半同步复制

默认配置下,MYSQL主从库通过binlog来保持一致,主库事务提交后,将binlog日志写入磁盘,然后返回给用户,备库通过拉取主库的binlog来同步主库的操作,无法保证主备节点数据实时一致,只能保证最终一致,因此属于异步复制。

为保证在主备切换时,主备节点数据完全一致,MYSQL提供了半同步复制,其实现原理为:事务在主库上执行完成,生成BINLOG并推送给备库,等待备库的影响消息,备库将接受到的binlog(file,pos)信息返回给主库,主库接收到背库的确认消息后,在返回给用户,事务提交完成。

半同步复制只保证主库和备库的binlog同步,但主库无需等待备库应用这些binglog就会返回提交结果,从库异步地应用这些binlog,因此主库和从库的数据不是实时同步的,因此称为“半同步”。

半同步复制参数rpl_semi_sync_master_timeout用于控制主库等待备库响应的消息时间(单位ms),如果超过该阀值,则认为备库存在问题,将半同步复制修改为异步复制,避免主库的执行事务长时间等待。参数rpl_semi_sync_master_timeout的默认值为50ms。
rpl_semi_sync_master_enabled:表示主上是否开启半同步复制功能,可以动态修改。可选值:ON\OFF
rpl_semi_sync_slave_enabled:表示从上是否开启半同步复制功能,可以动态修改。可选值:ON\OFF

半同步复制要求执行的每一个事务,都至少有一个备库成功接收后,才返回给用户,在主库实例上,有一个专门的线程(ack_receiver)接收备库的响应消息,并以通知机制告知备库已经接收日志。在半同步复制模式下,默认Master发送事务默认至少需要一个Slave的响应才能继续下一个事务,在MySQL5.7版本中引入参数rpl_semi_sync_master_wait_for_slave_count来设置需要应答的Slave的数量,默认值为1。在一主多从的架构下,可以增大rpl_semi_sync_master_wait_for_slave_count的值来保证多个从库均包含最新事务,但增加rpl_semi_sync_master_wait_for_slave_count的值会增加主库等待接受从库响应的时间。

半同步复制通信模式

MySQL 5.5和MySQL5.6的半同步复制使单工通信方式,master发送事务的Binlog后,需要接收和处理Slave的应答后才会继续发送下一个事务:

而MySQL 5.7的半同步复制创建单独的应答接收线程,形成双工模式,发送和接收互不影响,因此提示发送效率,降低半同步的延迟。

PS: MySQL5.7单独的应答接收线程在开启半同步复制的时候默认创建,无需额外设置。

AFTER_COMMIT与AFTER_SYNC

在MySQL 5.5中引入半同步复制,默认使用AFTER_COMMIT方式,因为主库上事务在提交后才发送给从库,因此存在主库宕机导致事务丢失的情况。

AFTER_COMMIT操作顺序:

AFTER_COMMIT:
1>将事务写入binlog和备库
2>将binlog刷新到磁盘
3>提交事务,等待备库返回确认信息
4>接收到备库确认信息
5>返回结果给客户端

在MySQL 5.7版本对半同步复制做了改进,增加了AFTER_SYNC方式,并默认使用AFTER_SYNC方式。

AFTER_SYNC操作顺序:

1>将事务写入binlog和备库
2>将binlog刷新到磁盘
3>等待备库返回确认信息
4>接收到备库确认信息,提交事务
5>返回结果给客户端

AFTER_COMMIT和AFTER_SYNC对比

