mysql的半同步复制
1. binlog dump线程何时向从库发送binlog
mysql在server层进行了组提交之后,为了提高并行度,将提交阶段分为了 flush sync commit三个阶段,根据sync_binlog的不同,会在 flush阶段或者 sync阶段以更新binlog位置点的方式通知 dump 线程发送binlog,而在commit阶段等待从库的ACK应答情况,即 after_sync 和 after_commit。
- flush stage;
- if sync_binlog != 1 {
- update binlog end pos -> binlogdump thread //发信号给dump线程
- }
- sync stage;
- if sync_binlog == 1 {
- update binlog end pos -> binlogdump thread //发信号给dump线程
- }
- if after_sync {
- wait for slave ack
- }
- commit stage;
- if after_commit {
- wait for slave ack
- }
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; 【同步复制中由于网络原因导致复制时间超过1000ms后,增强半同步复制就变成了异步复制了】
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节点。
2. 在从库上执行以下命令:
stop slave io_thread;
start slave io_thread;
3. 在主从库配置文件中添加
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;
4. 以上配置之后从库挂掉重启之后加入集群之后开启半同步复制的操作为:
set global rpl_semi_sync_slave_enabled =1;
set global rpl_semi_sync_master_enabled =1;
Stop slave;
Start slave;
mysql的半同步复制的更多相关文章
- MySQL主从复制半同步复制原理及搭建
在MySQL5.5之前的版本中,MySQL的复制是异步复制,主库和从库的数据之间存在一定的延迟,比如网络故障等各种原因,这样子容易存在隐患就是:当在主库写入一个事务成功后并提交了,但是由于从库延迟没有 ...
- MySQL的半同步复制监控
(1)master端 >show variables like 'rpl_semi_sync%'; +------------------------------------+-------+ ...
- MySQL数据的主从复制、半同步复制和主主复制详解
一.MySQL复制概述 ⑴.MySQL数据的复制的基本介绍 目前MySQL数据库已经占去数据库市场上很大的份额,其一是由于MySQL数据的开源性和高性能,当然还有重要的一条就是免费~不过不知道还能免费 ...
- MySQL数据的主从复制、半同步复制和主主复制详解-转
一.MySQL复制概述 ⑴.MySQL数据的复制的基本介绍 目前MySQL数据库已经占去数据库市场上很大的份额,其一是由于MySQL数据的开源性和高性能,当然还有重要的一条就是免费~不过不知道还能免费 ...
- MySQL半同步复制的数据一致性探讨微信后台团队实践【转】
MySQL是一个RDBMS(关系型数据库管理系统),由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下产品.由于其体积小.速度快.拥有成本低,尤其是开放源码这一特点,广受各大企业欢迎,包括 ...
- Mysql半同步复制模式说明及配置示例 - 运维小结
MySQL主从复制包括异步模式.半同步模式.GTID模式以及多源复制模式,默认是异步模式 (如之前详细介绍的mysql主从复制).所谓异步模式指的是MySQL 主服务器上I/O thread 线程将二 ...
- MySQL/MariaDB数据库的半同步复制
MySQL/MariaDB数据库的半同步复制 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.MySQL半同步复制概述 1>.MySQL默认的异步复制 默认情况下,M ...
- MySQL半同步复制源码解析
今天 DBA 同事问了一个问题,MySQL在半同步复制的场景下,当关闭从节点时使得从节点的数量 < rpl_semi_sync_master_wait_for_slave_count时,show ...
- mysql半同步复制问题排查
1.问题背景 默认情况下,线上的mysql复制都是异步复制,因此在极端情况下,主备切换时,会有一定的概率备库比主库数据少,因此切换后,我们会通过工具进行回滚回补,确保数据不丢失.半同步复制则 ...
随机推荐
- 跨平台跨架构的统信DTK开发套件教程及常见问题
DTK是统信基于Qt开发的一整套简单且实用的通用开发框架,处于统信UOS系统中的核心位置,统信UOS浏览器.音乐.邮件等40余款原生应用全部使用DTK开发.DTK从开发者的角度出发,融合现代化的开发理 ...
- Java基础——自动装箱与拆箱
装箱:把基本数据类型转换为对应的包装类类型 //装箱Integer i=Integer.ValuesOf(100);//自动装箱integer i1=100;//能够直接赋值成功的称为自动装箱,也调用 ...
- 面板Panel
面板 主要步骤: 1.new一个frame窗口 格式 Frame frame = new Frame() 2.设置窗口的大小.位置.可见性 3.设置frame窗口的布局格式(分为流式布局,东西南北中, ...
- Docker——镜像讲解
镜像是什么 镜像是一种轻量级,可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码.运行时.库.环境变量和配置文件. 所有的应用,直接打包doc ...
- 内置方法 __new__ __del__
1.__new__ 构造方法 实例化对象是先执行__new__方法,但是类中没有__new__方法,所以先到父类object类中的new方法,开辟一个属于对象的空间,然后再执行init方法 设计模式: ...
- 数据库原理 之MySQL
数据库种类: 关系型数据库: mysql 专注于数据安全 和功能 ,存取时 会有表的结构化操作解析sql语句---- 丢给磁盘存取 ----取出,结构化成表 常用关系型数据库产品介绍oracle数据库 ...
- badusb
badusb介绍 BadUSB是利用伪造HID设备执行攻击载荷的一种攻击方式.HID(Human InterfaceDevice)设备通常指的就是键盘鼠标等与人交互的设备,用户插入BadUSB,就会 ...
- error LNK2019: 无法解析的外部符号 _WinMain@16,该符号在函数。。。使用
一,问题描述 MSVCRTD.lib(crtexew.obj) : error LNK2019: 无法解析的外部符号 _WinMain@16,该符号在函数 ___tmainCRTStartup 中被引 ...
- Ajax的核心的对象是什么?
Ajax的核心对象是XMLXMLHttpRequest 对象. XMLHttpRequest提供不重新加载页面的情况下更新网页,在页面加载后在客户端向服务器请求数据,在页面加载后在服务器端接受数据,在 ...
- vue Cannot read property ‘tapPromise‘ of undefined
https://blog.csdn.net/qq379682421/article/details/111574290 https://github.com/SimenB/add-asset-html ...