MySQL主从复制半同步复制原理及搭建
在MySQL5.5之前的版本中,MySQL的复制是异步复制,主库和从库的数据之间存在一定的延迟,比如网络故障等各种原因,这样子容易存在隐患就是:当在主库写入一个事务成功后并提交了,但是由于从库延迟没有及时得到主库推送的Binlog日志时,主库突然宕机了,那么此时从库就可能损失这个事务,从而造成主从不一致的状况。
因此我们MySQL5.5版本之后引入了半同步复制的概念
半同步复制的原理:
半同步复制时,为了保证主库上的每一个Binlog事务都能够被可靠的复制到从库上,主库在每次事务成功提交时,并不及时反馈给前端应用用户,而是等待其中的一个从库也接收到Binlog事务并成功写入中继日志后,出库才返回commit操作成功给客户端。半同步复制保证了事务成功提交后,至少有两份日志记录,一份在主库的Binlog日志上,另一份在至少一个从库的中继日志Relay log上,从而更近一步保证了数据的完整性。

这个示意图是半同步复制的步骤:
在这个半同步复制模式下:第1、2、3中任何一个步骤中主库宕机,则事务并没有提交成功。从库也没有得到日志,此时的主从复制数据是一致的。
那什么时候半同步复制会突然变成异步复制呢?
在第4步的时候,如果网络延迟故障或从库宕机,那么此时主库的Binlog都没有及时传送给从库上,此时主库上的事务会等待一段时间,时间长短由参数rpl_semi_master_timeout设置的毫秒数来决定,如果Binlog在这段时间内都无法成功推送到从库上,则MySQL自动调整复制模式为异步模式,此时事务正常返回提交结果给客户端。
半同步复制很大程度上取决于主从库之间的网络情况,往返时延RTT越小决定了从库的实时性越好。
搭建步骤:
这次我们使用一个master节点两个slave节点进行搭建,并且进行此实验之前我们已经搭建好异步复制的环境了。搭建半同步复制不过是在异步的基础上添加一些插件而已。
| 172.31.22.29 | master |
| 172.31.26.133 | slave |
| 172.31.17.203 | slave |
1、首先判断一下当前版本的数据库是否支持动态扩展,因为我们的版本都是一致的,因此在一台机器上检查即可
mysql> select @@have_dynamic_loading;
+------------------------+
| @@have_dynamic_loading |
+------------------------+
| YES |
+------------------------+
1 row in set (0.00 sec)
2、确认支持动态增加插件以后,我们再来检查一下MySQL的$MYSQL/lib/plugin目录下是否存在主库插件“semisync_master.so”和从库插件“semisync_slave.so”。
[root@:vg_adn_tidbCkhsTest /usr/local/mysql/lib/plugin]#ls #这里只列出了一部分而已
adt_null.so libtest_framework.so libtest_sql_lock.so mysqlx.so
authentication_ldap_sasl_client.so libtest_services.so libtest_sql_processlist.so rewrite_example.so
auth_socket.so libtest_services_threaded.so libtest_sql_replication.so rewriter.so
connection_control.so libtest_session_detach.so libtest_sql_shutdown.so semisync_master.so
debug libtest_session_info.so libtest_sql_sqlmode.so semisync_slave.so
group_replication.so libtest_session_in_thd.so libtest_sql_stored_procedures_functions.so test_security_context.so
接下来我们在主库上安装插件
mysql> install plugin rpl_semi_sync_master SONAME 'semisync_master.so';
Query OK, 0 rows affected (0.00 sec)
在两个从库上安装插件
MySQL [(none)]> install plugin rpl_semi_sync_slave SONAME 'semisync_slave.so';
Query OK, 0 rows affected (0.01 sec)
安装完成后,我们可以使用语句来查看一下:
mysql> select * from mysql.plugin;
+----------------------+--------------------+
| name | dl |
+----------------------+--------------------+
| rpl_semi_sync_master | semisync_master.so |
+----------------------+--------------------+
1 row in set (0.00 sec)
说明我们已经安装插件成功了。并且系统重启的时候也会自动加载该插件,不必担心。
3、现在我们需要分别在主库和从库上配置参数打开半同步semi-sync,默认情况下半同步设置不打开的,主库上配置全局参数。
mysql> set global rpl_semi_sync_master_enabled=1;
Query OK, 0 rows affected (0.00 sec) mysql> set global rpl_semi_sync_master_timeout=10000; #注意这是毫秒单位,因此这个数是10秒。
Query OK, 0 rows affected (0.00 sec)
两个从库上也需要配置:
MySQL [(none)]> set global rpl_semi_sync_slave_enabled=1;
Query OK, 0 rows affected (0.00 sec)
注意:由于之前已经配置过异步复制,因此在这里需要重启一下从库上的I/O线程。(如果是全新配置的半同步复制则不需要这一步骤。)
MySQL [(none)]> stop slave io_thread;
Query OK, 0 rows affected (0.00 sec) MySQL [(none)]> start slave io_thread;
Query OK, 0 rows affected (0.00 sec)
有几台slave,就在几台上执行这样子的操作。到此,半同步复制就搭建成功了。
在主库上使用下面命令执行以下看看半同步复制的状态信息:
mysql> show status like '%semi_sync%';
+--------------------------------------------+-------+
| Variable_name | Value |
+--------------------------------------------+-------+
| Rpl_semi_sync_master_clients | 2 |
| Rpl_semi_sync_master_net_avg_wait_time | 0 |
| Rpl_semi_sync_master_net_wait_time | 0 |
| Rpl_semi_sync_master_net_waits | 0 |
| Rpl_semi_sync_master_no_times | 0 |
| Rpl_semi_sync_master_no_tx | 0 |
| Rpl_semi_sync_master_status | ON |
| Rpl_semi_sync_master_timefunc_failures | 0 |
| Rpl_semi_sync_master_tx_avg_wait_time | 0 |
| Rpl_semi_sync_master_tx_wait_time | 0 |
| Rpl_semi_sync_master_tx_waits | 0 |
| Rpl_semi_sync_master_wait_pos_backtraverse | 0 |
| Rpl_semi_sync_master_wait_sessions | 0 |
| Rpl_semi_sync_master_yes_tx | 0 |
+--------------------------------------------+-------+
14 rows in set (0.00 sec)
我们注重关注这三个值:
1、Rpl_semi_sync_master_status:值为ON,表示半同步复制目前处于打开状态。
2、Rpl_semi_sync_master_no_tx:这个值表示当前主库有多少个事务不是半同步模式下从库及时响应的。
3、Rpl_semi_sync_master_yes_tx:这个值表示当前主库上有多少个事务是通过半同步复制到从库的。
在日常的维护中,我们可以查看着三项值判断半同步复制是否是正常的。
MySQL主从复制半同步复制原理及搭建的更多相关文章
- centos7下mysql半同步复制原理安装测试详解
原理简介: 在MySQL5.5之前,MySQL的复制其实都是异步复制(见下图),主库和从库的数据之间存在一定的延迟,这样存在一个隐患:当在主库上写入一个事务并提交成功,而从库尚未得到主库推送的BinL ...
- mysql的半同步复制
1. binlog dump线程何时向从库发送binlog mysql在server层进行了组提交之后,为了提高并行度,将提交阶段分为了 flush sync commit三个阶段,根据sync_bi ...
- 烂泥:学习mysql数据库主从同步复制原理
本文由秀依林枫提供友情赞助,首发于烂泥行天下. 说明本篇文章部分转载自互联网. MySQL的Replication(英文为复制)是一个多MySQL数据库做主从同步的方案,特点是异步复制,广泛用在各种对 ...
- MySQL系列详解六:MySQL主从复制/半同步演示-技术流ken
前言 随着技术的发展,在实际的生产环境中,由单台MySQL数据库服务器不能满足实际的需求.此时数据库集群就很好的解决了这个问题了.采用MySQL分布式集群,能够搭建一个高并发.负载均衡的集群服务器.在 ...
- mysql数据库主从同步复制原理
MySQL的Replication(英文为复制)是一个多MySQL数据库做主从同步的方案,特点是异步复制,广泛用在各种对MySQL有更高性能.更高可靠性要求的场合.与之对应的是另一个同步技术是MySQ ...
- MySQL的半同步复制监控
(1)master端 >show variables like 'rpl_semi_sync%'; +------------------------------------+-------+ ...
- MySQL数据的主从复制、半同步复制和主主复制详解
一.MySQL复制概述 ⑴.MySQL数据的复制的基本介绍 目前MySQL数据库已经占去数据库市场上很大的份额,其一是由于MySQL数据的开源性和高性能,当然还有重要的一条就是免费~不过不知道还能免费 ...
- MySQL数据的主从复制、半同步复制和主主复制详解-转
一.MySQL复制概述 ⑴.MySQL数据的复制的基本介绍 目前MySQL数据库已经占去数据库市场上很大的份额,其一是由于MySQL数据的开源性和高性能,当然还有重要的一条就是免费~不过不知道还能免费 ...
- Mysql半同步复制模式说明及配置示例 - 运维小结
MySQL主从复制包括异步模式.半同步模式.GTID模式以及多源复制模式,默认是异步模式 (如之前详细介绍的mysql主从复制).所谓异步模式指的是MySQL 主服务器上I/O thread 线程将二 ...
随机推荐
- python的Web框架:Django路由系统以及模板导入
Django的路由系统 当一个请求来到时 当一个请求来到时 1.首先到项目目录下的urls.py(根URLconf模块)中,查找路由规则: 2.根URELcof模块,里面定义了 urlpatterns ...
- UVa 122 Trees on the level(链式二叉树的建立和层次遍历)
题目链接: https://cn.vjudge.net/problem/UVA-122 /* 问题 给出每个节点的权值和路线,输出该二叉树的层次遍历序列. 解题思路 根据输入构建链式二叉树,再用广度优 ...
- [USACO 06DEC]Milk Patterns
Description 题库链接 给定一个长度为 \(n\) 的字符串,求至少出现 \(k\) 次的最长重复子串,这 \(k\) 个子串可以重叠. \(1\leq n\leq 20000\) Solu ...
- MVC应用程序播放RealPlayer(rmvb)视频
以前Insus.NET开发asp.net时,一直无法把Realplayer的rmvb格式的视频在aspx网页播放与显示.现在学习ASP.NET MVC了,再次尝试这个,望它能在MVC的应用程序运行. ...
- SqlServer常用语法总结
前言 近期公司做一个短信平台,写了一些关于统计方面的存储过程,今天刚好有空总结一下. 统计查询和性能提升 一.使用WITH AS提高性能简化嵌套SQL 首先,感谢@飞洋过海和@宋沄剑,通过阅读他们的博 ...
- 乐字节-Java8新特性之Stream流(上)
上一篇文章,小乐给大家介绍了<Java8新特性之方法引用>,下面接下来小乐将会给大家介绍Java8新特性之Stream,称之为流,本篇文章为上半部分. 1.什么是流? Java Se中对于 ...
- A simple Gaussian elimination problem.(hdu4975)网络流+最大流
A simple Gaussian elimination problem. Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65 ...
- 获取本机的ip地址(排除虚拟机,蓝牙等ip)
项目中遇到了要获取本地ip的需求,网上查找资料遇到很多坑,很多Java获取本机ip地址的方法要么是根本获取不到,要么是获取的有问题. 网上常见的方法如下 InetAddress.getLocalHos ...
- Linux常用基本命令(head)
head命令 作用:显示文件的头部内容,默认显示前面10行 格式: head [option] [file] -n <行数> -c <字节> ghostwu@dev:~/lin ...
- php $_REQUEST写法防注入突破
扫描器扫到robots.txt ,访问:http://xxx.com/robots.txt 有一个admin,但访问需要输入账号和密码. 尝试访问: http://xxx.com/index.phps ...