说说MySQL的半同步复制

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,高可用系列 2核4GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介:

    MySQL Semisynchronous Replication

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

异步复制的缺点:

MySQL复制默认是异步复制,Master将事件写入binlog,但并不知道Slave是否或何时已经接收且已处理。在异步复制的机制的情况下,如果Master宕机,事务在Master上已提交,但很可能这些事务没有传到任何的Slave上。假设有Master->Salve故障转移的机制,此时Slave也可能会丢失事务。

半同步复制的概念:

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

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

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

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

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

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

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

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

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

半同步复制的控制变量,状态监控变量:

控制变量

Variable Name Variable Scope Dynamic Variable Type Default Effect Host
rpl_semi_sync_master_enabled Global Yes boolean OFF Master
rpl_semi_sync_slave_enabled Global Yes boolean OFF Slave
rpl_semi_sync_master_timeout Global Yes numeric 10000 Master

解释:

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时,反之。

说明关于其它的请参阅:http://dev.mysql.com/doc/refman/5.5/en/index.html

半同步复制的安装,配置

环境要求:

  1. MySQL5.5或以上版本

  2. 在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' ;

如果不清楚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/ |
+ ---------------+----------------------------------+

检查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;

在Slave上执行:

1
mysql>  SET  GLOBAL  rpl_semi_sync_slave_enabled = 1;

说明:

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

1
mysql> STOP SLAVE IO_THREAD; START SLAVE IO_THREAD;

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

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

Master上:

1
2
3
[mysqld]
rpl_semi_sync_master_enabled= 1
rpl_semi_sync_master_timeout= 1000  1  second

Slave上:

1
2
[mysqld]
rpl_semi_sync_slave_enabled= 1

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










本文转自 kuchuli 51CTO博客,原文链接:http://blog.51cto.com/lgdvsehome/1231046,如需转载请自行联系原作者
相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
目录
相关文章
|
9月前
|
SQL 存储 关系型数据库
MySQL主从复制 —— 作用、原理、数据一致性,异步复制、半同步复制、组复制
MySQL主从复制 作用、原理—主库线程、I/O线程、SQL线程;主从同步要求,主从延迟原因及解决方案;数据一致性,异步复制、半同步复制、组复制
981 11
|
监控 关系型数据库 MySQL
银河麒麟V10 SP3 X86 二进制文件部署 mysql-5.7.29 GTID 半同步复制的双主架构
银河麒麟V10 SP3 X86 二进制文件部署 mysql-5.7.29 GTID 半同步复制的双主架构
871 1
|
关系型数据库 MySQL
MySQL 5.7 基于GTID主从复制+并行复制+半同步复制
MySQL 5.7 基于GTID主从复制+并行复制+半同步复制
320 0
|
关系型数据库 MySQL
MySQL半同步(四)流程和相关参数
MySQL半同步(四)流程和相关参数
686 0
MySQL半同步(四)流程和相关参数
|
关系型数据库 MySQL 数据库
MySQL的延迟复制、半同步复制,主主复制,异步复制有什么区别?底层原理是什么?
MySQL的延迟复制、半同步复制,主主复制,异步复制有什么区别?底层原理是什么?
533 0
|
关系型数据库 MySQL
MySQL的半同步复制是什么意思?底层原理是什么?
MySQL的半同步复制是什么意思?底层原理是什么?
417 0
|
关系型数据库 MySQL
MySQL 5.7 基于 GTID 主从复制 + 并行复制 + 半同步复制
MySQL 5.7 基于 GTID 主从复制 + 并行复制 + 半同步复制
810 0
|
关系型数据库 MySQL
MySQL半同步(四)流程和相关参数
MySQL半同步(四)流程和相关参数
MySQL半同步(四)流程和相关参数
|
关系型数据库 MySQL 测试技术
MySQL压测--异步与半同步复制
  最近在看MySQL5.7 Manual,有关Semisynchronous Replication这一块的内容,我们知道,MySQL默认的Replication是异步的,何为异步?何为半同步?废话不多说,直接看官方解释吧: 1.
2633 0
|
关系型数据库 MySQL SQL
mysql主从复制、半同步复制配置记录
mysql主从复制、半同步复制配置记录
1695 0

推荐镜像

更多