mysql semi sync_MySQL Semisync
默认情况下,MySQL的复制功能是异步的。master把binlog发送给slave时,这个复制动作就已经完成,master不会验证slave是否接收完毕(类似于Oracle DataGuard Maximum Performance)。异步复制同时意味着在把数据从一个mysqld实例拷贝到另一个mysqld时有一个延时,即master当前提交的事务不会在同一时刻拷贝到slave。这也带来了一定的风险,当master或slave发生故障时,slave有可能会没有接收到master发送过来的binlog,这样就会造成了master/slave的数据不一直,甚至在恢复时也会造成数据的损失。
为了解决这个问题,MySQL 在5.5以后引入了一种半同步模式,slave在接收binlog并写入relay log后会给服务器发送一个反馈,告诉master接收完成,当出现超时情况时,master会暂时切换到异步复制模式,和Oracle DataGuard Maximum Available的处理方式比较相似。半同步复制模式必须在master和slave端同时启用,否则master会使用默认的异步模式。
1. 开启半同步
我的环境是RHEL 6.5 x86_64, Percona-Server-server-56(RPM),已经配置了异步的同步模式。
检查动态加载选项和插件列表。
mysql> select @@have_dynamic_loading ;
+------------------------+
| @@have_dynamic_loading |
+------------------------+
| YES |
+------------------------+
1 row in set (0.00 sec)
mysql> show plugins;
......
默认并没有加载半同步插件,rpm发行版的插件.so文件的位置
/usr/lib64/mysql/plugin/semisync_master.so
/usr/lib64/mysql/plugin/semisync_slave.so
然后在M/S上都加载插件并启用同步。初次加载插件后,MySQL会将该插件记录到系统表mysql.plugin中,下次mysqld启动时会自动加载,无需INSTALL PLUGIN
mysql> INSTALL PLUGIN rpl_semi_sync_master soname 'semisync_master.so' ;
Query OK, 0 rows affected (0.01 sec)
mysql> INSTALL PLUGIN rpl_semi_sync_slave soname 'semisync_slave.so';
Query OK, 0 rows affected (0.00 sec)
mysql> SET GLOBAL rpl_semi_sync_master_enabled=ON;
mysql> SET GLOBAL rpl_semi_sync_slave_enabled=ON;
要将rpl_semi_sync_master_enabled和rpl_semi_sync_slave_enabled参数写入配置文件my.cnf
rpl_semi_sync_master_enabled = 1
rpl_semi_sync_slave_enabled =1
日志文件会显示:
2014-08-14 14:13:23 5927 [Note] Semi-sync replication initialized for transactions.
2014-08-14 14:13:23 5927 [Note] Semi-sync replication enabled on the master.
2. 半同步的参数说明
在master上有4个相关参数,slave中有2个.
mysql> show global variables like 'rpl_semi%';
+------------------------------------+-------+
| Variable_name | Value |
+------------------------------------+-------+
| rpl_semi_sync_master_enabled | ON | --master上是否开启了半同步复制模式
| rpl_semi_sync_master_timeout | 10000 | --该参数默认为10000毫秒,可动态调整。它用来表示如果主库中某个事务等待时间超过10秒,则降级为异步复制模式。
| rpl_semi_sync_master_trace_level | 32 | --开启半同模式的调试级别
| rpl_semi_sync_master_wait_no_slave | ON | --表示是否允许master每个事物提交后都要等待slave的接收等待确认信号,默认为ON。
| rpl_semi_sync_slave_enabled | ON | --slave是否开启了半同步复制模式
| rpl_semi_sync_slave_trace_level | 32 |
+------------------------------------+-------+
6 rows in set (0.00 sec)
3. 半同步与异步的切换
执行完上面的步骤后,我们在M/S上检查半同步的状态,发现rpl_semi_sync_slave_status都是关闭的。这说明虽然启用了半同步的功能,但slave不会自动从异步模式转换到半同步模式。
mysql> show status like "%semi%";
+--------------------------------------------+-------+
| Variable_name | Value |
+--------------------------------------------+-------+
| Rpl_semi_sync_master_clients | 1 | --有多少slave配置成了semi-sync模式
| Rpl_semi_sync_master_net_avg_wait_time | 677 | --等待slave确认的平均等待时间,单位微秒。
| Rpl_semi_sync_master_net_wait_time | 3385 | --master的总等待时间,单位微秒
| Rpl_semi_sync_master_net_waits | 5 | --等待slave确认的的总的等待次数
| Rpl_semi_sync_master_no_times | 0 | --关闭半同步复制的次数
| Rpl_semi_sync_master_no_tx | 0 | --slave确认的不成功提交次数
| Rpl_semi_sync_master_status | ON | --master现在是否是半同步复制状态
| Rpl_semi_sync_master_timefunc_failures | 0 | --半同步所用的时间函数失败的次数
| Rpl_semi_sync_master_tx_avg_wait_time | 776 | --事务等待slave确认的平均等待时间,单位微秒
| Rpl_semi_sync_master_tx_wait_time | 3881 | --事物等待slave确认的总等待时间,单位微秒
| Rpl_semi_sync_master_tx_waits | 5 | --等待slave确认的的总的等待次数
| Rpl_semi_sync_master_wait_pos_backtraverse | 0 | --改变当前等待最小二进制日志的次数
| Rpl_semi_sync_master_wait_sessions | 0 | --当前有多少个session 因为slave 的回复而造成等待
| Rpl_semi_sync_master_yes_tx | 5 | --slave确认的成功提交次数
| Rpl_semi_sync_slave_status | OFF | --该server的slave是否处于半同步状态
+--------------------------------------------+-------+
过上面的参数也说明了开启半同步会导致一部分额外的开销:
(1). 完成单条事务增加了额外的等待延迟,延迟的大小取决于网络的好坏。
(2). Semi-sync不是分布式事务,主库会在自己完成事务后,等待备库接收事务日志。
接下来重新启动slave。
mysql> stop slave;
Query OK, 0 rows affected (0.01 sec)
mysql> start slave ;
Query OK, 0 rows affected (0.03 sec)
这是Master和Slave中的日志中会提示:
--- master ---
2014-08-14 14:26:10 5927 [Note] Start semi-sync binlog_dump to slave (server_id: 2), pos(mysql-bin.000009, 1507)
--- slave ---
2014-08-14 14:26:09 5969 [Note] Slave I/O thread: Start semi-sync replication to master 'rep@172.19.17.210:3306' in log 'mysql-bin.000009' at position 1507
次检查slave的状态:
mysql> show status like "%semi%";
+--------------------------------------------+-------+
| Variable_name | Value |
+--------------------------------------------+-------+
| Rpl_semi_sync_master_status | ON |
......
| Rpl_semi_sync_slave_status | ON |
+--------------------------------------------+-------+
15 rows in set (0.01 sec)
参考:一般情况下,当slave的io线程将binlog接受完毕后,要给master发送一个确认。如果超过rpl_semi_sync_master_timeout=10000(10秒)内未收到该确认信号,那么就自动转换为异步复制模式。这种情况下要排查错误并重启slave来恢复半同步模式。
http://dev.mysql.com/doc/refman/5.5/en/replication-semisync.html
http://www.orczhou.com/index.php/2011/06/mysql-5-5-semi-sync-replication-setup-config/
mysql semi sync_MySQL Semisync相关推荐
- mysql semi join_MySQL 通过semi join 优化子查询
半连接是MySQL 5.6.5引入的,多在子查询exists中使用,对外部row source的每个键值,查找到内部row source匹配的第一个键值后就返回,如果找到就不用再查找内部row sou ...
- mysql semi join_技术分享 | MySQL 子查询优化
作者:胡呈清 爱可生 DBA 团队成员,擅长故障分析.性能优化,个人博客:https://www.jianshu.com/u/a95...,欢迎讨论. 本文来源:原创投稿 *爱可生开源社区出品,原创内 ...
- mysql semi join详解_MySQL中的semi-join
http://www.linuxidc.com/Linux/2015-05/117523.htm 1. 背景介绍 什么是semi-join? 所谓的semi-join是指semi-join子查询. 当 ...
- mysql semi join_MySQL 5.6 Semi join优化之materialization strategy
8月 24, 2014 | Nix.Huang 考虑如下查询: select * from Country where Country.code IN (select City.Country fro ...
- mysql 半同步复制_Mysql半同步复制原理及问题排查
mysql半同步复制和异步复制的差别如上述架构图所示:在mysql异步复制的情况下,Mysql Master Server将自己的Binary Log通过复制线程传输出去以后,Mysql Master ...
- mysql半同步复制问题排查
1.问题背景 默认情况下,线上的mysql复制都是异步复制,因此在极端情况下,主备切换时,会有一定的概率备库比主库数据少,因此切换后,我们会通过工具进行回滚回补,确保数据不丢失.半同步复制 ...
- mysql 5.7.21-linux_MySQL 5.7.21 Linux平台安装 Part 2
从今天开始MySQL相关方面的东西 今天是关于MySQL的安装 系统为 redhat 6.10 数据库为MySQL 5.7.21 PS:目前最新版本为MySQL 5.7.25 1. 目录规划 2. M ...
- MySQL无中心化集群_MySQL Plus 如何做到无中心化、数据强一致性、秒级切换?
数据库服务于企业的核心交易业务和实时交互应用,承载着企业的核心数据,因此企业对于数据库的数据一致性和高可用性有强烈的需求. 本次内容为青云QingCloud 数据库工程师蒙哲在 3306Pai 201 ...
- 问题定位 | XtraBackup 8.0 数据重建避坑事件始末
作者:卢文双 资深数据库研发工程师 目前负责青云云数据库的研发工作,热衷于研究主流数据库架构.源码,对关系型数据库 MySQL/PostgreSQL 及分布式数据库有深入研究. 前言 在为 Xenon ...
最新文章
- 使用npm打包后生成的package.json中重要字段含义
- 为何生命进化的方向是衰老,而不是永生?
- Visual C++ MFC/ATL开发-高级篇(一)
- 计算机视觉编程——图像内容分类
- python 列表,元祖,字典的区别
- 3DSlicer12:风格准则
- microwindows位图解析
- php接收post写入文件,PHP中Post和Get获取数据写入文件中
- TensorFlow人工智能入门教程之十一 最强网络DLSTM 双向长短期记忆网络(阿里小AI实现)...
- [干货来袭]DevExpress ASP.NET示例资源最全分享!(二)
- Unicode16 与 UTF-8编码之间的转换
- git 分支merge主分支 解决冲突
- Java IO 之 介质流
- webpack-internal:///./node_modules/vue/dist/vue.esm.js:629 [Vue warn]: Invalid prop: type check fail
- 面试技巧,如何通过索引说数据库优化能力
- 华为系列设备优先级总结(二)
- 《数据库应用》课程设计人事管理系统(java源代码)
- NYOJ-57-6174问题-2013年6月29日11:58:06
- win32com为word添加页码(示例)
- 常见几种显示器进入工厂模式的方法
热门文章
- 形成性考核(计算机应用基础) 答案,2019年最新电大《计算机应用基础(Win7)》形成性考核册及答案.pdf...
- 东京大学计算机专业研究生好吗,东北大学计算机类研究生个人考研经历以及感受...
- Docker 私有仓库registry
- android谷歌打印插件下载地址,ARC Welder(App Runtime for Chrome)插件下载 附下载地址
- android的actionbar及菜单机制,Android ActionBar基本使用方法
- python开发效率怎样_Python 的开发效率真的比 Java高吗?
- 怎么去调需要登录的接口_遇到需要的登录的网站怎么办?学好python,用这3招轻松搞定...
- IDEA debug模式,修改集合的值
- java中hashcode和equals的区别和联系
- 远程桌面服务器无法复制粘贴了怎么解决