首页 > 数据库 > 数据库开发技术 > Mysql 数据可用性之半同步复制
为什么要使用半同步复制
MySQL默认使用异步复制来同步数据,这意味着当MySQL主服务器通过复制线程将自己的二进制日志发送给从服务器时,它会立即向客户端返回数据,而无需确认从服务器是否接收或处理了这些数据。这种复制方式可能导致主从数据库之间的数据不一致,因为主库的数据可能已经提交,但从库未必及时接收到这些数据。如果主库出现故障,提交的事务可能没有传播到任何从库,这种情况下如果采用主库到从库的故障转移机制,从库也可能会丢失数据。
为了在主备库之间保持数据的一致性,MySQL引入了半同步复制特性。这种复制方式是Google为MySQL开发的一种基于半同步的补丁,从MySQL 5.5开始提供。通过半同步复制,当主库将自己的二进制日志发送给从库时,它会等待从库确认收到日志后,再向客户端返回数据。这种机制与异步复制相比,为用户请求提供稍微慢一些的响应,但可以确保二进制日志的完整性,并减少数据丢失的风险。

半同步复制原理
半同步复制架构图如下所示

半同步复制的概念
1、当从库连接到主库时,你可以查看它是否处于半同步复制机制,这样可以确保从库与主库之间的数据同步过程。
2、当在主库上启用半同步复制功能时,至少要有一个从库开启半同步复制,以便确保数据的完整性。当主库上有线程提交事务时,它会被阻塞,直到确认至少一个从库成功接收到该事务的所有数据事件,或者超时。
3、从库会在将所有事务事件写入其中继日志并刷新到磁盘后,通知主库已接收到数据。在主库上,专门的ack_receiver线程接收从库的响应消息,并通知主库已收到日志,可以继续执行操作。
4、如果等待超时,主库未能接收到从库的确认,此时主库会自动切换为异步复制模式。如果至少有一个从库已经同步了数据,主库和该从库会自动切换为半同步复制模式。
5、半同步复制功能需要在主库和从库上都启用,才会起作用;否则,如果只在一边启用,仍然是异步复制。
6、半同步复制的目标是确保主从库的数据一致性。相对于异步复制,半同步复制要求每个事务都至少被一个从库成功接收后,才返回给用户结果。这样可以提高数据的一致性和可靠性。

三,半同步复制的实现
配置主节点:
#安装插件mysql> install plugin rpl_semi_sync_master soname 'semisync_master.so';Query OK, 0 rows affected (0.07 sec)mysql> show global variables like '%semi%';+------------------------------------+--------------+| Variable_name | Value |+------------------------------------+--------------+| rpl_semi_sync_master_enabled | OFF || rpl_semi_sync_master_timeout | 10000 || rpl_semi_sync_master_trace_level | 32 || rpl_semi_sync_master_wait_no_slave | ON || rpl_semi_sync_master_wait_point | AFTER_COMMIT |+------------------------------------+--------------+5 rows in set (0.00 sec)#启用插件mysql> set global rpl_semi_sync_master_enabled=on;Query OK, 0 rows affected (0.02 sec)#设置超时时间mysql> set global rpl_semi_sync_master_timeout=2000;Query OK, 0 rows affected (0.00 sec)mysql> show global variables like '%semi%';+------------------------------------+--------------+| Variable_name | Value |+------------------------------------+--------------+| rpl_semi_sync_master_enabled | ON || rpl_semi_sync_master_timeout | 2000 || rpl_semi_sync_master_trace_level | 32 || rpl_semi_sync_master_wait_no_slave | ON || rpl_semi_sync_master_wait_point | AFTER_COMMIT |+------------------------------------+--------------+5 rows in set (0.00 sec)
解释
rpl_semi_sync_master_enabled 是用于控制主库是否启用半同步复制。通过将其设置为 ON 或 1 来开启,设置为 OFF 或 0 来关闭。rpl_semi_sync_master_timeout 是用于控制主库等待从库确认数据接收的超时时间。这是主库在进行事务提交时等待从库接收到数据的最长时间。rpl_semi_sync_slave_enabled 是用于控制从库是否启用半同步复制。通过将其设置为 ON 或 1 来开启,设置为 OFF 或 0 来关闭。
监控半同步复制的常用的状态变量
Rpl_semi_sync_master_clients:显示开启半同步复制的从库(Slave)数量,即有多少个从库安装了半同步复制插件并启用。Rpl_semi_sync_master_status:显示主库上的半同步复制是否在运行。值为 ON 时,说明主库启用了半同步复制且确认至少一个从库接收了数据。值为 OFF 时,说明主库没有启用半同步复制或主库因超时等原因没有得到从库的确认。Rpl_semi_sync_master_no_tx:显示有多少事务没有通过半同步复制机制进行复制。这通常是因为超时或其他原因导致半同步复制没有生效,而事务以异步复制方式传播。Rpl_semi_sync_master_yes_tx:显示通过半同步复制机制成功复制的事务数量。这些事务在主库等待从库确认接收到数据后才完成复制。Rpl_semi_sync_slave_status:显示从库上的半同步复制是否在正常运行。值为 ON 时,说明从库正在运行半同步复制且从库 I/O 线程正常工作。值为 OFF 时,说明从库没有运行半同步复制或 I/O 线程未正常工作。
重启io_thread
使用相同步骤配置从节点,完成后需要重启io_thread,不重启当执行时会超时,超时后则自动降为异步:
MariaDB [mydb]> install plugin rpl_semi_sync_master soname 'semisync_master.so';MariaDB [mydb]> set global rpl_semi_sync_master_enabled=on;MariaDB [mydb]> stop slave io_thread;Query OK, 0 rows affected (0.01 sec)MariaDB [mydb]> start slave io_thread;Query OK, 0 rows affected (0.00 sec)# 查看半同步客户端mysql> show global status like '%semi%';+--------------------------------------------+-------+| Variable_name | Value |+--------------------------------------------+-------+| Rpl_semi_sync_master_clients | 0 || 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 | 1 || Rpl_semi_sync_master_no_tx | 3 || Rpl_semi_sync_master_status | OFF || Rpl_semi_sync_master_timefunc_failures | 0 || Rpl_semi_sync_master_tx_avg_wait_time | 0 || Rpl_semi_sync_master_tx_wait_time | 0 || 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.00 sec)

注意
使用半同步复制机制的主要目标是保持主从库之间的数据完整性和一致性。这种机制确保在主库提交事务时,至少有一个从库成功接收到数据,然后再向客户端返回结果。这在一定程度上会牺牲性能,因为主库需要等待从库的确认,从而增加了事务提交的延迟。
尽管使用半同步复制可能会对性能产生一定的影响,但它为系统提供了更高的数据安全性和一致性。因此,对于需要确保数据完整性的应用场景而言,使用半同步复制是一种值得的策略,即使会有一些性能损失。总体来说,半同步复制在数据可靠性和性能之间取得了一个平衡。所以事情情况上,需要个人主观判断是否适用


添加博主
微信号|yfq940-
点个关注!!!
原文作者:步步运维步步坑;如有侵权,请联系管理员删除。