mysql8半同步复制详细步骤

半同步复制

mysql8 基于bin log的复制 | 主从复制 | 异步复制 | 详细步骤
[图文]搭建InnoDB Cluster详细流程
mysql8半同步复制详细步骤

1 概述

1.1异步复制

MySQL 复制默认是异步的。源将事件写入其二进制日志,副本在准备就绪时请求它们。源不知道副本是否或何时检索并处理了事务,并且不能保证任何事件都会到达任何副本。对于异步复制,如果源崩溃,它提交的事务可能还没有传输到任何副本。在这种情况下,从源到副本的故障转移可能会导致故障转移到缺少与源相关的事务的服务器。

1.2完全同步复制

使用完全同步复制,源等待所有副本接收并提交事务后才返回客户端事务提交成功。完全同步复制意味着随时可以从源故障转移到任何副本。完全同步复制的缺点是完成事务可能会有很多延迟

1.3半同步复制

半同步复制介于异步和完全同步复制之间。源等待直到至少一个副本已接收并记录到中继日志(所需的副本数是可配置的),然后提交事务。源不等待所有副本确认接收,它只需要来自副本的确认,而不是事件已在副本端完全执行和提交。因此,半同步复制保证如果源崩溃,它提交的所有事务都已传输到至少一个副本。

与完全同步复制相比,半同步复制更快。

如果在没有任何副本确认事务的情况下发生超时,则源恢复为异步复制。当至少一个半同步副本赶上时,源返回到半同步复制。这意味着半同步复制最适合通过快速网络进行通信的近距离服务器,而最不适合通过慢速网络进行通信的远程服务器。。

2 安装半同步复制

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

  • 安装插件的能力需要一个支持动态加载的MySQL服务器。要验证这一点,请检查 have_dynamic_loading 系统变量的值是否为 YES。

  • 复制必须已经在工作。

  • 不得配置多个复制通道。半同步复制仅与默认复制通道兼容。

2.1安装插件

半同步复制是使用插件实现的,必须在源和副本上安装插件才能在实例上进行半同步复制。

从 MySQL 8.0.26 开始,提供了实现半同步复制的新版本插件,一个用于源服务器,一个用于副本服务器。新插件在系统变量和状态变量中将术语“master”和“slave”替换为“source”和“replica”,您可以安装这些版本而不是旧版本。您不能在一个实例上同时安装新旧版本的相关插件。如果你使用新版本的插件,新的系统变量和状态变量可用,旧的不可用。如果您使用旧版本的插件,旧的系统变量和状态变量可用,但新的不可用。

源服务器,旧术语: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 语句,并根据需要为您的平台调整 .so 后缀。

在源上:

INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';

 

Or 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';

 

Or from MySQL 8.0.26:

INSTALL PLUGIN rpl_semi_sync_replica SONAME 'semisync_replica.so';

如果在 Linux 上尝试安装插件导致出现与此处所示类似的错误,则必须安装 libimf:

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)

验证插件是否安装

mysql> SELECT PLUGIN_NAME, PLUGIN_STATUS

​    FROM INFORMATION_SCHEMA.PLUGINS

​    WHERE PLUGIN_NAME LIKE '%semi%';

+----------------------+---------------+

| PLUGIN_NAME     | PLUGIN_STATUS |

+----------------------+---------------+

| rpl_semi_sync_source | ACTIVE    |

2.2基于二进制日志的复制

博客

2.3启用插件

安装半同步复制插件后,默认情况下它是禁用的。必须在源端和副本端启用插件才能启用半同步复制。如果仅启用一侧,则复制是异步的。

2.3.1 在源上执行

vim /etc/my.cnf

On the source: 

 

[mysqld]

rpl_semi_sync_master_enabled=1

 

Or from MySQL 8.0.26 with the rpl_semi_sync_source plugin:

rpl_semi_sync_source_enabled=1

systemctl restart mysqld

2.3.2 在每个副本上执行

On each replica: 

 

