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

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 关于MySQL的复制架构,大体有下面三种方式,异步,全同步复制,半同步复制。 三种复制方式     第一种是异步复制,是比较经典的主从复制,搭建主从默认的架构方式,就是属于异步的,相对来说性能要好一些。

关于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_statusSlave端检查

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   中的图片。

gif;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAA

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


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

640?wxfrom=5&wx_lazy=1

这种模式(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)

关于半同步复制还需要持续的深入理解。今天暂且测试到这里。
相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
23天前
|
关系型数据库 MySQL
【MySQL实战笔记】07 | 行锁功过:怎么减少行锁对性能的影响?-01
【4月更文挑战第18天】MySQL的InnoDB引擎支持行锁,而MyISAM只支持表锁。行锁在事务开始时添加,事务结束时释放,遵循两阶段锁协议。为减少锁冲突影响并发,应将可能导致最大冲突的锁操作放在事务最后。例如,在电影票交易中,应将更新影院账户余额的操作安排在事务末尾,以缩短锁住关键行的时间,提高系统并发性能。
15 4
|
24天前
|
关系型数据库 MySQL 数据库
【MySQL实战笔记】 06 | 全局锁和表锁 :给表加个字段怎么有这么多阻碍?-01
【4月更文挑战第17天】MySQL的锁分为全局锁、表级锁和行锁。全局锁用于全库备份,可能导致业务暂停或主从延迟。不加锁备份会导致逻辑不一致。推荐使用`FTWRL`而非`readonly=true`因后者可能影响其他逻辑且异常处理不同。表级锁如`lock tables`限制读写并限定操作对象,常用于并发控制。元数据锁(MDL)在访问表时自动加锁,确保读写正确性。
70 31
|
1月前
|
存储 关系型数据库 MySQL
【MySQL实战笔记】 04 | 深入浅出索引(上)-01
【4月更文挑战第8天】这篇文章除了介绍索引的作用和提高查询效率的原理,还探讨了三种常见的数据结构:哈希表、有序数组和搜索树。哈希表适合等值查询,但不支持范围查询;有序数组利用二分查找实现快速等值查询,但更新成本高;二叉搜索树保持平衡时查询高效,但磁盘存储时效率低。文章指出,由于磁盘读取延迟,实际数据库索引设计需考虑减少磁盘访问次数。
34 5
|
1月前
|
SQL 安全 关系型数据库
【MySQL实战笔记】03.事务隔离:为什么你改了我还看不见?-01
【4月更文挑战第6天】MySQL事务的隔离性确保数据操作的完整性和一致性,ACID原则包括原子性、一致性、隔离性和持久性。事务隔离级别有四种:读未提交、读提交、可重复读和串行化,分别解决并发问题如脏读、不可重复读和幻读。不同隔离级别在效率和安全性间权衡,例如读未提交允许未提交变更可见,而串行化通过锁保证安全但可能降低效率。在不同隔离级别下,事务看到的数据状态会有所变化,例如在可重复读级别,事务始终看到初始数据,而在串行化级别,事务会等待其他事务完成再继续,避免数据冲突。
278 10
|
2天前
|
存储 关系型数据库 MySQL
【MySQL系列笔记】分库分表
分库分表是一种数据库架构设计的方法,用于解决大规模数据存储和处理的问题。 分库分表可以简单理解为原来一个表存储数据现在改为通过多个数据库及多个表去存储,这就相当于原来一台服务器提供服务现在改成多台服务器组成集群共同提供服务。
25 8
|
8天前
|
存储 SQL 关系型数据库
MySQL万字超详细笔记❗❗❗
MySQL万字超详细笔记❗❗❗
70 1
MySQL万字超详细笔记❗❗❗
|
13天前
|
SQL 关系型数据库 MySQL
【MySQL系列笔记】MySQL总结
MySQL 是一种关系型数据库,说到关系,那么就离不开表与表之间的关系,而最能体现这种关系的其实就是我们接下来需要介绍的主角 SQL,SQL 的全称是 Structure Query Language ,结构化的查询语言,它是一种针对表关联关系所设计的一门语言,也就是说,学好 MySQL,SQL 是基础和重中之重。SQL 不只是 MySQL 中特有的一门语言,大多数关系型数据库都支持这门语言。
232 8
|
13天前
|
SQL 关系型数据库 MySQL
【MySQL系列笔记】常用SQL
常用SQL分为三种类型,分别为DDL,DML和DQL;这三种类型的SQL语句分别用于管理数据库结构、操作数据、以及查询数据,是数据库操作中最常用的语句类型。 在后面学习的多表联查中,SQL是分析业务后业务后能否实现的基础,以及后面如何书写动态SQL,以及完成级联查询的关键。
203 6
|
13天前
|
存储 关系型数据库 MySQL
【MySQL系列笔记】InnoDB引擎-数据存储结构
InnoDB 存储引擎是MySQL的默认存储引擎,是事务安全的MySQL存储引擎。该存储引擎是第一个完整ACID事务的MySQL存储引擎,其特点是行锁设计、支持MVCC、支持外键、提供一致性非锁定读,同时被设计用来最有效地利用以及使用内存和 CPU。因此很有必要学习下InnoDB存储引擎,它的很多架构设计思路都可以应用到我们的应用系统设计中。
194 4
|
13天前
|
SQL 存储 关系型数据库
【MySQL系列笔记】SQL优化
SQL优化是通过调整数据库查询、索引、表结构和配置参数等方式,提高SQL查询性能和效率的过程。它旨在减少查询执行时间、减少系统资源消耗,从而提升数据库系统整体性能。优化方法包括索引优化、查询重写、表分区、适当选择和调整数据库引擎等。
226 3