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复制都是异步复制,因此在极端情况下,主备切换时,会有一定的概率备库比主库数据少,因此切换后,我们会通过工具进行回滚回补,确保数据不丢失.半同步复制则 ...
随机推荐
- 服务器中一个进程kill不掉,如何处理?
问题描述: 我们在服务器中有时候kill一个进程,会碰到死活杀不死的情况,那么有可能这个进程成为了一个僵尸进程,zombie状态.这种情况是这个进程释放了资源,但是没有得到父进程的确认. 可以使用命令 ...
- java-计算机
计算机 硬件 装机:CPU 内存 主板 IO设备(input output) 冯诺依曼体系结构 CPU读取数据在运算器中运算传输到存储器,控制器控制输出结果. 软件
- 《浅谈产品》——加油APP的平台是如何做的
最近油价又上涨了,我们平常去加油站加油用到"某滴加油"."某团加油"这些APP,一般情况下加200的油,各种优惠下来,最终只需要付170左右就可以了,基本是优惠 ...
- Adobe AIR 应用程序图标详细描述
官方PDF文档: http://help.adobe.com/zh_CN/air/build/WS901d38e593cd1bac1e63e3d129907d2886-8000.html#WS901d ...
- ClassNotFoundException: org.springframework.web.context.ContextLoadServlet
web.xml中配置 <!-- 配置spring核心监听器,默认会以 /WEB-INF/applicationContext.xml作为配置文件 --> <listener> ...
- SpringDataRedis的Keyspaces设置
前言 原文:https://docs.spring.io/spring-data/redis/docs/2.3.2.RELEASE/reference/html/#redis.repositories ...
- Elasticsearch 对于大数据量(上亿量级)的聚合如何实现?
Elasticsearch 提供的首个近似聚合是 cardinality 度量.它提供一个字段的基数, 即该字段的 distinct 或者 unique 值的数目.它是基于 HLL 算法的.HLL 会 ...
- Python turtle 模块可以编写游戏,是真的吗?
1. 前言 turtle (小海龟) 是 Python 内置的一个绘图模块,其实它不仅可以用来绘图,还可以制作简单的小游戏,甚至可以当成简易的 GUI 模块,编写简单的 GUI 程序. 本文使用 tu ...
- LQR (线性二次型调节器)的直观推导及简单应用
转自:https://blog.csdn.net/heyijia0327/article/details/39270597 本文主要介绍LQR的直观推导,说明LQR目标函数J选择的直观含义以及简单介绍 ...
- C++ | 虚函数初探
虚函数 虚函数 是在基类中使用关键字 virtual 声明的函数.在派生类中重新定义基类中定义的虚函数时,会告诉编译器不要静态链接到该函数. 我们想要的是在程序中任意点可以根据所调用的对象类型来选择调 ...