216_mysql_复制技术_半同步复制

举报
alexsully 发表于 2021/11/11 18:27:51 2021/11/11
【摘要】 半同步复制理论&相关参数监控

五 半同步复制

        5.7/8.0中支持通过插件的方式 实现半同步复制,半同步复制为增强型半同步/无损复制

  • Execute : 执行对数据修改操作;
  • binlog: 修改操作写入binlog ;
  • commit: 存储引擎层完成事务的提交

        5.1 异步复制

         masterbinlog ,不理会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

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。