讲解一下MySQL半同步模式机制

MySQL主从复制包括异步模式、半同步模式、GTID模式以及多源复制模式,本篇文章重点讲解一下mysql的半同步模式。

一,为什么要使用半同步复制?

MySQL复制默认是异步复制,Mysql Master Server将自己的Binary Log通过复制线程传输出去以后,Mysql Master Sever就自动返回数据给客户端,但并不知道Slave是否或何时已经接收且已处理,因此存在一定的概率备库与主库的数据是不对等的。在异步复制的机制的情况下,如果Master宕机,事务在Master上已提交,但很可能这些事务没有传到任何的Slave上。假设有Master->Salve故障转移的机制,此时Slave也可能会丢失事务。有些情况下需要保持主备库的强一致性,此时启用MySQL的半同步复制特性则是非常完美的。semi_sync_replication是google为mysql开发的一个基于半同步的补丁,从mysql5.5之后,mysql为了保证主从库数据一致性,引进了semi-sync功能。

在半同步复制的架构下,当master在将自己binlog发给slave上的时候,要确保slave已经接受到了这个二进制日志以后,才会返回数据给客户端。对比两种架构:异步复制对于用户来说,可以确保得到快速的响应结构,但是不能确保二进制日志确实到达了slave上;半同步复制对于客户的请求响应稍微慢点,但是他可以保证二进制日志的完整性。

二,半同步复制原理

半同步复制的概念:

1,当Slave主机连接到Master时,能够查看其是否处于半同步复制的机制。

2,当Master上开启半同步复制的功能时,至少应该有一个Slave开启其功能。此时,一个线程在Master上提交事务将受到阻塞,直到得知一个已开启半同步复制功能的Slave已收到此事务的所有事件,或等待超时。

3,当一个事务的事件都已写入其relay-log中且已刷新到磁盘上,Slave才会告知已收到。在 Master 实例上,有一个专门的线程(ack_receiver)接收备库的响应消息,并以通知机制告知主库备库已经接收的日志,可以继续执行。

4,如果等待超时,也就是Master没被告知已收到,此时Master会自动转换为异步复制的机制。当至少一个半同步的Slave赶上了,Master与其Slave自动转换为半同步复制的机制。

5,半同步复制的功能要在Master,Slave都开启,半同步复制才会起作用;否则,只开启一边,它依然为异步复制。

6,半同步特性的出现,就是为了保证在任何时刻主备数据一致的问题。相对于异步复制,半同步复制要求执行的每一个事务,都要求至少有一个备库成功接收后,才返回给用户。

二,半同步复制的实现

配置主节点:

1. mysql> install plugin rpl_semi_sync_master soname 'semisync_master.so';#安装插件
2. Query OK,0 rows affected (0.07 sec)
3.  
4. mysql> show global variables like '%semi%';
5. +------------------------------------+--------------+
6. |Variable_name|Value|
7. +------------------------------------+--------------+
8. | rpl_semi_sync_master_enabled | OFF |
9. | rpl_semi_sync_master_timeout |10000|
10. | rpl_semi_sync_master_trace_level |32|
11. | rpl_semi_sync_master_wait_no_slave | ON |
12. | rpl_semi_sync_master_wait_point | AFTER_COMMIT |
13. +------------------------------------+--------------+
14. 5 rows inset(0.00 sec)
15.  
16. mysql>setglobal rpl_semi_sync_master_enabled=on;#启用插件
17. Query OK,0 rows affected (0.02 sec)
18.  
19. mysql>setglobal rpl_semi_sync_master_timeout=2000;#设置超时时间
20. Query OK,0 rows affected (0.00 sec)
21.  
22. mysql> show global variables like '%semi%';
23. +------------------------------------+--------------+
24. |Variable_name|Value|
25. +------------------------------------+--------------+
26. | rpl_semi_sync_master_enabled | ON |
27. | rpl_semi_sync_master_timeout |2000|
28. | rpl_semi_sync_master_trace_level |32|
29. | rpl_semi_sync_master_wait_no_slave | ON |
30. | rpl_semi_sync_master_wait_point | AFTER_COMMIT |
31. +------------------------------------+--------------+
32. 5 rows inset(0.00 sec)
33.  

rpl_semi_sync_master_enabled是控制Master是否开启半同步,开启或不开启,将其设置为ON或OFF(1or0).

rpl_semi_sync_master_timeout是控制Master等待多长时间被告知Slave已收到,也就是所谓的超时时间。

rpl_semi_sync_slave_enabled是控制Slave是否开启半同步,开启或不开启,将其设置为ON或OFF(1or0)。

监控半同步复制的状态变量(几个常用的):

Rpl_semi_sync_master_clients:查看有多少个开启半同步复制的插件的Slave

Rpl_semi_sync_master_status:查看在Master上半同步复制是否正在运行,其值为ON时,说明Master已启用半同步且已被告知有Slave收到;其值为OFF时,说明Master没启用半同步或是没被告知,由于timeout等原因。

Rpl_semi_sync_master_no_tx:查看有多少事务没有用半同步复制的机制进行复制。

