MySQL半同步复制 - 优点、缺点、配置
admin
2023-04-17 18:21:15
0

说到半同步复制,就得先说说复制的三种方法:

异步复制:

对于异步复制而言,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




相关内容

热门资讯

徐巧芯剖析赖清德:最怕自己丢掉... 海峡导报综合报道 大罢免投票一周年纪念活动26日举行,台北市长蒋万安出席并怒轰,民进党一年过后仍没有...
中国红十字会总会紧急向广东调拨... 记者从中国红十字会总会了解到,针对台风“红霞”给广东造成的灾情,中国红十字会总会启动四级应急响应,紧...
这些少年,正被“毒蛋”围猎 李梦抽了几口电子烟,吐出了白色的烟雾,有一股浓烈的水果香味。随后,她看着自己握电子烟的手,跟身边人说...
蒋万安号召“倒阁”,卢秀燕认为... 海峡导报综合报道 台北市长蒋万安27日抛出震撼议题,表示多名民代向他提议推动“倒阁”,要求台行政机构...
特朗普将在白宫会见两位重要客人 俄乌战争仍未结束,美伊冲突又有升级风险。在此背景下,美国总统特朗普将在白宫接见乌克兰和以色列领导人。...
新租客打扫卧室柜子上掉落4万元... 近日,莲前西路某小区内,张倩签下一套房子的租赁合同。当天上午,她带着12岁的大女儿周馨怡和11岁的小...
六部门通告:禁止涉军队退役报废... 关于禁止涉军队退役报废装备销售活动的通告近年来,部分经营者在线上线下公开销售涉及我军退役报废装备(指...
九寨沟景区发生泥石流,部分道路... 7月26日,九寨沟风景名胜区管理局发布泥石流灾害通报:2026年7月26日15时50分,九寨沟景区局...
空调26度不凉是什么原因 从空调内部元器件来说,不凉的原因有可能是温度传感器出现故障了,也有可能是空调压缩机或者铜管出现问题,...
鲸鸿动能携手香港国际机场、鸿蒙...   2026 年 7 月 25 日,十余位鸿蒙车主组成的车队从珠海出发,经港珠澳大桥通关抵达香港国际...