MySQL半同步after_sync与after_commit-程序员宅基地

技术标签: 数据库架构  dba  MySQL  mysql  数据库  

前言:

在MySQL半同步复制中,有两种日志同步的ACK模式,分别是after_sync与after_commit,本文主要介绍两种模式下,主从同步数据的一致性情况。

测试环境:

主库        从库
192.168.1.110:3306 192.168.1.111:3306

半同步配置参数:

rpl_semi_sync_master_timeout=10000000
rpl_semi_sync_master_wait_for_slave_count=1
rpl_semi_sync_master_wait_point=after_sync|after_commit

after_commit模式:

after_commit:主库写入事务到binlog以及同步从库,sync binlog,并且提交事务到存储引擎,在提交之后主库等待从库接受到事务的确认,在接受到确认之后,源端返回提交完成到客户端。

在after_commit下,提交事务的客户端需要等待确认从库已经接收到事务才能返回,但由于提交到存储引擎是在确认从库之前完成,所以,其他客户端将比提交事务的客户端更早的看到提交事务的数据,在发生故障切换时,在对于已经提交存储引擎但还没有确认从库已经提交的事务,其他客户端可能会出现与他们在源上看到的数据相关的数据丢失。

提交流程:client-->execute sql-->wrtie redolog-->write binlog-->innodb storage commit-->wait ACK-->client receive OK。

暂停从库io_thread。

stop slave io_thread;
​
root@localhost : (none)06:19:40>stop slave io_thread;
Query OK, 0 rows affected (0.01 sec)
​
root@localhost : (none)06:19:55>show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: 
                  Master_Host: 192.168.1.110
                  Master_User: rep
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: nlog.000010
          Read_Master_Log_Pos: 377
               Relay_Log_File: mysql-relay-bin.000018
                Relay_Log_Pos: 500
        Relay_Master_Log_File: nlog.000010
             Slave_IO_Running: No
            Slave_SQL_Running: Yes
              Replicate_Do_DB: 
          Replicate_Ignore_DB: 
           Replicate_Do_Table: 
       Replicate_Ignore_Table: 
      Replicate_Wild_Do_Table: 
  Replicate_Wild_Ignore_Table: 
                   Last_Errno: 0
                   Last_Error: 
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 377
              Relay_Log_Space: 707
              Until_Condition: None
               Until_Log_File: 
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File: 
           Master_SSL_CA_Path: 
              Master_SSL_Cert: 
            Master_SSL_Cipher: 
               Master_SSL_Key: 
        Seconds_Behind_Master: NULL
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error: 
               Last_SQL_Errno: 0
               Last_SQL_Error: 
  Replicate_Ignore_Server_Ids: 
             Master_Server_Id: 3306
                  Master_UUID: 2b3039c9-57fa-11eb-b504-000c29ed797a
             Master_Info_File: mysql.slave_master_info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
           Master_Retry_Count: 86400
                  Master_Bind: 
      Last_IO_Error_Timestamp: 
     Last_SQL_Error_Timestamp: 
               Master_SSL_Crl: 
           Master_SSL_Crlpath: 
           Retrieved_Gtid_Set: 2b3039c9-57fa-11eb-b504-000c29ed797a:8346311
            Executed_Gtid_Set: 1b80feab-4aa6-11ec-9a60-000c29a6e7be:1-10,
2b3039c9-57fa-11eb-b504-000c29ed797a:1-8346311,
3a59d149-d4b8-11eb-8cf6-000c29a6e7b4:1-10,
a0a3d4b2-fff8-11eb-a420-000c29a6e7be:1-27
                Auto_Position: 1
         Replicate_Rewrite_DB: 
                 Channel_Name: 
           Master_TLS_Version:

插入数据。

begin;
insert into sbtest1(k,c,pad,d) values(1,'a','ziniu',1);
commit;

可以看到commit被挂起,没有返回。

主库其他会话查询该条数据,可以查到数据。

select * from sbtest1 where pad='ziniu';
​
root@localhost : sbtest06:27:17>select * from sbtest1 where pad='ziniu';
+--------+---+---+-------+------+
| id     | k | c | pad   | d    |
+--------+---+---+-------+------+
| 170006 | 1 | a | ziniu |    1 |
+--------+---+---+-------+------+
1 row in set (0.05 sec)

 但在从库查询不到该条数据。

root@localhost : sbtest06:27:27>select * from sbtest1 where pad='ziniu';
Empty set (0.06 sec)

这时候,如果发生主从故障切换,就会出现有些客户端在源上看到相关的数据丢失,因为故障切换前,在主库查到"ziniu"这条数据,但在切换之后却查不到该条数据,并且对于写入数据的客户端是没有收到commit提交完成的确认,所以,after_commit下主从出现了数据丢失,主从两边不是强一致性。

