千家信息网

MySQL半同步复制 - 优点、缺点、配置

发表于:2024-11-23 作者:千家信息网编辑
千家信息网最后更新 2024年11月23日,说到半同步复制,就得先说说复制的三种方法:异步复制:对于异步复制而言,Master主机将事件写入到binlog日志后,并不保证所有的事件都已经复制到slave主机,因此如果Master和Slave之间
千家信息网最后更新 2024年11月23日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




0