天天看点

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

检查半同步步状态

主库半同步状态

  • 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
           
# 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%';

继续阅读