[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

systemctl restart mysqld

3 配置半同步

要检查半同步复制状态变量的当前值,请使用 SHOW VARIABLES:

mysql> SHOW VARIABLES LIKE ‘rpl_semi_sync%’;
在这里插入图片描述

rpl_semi_sync_source_enabled或 rpl_semi_sync_master_enabled控制是否在源服务器上启用半同步复制。要启用或禁用插件,请分别将此变量设置为 1 或 0。默认值为 0(关闭)。
rpl_semi_sync_replica_enabled或 rpl_semi_sync_slave_enabled控制是否在副本上启用半同步复制。
rpl_semi_sync_source_timeout 或 rpl_semi_sync_master_timeout一个以毫秒为单位的值,它控制源在超时和恢复到异步复制之前等待提交以确认来自副本的时间。默认值为 10000(10 秒)。
rpl_semi_sync_source_wait_for_replica_count 或 rpl_semi_sync_master_wait_for_slave_count控制源在返回会话之前必须接收的每个事务的副本确认数。默认值为 1,表示源仅等待一个副本确认收到事务事件。
rpl_semi_sync_source_wait_point 或 rpl_semi_sync_master_wait_point系统变量控制半同步源服务器在将状态返回给提交事务的客户端之前等待事务接收的副本确认的点。这些值是允许的: AFTER_SYNC(默认):源将每个事务写入其二进制日志和副本,并将二进制日志同步到磁盘。同步后,源等待事务接收的副本确认。收到确认后,源将事务提交给存储引擎并将结果返回给客户端,然后客户端可以继续进行。 AFTER_COMMIT:源将每个事务写入其二进制日志和副本,同步二进制日志,并将事务提交给存储引擎。源在提交后等待事务接收的副本确认。收到确认后,源将结果返回给客户端,然后客户端可以继续。 这些设置的复制特征不同如下: 使用 AFTER_SYNC,所有客户端同时看到提交的事务,这是在它被副本确认并提交到源上的存储引擎之后。因此,所有客户端都在源上看到相同的数据。 在源发生故障的情况下,在源上提交的所有事务都已复制到副本(保存到其中继日志)。源意外退出和故障转移到副本是无损的,因为副本是最新的。如上所述,故障转移后不应重复使用源。 使用 AFTER_COMMIT,发出事务的客户端只有在服务器提交到存储引擎并收到副本确认后才会获得返回状态。在提交之后和副本确认之前,其他客户端可以在提交客户端之前看到提交的事务。 如果出现问题导致副本无法处理事务,那么在源意外退出并故障转移到副本的情况下,此类客户端可能会看到与他们在源上看到的数据相关的数据丢失。

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

4 半同步复制监控

半同步复制的插件公开了许多状态变量,使您能够监视它们的操作。要检查状态变量的当前值,请使用 SHOW STATUS:

mysql> SHOW STATUS LIKE ‘Rpl_semi_sync%’;

从 MySQL 8.0.26 开始,提供了新版本的源和副本插件,将系统变量和状态变量中的术语“主”和“从”替换为“源”和“副本”。如果安装新的 rpl_semi_sync_source 和 rpl_semi_sync_replica 插件,新的系统变量和状态变量可用,但旧的不可用。如果安装旧的 rpl_semi_sync_master 和 rpl_semi_sync_slave 插件,旧的系统变量和状态变量可用,但新的不可用。您不能在一个实例上同时安装新旧版本的相关插件。

所有 Rpl_semi_sync_xxx 状态变量在 “服务器状态变量”中进行了描述。一些例子是:

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。

当源由于提交阻塞超时或副本追赶而在异步或半同步复制之间切换时,它会适当地设置 Rpl_semi_sync_source_status 或 Rpl_semi_sync_master_status 状态变量的值。源端从半同步复制到异步复制的自动回退意味着 rpl_semi_sync_source_enabled 或 rpl_semi_sync_master_enabled 系统变量在源端的值为 1 是可能的,即使此时半同步复制实际上不在运行。您可以监视 Rpl_semi_sync_source_status 或 Rpl_semi_sync_master_status 状态变量以确定源当前是使用异步复制还是半同步复制。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值