after_sync模式:

after_sync(默认):主库写入事务到binlog以及同步从库并且sync binlog to disk,主库同步后等待从库接受到事务的确认,在等到从库的确认之后,主库提交事务到存储引擎并且返回客户端。

在after_sync下,全部客户端同一时间看到已经提交的事务,因为是在确认从库已经接收到事务之后再提交存储引擎的,所以全部客户端是同一时间看到已经提交事务的数据;此外,在发生故障切换时,主库全部已经提交的事务已经同步到从库的relay log,从库的数据是无损的。

提交流程:client-->execute sql-->wrtie redolog-->write binlog-->wait ACK-->innodb storage commit-->client receive OK。

暂停从库io_thread。

root@localhost : sbtest06:30:32>stop slave io_thread;
Query OK, 0 rows affected (0.00 sec)
​
root@localhost : sbtest06:59:44>
root@localhost : sbtest06:59:45>
root@localhost : sbtest06:59:45>
root@localhost : sbtest06:59:45>show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: 
                  Master_Host: 192.168.1.110
                  Master_User: rep
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: nlog.000010
          Read_Master_Log_Pos: 3013
               Relay_Log_File: mysql-relay-bin.000023
                Relay_Log_Pos: 808
        Relay_Master_Log_File: nlog.000010
             Slave_IO_Running: No
            Slave_SQL_Running: Yes
              Replicate_Do_DB: 
          Replicate_Ignore_DB: 
           Replicate_Do_Table: 
       Replicate_Ignore_Table: 
      Replicate_Wild_Do_Table: 
  Replicate_Wild_Ignore_Table: 
                   Last_Errno: 0
                   Last_Error: 
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 3013
              Relay_Log_Space: 2099
              Until_Condition: None
               Until_Log_File: 
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File: 
           Master_SSL_CA_Path: 
              Master_SSL_Cert: 
            Master_SSL_Cipher: 
               Master_SSL_Key: 
        Seconds_Behind_Master: NULL
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error: 
               Last_SQL_Errno: 0
               Last_SQL_Error: 
  Replicate_Ignore_Server_Ids: 
             Master_Server_Id: 3306
                  Master_UUID: 2b3039c9-57fa-11eb-b504-000c29ed797a
             Master_Info_File: mysql.slave_master_info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
           Master_Retry_Count: 86400
                  Master_Bind: 
      Last_IO_Error_Timestamp: 
     Last_SQL_Error_Timestamp: 
               Master_SSL_Crl: 
           Master_SSL_Crlpath: 
           Retrieved_Gtid_Set: 2b3039c9-57fa-11eb-b504-000c29ed797a:8346311-8346318
            Executed_Gtid_Set: 1b80feab-4aa6-11ec-9a60-000c29a6e7be:1-10,
2b3039c9-57fa-11eb-b504-000c29ed797a:1-8346318,
3a59d149-d4b8-11eb-8cf6-000c29a6e7b4:1-10,
a0a3d4b2-fff8-11eb-a420-000c29a6e7be:1-27
                Auto_Position: 1
         Replicate_Rewrite_DB: 
                 Channel_Name: 
           Master_TLS_Version: 
1 row in set (0.00 sec)

插入数据。

begin;
insert into sbtest1(k,c,pad,d) values(1,'a','niuniu',1);
commit;

可以看到commit被挂起,没有返回。

主库其他会话查询该条数据,并没有查到数据。

select * from sbtest1 where pad='niuniu';
root@localhost : sbtest07:02:06>select * from sbtest1 where pad='niuniu';
Empty set (0.05 sec)
​
root@localhost : sbtest07:02:06>
root@localhost : sbtest07:02:07>

在从库也查询不到该条数据。

root@localhost : sbtest07:03:59>select * from sbtest1 where pad='niuniu';
Empty set (0.06 sec)
​
root@localhost : sbtest07:04:02>

这时候,如果发生主从故障切换,对于"niuniu"这条数据,只是一条客户端提交失败的数据,不存在数据的丢失,所以,after_sync下主从两边数据是强一致性​。

总结:

对于生产环境半同步的配置,建议配置after_sync模式,在after_sync模式下,​才能保证主从数据的强一致性。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/sinat_36757755/article/details/124389786

智能推荐

通过 SQL 访问 DB2 管理 API_db2 avgcollen-程序员宅基地

