Mysql8.0 配置半同步复制
文章目录
新实例配置半同步复制
部署 MySQL
- 可使用脚本部署:https://github.com/XiangYyy/install_mysql_tools.git
- 需注意更改 DEPLOY_TYPE 为 semisync,且 SEMI_ROLE 设置为对应角色
- 或手动增加配置(需注意主从节点增加配置不同):
|
|
建立主从关系
- 主库创建从库同步用户(ip地址需要改为从库地址,根据实际情况选择允许访问的 ip 范围)
|
|
- 从库清空 GTID 信息
|
|
- 从库指定主库的 GTID
|
|
- 从库配置主库信息
|
|
- 从库开启同步
|
|
查看状态
- 主节点查看半同步信息
|
|
- 从节点查看从信息
|
|
- 从节点查看半同步信息
|
|
完善其他配置
主节点开启 rpl_semi_sync_master_wait_no_slave
- 更改配置文件
|
|
- MySQL 热更改参数
|
|
从节点开启 readonly
- 更改配置文件
|
|
- MySQL 热更改参数
|
|
正在运行的实例不停机配置半同步从库
- 操作和建立从库类似,先基于 xtrabackup,建立异步从库,同步主库数据
- 待主从延迟较低时,主从关系切换为半同步复制模式
创建异步从库
-
从节点查看 slave 状态
|
|
所有节点安装 plugin
|
|
从节点开启半同步复制配置
|
|
主节点配置半同步复制配置
|
|
- 关注主从延迟,在主从延迟较低时,开启主节点半同步复制
|
|
查看状态
|
|
从节点配置只读
|
|
主从节点更改配置文件(完全配置好后添加)
- 主从节点更改配置文件,根据实际配置调整
- 主节点增加配置
|
|
- 从节点增加配置
|
|
涉及参数
plugin
- 半同步复制需要引入的 plugin
|
|
leader
loose-rpl_semi_sync_master_wait_no_slave
- 默认为 ON
- 设为 OFF 后,当连接 master 的 slave 的数量少于 rpl_semi_sync_master_wait_for_slave_count 设置的值,master 不会等待超时,立刻自动降为异步复制模式
rpl_semi_sync_master_timeout
- 等待从库回复 ACK 的时间,超过这个时间会降级为异步
- 设置为较大值时,如果 slave 节点异常,会影响主库状态,但可以保证所有提交的数据在从节点也有一份,适用于对数据完整性要求较高的场景
- 设置为较小值时,如果 slave 节点异常,仅影响主库较短时间,但存在 leader flower 不分时间数据不一致的场景,适用于对数据可用性要求高,并能容忍一定数据丢失风险的场景
- 默认为 10000,即 10s
|
|
rpl_semi_sync_master_enabled
- 主库是否开启半同步复制
rpl_semi_sync_master_wait_for_slave_count
- 主库收到多少个 ACK 才认为提交成功,默认值为 1
rpl_semi_sync_master_wait_point
- 提交流程
- AFTER_SYNC:client–>execute sql–>wrtie redolog–>write binlog–>wait ACK–>innodb storage commit–>client receive OK
- AFTER_COMMIT:client–>execute sql–>wrtie redolog–>write binlog–>innodb storage commit–>wait ACK–>client receive OK
- 差别:
- 实际差别是 leader 服务器提交变更的时机不同,AFTER_SYNC 会在 flower 返回 ACK 后,提交变更,AFTER_SYNC 会先提交然后等待 flower 的 ACK
- 影响:
- AFTER_SYNC 所有客户端查到的数据是一致的,AFTER_COMMIT 其他客户端可能看到当前客户端提交更改的(commit)在等待 ACK 的数据
- AFTER_COMMIT 模式当发生主从切换时,有的终端可能会看到类似于数据丢失的情况,因为非触发更改的线程能看到还未返回 ACK 的数据,节点切换后,如果节点并未同步到该部分数据,则查询的结果会发生变化,即可能产生幻读
flower
rpl_semi_sync_replica_enabled
- 从库是否开启半同步复制
状态参数说明
|
|
- 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_waits:主库等待事务的总时间,以微秒为单位
- Rpl_semi_sync_master_wait_pos_backtraverse:主库等待事件的二进制日志次数低于之前等待事件的总次数。当事务等待回复的顺序与其二进制日志事件的写入顺序不同时,会发生这种情况
- Rpl_semi_sync_master_wait_sessions:当前等待从库回复的会话数
- Rpl_semi_sync_master_yes_tx:从库成功确认的事务数
文章作者 Xiang
上次更新 2024-05-04