MySQL 半同步复制详解

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介:

MySQL Semisynchronous Replication


MySQL5.5 除了支持内置的异步复制机制,还开始支持接口支持半同步复制的机制。


一、半同步复制的概念:


i.

当Slave主机连接到Master时,能够查看其是否处于半同步复制的机制。


ii.

当Master上开启半同步复制的功能时,至少应该有一个Slave开启其功能。此时,一个线程在Master上提交事务将受到阻塞,直到得知一个已开启半同步复制功能的Slave已收到此事务的所有事件,或等待超时。


iii.

当一个事务的事件都已写入其relay-log中且已刷新到磁盘上,Slave才会告知已收到。


iv.

如果等待超时,也就是Master没被告知已收到,此时Master会自动转换为异步复制的机制。当至少一个半同步的Slave赶上了,Master与其Slave自动转换为半同步复制的机制。


v.

半同步复制的功能要在Master,Slave都开启,半同步复制才会起作用;否则,只开启一边,它依然为异步复制。



二、同步,异步,半同步复制的比较:


同步复制:Master提交事务,直到事务在所有的Slave都已提交,此时才会返回客户端,事务执行完毕。缺点:完成一个事务可能会有很大的延迟。


异步复制:当Slave准备好才会向Master请求binlog。缺点:不能保证一些事件都能够被所有的Slave所接收。


半同步复制:半同步复制工作的机制处于同步和异步之间,Master的事务提交阻塞,只要一个Slave已收到该事务的事件且已记录。它不会等待所有的Slave都告知已收到,且它只是接收,并不用等其完全执行且提交。



三、常用参数解释:


开启半同步复制的状态量:


rpl_semi_sync_master_enabled  是控制Master是否开启半同步,开启或不开启,将其设置为ON或OFF(1or0).


rpl_semi_sync_master_timeout  是控制Master等待多长时间被告知Slave已收到,也就是所谓的超时时间。


rpl_semi_sync_slave_enabled   是控制Slave是否开启半同步,开启或不开启,将其设置为ON或OFF(1or0)。



监控半同步复制的状态变量(几个常用的):


Rpl_semi_sync_master_clients:查看有多少个开启半同步复制的插件的Slave


Rpl_semi_sync_master_status:查看在Master上半同步复制是否正在运行,其值为ON时,说明Master已启用半同步且已被告知有Slave收到;其值为OFF时,说明Master没启用半同步或是没被告知,由于timeout等原因。


Rpl_semi_sync_master_no_tx:查看有多少事务没有用半同步复制的机制进行复制。


Rpl_semi_sync_master_yes_tx:查看有多少事务是通过半同步复制机制成功复制。


Rpl_semi_sync_slave_status:查看Slave上半同步复制是否正常运行,其值为ON时,说明Slave正通过半同步复制且Slave I/O正在运行;为OFF时,反之。


可以通过以下方法查看以上的参数状态:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
mysql> show status  like  'rpl_semi%' ;
+ --------------------------------------------+-------+
| Variable_name                    | Value     |
+ --------------------------------------------+-------+
| Rpl_semi_sync_master_clients            | 2      |
| Rpl_semi_sync_master_net_avg_wait_time         | 654     |
| Rpl_semi_sync_master_net_wait_time         | 1308     |
| Rpl_semi_sync_master_net_waits           | 2     |
| 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             | 1     |
| Rpl_semi_sync_slave_status             |  ON      |
+ --------------------------------------------+-------+
15  rows  in  set  (0.00 sec)



四、开始部署:


部署环境要求:


i.MySQL版本需求


MySQL5.5或以上版本


ii.

在MySQL上安装插件需要数据库支持动态载入。检查是否支持,用如下检测:

1
2
3
4
5
6
7
mysql> show  global  variables  like  'have_dynamic_loading' ;
+ ----------------------+-------+
| Variable_name        | Value |
+ ----------------------+-------+
| have_dynamic_loading | YES  |
+ ----------------------+-------+
1 row  in  set  (0.00 sec)


iii.半同步复制是基于复制的环境。也就是说配置半同步复制前,已有复制的环境。


开始安装:


在Master上执行:

1
mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME  'semisync_master.so' ;


各个Slave上执行:

1
mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME  'semisync_slave.so' ;



iv.如果不清楚Plugin的目录,用如下查找:

1
2
3
4
5
6
mysql> show  global  variables  like  'plugin_dir' ;
+ ---------------+----------------------------------+
| Variable_name | Value                            |
+ ---------------+----------------------------------+
| plugin_dir    | /opt/usr/ local /mysql/lib/plugin/ |
+ ---------------+----------------------------------+


v.检查Plugin是否已正确安装:

1
2
3
mysql> show plugins;
or
mysql>  select  from  information_schema.plugins;



五、开始配置:


在Master上执行:

1
2
mysql>  SET  GLOBAL  rpl_semi_sync_master_enabled = 1;
mysql>  SET  GLOBAL  rpl_semi_sync_master_timeout = N; N自己设置一个数字即可


在Slave上执行:

1
mysql>  SET  GLOBAL  rpl_semi_sync_slave_enabled = 1;


如果在一个正在运行的Slave上开启半同步复制的功能,必须先停止Slave I/O,将其启用半同步后,再开启Slave I/O.

1
2
mysql> STOP SLAVE IO_THREAD; 
        START SLAVE IO_THREAD;


如果不这样做,Slave还是会以异步的方式进行复制。


正如大家所知,如果不将变量的设置写到配置文件,下次重启数据库,将失效。写入配置文件:


Master上:


[mysqld]


rpl_semi_sync_master_enabled=1


rpl_semi_sync_master_timeout=1000 #default 1 second



Slave上:


[mysqld]


rpl_semi_sync_slave_enabled=1


总结:

半同步复制个人感觉是维持数据完整性,安全性的的一个策略,虽会损失一点性能,还是值得的。配置很简单,关键是理解其工作机制。、




      本文转自crazy_charles 51CTO博客,原文链接:http://blog.51cto.com/douya/1790281,如需转载请自行联系原作者




相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
5月前
|
关系型数据库 MySQL
MySQL 5.7 基于GTID主从复制+并行复制+半同步复制
MySQL 5.7 基于GTID主从复制+并行复制+半同步复制
77 0
|
关系型数据库 MySQL 数据库
MySQL的延迟复制、半同步复制,主主复制,异步复制有什么区别?底层原理是什么?
MySQL的延迟复制、半同步复制,主主复制,异步复制有什么区别?底层原理是什么?
252 0
|
关系型数据库 MySQL
MySQL的半同步复制是什么意思?底层原理是什么?
MySQL的半同步复制是什么意思?底层原理是什么?
120 0
|
关系型数据库 MySQL
MySQL 5.7 基于 GTID 主从复制 + 并行复制 + 半同步复制
MySQL 5.7 基于 GTID 主从复制 + 并行复制 + 半同步复制
536 0
|
关系型数据库 MySQL 测试技术
MySQL压测--异步与半同步复制
  最近在看MySQL5.7 Manual,有关Semisynchronous Replication这一块的内容,我们知道,MySQL默认的Replication是异步的,何为异步?何为半同步?废话不多说,直接看官方解释吧: 1.
2484 0
|
关系型数据库 MySQL SQL
mysql主从复制、半同步复制配置记录
mysql主从复制、半同步复制配置记录
1572 0
|
关系型数据库 MySQL 数据库
mysql配置为半同步复制
mysql 半同步插件是由谷歌提供,具体位置/usr/local/mysql/lib/plugin/下,一个是 master用的 semisync_master.so,一个是 slave 用的 semisync_slave.so,下面我们就来具体配置一下。
1299 0
|
关系型数据库 MySQL
mysql配置完半同步复制之后报错[ERROR] The server quit without updating PID file
修改配置,MySQL启动报:[ERROR] The server quit without updating PID file     [root@localhost mysql]# /etc/init.
1986 0
|
监控 MySQL 关系型数据库
mysql的主从复制和半同步复制
mysql的主从复制和半同步复制 一.主从复制 MySQL数据库自身提供的主从复制功能可以方便的实现数据的多处自动备份,实现数据库的拓展。多个数据备份不仅可以加强数据的安全性,通过实现读写分离还能进一步提升数据库的负载性能。
1500 0
|
关系型数据库 MySQL
MySQL异步、同步、半同步复制
异步复制 MySQL复制默认是异步复制,Master将事件写入binlog,提交事务,自身并不知道slave是否接收是否处理; 缺点:不能保证所有事务都被所有slave接收。 同步复制 Master提交事务,直到事务在所有slave都已提交,才会返回客户端事务执行完毕信息; 缺点:完成一个事务可能造成延迟。
1056 0