2.5 配置半同步复制
上一章中我们配置了“一主两从”的MySQL异步复制,下面在相同环境下配置半同步复制。
2.5.1 安装插件
半同步复制是使用插件实现的,因此必须将插件安装到MySQL服务器中才能使用它们。安装插件后,可通过与之关联的系统变量来控制它。要使用半同步复制,必须满足以下要求:
- 安装插件需要MySQL服务器支持动态加载。要验证这一点,检查have_dynamic_loading系统变量的值是否为YES。MySQL 8默认为YES。
- 已经启动了异步复制。
- 半同步不支持多源复制(“一从多主”的情况)。
安装设置半同步复制,需要REPLICATION_SLAVE_ADMIN或SUPER权限。MySQL发行版包括主、从端的半同步复制插件文件semisync_master.so和semisync_slave.so,默认位于MySQL安装目录下的lib/plugin目录下,本例中为/usr/local/mysql/lib/plugin。也可以通过设置plugin_dir系统变量的值指定插件目录位置。
执行下面的SQL语句加载插件:
-- 在主库 install plugin rpl_semi_sync_master soname 'semisync_master.so'; -- 在每个从库 install plugin rpl_semi_sync_slave soname 'semisync_slave.so';
如果安装插件时Linux上出现类似于下面所示的错误,则必须安装libimf:
mysql> install plugin rpl_semi_sync_master soname 'semisync_master.so'; ERROR 1126 (HY000): Can't open shared library '/usr/local/mysql/lib/plugin/semisync_master.so' (errno: 22 libimf.so: cannot open shared object file: No such file or directory)
可以通过网址https://dev.mysql.com/downloads/os-linux.html获取libimf。检查INFORMATION_SCHEMA.PLUGINS表或使用SHOW PLUGINS语句验证插件安装,例如:
检查相关系统变量的初始值:
主库的相关系统变量:
- rpl_semi_sync_master_enabled:主库是否启用了半同步复制,默认为OFF。
- rpl_semi_sync_master_timeout:等待从库的ACK回复的超时时间,默认为10秒。
- rpl_semi_sync_master_trace_level:半同步复制时主库的调试级别。
- rpl_semi_sync_master_wait_for_slave_count:主库在超时时间内需要收到多少个ACK回复才认为此次提交成功,否则就降级为异步复制。该变量在MySQL 5.7.3版本才提供,在此之前的版本都默认为收到1个ACK则确认成功,且不可更改。MySQL 5.7.3之后该变量的默认值也是1。
- rpl_semi_sync_master_wait_no_slave:默认值为ON,当状态变量Rpl_semi_sync_master_clients中的值小于rpl_semi_sync_master_wait_for_slave_count时,Rpl_semi_sync_master_status依旧为ON,只有当事务提交后等待rpl_semi_sync_master_timeout超时后,Rpl_semi_sync_master_status才会变为OFF,即降级为异步复制;为OFF时,当状态变量Rpl_semi_sync_master_clients中的值小于rpl_semi_sync_master_wait_for_slave_count时,Rpl_semi_sync_master_status立即显示为OFF,即立即降级为异步复制。
- rpl_semi_sync_master_wait_point:控制主库上commit、接收ACK、返回消息给客户端的时间点。值为AFTER_SYNC或AFTER_COMMIT。该选项是MySQL 5.7.2版本才引入的,默认值为AFTER_SYNC。此版本之前,等价于使用了AFTER_COMMIT模式。
从库的相关系统变量:
- rpl_semi_sync_slave_enabled:从库是否开启半同步复制。
- rpl_semi_sync_slave_trace_level:从库的调试级别。
2.5.2 启用半同步复制
安装半同步复制插件后,默认情况下会禁用它。必须在主库和从库都启用插件才能使用半同步复制。如果仅启用一侧,则复制将是异步的。
1. 启用半同步复制
以上的启动方式是在命令行执行的,也可写在配置文件中:
在有的高可用架构下,master和slave需同时启动,以便在切换后能继续使用半同步复制:
2. 重启从库上的I/O线程
stop slave io_thread; start slave io_thread;
如果没有重启,则默认还是异步复制。重启后,从库会在主库上注册为启用半同步复制的从库角色。
3. 查看半同步是否在运行
这两个变量常用来监控主从库是否运行在半同步复制模式下。至此,MySQL半同步复制搭建完毕。
2.5.3 监控半同步复制
半同步复制功能的插件公开了几个状态变量,可以检查这些变量以确定其操作状态,它们仅当安装了半同步复制插件以后才可用。
从库上只有一个半同步复制相关的状态变量Rpl_semi_sync_slave_status,为ON时表示从库使用半同步复制,OFF表示从库使用异步复制。
主库有14个半同步复制相关的状态变量:
- Rpl_semi_sync_master_clients:当前连接了多少个半同步从库。
- Rpl_semi_sync_master_net_avg_wait_time:主库等待从库回复的平均时间,以微秒为单位。此变量始终为0,不推荐使用,并且将在以后的版本中删除。
- Rpl_semi_sync_master_net_wait_time:主库等待从库回复的总时间,以微秒为单位。此变量始终为0,不推荐使用,并且将在以后的版本中删除。
- Rpl_semi_sync_master_net_waits:主库等待从库回复的总次数。
- Rpl_semi_sync_master_no_times:主库关闭半同步复制的次数。
- Rpl_semi_sync_master_no_tx:从库未成功确认的事务数。
- Rpl_semi_sync_master_status:为ON时表示主库使用半同步复制,为OFF时表示主库使用异步复制。
- Rpl_semi_sync_master_timefunc_failures:调用gettimeofday等时间函数时主库失败的次数。
- Rpl_semi_sync_master_tx_avg_wait_time:主库等待一个事务的平均时间,以微秒为单位。
- Rpl_semi_sync_master_tx_wait_time:主库等待事务的总时间,以微秒为单位。
- Rpl_semi_sync_master_tx_waits:主库等待事务的总次数。
- Rpl_semi_sync_master_wait_pos_backtraverse:主库等待事件的二进制日志次数低于之前等待事件的总次数。当事务等待回复的顺序与其二进制日志事件的写入顺序不同时,就会发生这种情况。
- Rpl_semi_sync_master_wait_sessions:当前等待从库回复的会话数。
- Rpl_semi_sync_master_yes_tx:从库成功确认的事务数。