两者区别在于:
AFTER_COMMIT:在接收到备库确认信息前将事务提交
AFTER_SYNC:在接收到备库确认信息后将事务提交 造成影响:
对于AFTER_SYNC,所有客户端可以在同一时间看到事务被提交;
对于AFTER_COMMIT,由于事务提交后还需要等待备库的确认信息,在提交事务的客户端等待的这段时间内,其他客户端已经可以看到事务提交,并能访问到被提交的数据。 主库发生宕机时:
对于AFTER_SYNC,所有在主库上提交的事务都已复制到备库,因此备库数据是实时的,主备切换不丢失数据。
对于AFTER_COMMIT,不能保证所有主库上提交的事务都已复制到备库,存在数据丢失风险。 假设主库执行事务A操作新增一条数据并提交,事务A产生的BINLOG传递给从库并等待从库返回ACK,此时主库宕机并主从自动故障切换:
场景1:从库未收到事务A的BINLOG,主从切换后新主库上事务A的数据丢失
1、在AFTER_COMMIT模式下,主从切换前由于"事务已提交"应用其他线程读取到事务A新增记录,主从切换后对新增记录进行更新,更新失败业务异常。
2、在AFTER_SYNC模式下,主从切换前由于"事务未提交"应用其他线程无法读取到事务A新增记录,主从切换前后不存在”幻读“情况。 场景2:从库收到事务A的BINLOG,主从切换后新主库含有事务A的新增数据
1、在AFTER_COMMIT模式下,执行事务A的操作未收到事务提交成功消息,判断插入操作失败重试,操作自动切换后的新主库,导致数据重复业务异常。
2、在AFTER_SYNC模式下,执行事务A的操作未收到事务提交成功消息,判断插入操作失败重试,操作自动切换后的新主库,导致数据重复业务异常。

启用半同步复制

## 查看MYSQL服务器是否支持动态插件
SELECT @@have_dynamic_loading;
+------------------------+
| @@have_dynamic_loading |
+------------------------+
| YES |
+------------------------+ ##在主库和从库上安装PLUGIN,执行:
INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so'; ##在主库和从库上启用半同步复制,并设置等待时长为1000ms,执行:
SET GLOBAL rpl_semi_sync_master_enabled = 1;
SET GLOBAL rpl_semi_sync_master_timeout = 1000;
SET GLOBAL rpl_semi_sync_slave_enabled = 1; ##在从库上重启IO_THREAD,执行:
STOP SLAVE IO_THREAD;
START SLAVE IO_THREAD; PS1: 理论上只需要在从库和主库分别启用就好,但为故障切换时操作方便,可以在主从库上都启用。
PS2: 在设置半同步参数后,需要重启复制才能生效。

半同步复制相关参数

##============================================================
##查看半同步复制的状态和参数:
SHOW VARIABLES LIKE 'rpl_semi_sync%';
+-------------------------------------------+------------+
| Variable_name | Value |
+-------------------------------------------+------------+
| rpl_semi_sync_master_enabled | ON |
| rpl_semi_sync_master_timeout | 1000 |
| rpl_semi_sync_master_trace_level | 32 |
| rpl_semi_sync_master_wait_for_slave_count | 1 |
| rpl_semi_sync_master_wait_no_slave | ON |
| rpl_semi_sync_master_wait_point | AFTER_SYNC |
+-------------------------------------------+------------+ rpl_semi_sync_master_wait_no_slave:
是否允许master 每个事物提交后都要等待slave的receipt信号。
默认为on,每一个事务都会等待,如果slave当掉后,当slave追赶上master的日志时,可以自动的切换为半同步方式。
如果为off,则slave追赶上后,也不会采用半同步的方式复制了,需要手工配置。 rpl_semi_sync_master_enabled:主库是否启用半同步。
rpl_semi_sync_slave_enabled:从库是否启用半同步。
rpl_semi_sync_master_timeout:主库等待半同步复制信息返回的超时间隔,默认10秒(单位毫秒)。 rpl_semi_sync_master_trace_level:监控等级
1 = general level (for example, time function failures)
16 = detail level (more verbose information)
32 = net wait level (more information about network waits)
64 = function level (information about function entry and exit) rpl_semi_sync_master_wait_for_slave_count: 主库等待确认消息的从库数量。 rpl_semi_sync_master_wait_point:半同步复制方式,AFTER_SYNC或AFTER_COMMIT。

半同步复制相关参数

