mysql 架构篇系列 4 复制架构一主一从搭建(半同步复制)
一.概述
在mysql 5.5之前,mysql 的复制是异步操作,主库和从库的数据之间存在一定的延时,这样存在一个隐患:当主库上写入一个事务并提交成功,而从库尚未得到主库推送的Binlog日志时,主库down机了,事务Binlog丢失了,此时从库就缺失了这个事务,从而造成主从不一致。
为了解决这个问题,mysql5.5 引入了半同步复制,在mysql 5.5之前的异步复制时,主库执行完Commit提交操作后,在主库写入Binlog日志后即可成功返回客户端,无需等待Binlog日志传送给从库,异步复制流程如下图所示:

对于半同步复制,能保证主库上的每一个Binlog事务都能被可靠的复制到从库上,主库在每次事务成功提交时,并不及时反馈给前端应用用户,而是等待其中一个从库也接收到Binlog事务并成功写入中继日志后,主库才返回Commit操作成功给客户端。 半同步复制保证了事务成功提交后,至少有两份日志记录,一份在主库的Binlog日志上,另一份在至少 一个从库的中继日志relay log上,从而更进一步保证的主从数据的一致性。半同步复制流程如下图所示:

在半同步复制模式下,假设步骤(1,2,3)的任何一个步骤中主库宕机,则事务并没有提交成功,从库也没收到事务binlog日志,所以主从数据是一致的。假如步骤(4)传送Binlog日志到从库时,从库宕机或者网络故障,导致binlog并没有及时传送到从库上,此时主库上的事务会等待一段时间(由参数rp1_semi_sync_master_timeout毫秒决定), 如果binlog在这段时间内都无法成功推送到从库上,则mysql自动调整复制为异步复制模式。事务正常返回提交结果给客户端。
二. 半同步(Semi-sync)复制配置步骤
下面半同步复制的配置步骤是基于前面第二篇 "一主一从搭建(异步复制)" 基础之上。半同步模式作为mysql5.5的一个插件来实现的,主库和从库使用不同的插件,需要安装
(1)判断mysql服务器是否支持动态增加插件
SELECT @@have_dynamic_loading

(2) 检查mysql的安装目录下是否存在插件,主库插件是semisync_master.so,从库插件是semisync_slave.so。
-- 主库插件位置:
SHOW VARIABLES LIKE 'plugin_dir';

-- 从库插件位置
SHOW VARIABLES LIKE 'plugin_dir';

--在主库上安装插件 semisync_master.so,安装完从plugin表查看
INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so'
SELECT * FROM mysql.`plugin`

--在从库上安装插件 semisync_slave.so ,安装完从plugin表查看
INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so'
SELECT * FROM mysql.`plugin`

(3) 需要分别在主库和从库上配置参数打开半同步semi-sync, 默认半同步设置是打不开的,主库上配置全局参数。
-- 主库上配置启用。设置主库传送到从库的Binlog日志,最大超时时间。
SET GLOBAL rpl_semi_sync_master_enabled=1;
SET GLOBAL rpl_semi_sync_master_timeout=3000;
-- 从库上
SET GLOBAL rpl_semi_sync_slave_enabled=1;
注意之前配置的复制是异步复制,所以需要重启一下从库上的I/O线程。
-- 从库停掉I/O 线程,再启动
STOP SLAVE IO_THREAD;
START SLAVE IO_THREAD;
(4) 同半步配置完毕后,下面验证一下
-- 主库上查看当前半同步复制的一些状态值
SHOW STATUS LIKE '%semi_sync%'

在上面的状态信息中,重点先来了解3个状态值:
Rpl_semi_sync_master_status: 值为ON, 代表半同步复制目前处于打开状态。
Rpl_semi_sync_master_yes_tx: 值表示主库当前有多少事务是通过半同步复制到从库的。
Rpl_semi_sync_master_no_tx: 值表示当前事务不是半同步下从库及时响应的(主从不同步时体现)。
-- 在主库上执行一个事务,再检查主库复制状态
UPDATE testbackup2 SET `name`='小李2' WHERE id=12

