如何实现mysql主从服务器的半同步复制
在mysql的主从架构和主主架构中,虽然这两种架构实现了mysql服务器的负载均衡,但却没有提高读写速度,且在这构架复制时,由于主服务器和从服务器都是独立的,所以异步复制很难保证数据的完整一致性,对于此mysql添加了半同步复制,在mysql5.5的版本之后都是支持此功能的,但默认用的是异步复制。
半同步复制模式简单介绍:根据名字可以,它不能达到同步复制,但却优于异步复制。主服务器有多个从服务器,主服务会等待其中一台数据写入成功,完成一致性之后,在执行其它数据写入,。但主服务器也不能一直在等待,所以又规定了超时时间,当超过时间之后,半同步复制则切换到异步复制。直到至少有一台从服务器于主服务的数据一致,才再次进入半同步复制。
下面就介绍如何实现半同步复制
请大家在实现下面功能之前,请确保自己的mysql已经是主从架构的服务器,如果不会配置主从服务器,请看我博客中的其它文章,里面有讲解的。
1、确保mysql支持半同步复制
在mysql的安装目录下执行下面的操作
[root@mail mysql]# ls lib/plugin/
semisync_master.so semisync_slave.so 若有这两个文件则说明支持半同步复制
如果没有则需要使用更高版本的mysql,5.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