##============================================================
##查看半同步复制的状态
SHOW STATUS LIKE 'rpl_semi_sync%';
+--------------------------------------------+-------+
| Variable_name | Value |
+--------------------------------------------+-------+
| Rpl_semi_sync_master_clients | |
| Rpl_semi_sync_master_net_avg_wait_time | |
| Rpl_semi_sync_master_net_wait_time | |
| Rpl_semi_sync_master_net_waits | |
| Rpl_semi_sync_master_no_times | |
| Rpl_semi_sync_master_no_tx | |
| Rpl_semi_sync_master_status | ON |
| Rpl_semi_sync_master_timefunc_failures | |
| Rpl_semi_sync_master_tx_avg_wait_time | |
| Rpl_semi_sync_master_tx_wait_time | |
| Rpl_semi_sync_master_tx_waits | |
| Rpl_semi_sync_master_wait_pos_backtraverse | |
| Rpl_semi_sync_master_wait_sessions | |
| Rpl_semi_sync_master_yes_tx | |
+--------------------------------------------+-------+ Rpl_semi_sync_master_clients:当前有多少个从库被设置为半同步模式。 Rpl_semi_sync_master_net_avg_wait_time:等待从库返回去确认消息的平均时间(单位:ms) Rpl_semi_sync_master_net_wait_time:等到从库返回确认消息的总时间(单位:ms) Rpl_semi_sync_master_net_waits:等待从库返回确认消息的总次数 Rpl_semi_sync_master_no_tx:事务没有得到从库返回确认消息就提交的次数,The number of commits that were not acknowledged successfully by a slave. Rpl_semi_sync_master_timefunc_failures:调用函数gettimeofday()失败的次数,The number of times the master failed when calling time functions such as gettimeofday(). Rpl_semi_sync_master_tx_avg_wait_time:主库上平均每个事务等待时长,The average time in microseconds the master waited for each transaction. Rpl_semi_sync_master_tx_wait_time:主库上事务等待的总时长,The total time in microseconds the master waited for transactions. Rpl_semi_sync_master_tx_waits:主库上事务等待的次数,The total number of times the master waited for transactions. Rpl_semi_sync_master_wait_pos_backtraverse:改变当前等待最小二进制日志的次数,The total number of times the master waited for an event with binary coordinates lower than events waited for previously. This can occur when the order in which transactions start waiting for a reply is different from the order in which their binary log events are written. Rpl_semi_sync_master_wait_sessions:当前等待从库返回确认消息的回话数,The number of sessions currently waiting for slave replies. Rpl_semi_sync_master_yes_tx:得到从库返回消息的事务数,The number of commits that were acknowledged successfully by a slave. 当半同步复制开启后,Rpl_semi_sync_master_status 变量用动态地显示半同步复制的状态。
Rpl_semi_sync_master_status设置为OFF,表明当前处于异步复制下,当等待从库返回确认消息时间超过rpl_semi_sync_master_timeout值后修改为OFF.;Rpl_semi_sync_master_status设置为ON,表明当前处于半同步复制下。当从库追赶上主库后修改为ON,
If a timeout occurs without any slave having acknowledged the transaction, the master reverts to asynchronous replication. When at least one semisynchronous slave catches up, the master returns to semisynchronous replication.

参考链接:

https://www.jianshu.com/p/3bfb0bfb8b34
http://www.cnblogs.com/zhoujinyi/p/5704567.html

