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)

大家都在看

  • 非华为电脑开启多屏协同

    非华为电脑开启多屏协同 配置 windows 10系统(五代i7的辣鸡配置) WIFI、蓝牙(网上说需要5GHz,但本人的电脑是2.4G的也是有效) 华为、荣耀手机(EMUI 10…

    数据库 2023年6月11日
    0105
  • String vs StringBuffer vs StringBuilder

    String vs StringBuffer vs StringBuilder 本文翻译自:https://www.digitalocean.com/community/tutor…

    数据库 2023年6月11日
    087
  • 真正在大厂干了几年,我学会了反内卷[转]

    内卷这个概念的内涵很丰富,与我们的生活息息相关。为了普及和传播知识,我参考了相关的信息,把我个人的粗浅理解奉献给朋友们。 什么是内卷? 内卷 involution,与之对应的是 e…

    数据库 2023年6月14日
    0103
  • 容器化 | 在 NFS 备份恢复 RadonDB MySQL 集群数据

    社区于上个月发布了 RadonDB MySQL Kubernetes v2.2.0,集群数据备份恢复的存储类型除了 S3,新增 NFS 存储。本文将为您演示如何进行 NFS 备份及…

    数据库 2023年5月24日
    0140
  • mysql主从

    mysql主从 mysql主从 1.主从原理 1.1 主从介绍 1.2 主从作用 1.3 主从形式 1.4 主从复制原理 2.主从复制配置 2.1 mysql安装 2.2 mysq…

    数据库 2023年5月24日
    071
  • leetcode 144. Binary Tree Preorder Traversal 二叉树展开为链表(中等)

    一、题目大意 给你二叉树的根节点 root ,返回它节点值的 前序 遍历。 示例 1: 输入:root = [1,null,2,3]输出:[1,2,3] 示例 2: 输入:root…

    数据库 2023年6月16日
    073
  • 18-网络七层架构

    七层架构主要包括 ①、 物理层 主要定义物理设备标准,如网线的接口类型、光纤的接口类型、各种传输介质的传输速率等。它的主要作用是传输比特流(就是由 1、0 转化为电流强弱来进行传输…

    数据库 2023年6月16日
    073
  • 【SQL实战】期末考试,如何统计学生成绩

    年关将至,这两天所有小学都进入了期末考试阶段。在考试结束时,有必要清点学生的分数。有趣的是,学校提供的成绩单现在并不直接标明分数,而是一个等级,如优秀、良好、合格、不及格。至少北京…

    数据库 2023年5月24日
    0155
  • Linux–>定时任务调度

    指定系统在某个时间执行特点的命令或程序。 任务调度分类: crontab 选项 常用选项 选项 说明 -e 编辑crontab定时任务 -l 查询crontab任务 -r 删除当前…

    数据库 2023年6月14日
    054
  • CISCN2022初赛misc wp

    ez_usb usb流量题,与以前的鼠标流量和键盘流量有所区别,但大同小异 导出所有的HID数据并按照ip分类,之后脚本解码得到压缩包和密码 mappings = { "…

    数据库 2023年6月11日
    0103
  • fiddler相关随笔(网络异常、证书问题、配置代理)

    fiddler中遇到的坑 最近用fiddler实在是太频繁,经常开关,也不清理之前的代理配置,导致很多时候,电脑连不上网,大概有以下场景 * fiddler提示某网站要求上传相关证…

    数据库 2023年6月6日
    073
  • Css3入门详解

    一、Css基本语法 1.Html和Css没分开 点击查看代码 <!DOCTYPE html> <html lang="en"> <…

    数据库 2023年6月16日
    078
  • MySQL Bug:No suitable ‘keyring_component_metadata_query’ service implementation found to fulfill the request

    监控发现公司一台MySQL 8.0.26 的错误日志中出现大量下面告警信息: [Warning] [MY-013712] [Server] No suitable ‘k…

    数据库 2023年5月24日
    078
  • Java代码如何创建GUID字符串呢?

    随机字符串是我们日常开发中,经常使用的一种字符串,那么下文将讲述具有代表性的字符串GUID GUID字符串是全球唯一标识,是我们经常使用的一种唯一标识 如:分布式系统中使用其作为表…

    数据库 2023年6月11日
    079
  • Redis-实现分布式锁

    单节点分布式锁 本地的锁操作非常常见,无非就是申请一个锁变量lock, 加锁时,判断锁变量是否被持有,如果被持有中,则加锁失败,如果不被持有,则加锁成功,将锁的状态改为持有锁的这个…

    数据库 2023年6月11日
    064
  • 集合

    集合分为单列集合和双列集合。 Collection&#x96C6;&#x5408;&#x7684;&#x4F53;&#x7CFB;&…

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