文章浏览阅读2.6k次。完全使用 SQL 语句来收集统计信息并将数据装载到表中级别: 中级Knut StolzeDB2 Websphere Information Integration Development, IBM 德国2005 年 5 月 19 日实现允许通过 SQL 使用 IBM DB2 Universal Database (DB2 UDB) 管理 API 的函数和存储过程。本文演示了两个存储过程,一个_db2 avgcollen

node-gyp与Python版本不同导致编译出错_node-gyp 哪个版本使用 python2.7_我要我自我的博客-程序员宅基地

文章浏览阅读2.1k次。[email protected] -》python2.7高版本的node-gyp需要安装python3_node-gyp 哪个版本使用 python2.7

input标签输入汉字高度变高的解决方法-程序员宅基地

文章浏览阅读1k次。当往input输入汉字时,input的高度变高,解决方法是设置line-height的高度等于input的高度。参考:input输入框中光标高度的变化问题_html/css_WEB-ITnose (gxlcms.com)

九度_题目1361:翻转单词顺序-程序员宅基地

文章浏览阅读700次。题目描述:JOBDU最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“student. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a student.”。Cat对一一的翻转这些单词顺序可不在行,你能帮助他么?输入:每

USB_STM32 学习_ep_tx_nak-程序员宅基地

文章浏览阅读2k次。我修改过的ST的Custom_HID例程http://download.csdn.net/source/2022984本文中修改好的例程http://download.csdn.net/source/2807366以下是笔者将ST的Custom_HID例程修改为“自定义USB设备”例程时总结出来的,因为笔者也是刚刚学USB开发不久,某些方面理解错误在所难免,请各位大虾指正。_ep_tx_nak

One-bit DAC-程序员宅基地

文章浏览阅读1.9k次。【TI博客大赛】【原创】LM3S811之基于PWM的DAChttp://bbs.ednchina.com/BLOG_ARTICLE_3005301.HTM http://www.fpga4fun.com/PWM_DAC_3.htmlOne-bit DACTake one pin of an FPGA, connect a speaker and l_one-bit dac

随便推点

源码安装nginx步骤_简述源码安装nginx的步骤-程序员宅基地

文章浏览阅读761次。** ## Nginx源码安装 **Nginx简介:Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行。其特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。目前还有淘宝研发的nginx,如果有兴趣的可..._简述源码安装nginx的步骤

Postman 发送请求-程序员宅基地

文章浏览阅读9.3k次。安装好之后,我们先打开Postman,可以看到界面分成左右两个部分,右边是我们后头要讲的collection,左边是现在要讲的request builder。在request builder中,我们可以通过Postman快速的随意组装出我们希望的request。一般来说,所有的HTTP Request都分成4个部分,URL, method, headers和body。而Postman针对这几部分都

RHEL7软件包管理-程序员宅基地

文章浏览阅读1.1k次。简称:Redhat Package Manager挂载光盘[root@localhost ~]# umount /dev/sr0 卸载[root@localhost ~]# mount /dev/sr0 /mnt 挂载rpm包名字结构zsh-5.0.2-14.el7.x86_64.rpm安装rpm软件-i --install 安装软件包--nodeps 不验证软件包依...

利用python分析权力的游戏五王之战数据-程序员宅基地

文章浏览阅读194次。本身是个美剧迷,其中权力的游戏是我最爱的美剧之一,所以我通过kaggle下载了数据集并进行分析。数据名称解释如下:name: 战争的名称,字符变量。year: 战争发生的年份,数值变量。battle_number: 本数据中的unique id,对应每一场独立的战役,数值变量。attacker_king: 攻击方的国王,"/"表示了国王的更换。例如:"Joffrey/Tommen ..._joffrey tommen

Android Studio安装过程及常见问题-程序员宅基地

文章浏览阅读1.9k次。Win7下安装 Android Studio(以下简称AS)之前在Eclipse上进行Android开发,近期想试一下AS,无奈在安装的过程中遇到各种问题,最终折腾了两天,终于把AS安装好了,于是想把安装过程和当中遇到的问题作一个总结。本文分为三部分,安装部分为环境配置和AS的安装。最后一部分是总结可能遇到的问题。一. 环境配置JDK安装以及环境配置下载jdk:首先到官网下载jdk安装包  请

Sprite的一些有趣的现象_sprite换行显示-程序员宅基地

文章浏览阅读913次。sprite是经常用到的显示对象,它有一些十分有趣的特性(也十分的坑爹)。 1.当sprite里面没有任何子显示对象,也没用graphics画任何的图形时,这时如果给sprite的width和height赋值的话,scaleX和scaleY将会变成0,之后再往sprite添加任何显示对象或者用graphics画图都不会显示。如果先添加显示对象,则sprite的width/height就是有里面_sprite换行显示

推荐文章

热门文章

相关标签