216_mysql_复制技术_半同步复制
【摘要】 半同步复制理论&相关参数监控
五 半同步复制
5.7/8.0中支持通过插件的方式 实现半同步复制,半同步复制为增强型半同步/无损复制
- Execute : 执行对数据修改操作;
- binlog: 修改操作写入binlog ;
- commit: 存储引擎层完成事务的提交
5.1 异步复制
master发binlog ,不理会slave是否会受到,直接commit (没有接受到slave返回的 ACK, master)
5.2 半同步复制
- 待slave 返回ACK 才最终commit;
- 在master接受到slave返回的ack之前,会阻塞,不会返回任何值给客户端,
- commit 后,返回值才返回给客户端
- 如果涉及多个slave,可以设置 rpl_semi_sync_master_wait_for_slave_count(默认为1) 设置接受到多少个slave返回ack 才commit
Rpl_semi_sync_master_wati_point commit之前,等待ACK 点位
- AFTER_SYNC : 收到ACK 时候才会commit,然后返回给客户端
- AFTER_COMMIT: 先commit 收到ACK 时候,才返回给客户端
5.3 半同步过程
- 1 master 开启半同步,slave 开启半同步 (入有一方未开启,则为传统异步复制)
- 2 master 至少会等待一个slave 返回 ACK
- 3 slave 收到binlog 写入relay log 后 才发送ACK
- 4 master 超时未收到ACK 会切换成 异步复制, 直到收到 slave ack 才切换回 半同步复制
开启半同步复制流程
master
show plugins; #查看
install plugin rpl_semi_sync_master soname 'semisync_master.so'; #安装
show variables like 'rpl%';
set persist rpl_semi_sync_master_enabled=on; 启动主库半同步复制
slave
install plugin rpl_semi_sync_slave soname 'semisync_slave.so';
set persist rpl_semi_sync_slave_enabled=on;
重启从库IO线程
stop slave io_thread;
start slave io_thread;
show global status like 'rpl%';
核心参数
rpl_semi_sync_master_timeout : 毫秒为单位,控制主库等待ACK超时时间(默认10000 10秒)
Rpl_semi_sync_master_status 主库半同步复制状态是否启用
Rpl_semi_sync_slave_status 从库半同步复制状态是否启用
rpl_semi_sync_master_clients: 显示半同步从库数量
rpl_semi_sync_master_no_trx: 从库未成功确认事务的提交数(异步复制模式)
rpl_semi_sync_master_yes_trx: 从库成功确认事务的提交数(半同步复制模式)
半同步复制监控
监控配置是否正确 show variables
- show variables like "rpl_semi_sync";
监控半同步插件的工作/操作状态, show status
- show status like "rpl_semi_sync"
开启半同步后 变量永远rpl_semi_sync_master_enabled =1; 是否是半同步还是异步状态 Rpl_semi_sync_master_status =ON 来确认
主库
环境变量 show variables like '%semi%';
mysql> show variables like '%semi%';
rpl_semi_sync_master_enabled=ON 表示开启半同步复制
rpl_semi_sync_master_timeout=10000 单位为毫秒,即10秒超时,将切换为异步复制
rpl_semi_sync_master_wait_no_slave 表示是否允许master每个事务都要等待slave接收确认。默认为ON,每一个事务都会等待,如果slave crash后,当slave追赶上master的日志时,可以自动的切换为半同步方式。如果为OFF,则slave追赶上后,也不会采用半同步的方式复制了,需要手工配置。
rpl_semi_sync_master_trace_level=32 表示用于开启半同步复制时的调试级别,默认32
rpl_semi_sync_master_wait_for_slave_count MySQL 5.7.3引入的,该变量设置主库需要等待多少个slave应答,才能返回给客户端,默认为1。
mysql> show status like '%semi%';
Rpl_semi_sync_master_status 标记master现在是否是半同步复制状态
Rpl_semi_sync_master_clients 记录支持半同步的slave的个数
Rpl_semi_sync_master_yes_tx master成功接收到slave的回复的次数
Rpl_semi_sync_master_no_tx master没有收到slave的回复而提交的次数
从库
show global status like "repl_semi_sync"
备注 早期半同步是 不等从库ACK直接commit,但不会返回给客户端,容易有幻读,5.7版本做了优化,必须等到ACK 才会commit
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)