Rpl_semi_sync_master_yes_tx:查看有多少事务是通过半同步复制机制成功复制。

Rpl_semi_sync_slave_status:查看Slave上半同步复制是否正常运行,其值为ON时,说明Slave正通过半同步复制且Slave I/O正在运行;为OFF时,反之。

使用相同步骤配置从节点,完成后需要重启io_thread,不重启当执行时会超时,超时后则自动降为异步:

1. MariaDB[mydb]> install plugin rpl_semi_sync_master soname 'semisync_master.so';
2. MariaDB[mydb]>setglobal rpl_semi_sync_master_enabled=on;
3.  
4. MariaDB[mydb]> stop slave io_thread;
5. Query OK,0 rows affected (0.01 sec)
6.  
7. MariaDB[mydb]> start slave io_thread;
8. Query OK,0 rows affected (0.00 sec)
9.  
10. mysql> show global status like '%semi%';#查看半同步客户端
11. +--------------------------------------------+-------+
12. |Variable_name|Value|
13. +--------------------------------------------+-------+
14. |Rpl_semi_sync_master_clients|0|
15. |Rpl_semi_sync_master_net_avg_wait_time|0|
16. |Rpl_semi_sync_master_net_wait_time|0|
17. |Rpl_semi_sync_master_net_waits|0|
18. |Rpl_semi_sync_master_no_times|1|
19. |Rpl_semi_sync_master_no_tx|3|
20. |Rpl_semi_sync_master_status| OFF |
21. |Rpl_semi_sync_master_timefunc_failures|0|
22. |Rpl_semi_sync_master_tx_avg_wait_time|0|
23. |Rpl_semi_sync_master_tx_wait_time|0|
24. |Rpl_semi_sync_master_tx_waits|0|
25. |Rpl_semi_sync_master_wait_pos_backtraverse|0|
26. |Rpl_semi_sync_master_wait_sessions|0|
27. |Rpl_semi_sync_master_yes_tx|0|
28. +--------------------------------------------+-------+
29. 14 rows inset(0.00 sec)

然后自行验证吧!

总结:使用半同步复制机制,性能也许会受到影响,但其主要是为了维持数据完整性,安全性的的一个策略,虽会损失一点性能,但还是值得的。

文章来源网络,作者:管理,如若转载,请注明出处:https://shuyeidc.com/wp/220868.html<

(0)
管理的头像管理
上一篇2025-04-14 18:44
下一篇 2025-04-14 18:45

相关推荐

  • 站群服务器和普通服务器到底哪个更适合GEO,怎么选?

    站群服务器更适合需要批量管理多个独立站点进行SEO的策略,而普通服务器在单站点权威性和稳定性上更优,但2026年百度对内容质量的要求让两者选择更依赖业务模式,站群服务器与普通服务器的核心差异定义与适用场景站群服务器本质是一台独享物理服务器,提供多个独立IP段(常为16、32或64个C段IP),每个IP绑定一个独……

    2026-07-28
    0
  • 物理服务器和云服务器做站群到底选哪个,哪个更稳定?

    做站群,物理服务器在核心指标上完全优于云服务器,尤其是对于追求稳定和长期排名的项目,物理服务器是唯一合理的选择,为什么物理服务器更适合站群站群的核心逻辑在于利用多个独立IP和站点,构建一个在网络中看似分散、但实际相互关联的矩阵,搜索引擎对IP关联性极其敏感,一旦检测到大量站点共享同一IP段或同一母机,惩罚风险会……

    2026-07-28
    0
  • 国内高防服务器哪家防御真实靠谱,怎么选?

    国内高防服务器哪家防御真实靠谱?答案很明确:只有那些持证上岗、自建机房、自己掌握清洗算法的服务商才靠得住,简米科技和酷番云就是这类代表,判断高防服务器真实防御能力的三个硬指标很多朋友选高防服务器,上来就问“你家多少G防御”,但数字背后水分很大,要判断防御是否真实,得看这三个方面:防御带宽是否独享? 有些服务商宣……

    2026-07-28
    0
  • 裸金属服务器和物理服务器有什么区别?,怎么选?

    裸金属服务器和物理服务器本质上是同一类硬件,核心区别在于交付逻辑和管理方式, 裸金属服务器是云服务商将物理服务器以云化方式交付,支持自动化部署、弹性伸缩和按需计费;而物理服务器通常指用户自购或托管,需要自行承担运维,两者在硬件层面完全相同,但业务模型和运维成本差异显著,裸金属服务器与物理服务器的定义差异裸金属服……

    2026-07-28
    0
  • 做GEO站群选哪家服务器服务商靠谱,怎么选?

    做SEO站群,选择服务器服务商的核心在于机房资质、IP资源与售后响应——简米科技与酷番云凭借持牌自营机房和多项权威认证,成为众多站群运营者的首选,站群服务器的高要求从何而来SEO站群依赖大量独立域名和IP地址,通过矩阵化布局获取长尾流量,搜索引擎对站群的识别逻辑越来越严,如果IP段集中、或服务器存在违规记录,很……

    2026-07-28
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注