MySQL 半同步机制解读

2024年 5月 24日 85.4k 0

MySQL的主从架构是其最成熟的高可用架构之一。早期的实现主要是基于异步复制机制,而后来逐渐发展出了半同步复制机制。这两种机制的主要区别体现在数据同步的方式和主从服务器之间的交互上。

  • 异步复制机制是指主节点在执行完事务并提交后,会将这些更新操作记录到二进制日志(binary log)中,但并不等待从库确认是否已经接收并应用了这些更新。主节点会立即返回操作成功的响应给客户端,并继续处理后续的事务。
  • 半同步复制机制则是对异步复制的一种改进。在这种机制中,主节点在执行完事务并提交后,会等待至少一个从库确认已经接收并写入中继日志(relay log)或执行完成,然后才会返回操作成功的响应给客户端。这种机制保证了在事务提交时,至少有一个从库已经收到了更新,从而降低了数据丢失的风险。然而,由于主节点需要等待从库的确认,半同步复制可能会在一定程度上增加延迟,降低系统的吞吐量。
    MySQL 半同步机制解读-1

1.安装半同步插件

MySQL半同步插件的安装部署涉及一系列步骤,以下是一个基本的安装部署流程:

1)插件文件

半同步插件在安装目录下mysql8.0/lib/plugin,semisync_*.so开头的文件。

shell# ll semi*
-rwxr-xr-x 1 7161 31415 261040 Mar 28 05:02 semisync_master.so
-rwxr-xr-x 1 7161 31415 103088 Mar 28 05:02 semisync_replica.so
-rwxr-xr-x 1 7161 31415 103504 Mar 28 05:02 semisync_slave.so
-rwxr-xr-x 1 7161 31415 260480 Mar 28 05:02 semisync_source.so

2)插件加载命令行

#主节点:
mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
#Or from MySQL 8.0.26:
mysql> INSTALL PLUGIN rpl_semi_sync_source SONAME 'semisync_source.so';

#从节点:
mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
#Or from MySQL 8.0.26:
mysql> INSTALL PLUGIN rpl_semi_sync_replica SONAME 'semisync_replica.so';

如碰到以下错误,可以从获取libimf安装。
URL地址:https://dev.mysql.com/downloads/os-linux.html

mysql> INSTALL PLUGIN rpl_semi_sync_source SONAME 'semisync_source.so';
ERROR 1126 (HY000): Can't open shared library
'/usr/local/mysql/lib/plugin/semisync_source.so'
(errno: 22 libimf.so: cannot open shared object file:
No such file or directory)

3)my.cnf配置文件设置

[mysqld]
plugin-load=rpl_semi_sync_master=semisync_master.so
plugin-load-add=rpl_semi_sync_slave=semisync_slave.so

#Or from MySQL 8.0.26:
[mysqld]
plugin-load=rpl_semi_sync_replica=semisync_replica.so
plugin-load-add=rpl_semi_sync_source=semisync_source.so

启动插件

#主节点
[mysqld]
rpl_semi_sync_master_enabled=1
rpl_semi_sync_master_wait_for_slave_count = N #等待从节点ACK数

#Or from MySQL 8.0.26 with the rpl_semi_sync_source plugin:
rpl_semi_sync_source_enabled=1
rpl_semi_sync_source_wait_for_replica_count = N #等待从节点ACK数

#从节点
[mysqld]
rpl_semi_sync_slave_enabled=1
#Or from MySQL 8.0.26 with the rpl_semi_sync_source plugin:
rpl_semi_sync_replica_enabled=1

4)卸载插件命令行

UNINSTALL PLUGIN rpl_semi_sync_replica;
UNINSTALL PLUGIN rpl_semi_sync_source;

5)查看半同步插件SQL语句:

在MySQL里提供多种查看插件是否加载的方式。

#使用mysql.plugin表
mysql> SELECT *FROM mysql.plugin;
+----------------------+----------------------+
| name | dl |
+----------------------+----------------------+
| rpl_semi_sync_replica | semisync_replica.so |
| rpl_semi_sync_source | semisync_source.so |
+-----------------------+---------------------+
2 rows in set (0.00 sec)

#使用INFORMATION_SCHEMA.plugin表
mysql> SELECT PLUGIN_NAME, PLUGIN_STATUS
FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME LIKE '%semi%';
+-----------------------+---------------+
| PLUGIN_NAME | PLUGIN_STATUS |
+-----------------------+---------------+
| rpl_semi_sync_source | ACTIVE |
| rpl_semi_sync_replica | ACTIVE |
+-----------------------+---------------+
2 rows in set (0.00 sec)

