MySQL 半同步复制
在主库初次启动时,执行如下语句加载semisync_master插件:
备库上则加载semisync_slave插件:
在初次加载插件后,MySQL会将该插件记录到系统表mysql.plugin中,下次启动时系统则会自动加载该插件了,无需再次执行上面的命令。
另外,主备库的配置文件my.cnf还需要新增如下记录来打开semi-sync。主库上,新增如下参数:
...
rpl_semi_sync_master_enabled=1
rpl_semi_sync_master_timeout=1000
...
备库上新增:
...
rpl_semi_sync_slave_enabled=1
...
那么主备在启动后,且slave线程开始dump主库的日志后,Semi-sync Replication就会开启,上面的配置(rpl_semi_sync_master_timeout=1000)表示主库在某次事务中,如果等待时间超过1000毫秒,那么则降级为普通模式,不再等待备库。如果主库再次探测到,备库恢复了,则会自动再次回到Semi-sync状态。
Semi-sync的配置参数不多,按照上面配置就可以了,其他少数几个参数默认即可。
主库上的其他参数:
备库上有:
root@localhost >show global status like '%semi%';
+--------------------------------------------+-------+
| Variable_name | Value |
+--------------------------------------------+-------+
| Rpl_semi_sync_master_clients | 1 | 有多少个Semi-sync的备库
| Rpl_semi_sync_master_net_avg_wait_time | 0 | 事务提交后,等待备库响应的平均时间
| Rpl_semi_sync_master_net_wait_time | 0 | 等待网络响应的总次数
| Rpl_semi_sync_master_net_waits | 7 | 总的网络等待时间
| Rpl_semi_sync_master_no_times | 0 | 一共有几次从Semi-sync跌回普通状态
| Rpl_semi_sync_master_no_tx | 0 | 库未及时响应的事务数,如果这个值很大就有问题
| Rpl_semi_sync_master_status | ON | 主库上Semi-sync是否正常开启
| Rpl_semi_sync_master_timefunc_failures | 0 | 时间函数未正常工作的次数
| Rpl_semi_sync_master_tx_avg_wait_time | 410 | 开启Semi-sync,事务返回需要等待的平均时间
| Rpl_semi_sync_master_tx_wait_time | 2876 | 事务等待备库响应的总时间
| Rpl_semi_sync_master_tx_waits | 7 | 事务等待备库响应的总次数
| Rpl_semi_sync_master_wait_pos_backtraverse | 0 | 改变当前等待最小二进制日志的次数
| Rpl_semi_sync_master_wait_sessions | 0 | 当前有几个线程在等备库响应
| Rpl_semi_sync_master_yes_tx | 7 | Semi-sync模式下,成功的事务数
---------------------