MariaDB半同步主从配置

mariadb的主从复制原理图

在这里插入图片描述

半同步复制介绍

解决主据不一致原因,主库数据挂掉,从库数据不一致的问题。 解决方法:半同步复制 半同步复制场景中,master会监视所有的slave,确保其中至少一台数据完全同步成功,master才会返回客户端信息,此数据写成功。

环境介绍

华为云服务器CentOS8.0

主节点:120.46.182.30

从节点:120.46.199.32

配置步骤

1、主从库初始化

[root@node01-k8s yum.repos.d]# mariadb-secure-installation

 2、修改主库配置

[root@mster-k8s mysql]# grep -Ev "^$|^#" /etc/my.cnf.d/server.cnf

 或者

[root@hecs-141427 my.cnf.d]# vim /etc/my.cnf.d/mariadb-server.cnf
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
log-error=/var/log/mariadb/mariadb.log
pid-file=/run/mariadb/mariadb.pid
server_id=30    #一组主从组里的每个id必须是唯一值。推荐用ip位数
log_slave_updates=true    #slave更新是否记入日志
expire_logs_days=7   #二进制日志文件过期时间,默认为0,表示不过期
max_binlog_size=500M   #二进制日志文件限制大小,超出给定值发生滚动,默认是1G
slave_parallel_threads=2 #同时启动多少个复制线程,最多与要复制的数据库数量相等即可
binlog_format=ROW    # 二进制日志文件格式

3、修改从库配置