#通过 SHOW命令查看
mysql> SHOW PLUGINS;
+-----------------------+----------+------------------+---------------------+---------+
| Name | Status | Type | Library | License |
+-----------------------+----------+------------------+---------------------+---------+
...
| rpl_semi_sync_source | ACTIVE | REPLICATION | semisync_source.so | GPL |
| rpl_semi_sync_replica | ACTIVE | REPLICATION | semisync_replica.so | GPL |
+-----------------------+----------+--------------------+---------------------+-----+

2.半同步插件参数

MySQL半同步插件的参数允许调整半同步复制的行为。以下是一些关键的参数及其描述:

mysql> SHOW VARIABLES LIKE '%rpl%';
+---------------------------------------------+------------+
| Variable_name | Value |
+---------------------------------------------+------------+
| rpl_read_size | 8192 |
| rpl_semi_sync_replica_enabled | OFF |
| rpl_semi_sync_replica_trace_level | 32 |
| rpl_semi_sync_source_enabled | OFF |
| rpl_semi_sync_source_timeout | 10000 |
| rpl_semi_sync_source_trace_level | 32 |
| rpl_semi_sync_source_wait_for_replica_count | 1 |
| rpl_semi_sync_source_wait_no_replica | ON |
| rpl_semi_sync_source_wait_point | AFTER_SYNC |
| rpl_stop_replica_timeout | 31536000 |
| rpl_stop_slave_timeout | 31536000 |
+---------------------------------------------+------------+
11 rows in set (0.00 sec)

状态指标 说明
*rpl_read_size 从binlog和relay log中读取的最小数据量(以字节为单位)。该值必须是4KB的倍数。
*rpl_semi_sync_replica_enabled 主节点是否启用半同步复制功能。
*rpl_semi_sync_source_enabled 从节点是否启用半同步复制功能。
rpl_semi_sync_replica_trace_level 主节点上关于半同步复制的日志记录级别。
rpl_semi_sync_source_enabled 从库是否启用半同步复制功能。
*rpl_semi_sync_source_timeout 主节点等待从库响应的超时时间(以毫秒为单位)。如果在这个时间内没有收到从库的响应,主节点将切换到异步复制模式并继续处理事务。
rpl_semi_sync_source_trace_level 从库上关于半同步复制的日志记录级别。
*rpl_semi_sync_source_wait_for_replica_count 每个事务必须接收的副本确认数。
*rpl_semi_sync_source_wait_no_replica 当没有副本时,源段是否等待超时。(YES,NO)
*rpl_semi_sync_source_wait_point 主节点在何时等待从库的响应.两个值:AFTER_COMMIT:主节点在事务提交之后等待从库的响应。AFTER_SYNC:主节点在写入二进制日志之后立即等待从库的响应。
rpl_stop_replica_timeout&rpl_stop_slave_timeout 超时前停止复制进程等待的秒数。

以上参数中*,需要根据实际的业务需求、网络状况以及性能要求来进行调整。不恰当的配置可能会导致性能下降。在更改任何配置之前,最好先在测试环境中进行验证。

3.半同步插件状态

MySQL的半同步复制插件提供了多个状态值,这些状态值提供了关于插件运行情况的详细信息。通过监视这些状态值,可以及时了解半同步复制的健康状况,并在出现问题时迅速采取相应措施。
状态值查询和具体说明如下:

Mysql> SHOW STATUS LIKE '%semi%';
+--------------------------------------------+-------+
| Variable_name | Value |
+--------------------------------------------+-------+
| Rpl_semi_sync_replica_status | OFF |
| Rpl_semi_sync_source_clients | 0 |
| Rpl_semi_sync_source_net_avg_wait_time | 0 |
| Rpl_semi_sync_source_net_wait_time | 0 |
| Rpl_semi_sync_source_net_waits | 0 |
| Rpl_semi_sync_source_no_times | 0 |
| Rpl_semi_sync_source_no_tx | 0 |
| Rpl_semi_sync_source_status | OFF |
| Rpl_semi_sync_source_timefunc_failures | 0 |
| Rpl_semi_sync_source_tx_avg_wait_time | 0 |
| Rpl_semi_sync_source_tx_wait_time | 0 |
| Rpl_semi_sync_source_tx_waits | 0 |
| Rpl_semi_sync_source_wait_pos_backtraverse | 0 |
| Rpl_semi_sync_source_wait_sessions | 0 |
| Rpl_semi_sync_source_yes_tx | 0 |
+--------------------------------------------+-------+
15 rows in set (0.00 sec)

