代码改变世界

MySQL 8 半同步复制

2023-12-21 14:27  abce  阅读(436)  评论(0编辑  收藏  举报

安装半同步复制

半同步复制是通过插件的形式实现的。必须要在源库和副本上安装插件。源库和副本有不同的插件。插件安装后,可通过与之相关的系统变量对其进行控制。只有安装了相关插件,这些系统变量才可用。

要使用半同步复制,必须满足以下要求:

·要求 MySQL 服务器支持动态加载。要验证这一点,请检查 have_dynamic_loading 系统变量的值是否为 YES。二进制发行版应支持动态加载。

>show variables like '%have_dynamic_loading%';
+----------------------+-------+
| Variable_name        | Value |
+----------------------+-------+
| have_dynamic_loading | YES   |
+----------------------+-------+

·复制已经在运行

·不能配置了多个复制 channels ,半同步复制只是支持默认的复制 channel

从 MySQL 8.0.26 开始,提供了新的主从复制插件,使用了新的系统变量。不同的平台,插件名的前缀不同:

·源库,旧术语:rpl_semi_sync_master 插件(semisync_master.so 或 semisync_master.dll 库)
·源库,新术语(从 MySQL 8.0.26 起):rpl_semi_sync_source 插件(semisync_source.so 或 semisync_source.dll 库)
·副本,旧术语:rpl_semi_sync_slave 插件(semisync_slave.so 或 semisync_slave.dll 库)
·副本,新术语(从 MySQL 8.0.26 起):rpl_semi_sync_replica 插件(semisync_replica.so 或 semisync_replica.dll 库)

源库安装:

INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
--from MySQL 8.0.26:
INSTALL PLUGIN rpl_semi_sync_source SONAME 'semisync_source.so';

副本上安装:

INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
--from MySQL 8.0.26:
INSTALL PLUGIN rpl_semi_sync_replica SONAME 'semisync_replica.so';

确认安装是否成功:

mysql> SELECT PLUGIN_NAME, PLUGIN_STATUS
       FROM INFORMATION_SCHEMA.PLUGINS
       WHERE PLUGIN_NAME LIKE '%semi%';
+----------------------+---------------+
| PLUGIN_NAME          | PLUGIN_STATUS |
+----------------------+---------------+
| rpl_semi_sync_source | ACTIVE        |
+----------------------+---------------+

插件安装后,默认是不启用的。

 

开启半同步复制

如果一边开启,一边不开启,就是使用异步复制。

源库端:

SET GLOBAL rpl_semi_sync_master_enabled = 1;
--from MySQL 8.0.26 with the rpl_semi_sync_source plugin:
SET GLOBAL rpl_semi_sync_source_enabled = 1;

副本端:

SET GLOBAL rpl_semi_sync_slave_enabled = 1;
--from MySQL 8.0.26 with the rpl_semi_sync_replica plugin:
SET GLOBAL rpl_semi_sync_replica_enabled = 1;

 

如果是复制运行时开启半同步复制,需要重启io thread:否则还是继续使用异步复制

stop slave io_thread;
start slave io_thread;

--from MySQL 8.0.22:
stop replica io_thread;
start replica io_thread;

 

要想每次重启生效,需要配置到配置文件中

源库端:

[mysqld]
rpl_semi_sync_master_enabled=1
--from MySQL 8.0.26 with the rpl_semi_sync_source plugin:
rpl_semi_sync_source_enabled=1

副本端:

[mysqld]
rpl_semi_sync_slave_enabled=1
--from MySQL 8.0.26 with the rpl_semi_sync_source plugin:
rpl_semi_sync_replica_enabled=1

 

配置半同步复制

从 MySQL 8.0.26 开始,提供了新的主从复制插件,使用了新的系统变量。

如果安装了  rpl_semi_sync_source 和 rpl_semi_sync_replica 插件,只能看到新的系统变量和状态变量,老的已经看不到了。如果安装的是 rpl_semi_sync_master 和 rpl_semi_sync_slave 插件,只能使用老的系统变量和状态变量。新旧插件不可以同时使用。

·rpl_semi_sync_source_enabled 或 rpl_semi_sync_master_enabled

主库上是否开启半同步复制。默认是0,表示不开启

·rpl_semi_sync_replica_enabled 或 rpl_semi_sync_slave_enabled

从库上是否开启半同步复制

·rpl_semi_sync_source_timeout 或 rpl_semi_sync_master_timeout

单位是毫秒,控制主库等待ack消息的等待超时时间,默认是10000,即10秒,超时后切换成异步复制

·rpl_semi_sync_source_wait_for_replica_count 或 rpl_semi_sync_master_wait_for_slave_count

默认是0,表示主库不需要等待从库的ack

·rpl_semi_sync_source_wait_point 或 rpl_semi_sync_master_wait_point

这两个系统变量控制着半同步源服务器在向提交事务的客户端返回状态前等待事务接收副本确认的时间点。支持的值有:

(1)after_sync:

这是默认值。源库将每个事务写入自己的二进制日志和副本,并将二进制日志写入磁盘。同步后,源库会等待副本确认收到事务。收到确认后,源库会将事务提交到存储引擎,并将结果返回给客户端,然后客户端就可以继续处理。

使用 after_sync 设置,所有的客户端同时看到提交的事务,即在收到副本的ack后,在源库上提交事务到存储引擎。

如果源库发生失败,源库上所有提交的事务已经发送到副本的relay中。源库异常退出集群或故障转移到副本,是无损的,因为副本是最新的。故障转移后,就不应该继续使用老的源库了。

(2)after_commit:

源库将每个事务写入自己的二进制日志和副本,同步二进制日志,并将事务提交到存储引擎。提交后,源库会等待副本确认收到事务。收到确认后,源会向客户端返回一个结果,然后客户端就可以继续。

使用 after_commit,只有在服务器向存储引擎提交并收到副本确认后,发出事务的客户端才会获得返回状态。在提交之后和副本确认之前,其他客户端可以在提交客户端之前看到已提交的事务。

如果出了差错,副本没有处理事务,那么在源库意外退出并故障切换到副本的情况下,这些客户端就有可能在源库上看到的数据,在副本上被丢失。

从 MySQL 8.0.23 开始,启用限制回调的系统变量 replication_sender_observe_commit_only 和增加共享锁并避免不必要锁获取的 replication_optimize_for_static_plugin_config,可以提高半同步复制的性能。随着复制数量的增加,这些设置会有所帮助,因为对锁的争夺会降低性能。半同步复制源服务器也能从启用这些系统变量中获得性能优势,因为它们使用与复制相同的锁定机制。

半同步复制的监控

半同步复制插件增加了很多状态变量,可以使用 show status 命令查看:

mysql> SHOW STATUS LIKE 'Rpl_semi_sync%';

说明:

·Rpl_semi_sync_source_clients 或 Rpl_semi_sync_master_clients:连接到源服务器的半同步副本的数量。

·Rpl_semi_sync_source_status 或 Rpl_semi_sync_master_status:半同步复制当前是否在源服务器上运行。如果插件已启用,且提交确认尚未发生,则值为 1。如果未启用插件,或源服务器因提交确认超时而退回到异步复制,则值为 0。

·Rpl_semi_sync_source_no_tx 或 Rpl_semi_sync_master_no_tx:副本未成功确认的提交次数。

·Rpl_semi_sync_source_yes_tx 或 Rpl_semi_sync_master_yes_tx:副本成功确认的提交次数。

·Rpl_semi_sync_replica_status 或 Rpl_semi_sync_slave_status:半同步复制当前是否在副本上运行。如果插件已启用且复制 I/O(接收器)线程正在运行,则该值为 1,否则为 0。