mysql的半同步复制

  1. binlog dump线程何时向从库发送binlog

mysql在server层进行了组提交之后,为了提高并行度,将提交阶段分为了 flush sync commit三个阶段,根据sync_binlog的不同,会在 flush阶段或者 sync阶段以更新binlog位置点的方式通知 dump 线程发送binlog,而在commit阶段等待从库的ACK应答情况,即 after_sync 和 after_commit。

MySQL宕机时sync_binlog的值对数据库的影响?

sync_binlog == 1:在sync阶段通知 dump 线程发送binlog给slave节点,这时binlog确定已经刷盘,主库宕机对从库无影响。

sync_binlog != 1:在 flush阶段通知 dump 线程发送 binlog给slave节点,这时主节点binlog还没有刷盘,此时主库宕机,最后一次binlog没有落盘,会出现从库比主库多一次事务的情况。

MySQL宕机时 after_commit和after_sync对数据库的影响?

after_sync:假设 master节点在等待接收从节点ack时宕机,因为引擎层没有提交,HA切换到从库,因为binlog已经在从库重放,这时在业务层面就会发现在主库没有提交的事务在从库已经提交了,从库比主库多一次事务。在 mysql层面上,因为binlog的sync完成已经对应着一次事务的写入完成,master节点重启之后可以直接挂在从库上。

after_commit:先在主库引擎层进行事务提交后等待从库确认。因此,在主库commit之后从库ack之前,该次事务的提交对其他业务连接可见。此时,如果在主库 commit之后从库 ack之前,master与slave之间网络出现抖动,造成binlog event没有发送给从库,此时主库宕机。HA切换到从库,就会发现新的主库缺少了最后一组事务;对于其他业务连接而言,就像出现了幻读。

after_commit 和 after_sync 哪个性能更好?

sync redo log; A = 1ms

flush/sync binlog; B = 1ms

wait for slave ack; C = 1ms

commit; D = 1ms

当mysql没有采用组提交时,after commit的性能更好。

当3个事务串行提交时,after_sync 执行顺序为

A。。B。。C。。D。。

A。。B。。C。。D。。

A。。B。。C。。D。。

耗时为 3 * (A + B + C + D)

after_commit执行顺序为

A。。B。。D。。C。。

A。。B。。D。。C。。

A。。B。。D。。C。。

耗时为 (A + B + D + C) + 2 * (A + B + D);明显 after_commit性能更好。

但是,当mysql采用组提交后,因为after_sync要等待日志传输到远程,事务才提交,那么后面等待提交的事务队列拉长,后续组提交涉及的事务数就越大,IO开销变小,唤醒事务队列的成本也更小,性能更好。但是当存在热点数据时,after commit模式下,事务已经在引擎层提交,不再持有事务内锁,此时after commit性能更好。

总结下来就是:

after_commit模式下,因为在 commit之后,wait slave ack之前就释放了事务锁,下一次事务就可以开始;因此在未采用组提交或着采用了组提交但是存在热点数据的情况下,性能更好。

after_sync模式下,事务要传输到远程,事务才提交,导致了后续等待提交的事务队列的拉长,后续组提交的队列也就越长,io开销变小,此时性能更好。

异步复制修改为半同步复制的流程:

  1. 在主从节点上加载半同步复制插件

INSTALL PLUGIN rpl_semi_sync_master SONAME ‘semisync_master.so’;

INSTALL PLUGIN rpl_semi_sync_slave SONAME ‘semisync_slave.so’;

set global rpl_semi_sync_slave_enabled =1;【在从库开启半同步复制,主从都要开启,不要写在配置文件中】

set global rpl_semi_sync_master_enabled =1;【在主库开启半同步复制,主从都要开启,不要写在配置文件中】

set global rpl_semi_sync_master_timeout =1000; 【同步复制中由于网络原因导致复制时间超过10 00ms 后,增强半同步复制就变成了异步复制了】

set global rpl_semi_sync_master_wait_for_slave_count = 1;【该变量控制slave 应答的数量,默认是1 ,表示master 接收到几个slave 应答后才commit 】

其中,set global rpl_semi_sync_slave_enabled =1;和 set global rpl_semi_sync_master_enabled =1; 不建议写入配置文件,写入配置文件之后,如果slave 挂掉重启,会自动开启增强半同步复制。如果slave 库断开master 时间较长,最好是先开启mysql 异步复制,待slave 追上master 后再开启增强半同步复制。这样不会拖垮master 节点。

  1. 在从库上执行以下命令:

stop slave io_thread;

start slave io_thread;

  1. 在主从库配置文件中添加

plugin-load = “rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so”

rpl_semi_sync_master_timeout =1000;

rpl_semi_sync_master_wait_for_slave_count = 1;

  1. 以上配置之后从库挂掉重启之后加入集群之后开启半同步复制的操作为:

set global rpl_semi_sync_slave_enabled =1;

set global rpl_semi_sync_master_enabled =1;

Stop slave;

Start slave;