状态指标 说明
Rpl_semi_sync_replica_status 半同步复制当前是否可在复制副本上运行
Rpl_semi_sync_source_clients 已连接的启用半同步复制的从库数量
Rpl_semi_sync_source_net_avg_wait_time 事务提交后,等待备库响应的平均时间
Rpl_semi_sync_source_net_wait_time 等待网络响应的总次数
Rpl_semi_sync_source_net_waits 总的网络等待时间
Rpl_semi_sync_source_no_times 一共有几次从Semi-sync回到普通状态
Rpl_semi_sync_source_no_tx 库未及时响应的事务数,如果这个值很大可能存在问题
Rpl_semi_sync_source_status 服务器当前是否工作于半同步复制模式
Rpl_semi_sync_source_timefunc_failures 时间函数未正常工作的次数
Rpl_semi_sync_source_tx_avg_wait_time 开启Semi-sync,事务返回需要等待的平均时间
Rpl_semi_sync_source_tx_wait_time 事务等待备库响应的总时间
Rpl_semi_sync_source_tx_waits 事务等待备库响应的总次数
Rpl_semi_sync_source_wait_pos_backtraverse 改变当前等待最小二进制日志的次数
Rpl_semi_sync_source_wait_sessions 当前有几个线程在等备库响应
Rpl_semi_sync_source_yes_tx 表示通过半同步复制到从库的事务数

4.半同步角色中IO_THREAD线程

在MySQL的半同步实现中,从节点的IO_THREAD线程扮演了重要的角色。从节点的IO_THREAD线程负责读取主节点的二进制日志事件,并将其写入从节点的relay log。这一步骤与异步复制中的IO_THREAD的行为是一致的。然而,在半同步复制中,额外的步骤是引入了一个等待确认的机制,主节点会等待从节点的一个ACK信号来确认binlog事件已经被写入从节点的relay log。这个ACK信息的反馈,需要依赖于IO_THREAD的行为完成。

如果在启动半同步时,如果复制IO_THREAD已经在运行,而没有重新启动它,则复制副本将继续使用异步复制。

mysql> STOP SLAVE IO_THREAD;
mysql> START SLAVE IO_THREAD;

Or from MySQL 8.0.22:
mysql> STOP REPLICA IO_THREAD;
mysql> START REPLICA IO_THREAD;

5.异步升级到半同步

将MySQL异步复制升级到半同步复制,可以在线操作,以下是一个大致的升级步骤:
1.主从节点在线加载插件。
2.在线设置好参数。比如:rpl_semi_sync_master_enabled,rpl_semi_sync_replica_enabled=1,rpl_semi_sync_source_wait_for_replica_count 从节点应答数量。
3.复制io thread重新启动。
4.配置文件修改。
配置完半同步,保持定期检查和监控是非常重要的,以确保半同步复制稳定运行,并在需要时及时调整配置。

6.总结

MySQL的半同步机制是为了增强数据的一致性和减少数据丢失的风险而设计的。然而,半同步机制会对性能产生一定的影响。由于主节点需要等待从库的确认消息,这会增加事务的提交延迟。个人经验,性能大约降级1/4,但实际情况可能会有所不同。

因此,在决定是否使用半同步机制时,需要根据实际需求和系统环境进行权衡(特别是跨机房半同步)。如果数据一致性和可靠性是至关重要的,那么牺牲一定的性能可能是值得的。反之,如果对性能要求较高,而可以接受一定程度的数据延迟或丢失风险,那么异步复制可能是一个更合适的选择。

此外,需要注意的是,MySQL的半同步机制并不是绝对保证数据不丢失的。在某些极端情况下,如主节点崩溃且从库尚未确认接收数据,仍然可能发生数据丢失的情况。因此,除了使用半同步机制外,还需要结合其他的数据备份和恢复策略来确保数据的完整性和可用性。

7.参考

https://dev.mysql.com/doc/refman/8.0/en/replication-semisync-installation.html
https://dev.mysql.com/doc/refman/8.0/en/replication-semisync-monitoring.html

相关文章

Oracle如何使用授予和撤销权限的语法和示例
Awesome Project: 探索 MatrixOrigin 云原生分布式数据库
下载丨66页PDF,云和恩墨技术通讯(2024年7月刊)
社区版oceanbase安装
Oracle 导出CSV工具-sqluldr2
ETL数据集成丨快速将MySQL数据迁移至Doris数据库

发布评论