MySQL半同步复制 - 优点、缺点、配置
说到半同步复制,就得先说说复制的三种方法:
异步复制:
对于异步复制而言,Master主机将事件写入到binlog日志后,并不保证所有的事件都已经复制到slave主机,因此如果Master和Slave之间有网络延迟,就会造成暂时的数据不一致的现象;如果Master出故障,而数据还没有复制过去,则会造成数据丢失;但也有好处,效率较其他两种复制方式高
半同步复制:
对于半同步复制而言,Master主机将事件发送给Slave主机后会触发一个等待,直到其中一个Slave节点(如果有多个Slave)返回数据复制成功的信息给Master,由此增强了数据的一致性,但是因为Master主机的确认开销,会损耗一部分的性能;另外,半同步复制除了不需要等待所有Slave主机确认事件的接收外,半同步数据复制并不要求那些事件完全地执行,因此,仍有可能看到在Slave主机上数据复制延迟的发生,如果因为网络延迟等原因造成Slave迟迟没有返回复制成功的信息,超过了Master设置的超时时长(rpl_semi_sync_master_timeout),半同步复制就降级为异步复制方式,而后继续数据复制
同步复制:
对于同步复制而言,Master主机将事件发送给Slave主机后会触发一个等待,直到所有Slave节点(如果有多个Slave)返回数据复制成功的信息给Master。这种复制方式最安全,但是同时,效率也是最差的
小结:
以上三种复制方法,没有绝对的优劣之分,根据自己的业务效率需求和对数据一致性、安全性的要求,自行选择
半同步复制插件的安装:(笔者线上MySQL使用的是5.6.16-log版本)
1、首先确认是否支持动态加载插件:(半同步复制是通过MySQL提供的插件来实现的)
Master、Slave主机主机都要确认
mysql> show variables like 'have_dynamic_loading';
+----------------------+-------+
| Variable_name | Value |
+----------------------+-------+
| have_dynamic_loading | YES |
+----------------------+-------+
2、安装插件:
Master主机:
mysql> install plugin rpl_semi_sync_master soname 'semisync_master.so';
Query OK, 0 rows affected (0.08 sec)
查看插件列表时,最后一个就是刚安装的半同步复制插件:
mysql> show plugins;
+----------------------------+----------+--------------------+--------------------+---------+
| Name | Status | Type | Library | License |
+----------------------------+----------+--------------------+--------------------+---------+
| rpl_semi_sync_master | ACTIVE | REPLICATION | semisync_master.so | GPL |
+----------------------------+----------+--------------------+--------------------+---------+
Slave主机:
mysql> install plugin rpl_semi_sync_slave soname 'semisync_slave.so';
Query OK, 0 rows affected (0.07 sec)
mysql> show plugins;
+----------------------------+----------+--------------------+--------------------+---------+
| Name | Status | Type | Library | License |
+----------------------------+----------+--------------------+--------------------+---------+
| rpl_semi_sync_slave | ACTIVE | REPLICATION | semisync_slave.so | GPL |
+----------------------------+----------+--------------------+--------------------+---------+
注意:如果安装插件时,不能安装成功,先检查下MySQL插件目录下,是否有对应的插件存在
mysql> show variables like '%plugin%';
+---------------+-------------------------------+
| Variable_name | Value |
+---------------+-------------------------------+
| plugin_dir | /usr/local/mysql//lib/plugin/ |
+---------------+-------------------------------+
1 row in set (0.00 sec)
3、开启半同步复制功能:
Master主机:
mysql> set global rpl_semi_sync_master_enabled=1;
Query OK, 0 rows affected (0.00 sec)
mysql> show global variables like 'rpl_semi_sync_master_enabled';
+------------------------------+-------+
| Variable_name | Value |
+------------------------------+-------+
| rpl_semi_sync_master_enabled | ON |
+------------------------------+-------+
1 row in set (0.00 sec)
查看Master错误日志显示半同步复制信息:
cat master.err
2019-05-14 15:50:50 1465 [Note] Semi-sync replication initialized for transactions.
2019-05-14 15:50:50 1465 [Note] Semi-sync replication enabled on the master.
Slave主机:
mysql> set global rpl_semi_sync_slave_enabled=1;
Query OK, 0 rows affected (0.01 sec)
mysql> show global variables like 'rpl_semi_sync_slave_enabled';
+-----------------------------+-------+
| Variable_name | Value |
+-----------------------------+-------+
| rpl_semi_sync_slave_enabled | ON |
+-----------------------------+-------+
1 row in set (0.00 sec)
注意:
为了防止这些动态的半同步复制参数在服务器重启后失效,需要写入到配置文件中,使其永久生效:
Master主机配置:
[mysqld]
rpl_semi_sync_master_enabled = 1
rpl_semi_sync_master_timeout = 1000
Slave主机配置:
[mysqld]
rpl_semi_sync_slave_enabled = 1
4、在Master主机通过MySQL状态变量来监控半同步复制情况
mysql> show global status like 'rpl%';
+--------------------------------------------+-------+
| Variable_name | Value |
+--------------------------------------------+-------+
| Rpl_semi_sync_master_clients | 0 |
| Rpl_semi_sync_master_net_avg_wait_time | 4803 |
| Rpl_semi_sync_master_net_wait_time | 4803 |
| Rpl_semi_sync_master_net_waits | 1 |
| Rpl_semi_sync_master_no_times | 1 |
| Rpl_semi_sync_master_no_tx | 1 |
| Rpl_semi_sync_master_status | ON |
| Rpl_semi_sync_master_timefunc_failures | 0 |
| Rpl_semi_sync_master_tx_avg_wait_time | 1975 |
| Rpl_semi_sync_master_tx_wait_time | 1975 |
| Rpl_semi_sync_master_tx_waits | 1 |
| Rpl_semi_sync_master_wait_pos_backtraverse | 0 |
| Rpl_semi_sync_master_wait_sessions | 0 |
| Rpl_semi_sync_master_yes_tx | 1 |
+--------------------------------------------+-------+
14 rows in set (0.00 sec)
参数含义,具体参考MySQL官网
注意:
如果你配置好了半同步,在Master变更了数据,Slave也能够正常的同步数据,但是在监控半同步复制情况时,发现Rpl_semi_sync_master_status值为OFF,但rpl_semi_sync_master_enabled为ON,说明之前依然是采用的异步复制方式,此时需要重启Slave,才能使用半同步复制方式生效
查看半同步复制相关的系统变量:
mysql> show global variables like 'rpl_semi%';
+------------------------------------+-------+
| Variable_name | Value |
+------------------------------------+-------+
| rpl_semi_sync_master_enabled | ON |
| rpl_semi_sync_master_timeout | 10000 | Master提交事件后,等待Slave的确认信息超时后,切换到异步复制模式的时间
| rpl_semi_sync_master_trace_level | 32 |
| rpl_semi_sync_master_wait_no_slave | ON |
+------------------------------------+-------+
4 rows in set (0.00 sec)
参数含义,具体参考MySQL官网
半同步数据复制可以在等待确认超时发生的时候降级为异步复制:
1、在Slave上模拟网络出现了问题
ifdown eth0(网络关掉后,第三方客户端,如:Xshell等会断)
2.1在Maser上更新一条数据:
mysql> update edusoho_e.t1 set xname='MySQL' where id=39;
Query OK, 1 row affected (10.04 sec) 因为Master需要等待Slave的确认信息,所以需要10s,这也说明半同步复制是成功的
Rows matched: 1 Changed: 1 Warnings: 0
2.2查看Master错误日志,可以看到半同步复制已经降级了(不过数据还是能够复制到Slave的)
cat master.err
2019-05-14 15:59:39 1465 [Warning] Timeout waiting for reply of binlog (file: mysql-bin.000004, pos: 2860), semi-sync up to file mysql-bin.000004, position 2606.
2019-05-14 15:59:39 1465 [Note] Semi-sync replication switched OFF
记得将Slave的网卡开启
ifup eth0
卸载半同步复制插件:
如果不再需要半同步复制方式,可以将半同步复制插件卸载掉:
mysql> uninstall plugin rpl_semi_sync_master; (Slave主机是rpl_semi_sync_slave)