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