MySQL 5.7.22
启用增强半同步复制

MySQL对该参数值的描述

Semisync can wait for slave ACKs at one of two points,
AFTER_SYNC or AFTER_COMMIT. AFTER_SYNC is the default value.
AFTER_SYNC means that semisynchronous replication waits just after the
binary log file is flushed, but before the engine commits, and so
guarantees that no other sessions can see the data before replicated to
slave. AFTER_COMMIT means that semisynchronous replication waits just
after the engine commits. Other sessions may see the data before it is
replicated, even though the current session is still waiting for the commit
to end successfully.

From: Source Code mysql-5.7.22\plugin\semisync\semisync_master_plugin.cc

Replication: Semisynchronous replication master servers now use a different wait point by default in communicating wih slaves. This is the point at which the master waits for acknowledgment of transaction receipt by a slave before returning a status to the client that committed the transaction. The wait point is controlled by the new rpl_semi_sync_master_wait_point system variable. These values are permitted:

AFTER_SYNC (the default): The master writes each transaction to its binary log and the slave, and syncs the binary log to disk. The master waits for slave acknowledgment of transaction receipt after the sync. Upon receiving acknowledgment, the master commits the transaction to the storage engine and returns a result to the client, which then can proceed.

AFTER_COMMIT: The master writes each transaction to its binary log and the slave, syncs the binary log, and commits the transaction to the storage engine. The master waits for slave acknowledgment of transaction receipt after the commit. Upon receiving acknowledgment, the master returns a result to the client, which then can proceed.

For older versions of MySQL, semisynchronous master behavior is equivalent to a setting of AFTER_COMMIT.

The replication characteristics of these settings differ as follows:

With AFTER_SYNC, all clients see the committed transaction at the same time: After it has been acknowledged by the slave and committed to the storage engine on the master. Thus, all clients see the same data on the master.

In the event of master failure, all transactions committed on the master have been replicated to the slave (saved to its relay log). A crash of the master and failover to the slave is lossless because the slave is up to date.

With AFTER_COMMIT, the client issuing the transaction gets a return status only after the server commits to the storage engine and receives slave acknowledgment. After the commit and before slave acknowledgment, other clients can see the committed transaction before the committing client.

If something goes wrong such that the slave does not process the transaction, then in the event of a master crash and failover to the slave, it is possible that such clients will see a loss of data relative to what they saw on the master.

The new wait point is a behavior change, but requires no reconfiguration. The change does introduce a version compatibility constraint because it increments the semisynchronous interface version: Servers for MySQL 5.7.2 and up do not work with semisynchronous replication plugins from older versions, nor do servers from older versions work with semisynchronous replication plugins for MySQL 5.7.2 and up.

From:https://dev.mysql.com/doc/relnotes/mysql/5.7/en/news-5-7-2.html

测试表

