MySQL中的半同步复制(r11笔记第65天)

关于MySQL的复制架构,大体有下面三种方式,异步,全同步复制,半同步复制。

三种复制方式

第一种是异步复制,是比较经典的主从复制,搭建主从默认的架构方式,就是属于异步的,相对来说性能要好一些。但是还是会有丢失数据的情况。

第二种是全复制,比如说MySQL Cluster这样的方式,是属于全复制的,实际上MySQL Cluster其实发展并不大顺利,更多时候是一个实验室产品,但是时间定格在2016年12月12日,MySQL 5.7.17 GA的重大特性group replication插件推出,增强了MySQL原有的高可用方案(原有的Replication方案),提供了重要的特性—多写,保证组内高可用,确保数据最终一致性。有点类似Oracle里面的RAC.

第三种是在异步和全复制之间的一种方案,就是半同步semi-sync replication。自MySQL 5.5推出,是对异步和全复制的一种补充,确切的说,应该是对MySQL Cluster这种方案的补充。

如果把这个和Oracle联系起来,其实和Oracle高可用模式有点类似,Oracle中是最大性能模式,最大保护模式,最大高可用模式,其中最大性能模式就是异步的方式,类似于异步复制的角色,最大保护模式是完全的数据同步,有点类似于全复制的方案,而最大高可用模式是介于两者之间,甚至可以达到动态切换,和半同步复制的角色差不多。

半同步复制

要开启半同步,我们需要安装插件,这个过程就很简单了。基本的要求是在满足异步复制的情况下,版本在5.5以上,并且变量have_dynamic_loading为YES

> show variables like '%have_dynamic_loading%';
+----------------------+-------+
| Variable_name        | Value |
+----------------------+-------+
| have_dynamic_loading | YES   |
+----------------------+-------+
1 row in set (0.00 sec)

在base目录下,可以很容易找到所需的插件。当前的base目录为/usr,可以根据关键字找到插件。

# find . -name "semisync_master.so"
./lib64/mysql/plugin/semisync_master.so
./lib64/mysql/plugin/debug/semisync_master.so

要安装插件就是两个简单的命令。

> install plugin rpl_semi_sync_master soname 'semisync_master.so';
Query OK, 0 rows affected (0.11 sec)

> install plugin rpl_semi_sync_slave soname 'semisync_slave.so';
Query OK, 0 rows affected (0.00 sec)

安装后查看mysql.plugin看看插件记录是否存在,或者使用show plugins也可以。

> select * from mysql.plugin;
+----------------------+--------------------+
| name                 | dl                 |
+----------------------+--------------------+
| rpl_semi_sync_master | semisync_master.so |
| rpl_semi_sync_slave  | semisync_slave.so  |
+----------------------+--------------------+
2 rows in set (0.00 sec)
当然默认半同步的开关还没有打开。
> show variables like 'rpl_semi_sync_master%';
+------------------------------------+-------+
| Variable_name                      | Value |
+------------------------------------+-------+
| rpl_semi_sync_master_enabled       | OFF   |
| rpl_semi_sync_master_timeout       | 10000 |
| rpl_semi_sync_master_trace_level   | 32    |
| rpl_semi_sync_master_wait_no_slave | ON    |
+------------------------------------+-------+
4 rows in set (0.00 sec)

这里涉及到两个参数rpl_semi_sync_master_enabled和rpl_semi_sync_slave_enabled,比较直观。

打开即可。

set global rpl_semi_sync_master_enabled=1; set global rpl_semi_sync_slave_enabled=1;

如果在master端简单验证,也可以使用show status

> show status like 'rpl_semi_sync_master_status';
+-----------------------------+-------+
| Variable_name               | Value |
+-----------------------------+-------+
| Rpl_semi_sync_master_status | ON    |
+-----------------------------+-------+

当然在slave端也需要做同样的操作,然后在slave端重启IO_Thread即可。

> STOP SLAVE IO_THREAD;
Query OK, 0 rows affected (0.01 sec)
> START SLAVE IO_THREAD;
Query OK, 0 rows affected (0.01 sec)

Master端检查

Rpl_semi_sync_master_status

Slave端检查

Rpl_semi_sync_slave_status

半同步在MySQL 5.6,5.7的变化

MySQL 5.7中新增了一个参数来控制半同步模式下 主库在返回给会话事务成功之前提交事务的方式。

> show variables like 'rpl_semi_sync_master_wait_point';
+---------------------------------+------------+
| Variable_name                   | Value      |
+---------------------------------+------------+
| rpl_semi_sync_master_wait_point | AFTER_SYNC |
+---------------------------------+------------+
1 row in set (0.00 sec)

而在MySQL 5.6中是什么设置呢,是AFTER_COMMIT

这两个参数该怎么理解。我参考了https://sanwen8.cn/p/105GRDe.html 中的图片。

master的数据写入了binlog,slave 刷新到磁盘(relay log),所以在OLTP的场景下,master需要等待slave 反馈收到relay log,只有收到ACK后master才将commit OK结果反馈给客户端

而MySQL 5.7中的半同步复制,有个叫法是Loss-Less半同步复制。实现的方式有了一些差别。

这种模式(AFTER_SYNC),事务是在提交之前发送给Slave,当Slave没有接收成功,并且如果发生Master宕机的场景,不会导致主从不一致,因为此时Master端还没有提交,所以主从都没有数据。

