MySQL半同步复制

本文问题

  1. 半同步复制的过程是怎样的?
  2. 半同步复制功能是通过什么执行的?
  3. 如何启用半同步复制?
  4. 启用半同步复制有什么要求和条件?
  5. 半同步复制在什么情况下会恢复为异步复制?
  6. 在主库上可以进行哪些半同步复制相关的配置?
  7. 在从库上可以进行哪些半同步复制相关的配置?
  8. 在使用半同步复制时,主库上的事务在什么时点进行提交?可以通过哪个选项修改提交时点?
  9. 如何查看半同步复制的配置?
  10. 如何查看半同步复制的状态?

半同步复制

默认情况下,MySQL复制是异步的,主库将事件写入到二进制日志,从库获取主库的二进制日志并进行应用。主库不知道从库从库什么时候获取和应用二进制日志。
当使用异步复制时,如果主库崩溃,可能主库上已经提交的事务没有在从库上提交,这时故障转移到从库可能导致数据丢失。

可以使用半同步复制来替代异步复制:

  • 从库在连接主库时说明是否支持半同步复制功能
  • 如果主库启用了半同步复制,并且至少有一个半同步的从库,则在主库上提交事务的线程将阻塞,等待直到至少一个从库确认已接收到该事务的所有事件,或者直到超时。
  • 从库在将事件写入到中继日志并且刷新到磁盘后,确认接收到事务。
  • 如果没有任何从库确认收到事务并且发生超时,主库恢复为异步复制。当至少一个半同步从库追上主库后,主库返回到半同步复制
  • 半同步复制必须在主库和从库上同时启用。如果在主库上禁用半同步复制,或者在主库上启用半同步复制但是从库未启用半同步复制,主库使用异步复制。

当主库阻塞(等待从库确认)时,执行事务的会话不会返回。当阻塞结束后,会话返回,然后可以继续执行其他语句。在这一时刻,事务已经在主库上提交,并且至少一个从库已经确认接收到事务。

半同步复制的安装和配置

半同步复制的安装

