一. 概述
在 MySQL 5.5 之前, MySQL 的复制是异步操作, 主库和从库的数据之间存在一定的延时, 这样存在一个隐患: 当主库上写入一个事务并提交成功, 而从库尚未得到主库推送的 Binlog 日志时, 主库 down 机了, 事务 Binlog 丢失了, 此时从库就缺失了这个事务, 从而造成主从不一致.
为了解决这个问题, mysql5.5 引入了半同步复制, 在 MySQL 5.5 之前的异步复制时, 主库执行完 Commit 提交操作后, 在主库写入 Binlog 日志后即可成功返回客户端, 无需等待 Binlog 日志传送给从库, 异步复制流程如下图所示:
对于半同步复制, 能保证主库上的每一个 Binlog 事务都能被可靠的复制到从库上, 主库在每次事务成功提交时, 并不及时反馈给前端应用用户, 而是等待其中一个从库也接收到 Binlog 事务并成功写入中继日志后, 主库才返回 Commit 操作成功给客户端. 半同步复制保证了事务成功提交后, 至少有两份日志记录, 一份在主库的 Binlog 日志上, 另一份在至少 一个从库的中继日志 relay log 上, 从而更进一步保证的主从数据的一致性. 半同步复制流程如下图所示:
在半同步复制模式下, 假设步骤 (1,2,3) 的任何一个步骤中主库宕机, 则事务并没有提交成功, 从库也没收到事务 binlog 日志, 所以主从数据是一致的. 假如步骤 (4) 传送 Binlog 日志到从库时, 从库宕机或者网络故障, 导致 binlog 并没有及时传送到从库上, 此时主库上的事务会等待一段时间(由参数 rp1_semi_sync_master_timeout 毫秒决定), 如果 binlog 在这段时间内都无法成功推送到从库上, 则 MySQL 自动调整复制为异步复制模式. 事务正常返回提交结果给客户端.
二. 半同步 (Semi-sync) 复制配置步骤
下面半同步复制的配置步骤是基于前面第二篇 "一主一从搭建(异步复制)" 基础之上. 半同步模式作为 mysql5.5 的一个插件来实现的, 主库和从库使用不同的插件, 需要安装
(1)判断 MySQL 服务器是否支持动态增加插件
SELECT @@have_dynamic_loading
(2) 检查 MySQL 的安装目录下是否存在插件, 主库插件是 semisync_master.so, 从库插件是 semisync_slave.so.
-- 主库插件位置:
SHOW VARIABLES LIKE 'plugin_dir';
-- 从库插件位置
SHOW VARIABLES LIKE 'plugin_dir';
-- 在主库上安装插件 semisync_master.so, 安装完从 plugin 表查看
- INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so'
- SELECT * FROM MySQL.`plugin`
-- 在从库上安装插件 semisync_slave.so , 安装完从 plugin 表查看
- INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so'
- SELECT * FROM MySQL.`plugin`
(3) 需要分别在主库和从库上配置参数打开半同步 semi-sync, 默认半同步设置是打不开的, 主库上配置全局参数.
-- 主库上配置启用. 设置主库传送到从库的 Binlog 日志, 最大超时时间.
- SET GLOBAL rpl_semi_sync_master_enabled=1;
- SET GLOBAL rpl_semi_sync_master_timeout=3000;
-- 从库上
SET GLOBAL rpl_semi_sync_slave_enabled=1;
注意之前配置的复制是异步复制, 所以需要重启一下从库上的 I/O 线程.
-- 从库停掉 I/O 线程, 再启动
- STOP SLAVE IO_THREAD;
- START SLAVE IO_THREAD;
(4) 同半步配置完毕后, 下面验证一下
-- 主库上查看当前半同步复制的一些状态值
SHOW STATUS LIKE '%semi_sync%'
在上面的状态信息中, 重点先来了解 3 个状态值:
Rpl_semi_sync_master_status: 值为 ON, 代表半同步复制目前处于打开状态.
Rpl_semi_sync_master_yes_tx: 值表示主库当前有多少事务是通过半同步复制到从库的.
Rpl_semi_sync_master_no_tx: 值表示当前事务不是半同步下从库及时响应的(主从不同步时体现).
-- 在主库上执行一个事务, 再检查主库复制状态
UPDATE testbackup2 SET `name`='小李 2' WHERE id=12
如上图所示, 此时 Rpl_semi_sync_master_yes_tx 的值计数增加 1, 在查从库时刚修改的数据已同步.
三. 半同步复制参数信息说明
3.1 主库上 semi_sync 状态信息(SHOW STATUS LIKE '%semi_sync%')
状态名称 | 状态值 | 描述 |
Rpl_semi_sync_master_clients | 1 | 有多少个 Semi-sync(半同步) 的从库 |
Rpl_semi_sync_master_net_avg_wait_time | 0 | 事务提交后,等待 slave 响应的平均时间 |
Rpl_semi_sync_master_net_wait_time | 0 | 总的网络等待时间 (等待 slave) |
Rpl_semi_sync_master_net_waits | 2 | 等待网络响应的总次数 (等待 slave) |
Rpl_semi_sync_master_no_times | 0 | 一共有几次从 Semi-sync 跌回普通状态, 通俗叫: 关闭半同步复制的次数 |
Rpl_semi_sync_master_no_tx | 0 | slave 未及时响应的事务数 |
Rpl_semi_sync_master_status | ON | 主库上 Semi-sync 是否正常开启 |
Rpl_semi_sync_master_timefunc_failures | 0 | 时间函数未正常工作的次数 |
Rpl_semi_sync_master_tx_avg_wait_time | 1222 | 开启 Semi-sync,事务返回需要等待的平均时间 |
Rpl_semi_sync_master_tx_wait_time | 2445 | 事务等待备库响应的总时间 |
Rpl_semi_sync_master_tx_waits | 2 | 事务等待备库响应的总次数 |
Rpl_semi_sync_master_wait_pos_backtraverse | 0 | 改变当前等待最小二进制日志的次数 |
Rpl_semi_sync_master_wait_sessions | 0 | 当前有几个线程在等备库响应 |
Rpl_semi_sync_master_yes_tx | 2 | Semi-sync 模式下,成功的事务数。也叫主库成功接收到 slave 的回复的次数。 |
3.2 主库上 semi_sync 环境信息(SHOW VARIABLES LIKE '%semi%')
环境名称 | 值 | 描述 |
rpl_semi_sync_master_enabled | ON | 是否自动开启半同步复制 |
rpl_semi_sync_master_timeout | 3000 | 主库传送到从库的 Binlog 日志,最大超时时间 |
rpl_semi_sync_master_trace_level | 32 | 用于开启半同步复制模式时的调试级别,默认是 32。 net wait level (more information about network waits) |
rpl_semi_sync_master_wait_for_slave_count | 1 | 至少有 N 个 slave 接收到日志 |
rpl_semi_sync_master_wait_no_slave | ON | 是否允许 master 每个事物提交后都要等待 slave 的 receipt 信号。默认为 on |
rpl_semi_sync_master_wait_point | AFTER_SYNC | 控制 master 在哪个环节接收 slave ack,master 接收到 ack 后返回状态给客户端。 此参数一共有两个选项 AFTER_SYNC(default) & AFTER_COMMIT。
|
3.3 从库上 semi_sync 环境信息(SHOW VARIABLES LIKE '%semi%';)
环境名称 | 值 | 描述 |
rpl_semi_sync_slave_enabled | ON | 从库是否自动开启半同步复制 |
rpl_semi_sync_slave_trace_level | 32 | 同上 |
3.4 从库上 semi_sync 状态信息(SHOW STATUS LIKE '%semi_sync%')
Rpl_semi_sync_slave_status | ON | 从库上 Semi-sync 是否正常开启 |
来源: https://www.cnblogs.com/MrHSR/p/9929914.html