解决主据不一致原因,主库数据挂掉,从库数据不一致的问题。 解决方法:半同步复制 半同步复制场景中,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;
恢复正常。
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主从半同步配置完毕。