Original: https://www.cnblogs.com/juanmaofeifei/p/14306783.html
Author: 卷毛狒狒
Title: mysql的半同步复制

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/590949/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • MySQL 中如何定位 DDL 被阻塞的问题

    经常碰到开发、测试童鞋会问,线下开发、测试环境,执行了一个DDL,发现很久都没有执行完,是不是被阻塞了?要怎么解决? 包括在群里,也经常会碰到类似问题:DDL 被阻塞了,如何找到阻…

    数据库 2023年5月24日
    065
  • 商企网络拓扑的搭建

    前段时间因为工作项目需要模拟搭建客户环境的网络拓扑结构用于验证某款网关产品的功能, 因为不是专业的网管,对于计算机网络的实践也相对较少,所以在组件网络拓扑时遇到了不少的坑,做下记录…

    数据库 2023年6月6日
    0107
  • MySQL启动过程详解一:启动整体流程

    MySQL启动流程如下: 设置进程名 处理配置文件及启动参数以及部分模块初始化,这包括: 2.1 从配置文件中读取选项,把他们放在 argc 和 argv 已有的参数之前 2.2 …

    数据库 2023年6月9日
    068
  • 一个校验接口引发的思考–我真的了解Response吗

    一个校验接口 最近,我需要对接一个外部接口,基本功能是:校验指定的门店是否完善了货运信息。接口大致是这样的: POST https://******/Dealer/CheckCar…

    数据库 2023年6月6日
    0112
  • 10 Math.round(11.5) 等于多少,Math.round(-11.5)等于多少

    Math.round():将括号内的数+0.5,然后向下取整 11.5 + 0.5 = 12,向下取整即12 -11.5 + 0.5 = -11,向下取整即-11 Original…

    数据库 2023年6月6日
    0116
  • 浅谈事务隔离级别、MVCC及相关特性

    文采不是很好,应该有一些表达不清楚的地方,请改正。 [En] Literary talent is not very good, there should be some uncl…

    数据库 2023年5月24日
    093
  • XPath和Selenium的使用

    XPath 是一门在 XML 文档中查找信息的语言 /: ——># 从根节点选取: //: ——># 不管位置,直接找 /@属性名 ——># 获取对应属性值 /t…

    数据库 2023年6月9日
    079
  • 2022-08-17 DQL—-子查询,日期格式

    子查询、日期格式 DQL查询语言 子查询 按照结果集的行列数不同,子查询可以分为以下几类: 标量子查询:结果集只有一行一列(单行子查询) 列子查询:结果集有一列多行 行子查询:结果…

    数据库 2023年6月14日
    096
  • 多商户商城系统功能拆解28讲-平台端营销-消费奖励

    多商户商城系统,也称为B2B2C(BBC)平台电商模式多商家商城系统。可以快速帮助企业搭建类似拼多多/京东/天猫/淘宝的综合商城。 多商户商城系统支持商家入驻加盟,同时满足平台自营…

    数据库 2023年6月14日
    095
  • 6、SQL模糊查询LIKE concat用法

    concat用来拼接查询的字符串: SELECT * FROM page_demo WHERE name LIKE concat(‘%’,#{name},’%’) 模糊查询: 1、…

    数据库 2023年6月6日
    0136
  • mybatis-延迟加载

    本文主要介绍下mybatis的延迟加载,从原理上介绍下怎么使用、有什么好处能规避什么问题。延迟加载一般用于级联查询(级联查询可以将主表不能直接查询的数据使用自定义映射规则调用字表来…

    数据库 2023年6月16日
    074
  • Java学习-第一部分-第一阶段-第八节:项目-房屋出租系统

    项目-房屋出租系统 笔记目录:(https://www.cnblogs.com/wenjie2000/p/16378441.html) 房屋出租系统-需求 ●项目需求说明 实现基于…

    数据库 2023年6月11日
    084
  • MySQL实现 group_concat 排序

    MySQL支持实现group_concat() 内部自定义排序: 实例: 新建一张表 reward,表中数据如下: SQL: SELECT uid, GROUP_CONCAT(mo…

    数据库 2023年6月14日
    093
  • 用Python做一个中秋节嫦娥投食小游戏《千里婵娟》

    山河远阔,烟火人间,又一年,千里婵娟~ 今天给大家带来的是给玉兔投喂月饼的小游戏。八月十五中秋夜晚,让我们对着月亮许愿:希望我们在意和在意我们的人,诸邪避退、百事无忌、平安喜乐、万…

    数据库 2023年6月14日
    0105
  • MYSQL–>多表查询

    多表之间的关系 一对多(多对一) 如多个员工都属于一个部门的关系 实现方式:在多的一方建立外键连接少的一方 多对对 如学生与课程表之间的关系 实现方式:在学生与课程表之间建立第三方…

    数据库 2023年6月14日
    0106
  • Mysql数据库体系

    Mysql数据库体系如下(手绘): 描述: 1.DBMS:database system management是数据库管理软件,平时我们使用的数据库的全称,是C/S架构(clien…

    数据库 2023年6月6日
    093
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球