美文网首页
MySQL半同步复制

MySQL半同步复制

作者: 月饮沙 | 来源:发表于2020-05-06 17:18 被阅读0次

    本文问题

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

    相关文章

      网友评论

          本文标题:MySQL半同步复制

          本文链接:https://www.haomeiwen.com/subject/tdfwghtx.html