安装要求

  • 数据库支持动态加载插件(have_dynamic_loading=YES
  • 复制已经在正常运行。
  • 不能配置多通道复制,半同步复制只支持默认通道。

安装半同步复制插件

主库安装半同步复制插件

INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';

从库安装半同步复制插件

INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';

启用半同步复制插件

主库启用半同步复制插件

[mysqld]
rpl_semi_sync_master_enabled=1
#或
SET GLOBAL rpl_semi_sync_master_enabled = 1;

从库启用半同步复制插件

[mysqld]
rpl_semi_sync_slave_enabled=1
#或
SET GLOBAL rpl_semi_sync_slave_enabled = 1

启动从库I/O线程

# 如果复制已经在运行,还需要停止后重新启动I/O线程来使用半同步复制
STOP SLAVE IO_THREAD;
START SLAVE IO_THREAD;

半同步复制的配置

所有半同步复制相关的配置都是在安装插件后才可用的,都可以动态修改。

主库配置

  • rpl_semi_sync_master_enabled 主库是否启用半同步复制 默认OFF
  • rpl_semi_sync_master_timeout 半同步复制的超时时间 默认10000(10s)
  • rpl_semi_sync_master_trace_level 主库半同步复制跟踪级别 默认32
    • 1 常规级别(功能故障时间)
    • 16 详细级别 (更多详细信息)
    • 32 网络等待级别 (更多关于网络等待的信息)
    • 64 功能级别 (有关功能进入和退出的信息)
  • rpl_semi_sync_master_wait_for_slave_count 默认1 主库必须获取到多少个从库的事务确认
  • rpl_semi_sync_master_wait_no_slave 默认ON 当从库确认数少于应确认数量时,是否等待超时。
    • ON 当从库确认数小于rpl_semi_sync_master_wait_for_slave_count,并且超出rpl_semi_sync_master_timeout后主库才恢复到异步复制。
    • OFF 当从库确认数小于rpl_semi_sync_master_wait_for_slave_count后,主库会恢复到异步复制
  • rpl_semi_sync_master_wait_point 主库等待从库确认事务的时机。
    • AFTER_SYNC 主库将事务写入到主库自己的二进制日志和从库上,并且刷新日志到磁盘。主库等待从库确认收到事务。收到确认后,主库提交事务并给客户端返回结果。
      连接主库的所有客户端可以同时看到已提交的事务。如果主库发生故障,在主库上提交的事务都复制到从库上,从主库到从库的故障转移是无损的。但是主库的二进制日志从可能包含未提交的事务,不能直接使用。
    • AFTER_COMMIT 主库将事务写入到主库自己的二进制日志和从库上,刷新日志到磁盘,然后提交事务。主库等待从库确认收到事务,收到确认后,主库将结果返回客户端。
      连接主库的客户端中,执行事务的客户端在从库确认前不能看到事务提交,但是其他客户端可以看到该事务已经提交。如果出现问题,从库还没有处理事务。当故障转移到从库时,可能会看不到主库上关于该事务的数据。

从库配置

  • rpl_semi_sync_slave_enabled 从库是否启用半同步复制 默认OFF
  • rpl_semi_sync_slave_trace_level 从库半同步复制调试跟踪级别

查看半同步复制状态

检查半同步复制插件是否安装

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

检查如何配置的半同步复制

mysql> SHOW VARIABLES LIKE 'rpl_semi_sync%';

检查半同步复制状态

mysql> SHOW STATUS LIKE 'Rpl_semi_sync%';

主库半同步复制状态

  • Rpl_semi_sync_master_clients
    半同步从库数量。
  • Rpl_semi_sync_master_net_avg_wait_time
    主库等待从库应答的平均时间(以微秒为单位)。不建议使用此变量(始终为0),并将在以后的版本中将其删除。
  • Rpl_semi_sync_master_net_wait_time
    主服务器等待从属​​服务器答复的总时间(以微秒为单位)。不建议使用此变量(始终为0),并将在以后的版本中将其删除。
  • Rpl_semi_sync_master_net_waits
    主库等待从库答复的总次数。
  • Rpl_semi_sync_master_no_times
    主库关闭半同步复制的时间。
  • Rpl_semi_sync_master_no_tx
    从库未成功确认的提交数。
  • Rpl_semi_sync_master_status
    半同步复制当前是否在主库上运行。
    ON 已启用插件并且已发生提交确认。
    OFF未启用插件或主库由于提交确认超时已经恢复为异步复制。
  • Rpl_semi_sync_master_timefunc_failures
    调用时间功能(例如gettimeofday())时主库发生故障的时间。
  • Rpl_semi_sync_master_tx_avg_wait_time
    主库等待每个事务的平均时间(以微秒为单位)。
  • Rpl_semi_sync_master_tx_wait_time
    主库等待事务的总时间(以微秒为单位)。
  • Rpl_semi_sync_master_tx_waits
    主库等待事务的总次数。
  • Rpl_semi_sync_master_wait_pos_backtraverse
    主节点等待事件的二进制坐标比以前等待的事件低的总次数。当事务开始等待答复的顺序与写入其二进制日志事件的顺序不同时,可能会发生这种情况。
  • Rpl_semi_sync_master_wait_sessions
    当前等待从库答复的会话数。
  • Rpl_semi_sync_master_yes_tx
    从库成功确认的提交数。

从库半同步复制状态

  • Rpl_semi_sync_slave_status
    半同步复制当前是否在从属服务器上运行。如果已启用插件并且从属I / O线程正在运行则为ON, 否则为OFF

问题答案

  1. 半同步复制的过程是怎样的?
    从库在连接主库时(启用I/O线程时)检测是否使用半同步复制。
    使用半同步复制:
    主库将事务写入到二进制日志并刷新到磁盘,根据rpl_semi_sync_master_wait_point的配置,等待至少N个从库确认事务后提交事务并返回给客户端(AFTER_SYNC),或者提交事务后等待至少N个从库确认事务,然后返回给客户端(AFTER_COMMIT)
    N可以通过rpl_semi_sync_master_wait_for_slave_count进行设置,默认为1.
    从库在将事务写入到中继日志并且刷新到磁盘后确认事务
    如果确认事务的从库数量小于N,根据rpl_semi_sync_master_wait_no_slave的配置来检查是否等待超时,如果值为ON,则在等待rpl_semi_sync_master_timeout时间后,主库恢复为异步复制,如果值为OFF,主库直接恢复为异步复制。
    当从库追上主库的进度后,主库返回半同步复制状态。
  2. 半同步复制功能是通过什么执行的?
    通过半同步复制插件,主库插件semisync_master.so,从库插件semisync_slave.so
  3. 如何启用半同步复制?
    安装半同步复制插件
# 主库
INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so'
# 从库
INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so'

启用半同步复制功能

# 主库
SET GLOBAL repl_semi_sync_master_enabled = 1
# 从库
SET GLOBAL repl_semi_sync_slave_enabled =1

启用从库的I/O线程

# STOP SLAVE IO_THREAD; #如果I/O线程已启用要先停止
START SLAVE IO_THREAD;
  1. 启用半同步复制有什么要求和条件?
    • 数据库可以动态加载插件have_dynamic_loading=YES
    • 复制已经在正常运行
    • 没有配置多通道复制,半同步复制只对默认复制通道有效
  2. 半同步复制在什么情况下会恢复为异步复制?
    根据rpl_semi_sync_wait_no_slave的配置:
    值为ON时:等待从库确认时间大于rpl_semi_sync_master_timeout后恢复为异步复制
    值为OFF时,从库确认数小于rpl_semi_sync_master_wait_for_slave_count后恢复为异步复制
  3. 在主库上可以进行哪些半同步复制相关的配置?
    rpl_semi_sync_master_enabled 是否启用半同步复制
    rpl_semi_sync_master_timeout 半同步复制超时时间
    rpl_semi_sync_master_wait_for_slave_count 需要确认事务的从库数量
    rpl_semi_sync_master_wait_no_slave 是否等待从库确认超时
    rpl_semi_sync_master_wait_point 等待从库确认事务的时点
    rpl_semi_sync_master_trace_level 半同步复制调试跟踪状态
  4. 在从库上可以进行哪些半同步复制相关的配置?
    rpl_semi_sync_slave_enabled 是否启用半同步复制
    rpl_semi_sync_slave_trace_level 半同步复制调试跟踪级别
  5. 在使用半同步复制时,主库上的事务在什么时点进行提交?可以通过哪个选项修改提交时点?
    默认主库上的事务在写入二进制日志并刷新到磁盘后,等待从库确认事务,然后提交并返回客户端.
    可以通过rpl_semi_sync_master_wait_point进行更改,默认值为AFTER_SYNC
    可以更改为AFTER_COMMIT:主库上的事务写入到二进制日志并刷新到磁盘后就提交事务,然后等待从库确认事务,再将结果返回到客户端。这种情况下,其他连接可以看到提交后的事务。
  6. 如何查看半同步复制的配置?
    SHOW VARIABLES LIKE 'rpl_semi_sync%';;
  7. 如何查看半同步复制的状态?
    SHOW STATUS LIKE 'rpl_semi_sync%';
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。