简单测试半同步复制

我们来简单看看半同步复制的一些小测试。

create database testsync;

然后创建一个表,插入一行数据。很明显执行速度很快。

> create table testsync.test(id int);
Query OK, 0 rows affected (0.07 sec)

> insert into testsync.test values(100);
Query OK, 1 row affected (0.01 sec)

我们模拟网络延迟的情况,直接把slave停掉。

stop slave;这个时候在Master端插入数据就会有很慢。这个过程持续了大概10秒多。

> insert into testsync.test values(101);
Query OK, 1 row affected (10.00 sec)

这里为什么是10秒,和一个扮同步复制的参数有关。单位是毫秒,所以换算下来就是10秒。

> show variables like 'rpl_semi_sync_master_timeout';
+------------------------------+-------+
| Variable_name                | Value |
+------------------------------+-------+
| rpl_semi_sync_master_timeout | 10000 |
+------------------------------+-------+

我们看看扮同步复制的开关。

> show status like 'Rpl_semi_sync_master_status';
+-----------------------------+-------+
| Variable_name               | Value |
+-----------------------------+-------+
| Rpl_semi_sync_master_status | OFF   |
+-----------------------------+-------+

slave端也是OFF的状态。

我们恢复状态,把slave启动。然后在Master端继续插入一条记录,速度就很快了。

> insert into testsync.test values(102);
Query OK, 1 row affected (0.00 sec)

此时的开关是打开的。

> show status like 'Rpl_semi_sync_master_status';
+-----------------------------+-------+
| Variable_name               | Value |
+-----------------------------+-------+
| Rpl_semi_sync_master_status | ON    |
+-----------------------------+-------+

查看数据库日志,其实也能看到很明确的信息。

2017-02-04T23:37:44.551667+08:00 2145633 [Warning] Timeout waiting for  reply of binlog (file: mysql-bin.000017, pos: 1056976828), semi-sync up  to file mysql-bin.000017, position 1056976573.
2017-02-04T23:37:44.551713+08:00 2145633 [Note] Semi-sync replication switched OFF.
2017-02-04T23:41:05.824146+08:00  2145900 [Note] Start binlog_dump to master_thread_id(2145900)  slave_server(13058), pos(mysql-bin.000017, 1056976573)
2017-02-04T23:41:05.824194+08:00  2145900 [Note] Start semi-sync binlog_dump to slave (server_id: 13058),  pos(mysql-bin.000017, 1056976573)
2017-02-04T23:41:05.835505+08:00 0 [Note] Semi-sync replication switched ON at (mysql-bin.000017, 1056977083)

关于半同步复制还需要持续的深入理解。今天暂且测试到这里。

原文发布于微信公众号 - 杨建荣的学习笔记(jianrong-notes)

原文发表时间:2017-02-04

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏java学习

Java程序员必备的Intellij插件

如果你是初学者,或者是自学者!你可以加小编微信(xxf960326)!小编可以给你学习上,工作上的一些建议以及可以给你(免费)提供学习资料!最重要我们还可以交个...

13110
来自专栏北京马哥教育

这8种命令都不会,还算什么Linux运维!

01 查看系统内核版本 显示了系统名称(CentOS)和内核版本(release 6.5) The file /etc/issue is a text file...

36570
来自专栏Java技术栈

史上最全Redis面试题及答案。

花了大量时间 整理了这套Redis面试题 首发50题,绝无仅有 从入门到精通 从基础,高级知识点 再到集群,运维,方案… 弄明白了这些题 可以说可以成为面霸了 ...

73870
来自专栏郝阳的专栏

主从同步中的关键技术解析

主从同步的整体思路不外乎“数据镜像(image) + 流水(binlog)”,但是仔细考虑,会有一些值得思考的细节问题,看看你是否考虑过?

1.1K110
来自专栏后端技术探索

nginx常见面试题

Nginx的并发能力在同类型网页服务器中的表现,相对而言是比较好的,因此受到了很多企业的青睐,我国使用Nginx网站的知名用户包括腾讯、淘宝、百度、京东、新浪、...

18920
来自专栏iOSDevLog

Action API目录

31490
来自专栏开发技术

virtualBox安装centos,并搭建tomcat

  本文没什么难点,只是发现自己记忆不好,特别是搭建tomcat服务的时候,总是需要去重新查阅资料,特此就写这篇博客来加强自己的记忆,同时也给大家以参考;

15230
来自专栏aoho求索

Redis Cluster深入与实践

1. redis介绍 www.redis.io redis是一个基于内存的K-V存储数据库。支持存储的类型有string,list,set,zset(sorte...

455120
来自专栏后端技术探索

Nginx面试中最常见的18道题 抱佛脚必备

Nginx的并发能力在同类型网页服务器中的表现,相对而言是比较好的,因此受到了很多企业的青睐,我国使用Nginx网站的知名用户包括腾讯、淘宝、百度、京东、新浪、...

29930
来自专栏企鹅号快讯

如何通过Smem命令行检查Ubuntu上的内存使用情况

如何检查Ubuntu Linux上的内存使用情况,我们可以安装并使用Smem内存报告工具来显示Ubutnu Linux系统上的内存使用情况。 Smem是一个命令...

25080

扫码关注云+社区

领取腾讯云代金券