Master-Slave Semisynchronous Replication on MySQL 5.7.13

Prerequisites

  1. 检查 have_dynamic_loading 系统变量值为 YES
  2. 复制已经在正常运行。
  3. 不能配置多复制通道,半同步复制只能兼容默认的复制通道。

Procedure

  1. 检查动态加载插件要求。

    mysql> show variables like 'have_dynamic_loading';
    +----------------------+-------+
    | Variable_name | Value |
    +----------------------+-------+
    | have_dynamic_loading | YES |
    +----------------------+-------+
    1 row in set (0.02 sec)
  2. 安装插件。

    源端

    mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
    Query OK, 0 rows affected (0.15 sec)

    mysql> SELECT PLUGIN_NAME, PLUGIN_STATUS
    -> FROM INFORMATION_SCHEMA.PLUGINS
    -> WHERE PLUGIN_NAME LIKE '%semi%';
    +----------------------+---------------+
    | PLUGIN_NAME | PLUGIN_STATUS |
    +----------------------+---------------+
    | rpl_semi_sync_master | ACTIVE |
    +----------------------+---------------+
    1 row in set (0.00 sec)

    复制端

    mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
    Query OK, 0 rows affected (0.19 sec)

    mysql> SELECT PLUGIN_NAME, PLUGIN_STATUS
    -> FROM INFORMATION_SCHEMA.PLUGINS
    -> WHERE PLUGIN_NAME LIKE '%semi%';
    +---------------------+---------------+
    | PLUGIN_NAME | PLUGIN_STATUS |
    +---------------------+---------------+
    | rpl_semi_sync_slave | ACTIVE |
    +---------------------+---------------+
    1 row in set (0.00 sec)
  3. 配置系统变量。

    源端

    SET GLOBAL rpl_semi_sync_master_enabled = {0|1};
    SET GLOBAL rpl_semi_sync_master_timeout = N;
    [mysqld]
    rpl_semi_sync_master_enabled=1
    rpl_semi_sync_master_timeout=1000 # 1 second

    复制端

    SET GLOBAL rpl_semi_sync_slave_enabled = {0|1};
    [mysqld]
    rpl_semi_sync_slave_enabled=1
  4. 重启复制 IO 线程。

    stop slave io_thread;
    start slave io_thread;