博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MySQL 半同步复制详解
阅读量:6075 次
发布时间:2019-06-20

本文共 3946 字,大约阅读时间需要 13 分钟。

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,如需转载请自行联系原作者

你可能感兴趣的文章
注入或获取spring上下文的几种方式
查看>>
Java中利用MessageFormat对象实现类似C# string.Format方法格式化
查看>>
Citrix发布新一代远程交付协议,EDT
查看>>
逆思维调用双版本PHP7和5
查看>>
14个坏习惯可能让你丢掉工作
查看>>
unbuntu 修改网卡
查看>>
鸟哥私房菜重温笔记7
查看>>
memset用法详解
查看>>
我的友情链接
查看>>
学习python:练习5.简单红包程序
查看>>
日志轮替简介
查看>>
生成7位不同的随机整数
查看>>
我的友情链接
查看>>
<img src="data:xxx1" style=aaa:'"/onerror=alert(1)//' >
查看>>
zabbix-----2-----监控nginx的状态
查看>>
我的友情链接
查看>>
***学习笔记--场景篇--通过mysql的root账号来get shell
查看>>
mysql之触发器trigger
查看>>
我的友情链接
查看>>
Java中的匿名内部类
查看>>