[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
log-error=/var/log/mariadb/mariadb.log
pid-file=/run/mariadb/mariadb.pid
server_id=32
relay_log = relay-bin    # 中继日志, 后面指定存放位置。如果只是指定名字,默认存放在/var/lib/mysql下
lower_case_table_names=1

4、重启主库和从库服务

[root@hecs-141427 my.cnf.d]# systemctl restart mariadb

 

 5、master节点配置

[root@hecs-141427 my.cnf.d]# mysql -uroot -p
Enter password: 
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 15
Server version: 10.3.28-MariaDB MariaDB Server

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> Grant replication slave,replication client n *.* to 'myslave'@'%' identified by '123456';
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'n *.* to 'myslave'@'%' identified by '123456'' at line 1
MariaDB [(none)]> use mysql;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
MariaDB [mysql]> Grant replication slave,replication client n *.* to 'myslave'@'%' identified by '123456';
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'n *.* to 'myslave'@'%' identified by '123456'' at line 1
MariaDB [mysql]> Grant replication slave,replication client on *.* to 'myslave'@'%' identified by '123456';
Query OK, 0 rows affected (0.000 sec)

MariaDB [mysql]> show master status;
Empty set (0.000 sec)

MariaDB [mysql]> flush privileges;
Query OK, 0 rows affected (0.000 sec)

MariaDB [mysql]> 

 如果出现如下情况,检查配置文件是否有错误:

 修改后正确:

6、 slave节点配置

MariaDB [(none)]> change master to master_host='120.46.182.30',master_user='myslave',master_password='123456',master_log_file='mysql-bin.000001',master_log_pos=328;

 启动同步,如有报错执行 reset slave;

MariaDB [(none)]> start slave;  

 show slave status\G        #查看 Slave 状态

MariaDB [(none)]> show slave status\G;

 //确保 IO 和 SQL 线程都是 Yes,代表同步正常。
Slave_IO_Running: Yes        #负责与主机的io通信
Slave_SQL_Running: Yes        #负责自己的slave mysql进程

注意:

一般 Slave_IO_Running: No 的可能性
1、网络不通
2、my.cnf配置有问题
3、密码、file文件名、pos偏移量不对
4、防火墙没有关闭

7、数据库主从如下出错解决办法

Slave_IO_Running:  No 一方面原因是因为网络通信的问题也有可能是日志读取错误的问题。以下是出错问题的解决方案:

从机器停止slave:

MariaDB [(none)]> stop slave;

到master机器登陆mysql,记录master的bin的位置:

 刷新日志:mysql> flush logs;

 因为刷新日志file的位置会+1

马上到slave执行:

mysql> CHANGE MASTER TO MASTER_LOG_FILE='mysqld-bin.000002',MASTER_LOG_POS=371;

mysql> slave start;

mysql> show slave status\G;

 

 恢复正常。

8、mariadb的半同步配置

在MariaDB 10.3.3和更高版本中,半同步复制功能内置于MariaDB服务器中,不再由插件提供。这意味着这些版本不支持安装插件。

1开启主库半同步复制

MariaDB [(none)]> set global rpl_semi_sync_master_enabled = 1;

 2开启等待从库响应时长

MariaDB [(none)]> set global rpl_semi_sync_master_timeout = 3000;

 3开启从库半同步复制

MariaDB [(none)]> set global rpl_semi_sync_slave_enabled = 1;

 4重启从库

 5、验证主库

MariaDB [(none)]> SHOW GLOBAL VARIABLES LIKE '%semi%';
+---------------------------------------+--------------+
| Variable_name                         | Value        |
+---------------------------------------+--------------+
| rpl_semi_sync_master_enabled          | ON           |
| rpl_semi_sync_master_timeout          | 3000         |
| rpl_semi_sync_master_trace_level      | 32           |
| rpl_semi_sync_master_wait_no_slave    | ON           |
| rpl_semi_sync_master_wait_point       | AFTER_COMMIT |
| rpl_semi_sync_slave_delay_master      | OFF          |
| rpl_semi_sync_slave_enabled           | OFF          |
| rpl_semi_sync_slave_kill_conn_timeout | 5            |
| rpl_semi_sync_slave_trace_level       | 32           |
+---------------------------------------+--------------+
9 rows in set (0.001 sec)

MariaDB [(none)]> SHOW GLOBAL STATUS LIKE 'rpl_semi%';
+--------------------------------------------+-------+
| Variable_name                              | Value |
+--------------------------------------------+-------+
| Rpl_semi_sync_master_clients               | 1     |
| Rpl_semi_sync_master_get_ack               | 0     |
| Rpl_semi_sync_master_net_avg_wait_time     | 0     |
| Rpl_semi_sync_master_net_wait_time         | 0     |
| Rpl_semi_sync_master_net_waits             | 0     |
| Rpl_semi_sync_master_no_times              | 0     |
| Rpl_semi_sync_master_no_tx                 | 0     |
| Rpl_semi_sync_master_request_ack           | 0     |
| Rpl_semi_sync_master_status                | ON    |
| Rpl_semi_sync_master_timefunc_failures     | 0     |
| Rpl_semi_sync_master_tx_avg_wait_time      | 0     |
| Rpl_semi_sync_master_tx_wait_time          | 0     |
| Rpl_semi_sync_master_tx_waits              | 0     |
| Rpl_semi_sync_master_wait_pos_backtraverse | 0     |
| Rpl_semi_sync_master_wait_sessions         | 0     |
| Rpl_semi_sync_master_yes_tx                | 0     |
| Rpl_semi_sync_slave_send_ack               | 0     |
| Rpl_semi_sync_slave_status                 | OFF   |
+--------------------------------------------+-------+
18 rows in set (0.000 sec)

MariaDB [(none)]> 

6、验证从库

[root@hecs-401441 ~]# mysql -uroot -p;
Enter password: 
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 65
Server version: 10.5.15-MariaDB MariaDB Server

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> SHOW GLOBAL VARIABLES LIKE '%semi%';
+---------------------------------------+--------------+
| Variable_name                         | Value        |
+---------------------------------------+--------------+
| rpl_semi_sync_master_enabled          | OFF          |
| rpl_semi_sync_master_timeout          | 10000        |
| rpl_semi_sync_master_trace_level      | 32           |
| rpl_semi_sync_master_wait_no_slave    | ON           |
| rpl_semi_sync_master_wait_point       | AFTER_COMMIT |
| rpl_semi_sync_slave_delay_master      | OFF          |
| rpl_semi_sync_slave_enabled           | ON           |
| rpl_semi_sync_slave_kill_conn_timeout | 5            |
| rpl_semi_sync_slave_trace_level       | 32           |
+---------------------------------------+--------------+
9 rows in set (0.001 sec)

MariaDB [(none)]> SHOW GLOBAL STATUS LIKE 'rpl_semi%';
+--------------------------------------------+-------+
| Variable_name                              | Value |
+--------------------------------------------+-------+
| Rpl_semi_sync_master_clients               | 0     |
| Rpl_semi_sync_master_get_ack               | 0     |
| Rpl_semi_sync_master_net_avg_wait_time     | 0     |
| Rpl_semi_sync_master_net_wait_time         | 0     |
| Rpl_semi_sync_master_net_waits             | 0     |
| Rpl_semi_sync_master_no_times              | 0     |
| Rpl_semi_sync_master_no_tx                 | 0     |
| Rpl_semi_sync_master_request_ack           | 0     |
| Rpl_semi_sync_master_status                | OFF   |
| Rpl_semi_sync_master_timefunc_failures     | 0     |
| Rpl_semi_sync_master_tx_avg_wait_time      | 0     |
| Rpl_semi_sync_master_tx_wait_time          | 0     |
| Rpl_semi_sync_master_tx_waits              | 0     |
| Rpl_semi_sync_master_wait_pos_backtraverse | 0     |
| Rpl_semi_sync_master_wait_sessions         | 0     |
| Rpl_semi_sync_master_yes_tx                | 0     |
| Rpl_semi_sync_slave_send_ack               | 0     |
| Rpl_semi_sync_slave_status                 | ON    |
+--------------------------------------------+-------+
18 rows in set (0.000 sec)

MariaDB [(none)]> 

 9、同步主库数据

导出主库数据:

[root@hecs-141427 ~]# mysqldump -uroot -p123456 --all-databases > all_databases_backup.sql;
[root@hecs-141427 ~]# ls
all_databases_backup.sql  mysql57-community-release-el7-10.noarch.rpm
[root@hecs-141427 ~]# ll
total 504
-rw-r--r-- 1 root root 484645 Oct 20 17:58 all_databases_backup.sql
-rw-r--r-- 1 root root  25548 Apr  7  2017 mysql57-community-release-el7-10.noarch.rpm
[root@hecs-141427 ~]# 

 拷贝文件到从库:

[root@hecs-141427 ~]# ls
all_databases_backup.sql  mysql57-community-release-el7-10.noarch.rpm
[root@hecs-141427 ~]# ll
total 504
-rw-r--r-- 1 root root 484645 Oct 20 17:58 all_databases_backup.sql
-rw-r--r-- 1 root root  25548 Apr  7  2017 mysql57-community-release-el7-10.noarch.rpm
[root@hecs-141427 ~]# scp /root/all_databases_backup.sql [email protected]:/root
The authenticity of host '120.46.182.30 (120.46.182.30)' can't be established.
ECDSA key fingerprint is SHA256:XlpY0kVXPf3RUKYcromfWzEVkXiLbQ2QXPb/JCVlvM4.
Are you sure you want to continue connecting (yes/no/[fingerprint])? no  
Host key verification failed.
lost connection
[root@hecs-141427 ~]# scp /root/all_databases_backup.sql [email protected]:/root
The authenticity of host '120.46.199.32 (120.46.199.32)' can't be established.
ECDSA key fingerprint is SHA256:uLmS9MFCB3hHojQTJYfQ6wRwf+YIoP/c0imnEtQbrKU.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '120.46.199.32' (ECDSA) to the list of known hosts.
[email protected]'s password: 
Permission denied, please try again.
[email protected]'s password: 
all_databases_backup.sql                                                                                                                                  100%  473KB  14.2MB/s   00:00    
[root@hecs-141427 ~]# 

 停用从库:

MariaDB [(none)]> stop slave;
Query OK, 0 rows affected, 1 warning (0.000 sec)

MariaDB [(none)]> 

 导入数据:

MariaDB [(none)]> use mysql;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
MariaDB [mysql]> source ./root/all_databases_backup.sql
ERROR: Failed to open file './root/all_databases_backup.sql', error: 2
MariaDB [mysql]> source ./all_databases_backup.sql;
Query OK, 0 rows affected (0.000 sec)

Query OK, 0 rows affected (0.000 sec)

Query OK, 0 rows affected (0.000 sec)

Query OK, 0 rows affected (0.000 sec)

Query OK, 0 rows affected (0.000 sec)

Query OK, 0 rows affected (0.000 sec)

Query OK, 0 rows affected (0.000 sec)

Query OK, 0 rows affected (0.000 sec)

Query OK, 0 rows affected (0.000 sec)

Query OK, 0 rows affected (0.000 sec)

Query OK, 0 rows affected (0.000 sec)

Database changed
Query OK, 0 rows affected (0.000 sec)

 开启从库:

MariaDB [mytest]> start slave;
Query OK, 0 rows affected (0.000 sec)

MariaDB [mytest]> 

插入数据进行验证。 至此,MariaDB主从半同步配置完毕。

猜你喜欢

转载自blog.csdn.net/Genius_zhu/article/details/127427755
今日推荐