1、原理
半同步复制是在 MySQL 5.5 之后引入的,主从服务器必须同时安装半同步复制插件,才能开启此功能。
半同步复制,会确保 从库接收完 主库传递过来的 二进制日志(binlog)内容 已经写入到 自己的 中继日志(relay log)里面 之后。才会通知主库上的等待进程,该操作完毕。
如果等待时间超时,超过 rpl_semi_sync_master_timeout
参数设置的时间,则会关闭半同步复制,并自动转换为异步复制模式,直到至少有一台从库通知主库已经接收到 binlog 信息为止。
原理图如下:
MySQL 5.7 版本新增 rpl_semi_sync_master_wait_point
参数,用于控制半同步模式下主库在返回给 session 事务成功之前的 事务提交方式。
可选值:
(1)AFTER_COMMIT (MySQL5.6版本默认值)
含义是:主库将每个事务写入binlog,并传递给从库,刷新到中继日志中,同时主库提交事务。之后主库开始等待从库的反馈,只有收到从库的回复之后,master才将 “commit OK” 的结果反馈给客户端。(2)AFTER_SYNC (MySQL5.7版本后新增,5.7版本默认值)
含义是:主库将每个事务写入 binlog,并传递给从库,刷新到中继日志中,主库开始等从库反馈,直到接到从库回复后,再提交事务,并返回 “commit OK” 结果给客户端。
如有多个从库,可以使用
rpl_semi_sync_master_wait_for_slave_count
参数 来控制主库需要接收到 多少个 从库写事务成功反馈后,才返回成功给客户端。
after_sync 模式下,即使主库宕机,在主库提交的事务,从库也已经能保证同步到了中继日志,不会丢失任何数据。
2、搭建(基于异步复制模式)
(1)主库 安装半同步复制插件
# 主库安装(linux)
install plugin rpl_semi_sync_master soname 'semisync_master.so';
# 主库安装(windows)
install plugin rpl_semi_sync_master soname 'semisync_master.dll';
# 主库开启半同步复制
set global rpl_semi_sync_master_enabled=on;
(2)从库 安装半同步复制插件
# 从库安装(linux)
install plugin rpl_semi_sync_slave soname 'semisync_slave.so';
# 从库安装(windows)
install plugin rpl_semi_sync_slave soname 'semisync_slave.dll';
# 从库开启半同步复制
set global rpl_semi_sync_slave_enabled=on;
(3)查看插件安装情况:
show plugins;
A、主库:
查看配置
rpl_semi_sync_master_timeout
:表示主库等待从库回复消息的时间,单位是毫秒,默认值10秒,如时间超过该值,则自动切换为异步复制模式。
B、从库:
查看配置
(4)设置开机启动
如要实现 开机自启动半同步复制功能,需要把rpl_semi_sync_master_enabled=on
、rpl_semi_sync_slave_enabled=on
分别加入到主库和从库的 my.cnf 配置文件中。
(5)重启
由于是在 异步复制的 基础上 搭建,所以只需要重新启动 从库 I/O 线程,激活半同步复制。
# 先停止
stop slave io_thread;
# 再启动
start slave io_thread;
(A)查看主库 上 半同步复制 是否正常:
SHOW GLOBAL STATUS LIKE '%semi%';
Rpl_semi_sync_master_clients:表示有几个从库连接到了主库,并且是半同步复制方式。
Rpl_semi_sync_master_status:表示主库半同步复制模式开启状态,ON:开启,OFF:关闭。
Rpl_semi_sync_master_no_tx:表示没有成功接收 slave 提交的次数。
Rpl_semi_sync_master_yes_tx:表示成功接收 slave 事务回复的次数。
(B)查看从库 上 半同步复制 状态:
SHOW GLOBAL STATUS LIKE '%semi%';
- Rpl_semi_sync_slave_status:表示从库 半同步复制模式开启状态,ON:开启,OFF:关闭。
3、半同步复制 与 异步复制 模式的 切换
A、半同步 切换到 异步
关闭从库 I/O 线程
stop slave io_thread;
主库上 执行语句 超时后,会自动断开从库,切换为异步
备注:
只要主库 等待 从库 回复时间 超出 rpl_semi_sync_master_timeout
配置所设置时间(包括从库宕机),就会自动断开从库,切换为 异步复制。
B、重新切换 回 半同步
只需 再次开启 从库 I/O 线程
start slave io_thread;
如未设置 开机自启动半同步复制功能,则 从库宕机后, 需要重新 设置启用 半同步复制,并重器 I/O 线程。如下
# 从库开启半同步复制
set global rpl_semi_sync_slave_enabled=on;
stop slave io_thread;
start slave io_thread;
最后编辑:admin 更新时间:2023-01-05 10:55