Create Table: CREATE TABLE `syk`.`t` (
`t` datetime DEFAULT NULL,
`a` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
insert into syk.t (t,a) values(now(),1);
commit;

准备3个会话窗口,A,B,C
A窗口连接主库,负责更改主库的参数及表更新操作
B窗口负责监视主库数据的变化,执行下述命令

while (true);do
mysql -uroot -pmysql- -e "select now(),t,a from syk.t" -s --skip-column-names >& | grep -v Warning
sleep
done

C窗口负责从库,slave的重启操作,模拟从库的slave停止

AFTER_SYNC
5.7.2及以上默认值

A:

mysql> show variables like '%rpl%point%';
+---------------------------------+------------+
| Variable_name | Value |
+---------------------------------+------------+
| rpl_semi_sync_master_wait_point | AFTER_SYNC |
+---------------------------------+------------+ mysql> show global status like '%rpl%master%status%';
+-----------------------------+-------+
| Variable_name | Value |
+-----------------------------+-------+
| Rpl_semi_sync_master_status | ON |
+-----------------------------+-------+ mysql> select * from syk.t;
+---------------------+------+
| t | a |
+---------------------+------+
| 2018-08-02 14:57:15 | 1 |
+---------------------+------+

B:
此时B窗口一直在查询表数据
C:
停止slave

A:

mysql> update syk.t set t=now() where a=1;
Query OK, 1 row affected (0.01 sec)
Rows matched: 1 Changed: 1 Warnings: 0 mysql> commit;
Query OK, 0 rows affected (10.00 sec) mysql> select * from syk.t;
+---------------------+------+
| t | a |
+---------------------+------+
| 2018-08-02 15:21:51 | 1 |
+---------------------+------+
1 row in set (0.00 sec)

A窗口的commit延迟了10秒才提交成功。受rpl_semi_sync_master_timeout参数影响,默认100000毫秒,即10秒。

B:

2018-08-02 15:21:50 2018-08-02 14:57:15 1
2018-08-02 15:21:51 2018-08-02 14:57:15 1 <=========
2018-08-02 15:21:52 2018-08-02 14:57:15 1
2018-08-02 15:21:53 2018-08-02 14:57:15 1
2018-08-02 15:21:54 2018-08-02 14:57:15 1
2018-08-02 15:21:55 2018-08-02 14:57:15 1
2018-08-02 15:21:56 2018-08-02 14:57:15 1
2018-08-02 15:21:57 2018-08-02 14:57:15 1
2018-08-02 15:21:58 2018-08-02 14:57:15 1
2018-08-02 15:21:59 2018-08-02 14:57:15 1
2018-08-02 15:22:00 2018-08-02 14:57:15 1
2018-08-02 15:22:01 2018-08-02 14:57:15 1
2018-08-02 15:22:02 2018-08-02 14:57:15 1
2018-08-02 15:22:03 2018-08-02 14:57:15 1
2018-08-02 15:22:04 2018-08-02 14:57:15 1
2018-08-02 15:22:05 2018-08-02 15:21:51 1 <=========

可以看到,主库的其他会话需要等待提交显示OK之后,才能看得到。

AFTER_COMMIT
5.7.2之前(不含5.7.2)的版本,的版本默认行为

A:

set global rpl_semi_sync_master_wait_point=AFTER_COMMIT;

C:
重启slave

A:

mysql> show variables like '%rpl%point%';
+---------------------------------+--------------+
| Variable_name | Value |
+---------------------------------+--------------+
| rpl_semi_sync_master_wait_point | AFTER_COMMIT |
+---------------------------------+--------------+
1 row in set (0.00 sec) mysql> show global status like '%rpl%master%status%';
+-----------------------------+-------+
| Variable_name | Value |
+-----------------------------+-------+
| Rpl_semi_sync_master_status | ON |
+-----------------------------+-------+
1 row in set (0.00 sec) mysql> select * from syk.t;
+---------------------+------+
| t | a |
+---------------------+------+
| 2018-08-02 15:21:51 | 1 |
+---------------------+------+
1 row in set (0.00 sec)

B:
此时B窗口一直在查询表数据
C:
停止slave

A:

mysql> update syk.t set t=now() where a=1;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0 mysql> commit;
Query OK, 0 rows affected (10.01 sec) mysql> select * from syk.t;
+---------------------+------+
| t | a |
+---------------------+------+
| 2018-08-02 15:38:42 | 1 |
+---------------------+------+
1 row in set (0.00 sec)

A窗口的commit同样延迟了10秒才提交成功。受rpl_semi_sync_master_timeout参数影响,默认100000毫秒,即10秒。

B:

2018-08-02 15:38:41 2018-08-02 15:21:51 1
2018-08-02 15:38:42 2018-08-02 15:21:51 1
2018-08-02 15:38:43 2018-08-02 15:38:42 1 <=========
2018-08-02 15:38:44 2018-08-02 15:38:42 1
2018-08-02 15:38:45 2018-08-02 15:38:42 1
2018-08-02 15:38:46 2018-08-02 15:38:42 1
2018-08-02 15:38:47 2018-08-02 15:38:42 1
2018-08-02 15:38:48 2018-08-02 15:38:42 1
2018-08-02 15:38:49 2018-08-02 15:38:42 1
2018-08-02 15:38:50 2018-08-02 15:38:42 1
2018-08-02 15:38:51 2018-08-02 15:38:42 1
2018-08-02 15:38:52 2018-08-02 15:38:42 1
2018-08-02 15:38:53 2018-08-02 15:38:42 1
2018-08-02 15:38:54 2018-08-02 15:38:42 1
2018-08-02 15:38:55 2018-08-02 15:38:42 1
2018-08-02 15:38:56 2018-08-02 15:38:42 1

虽然A的提交延迟了10秒,但其他会话已经看到已经提交的数据。

总结:
实验的对比,可以发现与源码中的描述是一致的。
AFTER_SYNC意味着半同步复制,在binary log被flush之后,在存储引擎commit前进入等待,这可以保证数据在被复制到从库前不被其他会话可见;
AFTER_COMMIT意味着半同步复制在存储引擎commit之后进入等待,尽管发起commit的会话还未收到commit成功的提示,其他的会话已经可以看到commit后的数据。
rpl_semi_sync_master_wait_point,该参数也正如其字面意思,master在哪个点开始等待。

Bullet:MySQL增强半同步参数rpl_semi_sync_master_wait_point值AFTER_SYNC和AFTER_COMMIT的对比实验的更多相关文章

  1. MySQL增强半同步的搭建实验,和一些参数的个人理解

    关于参数理解,已补充实验,可以查看: rpl_semi_sync_master_wait_no_slave 参数研究实验 环境信息 role ip port hostname master 192.1 ...

  2. MySQL增强半同步几个重要参数搭配的测试

      Preface       Semi-synchronous replication is supported since MySQL 5.5 and then enhanced graduall ...

  3. MySQL 5.7 新特性之增强半同步复制

    1. 背景介绍 半同步复制 普通的replication,即mysql的异步复制,依靠mysql二进制日志也即binary log进行数据复制.比如两台机器,一台主机(master),另外一台是从机( ...

  4. MySQL 5.7的复制架构,在有异步复制、半同步、增强半同步、MGR等的生产中,该如何选择?

    一.生产环境中: 几种复制场景都有存在的价值.下面分别描述一下: 从成熟度上来选择,推荐:异步复制(GTID+ROW) 从数据安全及更高性能上选择:增强半同步 (在这个结构下也可以把innodb_fl ...

  5. PostgreSQL的同步级别与MySQL的半同步after_sync比较

    MySQL的半同步中通过binlog进行流复制,同步级别和PostgreSQL对比可以发现: PostgreSQL                MySQL off local            ...

  6. MySQL的半同步是什么?

    前言 年后在进行腾讯二面的时候,写完算法的后问的第一个问题就是,MySQL的半同步是什么?我当时直接懵了,我以为是问的MySQL的两阶段提交的问题呢?结果确认了一下后不是两阶段提交,然后面试官看我连问 ...

  7. (MHA+MYSQL-5.7增强半同步)高可用架构设计与实现

           架构使用mysql5.7版本基于GTD增强半同步并行复制配置 reploication 一主两从,使用MHA套件管理整个复制架构,实现故障自动切换高可用        优势:       ...

  8. mysql的半同步复制

    1. binlog dump线程何时向从库发送binlog mysql在server层进行了组提交之后,为了提高并行度,将提交阶段分为了 flush sync commit三个阶段,根据sync_bi ...

  9. MySQL主从复制半同步复制原理及搭建

    在MySQL5.5之前的版本中,MySQL的复制是异步复制,主库和从库的数据之间存在一定的延迟,比如网络故障等各种原因,这样子容易存在隐患就是:当在主库写入一个事务成功后并提交了,但是由于从库延迟没有 ...

随机推荐

  1. appium的get_attribute方法

    转http://blog.csdn.net/bear_w/article/details/50330753 问题描述 当使用类似下面的代码获取元素的 content-desc 属性时,会报 NoSuc ...

  2. 安装phpwind报错

    在安装phpwind时,下面的报错提示是什么原因呢?  答:数据库密码应设置为空

  3. [App Store Connect帮助]七、在 App Store 上发行(2.2)设定价格与销售范围:将您的 App 以预订形式发布

    在首次将您的 App 发布至 App Store 前,您可以选择以预订形式提供该 App.在您的 App 发布以供下载之前,顾客可以查看您的产品页并订购您的 App.您的 App 一旦发布,顾客将会收 ...

  4. Noip2014生活大爆炸版石头剪刀布【水模拟】

    模拟暴力也要优雅. https://www.luogu.org/problemnew/show/P1328 像我这种蒟蒻就会敲无数个ifelse qaq. 可以优雅地进行预处理一下. 膜法真是好东西q ...

  5. 环境变量解释以及在Linux下的环境变量设置

    一.环境变量解释 环境变量是什么? 引用百度百科里面的解释:环境变量是操作系统中一个具有特定名字的对象,它包含了一个或者多个应用程序所将使用到的信息.例如Windows系统中的path环境变量,当要求 ...

  6. HTML/XML转义字符对照表

    HTML/XML转义字符对照表 HTML/XML转义字符对照表包含符号.数学符号.希腊字母 .重要的国际标志.ISO 8859-1 (Latin-1)字符集.特殊符号等. 1.特殊字符转义表 字符 十 ...

  7. listBox 搜索左右移动

    <td align="left" width="50%"> 查询:<asp:TextBox ID="SacffSearch" ...

  8. AJPFX总结final、finally、finallize的区别

    final.finally.finallize有何区别?    final表示一个修饰符,如果用它来修饰一个类,则该类是不能继承的:如果用它来修饰一个变量,则该变量一旦赋值之后就不能再修改:如果用它来 ...

  9. 从java toBinaryString() 看计算机数值存储方式(原码、反码、补码)

    一.toBinaryString 方法及其含义 1.1 方法说明 该方法位于java.lang.Integer类中 方法签名:public static String toBinaryString(i ...

  10. 波哥!一个不安分的IT男

    第一篇博文,紧张,窃喜,辣眼睛! 这个订阅号主要是写给自己的,近期越来越发现记忆力不如以前了! 时光如梭,岁月荏苒,或许这两句经典的开头文比较契合自己的年纪.依稀记得几年前还在组装服务器.搬机柜.做系 ...