MySQL Replication--半同步复制(Semi-Sync Replication)的更多相关文章

  1. MySQL 5.7半同步复制after sync和after commit详解【转】

    如果你的生产库开启了半同步复制,那么对数据的一致性会要求较高,但在MySQL5.5/5.6里,会存在数据不一致的风险.有这么一个场景,客户端提交了一个事务,master把binlog发送给slave, ...

  2. mysql的半同步复制

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

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

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

  4. MySQL的半同步复制监控

    (1)master端 >show variables like 'rpl_semi_sync%'; +------------------------------------+-------+ ...

  5. Mysql半同步复制模式说明及配置示例 - 运维小结

    MySQL主从复制包括异步模式.半同步模式.GTID模式以及多源复制模式,默认是异步模式 (如之前详细介绍的mysql主从复制).所谓异步模式指的是MySQL 主服务器上I/O thread 线程将二 ...

  6. mysql主从之半同步复制和lossless无损复制

    一 MySQL 的三种复制方式 1.1 简介 asynchronous 异步复制 fully synchronous 全同步复制 Semisynchronous 半同步复制 从MySQL5.5 开始, ...

  7. MySQL半同步复制源码解析

    今天 DBA 同事问了一个问题,MySQL在半同步复制的场景下,当关闭从节点时使得从节点的数量 < rpl_semi_sync_master_wait_for_slave_count时,show ...

  8. MySQL半同步复制

    从MySQL5.5开始,MySQL以插件的形式支持半同步复制.如何理解半同步呢?首先我们来看看异步,全同步的概念 异步复制(Asynchronous replication) MySQL默认的复制即是 ...

  9. 1018关于MySQL复制搭建[异步复制和半同步复制]

    转自:http://www.cnblogs.com/ivictor/p/5735580.html 搭建MySQL数据库的主从架构,还是蛮简单的.重要的几个命令整理一下. 主从服务器上: SHOW VA ...

  10. 安装MySQL半同步复制

    一.简介 从MySQL5.5开始,MySQL以插件的形式支持半同步复制.如何理解半同步呢?首先我们来看看异步,全同步的概念 异步复制(Asynchronous replication) MySQL默认 ...

随机推荐

  1. android 8.1 wifi提示"已连接 但无法访问互联网"的解决办法

    主要是GFW的问题 adb shell以下命令解决 settings put settings put settings put settings put global captive_portal_ ...

  2. 连接池-Mybatis源码

    持续更新:https://github.com/dchack/Mybatis-source-code-learn Mybatis连接池 有这么个定律,有连接的地方就有池. 在市面上,可以适配Mybat ...

  3. 仿简书MarkDown编辑器可同步滚动

    模仿简书的MarkDown编辑器,使用Angular8写的示例 1.支持同步滚动 编辑的过程中,右侧预览界面会同步滚动.滚动右侧预览界面,左侧编辑区也会同步滚动哦 2.支持语法高亮 如下: using ...

  4. Sigmoid函数的替代:overflow encountered in exp in computing the logistic function

    RuntimeWarning: overflow encountered in exp in computing the logistic function 以下是sigmoid函数的标准写法,但是如 ...

  5. spring boot 指定启动端口

    spring boot 默认端口为8080 1.修改为指定端口 (1)修改配置文件 src/main/resources/application.properties server.port= (2) ...

  6. Netty学习-IO体系架构系统回顾 & 装饰模式Decorator的具体使用

    Netty学习-IO体系架构系统回顾 IO和NIO的学习 NIO - 1.4 开始出的 在网络应用框架中,NIO得到了大量的使用,特别是netty里面 前提:对IO及其了解 对IO的总结和回顾 理解J ...

  7. Website Scraping with Python 阅读笔记

    第一章 工程涉及的基本工具:requests, beautiful soup, scrapy. 法规与技术约定:read the Terms & Conditions and the Priv ...

  8. MySQL [Err] 1055--1064 - Expression #1 of ORDER BY clause is not in GROUP BY clause

    1055错误: 方案1: 修改sql_mode的值 set sql_mode = '';set sql_mode = 'NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABL ...

  9. STM8L052C6T6液晶LCD驱动过程

    首先还是必要的说明,鄙人经验有限,如发现问题还请不吝赐教,反馈到邮箱mr.li.ming@qq.com 使用的液晶屏 单片机引脚 液晶的COM1-COM4分别对应单片机LCD_COM0-LCD_COM ...

  10. 【基本知识】UART接口

    1.简介 (1)UART一种通用异步串口数据总线,最低采用两路信号(TX/RX)即可实现全双工通信,十分简单: (2)UART采用LSB模式传输,串口数据传输格式如下图所示: 起始位:长度为1位的时间 ...