主从半同步复制的作用
- 默认情况下,MySQL的复制功能是异步的,
- 异步复制可以提供最佳的性能,
- 主库把binlog日志发送给从库即结束,并不验证从库是否接收完毕。
- 这意味着当主服务器或从服务器端发生故障时,
- 有可能从服务器没有接收到主服务器发送过来的binlog日志,
- 这就会造成主服务器和从服务器的数据不一致,甚至在恢复时造成数据的丢失
MySQL8.0.25配置实现主从半同步
- 先装功能插件模块,
- 再启用插件功能,
- 最后修改配置文件永久生效。
检查插件是否已存在
- 使用yum或者rpm安装,使用rpm -ql查看包中部署的模块
rpm -ql mysql-server |grep semisync
/usr/lib64/mysql/plugin/semisync_master.so
/usr/lib64/mysql/plugin/semisync_slave.so
- 使用二进制或者源码编译安装,用find查找模块是否存在
find / -name 'semisync*'
/usr/local/mysql-8.0.25-linux-glibc2.17-x86_64-minimal/lib/plugin/semisync_master.so
/usr/local/mysql-8.0.25-linux-glibc2.17-x86_64-minimal/lib/plugin/semisync_slave.so
主和所有从节点均需安装并开启插件
- 进入数据库并安装插件
mysql>INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so'; #永久安装插件
- 临时开启半同步功能(免重启立即生效)
SET GLOBAL rpl_semi_sync_master_enabled=1; #临时修改变量
主节点修改配置文件并设定半同步阈值
vim /etc/my.cnf.d/mysql-server.cnf
[mysqld]
server-id=8
log-bin
rpl_semi_sync_master_enabled=ON
rpl_semi_sync_master_timeout=3000
- 进入mysql设定阈值 (免重启立即生效)
rpl_semi_sync_master_timeout=3000 #设置3s内无法同步,也将返回成功信息给客户端
从节点修改配置文件
vim /etc/my.cnf.d/mysql-server.cnf
[mysqld]
server-id=8
log-bin
rpl_semi_sync_master_enabled=ON
从节点确认配置生效
mysql> stop slave;start slave;
Query OK, 0 rows affected, 1 warning (0.00 sec)
Query OK, 0 rows affected, 1 warning (0.01 sec)
mysql> SHOW GLOBAL STATUS LIKE '%semi%';
+----------------------------+-------+
| Variable_name | Value |
+----------------------------+-------+
| Rpl_semi_sync_slave_status | ON |
+----------------------------+-------+
1 row in set (0.00 sec)
主节点确认配置生效
mysql> SHOW GLOBAL VARIABLES LIKE '%semi%';
+-------------------------------------------+------------+
| Variable_name | Value |
+-------------------------------------------+------------+
| rpl_semi_sync_master_enabled | ON |
| rpl_semi_sync_master_timeout | 1000 |
| rpl_semi_sync_master_trace_level | 32 |
| rpl_semi_sync_master_wait_for_slave_count | 1 |
| rpl_semi_sync_master_wait_no_slave | ON |
| rpl_semi_sync_master_wait_point | AFTER_SYNC |
+-------------------------------------------+------------+
6 rows in set (0.01 sec)
mysql> SHOW GLOBAL STATUS LIKE '%semi%';
+--------------------------------------------+-------+
| Variable_name | Value |
+--------------------------------------------+-------+
| Rpl_semi_sync_master_clients | 3 |
| 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_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 |
+--------------------------------------------+-------+
14 rows in set (0.00 sec)
测试
在master实现,创建数据库,立即成功
MariaDB [db1]> create database db2;
Query OK, 1 row affected (0.004 sec)
在所有slave节点实现,停止复制线程
MariaDB [(none)]> stop slave;
Query OK, 0 rows affected (0.011 sec)
在master实现,创建数据库,等待3s才能成功
MariaDB [db1]> create database db3;
Query OK, 1 row affected (3.003 sec)
在任意一个slave节点实现,恢复复制线程
MariaDB [(none)]> start slave;
Query OK, 0 rows affected (0.006 sec)
在master实现,创建数据库,立即成功
MariaDB [db1]> create database db4;
Query OK, 1 row affected (0.002 sec)
Mariadb-10.3.11区别
- Mariadb-10.3.11及后续版本无法使用INSTALL PLUGIN直接安装
- 需要数据库服务器配置文件中添加调用插件,重启数据库服务器后生效
[root@master ~]
[mysqld]
server-id=8
log-bin
plugin-load-add = semisync_master
rpl_semi_sync_master_enabled=ON
rpl_semi_sync_master_timeout=3000
- 就是多了一行配置参数,主从服务器均需通过此参数启用插件功能
plugin-load-add = semisync_master