如何实现mysql主从服务器的半同步复制

mysql的主从架构和主主架构中,虽然这两种架构实现了mysql服务器的负载均衡,但却没有提高读写速度,且在这构架复制时,由于主服务器和从服务器都是独立的,所以异步复制很难保证数据的完整一致性,对于此mysql添加了半同步复制,在mysql5.5的版本之后都是支持此功能的,但默认用的是异步复制

 

半同步复制模式简单介绍:根据名字可以,它不能达到同步复制,但却优于异步复制。主服务器有多个从服务器,主服务会等待其中一台数据写入成功,完成一致性之后,在执行其它数据写入,。但主服务器也不能一直在等待,所以又规定了超时时间,当超过时间之后,半同步复制则切换到异步复制。直到至少有一台从服务器于主服务的数据一致,才再次进入半同步复制

 

下面就介绍如何实现半同步复制

请大家在实现下面功能之前,请确保自己的mysql已经是主从架构的服务器,如果不会配置主从服务器,请看我博客中的其它文章,里面有讲解的

 

1、确保mysql支持半同步复制

mysql的安装目录下执行下面的操作

[root@mail mysql]# ls lib/plugin/             

semisync_master.so semisync_slave.so            若有这两个文件则说明支持半同步复制

                                                          如果没有则需要使用更高版本的mysql5.5以上的都支持,

 

2、在主、从服务器上个安装模块,并设定其值

在主服务器上

mysql> install plugin rpl_semi_sync_master soname 'semisync_master.so'; 

                                                 安装主服务器半同步模块

mysql> set global rpl_semi_sync_master_enabled=1;    启动半同步器模块

mysql> set global rpl_semi_sync_master_timeout=1000;   设定超时时间,默认单位是毫秒

在从服务器上

install plugin rpl_semi_sync_slave soname 'semisync_slave.so';   安装从服务器半同步模块

mysql> set global rpl_semi_sync_slave_enabled=1;           启动半同步模块

mysql> stop slave;                                   关闭从服务器

mysql> start slave;                                   开启从服务器

 

3、验证半同步复制是否开启

在从服务器上验证

mysql> show global status like 'rpl_semi%';

+----------------------------+-------+

| Variable_name            | Value |

+----------------------------+-------+

| Rpl_semi_sync_slave_status | ON  |       当显示是on时,则说明已经开启半同步模式

     

+----------------------------+-------+

1 row in set (0.00 sec)                     

在主服务器上验证

mysql> show global status like 'rpl_semi%';

+--------------------------------------------+-------+

| Variable_name                        | Value |

+--------------------------------------------+-------+

| Rpl_semi_sync_master_clients                    | 1 |  值为1,说明有一个半同步从服务器

| Rpl_semi_sync_master_net_avg_wait_time | 0 | 事务进入等待队列后,到网络平均等待时间

| Rpl_semi_sync_master_net_wait_time      | 0 |  事务进入等待队列后,到网络等待时间

| Rpl_semi_sync_master_net_waits              | 0 | 

| Rpl_semi_sync_master_no_times               | 0 | 

| Rpl_semi_sync_master_no_tx                     | 0    显示从服务器确认的不成功提交数

| Rpl_semi_sync_master_status                | ON |   on时是半同步模式,off是异步模式

| Rpl_semi_sync_master_timefunc_failures | 0 | 

| Rpl_semi_sync_master_tx_avg_wait_time | 0 | 事务因开启Semi_sync平均需要额外等待的时间

| Rpl_semi_sync_master_tx_wait_time    | 0 |  事务因开启Semi_sync,需要额外等待的时间

| 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                     | 0 |  显示从服务器确认的成功提交数

+--------------------------------------------+-------+

14 rows in set (0.02 sec)

如果你也能看见上述内容,则恭喜你半同步复制已经配置完成。

 

 

为了让mysql在重启之后还支持半同步复制,则需要在配置文件中写入一下内容

在主、从服务器上的的my.cnf中编辑:

在主服务器上

[mysqld]  

rpl_semi_sync_master_enabled=1  

rpl_semi_sync_master_timeout=1000 

在从服务器上

[mysqld]  

rpl_semi_sync_slave_enabled=1