如上图所示,此时Rpl_semi_sync_master_yes_tx的值计数增加1,在查从库时刚修改的数据已同步。
三. 半同步复制参数信息说明
3.1 主库上semi_sync状态信息(SHOW STATUS LIKE '%semi_sync%')
|
状态名称 |
状态值 |
描述 |
|
Rpl_semi_sync_master_clients |
1 |
有多少个Semi-sync(半同步)的从库 |
|
Rpl_semi_sync_master_net_avg_wait_time |
0 |
事务提交后,等待slave响应的平均时间 |
|
Rpl_semi_sync_master_net_wait_time |
0 |
总的网络等待时间 (等待slave) |
|
Rpl_semi_sync_master_net_waits |
2 |
等待网络响应的总次数 (等待slave) |
|
Rpl_semi_sync_master_no_times |
0 |
一共有几次从Semi-sync跌回普通状态, 通俗叫:关闭半同步复制的次数 |
|
Rpl_semi_sync_master_no_tx |
0 |
slave未及时响应的事务数 |
|
Rpl_semi_sync_master_status |
ON |
主库上Semi-sync是否正常开启 |
|
Rpl_semi_sync_master_timefunc_failures |
0 |
时间函数未正常工作的次数 |
|
Rpl_semi_sync_master_tx_avg_wait_time |
1222 |
开启Semi-sync,事务返回需要等待的平均时间 |
|
Rpl_semi_sync_master_tx_wait_time |
2445 |
事务等待备库响应的总时间 |
|
Rpl_semi_sync_master_tx_waits |
2 |
事务等待备库响应的总次数 |
|
Rpl_semi_sync_master_wait_pos_backtraverse |
0 |
改变当前等待最小二进制日志的次数 |
|
Rpl_semi_sync_master_wait_sessions |
0 |
当前有几个线程在等备库响应 |
|
Rpl_semi_sync_master_yes_tx |
2 |
Semi-sync模式下,成功的事务数。也叫主库成功接收到slave的回复的次数。 |
3.2 主库上semi_sync环境信息(SHOW VARIABLES LIKE '%semi%')
|
环境名称 |
值 |
描述 |
|
rpl_semi_sync_master_enabled |
ON |
是否自动开启半同步复制 |
|
rpl_semi_sync_master_timeout |
3000 |
主库传送到从库的Binlog日志,最大超时时间 |
|
rpl_semi_sync_master_trace_level |
32 |
用于开启半同步复制模式时的调试级别,默认是32。 net wait level (more information about network waits) |
|
rpl_semi_sync_master_wait_for_slave_count |
1 |
至少有N个slave接收到日志 |
|
rpl_semi_sync_master_wait_no_slave |
ON |
是否允许master 每个事物提交后都要等待slave的receipt信号。默认为on |
|
rpl_semi_sync_master_wait_point |
AFTER_SYNC |
控制 master 在哪个环节接收 slave ack,master 接收到 ack 后返回状态给客户端。 |
3.3 从库上semi_sync环境信息(SHOW VARIABLES LIKE '%semi%';)
|
环境名称 |
值 |
描述 |
|
rpl_semi_sync_slave_enabled |
ON |
从库是否自动开启半同步复制 |
|
rpl_semi_sync_slave_trace_level |
32 |
同上 |
3.4 从库上semi_sync状态信息(SHOW STATUS LIKE '%semi_sync%')
|
Rpl_semi_sync_slave_status |
ON |
从库上Semi-sync是否正常开启 |
mysql 架构篇系列 4 复制架构一主一从搭建(半同步复制)的更多相关文章
- 【目录】mysql 架构篇系列
随笔分类 - mysql 架构篇系列 mysql 架构篇系列 4 复制架构一主一从搭建(半同步复制) 摘要: 一.概述 在mysql 5.5之前,mysql 的复制是异步操作,主库和从库的数据之间存在 ...
- MySQL主从复制半同步复制原理及搭建
在MySQL5.5之前的版本中,MySQL的复制是异步复制,主库和从库的数据之间存在一定的延迟,比如网络故障等各种原因,这样子容易存在隐患就是:当在主库写入一个事务成功后并提交了,但是由于从库延迟没有 ...
- MySQL 半同步复制+MMM架构
200 ? "200px" : this.width)!important;} --> 介绍 上篇文章介绍了MMM架构的实现方法,但是上篇文章的MMM方案的复制是异步复制,异 ...
- mysql 半同步复制~ 整体概述与改进
一 简介:今天来聊聊增强半同步复制这一强悍的特性 二 原理解析 1 AFTER_COMMIT(5.6默认值) master将每个事务写入binlog ,传递到slave 刷新到磁盘(relay log ...
- 安装MySQL半同步复制
一.简介 从MySQL5.5开始,MySQL以插件的形式支持半同步复制.如何理解半同步呢?首先我们来看看异步,全同步的概念 异步复制(Asynchronous replication) MySQL默认 ...
- MySQL半同步复制搭建
默认情况下,MySQL 5.5/5.6/5.7和MariaDB 10.0/10.1的复制是异步的,异步复制可以提供最佳性能,主库把binlog日志发送给从库,这一动作就结束了,并不会验证从库是否接收完 ...
- MySQL半同步复制的数据一致性探讨微信后台团队实践【转】
MySQL是一个RDBMS(关系型数据库管理系统),由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下产品.由于其体积小.速度快.拥有成本低,尤其是开放源码这一特点,广受各大企业欢迎,包括 ...
- 深入MySQL复制(三):半同步复制
1.半同步复制 半同步复制官方手册:https://dev.mysql.com/doc/refman/5.7/en/replication-semisync.html 默认情况下,MySQL的复制是异 ...
- centos7下mysql半同步复制原理安装测试详解
原理简介: 在MySQL5.5之前,MySQL的复制其实都是异步复制(见下图),主库和从库的数据之间存在一定的延迟,这样存在一个隐患:当在主库上写入一个事务并提交成功,而从库尚未得到主库推送的BinL ...
随机推荐
- 勾勾街——一个专注于免越狱免签名的苹果ios APP打包生成的网站
自涛舅舅研发的“苹果ios APP自助生成系统”上线以来,每天都有大量的用户注册和生成免越狱app,为什么? 因为我们有明显的技术优势,APP不需要上架appstore, 生成APP又不需要企业签名证 ...
- 单调栈&单调队列入门
单调队列是什么呢?可以直接从问题开始来展开. Poj 2823 给定一个数列,从左至右输出每个长度为m的数列段内的最小数和最大数. 数列长度:\(N <=10^6 ,m<=N\) 解法① ...
- IDEA 使用Mybatis效率飞起来的必备工具:MybatisCodeHelperPro 最新破解版,亲测可用!
IDEA 2018.3.5 最新版本亲测可用. Git地址:https://github.com/pengzhile/MyBatisCodeHelper-Pro-Crack/releases 下载最新 ...
- BZOJ5304 : [Haoi2018]字串覆盖
离线处理所有询问. 对于$r-l\leq 50$的情况: 按照串长从$1$到$51$分别把所有子串按照第一位字符为第一关键字,上一次排序结果为第二关键字进行$O(n)$基数排序. 同理也可以用上一次比 ...
- Rectangular Covering [POJ2836] [状压DP]
题意 平面上有 n (2 ≤ n ≤ 15) 个点,现用平行于坐标轴的矩形去覆盖所有点,每个矩形至少盖两个点,矩形面积不可为0,求这些矩形的最小面积. Input The input consists ...
- VS2017无法发现单元测试,不能运行单元测试的解决方案
问题: 在VS2017中新建空的单元测试后,无法运行测试,即右键菜单的"运行测试"和"调试测试" 不能运行,在测试资源管理中也无法列出这个测试. 解决方案: 1 ...
- copy与mutableCopy的区别总结
1.不可变类型(不管是集合还是非集合),copy结果,不产生新对象,浅拷贝:不可变类型(不管是集合还是非集合),mutableCopy结果,产生新对象,深拷贝.2.可变类型(不管是集合还是非集合),c ...
- 算法第四版中 while (!StdIn.isEmpty()) 循环无法跳出问题
在IDEA中使用Ctrl+D就可以退出console输入
- Egret的按钮事件处理
首先要在exml内要设置有对应按钮的ID 2,编写TypeScript脚本: public mybutton:eui.Button; 函数内部:this.mybutton.addEventListen ...
- HDP Hive StorageHandler 下推优化的坑
关键词:hdp , hive , StorageHandler 了解Hive StorageHandler的同学都知道,StorageHandler作为Hive适配不同存储的拓展类,同时肩负着Hive ...