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=onrpl_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-03 18:52
最后编辑:admin  更新时间:2023-01-05 10:55