前言:在MySQL主从复制中分为异步复制及半同步复制,不像Oracle分为最大性能模式,最大可用模式,最大保护模式。相比较而言,MySQL的复制更加简单一些,并且基本所有的MySQL高可用方案都是基于主从复制来做的。一般的传统复制即异步复制,主库上的事务无需等待从库应答即可提交。而半同步复制需要从库接收binlog并向主应答,这又分为after sync和after commit两种模式,具体两种区别可以参考之前的文章【MySQL】5.7增强半同步AFTER SYNC&AFTER COMMIT
这里以MySQL5.7为例讲一下怎么怎么搭建半主从复制。

一、安装半同步插件

  • Master
    查看当前所有已安装的插件:
  1. root@localhost [(none)]>show plugins;
  2. ERROR 2006 (HY000): MySQL server has gone away
  3. No connection. Trying to reconnect...
  4. Connection id: 6
  5. Current database: *** NONE ***
  6. +----------------------------+----------+--------------------+---------+---------+
  7. | Name | Status | Type | Library | License |
  8. +----------------------------+----------+--------------------+---------+---------+
  9. | binlog | ACTIVE | STORAGE ENGINE | NULL | GPL |
  10. | mysql_native_password | ACTIVE | AUTHENTICATION | NULL | GPL |
  11. | sha256_password | ACTIVE | AUTHENTICATION | NULL | GPL |
  12. | PERFORMANCE_SCHEMA | ACTIVE | STORAGE ENGINE | NULL | GPL |
  13. | MRG_MYISAM | ACTIVE | STORAGE ENGINE | NULL | GPL |
  14. | MEMORY | ACTIVE | STORAGE ENGINE | NULL | GPL |
  15. | InnoDB | ACTIVE | STORAGE ENGINE | NULL | GPL |
  16. | INNODB_TRX | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
  17. | INNODB_LOCKS | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
  18. | INNODB_LOCK_WAITS | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
  19. | INNODB_CMP | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
  20. | INNODB_CMP_RESET | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
  21. | INNODB_CMPMEM | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
  22. | INNODB_CMPMEM_RESET | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
  23. | INNODB_CMP_PER_INDEX | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
  24. | INNODB_CMP_PER_INDEX_RESET | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
  25. | INNODB_BUFFER_PAGE | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
  26. | INNODB_BUFFER_PAGE_LRU | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
  27. | INNODB_BUFFER_POOL_STATS | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
  28. | INNODB_TEMP_TABLE_INFO | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
  29. | INNODB_METRICS | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
  30. | INNODB_FT_DEFAULT_STOPWORD | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
  31. | INNODB_FT_DELETED | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
  32. | INNODB_FT_BEING_DELETED | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
  33. | INNODB_FT_CONFIG | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
  34. | INNODB_FT_INDEX_CACHE | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
  35. | INNODB_FT_INDEX_TABLE | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
  36. | INNODB_SYS_TABLES | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
  37. | INNODB_SYS_TABLESTATS | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
  38. | INNODB_SYS_INDEXES | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
  39. | INNODB_SYS_COLUMNS | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
  40. | INNODB_SYS_FIELDS | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
  41. | INNODB_SYS_FOREIGN | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
  42. | INNODB_SYS_FOREIGN_COLS | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
  43. | INNODB_SYS_TABLESPACES | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
  44. | INNODB_SYS_DATAFILES | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
  45. | INNODB_SYS_VIRTUAL | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
  46. | CSV | ACTIVE | STORAGE ENGINE | NULL | GPL |
  47. | MyISAM | ACTIVE | STORAGE ENGINE | NULL | GPL |
  48. | ARCHIVE | ACTIVE | STORAGE ENGINE | NULL | GPL |
  49. | partition | ACTIVE | STORAGE ENGINE | NULL | GPL |
  50. | BLACKHOLE | ACTIVE | STORAGE ENGINE | NULL | GPL |
  51. | FEDERATED | DISABLED | STORAGE ENGINE | NULL | GPL |
  52. | ngram | ACTIVE | FTPARSER | NULL | GPL |
  53. +----------------------------+----------+--------------------+---------+---------+
  54. 44 rows in set (0.00 sec)

看到并没有关于半同步的插件,那我们来装一下半同步插件:

  1. root@localhost [(none)]> install plugin rpl_semi_sync_master soname 'semisync_master.so';
  2. Query OK, 0 rows affected (0.00 sec)
  3. root@localhost [(none)]>install plugin rpl_semi_sync_slave soname 'semisync_slave.so';
  4. Query OK, 0 rows affected (0.01 sec)

实际上主库上不要装rpl_semi_sync_slave插件,我们这里考虑到以后自动化的问题,统一安装了。
安装后再次查看插件,可以看到版同步的插件已经安装完成。

  1. root@localhost [(none)]>show plugins;
  2. +----------------------------+----------+--------------------+--------------------+---------+
  3. | Name | Status | Type | Library | License |
  4. +----------------------------+----------+--------------------+--------------------+---------+
  5. | binlog | ACTIVE | STORAGE ENGINE | NULL | GPL |
  6. | mysql_native_password | ACTIVE | AUTHENTICATION | NULL | GPL |
  7. | sha256_password | ACTIVE | AUTHENTICATION | NULL | GPL |
  8. | PERFORMANCE_SCHEMA | ACTIVE | STORAGE ENGINE | NULL | GPL |
  9. | MRG_MYISAM | ACTIVE | STORAGE ENGINE | NULL | GPL |
  10. | MEMORY | ACTIVE | STORAGE ENGINE | NULL | GPL |
  11. | InnoDB | ACTIVE | STORAGE ENGINE | NULL | GPL |
  12. | INNODB_TRX | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
  13. | INNODB_LOCKS | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
  14. | INNODB_LOCK_WAITS | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
  15. | INNODB_CMP | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
  16. | INNODB_CMP_RESET | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
  17. | INNODB_CMPMEM | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
  18. | INNODB_CMPMEM_RESET | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
  19. | INNODB_CMP_PER_INDEX | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
  20. | INNODB_CMP_PER_INDEX_RESET | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
  21. | INNODB_BUFFER_PAGE | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
  22. | INNODB_BUFFER_PAGE_LRU | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
  23. | INNODB_BUFFER_POOL_STATS | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
  24. | INNODB_TEMP_TABLE_INFO | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
  25. | INNODB_METRICS | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
  26. | INNODB_FT_DEFAULT_STOPWORD | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
  27. | INNODB_FT_DELETED | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
  28. | INNODB_FT_BEING_DELETED | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
  29. | INNODB_FT_CONFIG | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
  30. | INNODB_FT_INDEX_CACHE | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
  31. | INNODB_FT_INDEX_TABLE | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
  32. | INNODB_SYS_TABLES | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
  33. | INNODB_SYS_TABLESTATS | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
  34. | INNODB_SYS_INDEXES | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
  35. | INNODB_SYS_COLUMNS | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
  36. | INNODB_SYS_FIELDS | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
  37. | INNODB_SYS_FOREIGN | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
  38. | INNODB_SYS_FOREIGN_COLS | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
  39. | INNODB_SYS_TABLESPACES | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
  40. | INNODB_SYS_DATAFILES | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
  41. | INNODB_SYS_VIRTUAL | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
  42. | CSV | ACTIVE | STORAGE ENGINE | NULL | GPL |
  43. | MyISAM | ACTIVE | STORAGE ENGINE | NULL | GPL |
  44. | ARCHIVE | ACTIVE | STORAGE ENGINE | NULL | GPL |
  45. | partition | ACTIVE | STORAGE ENGINE | NULL | GPL |
  46. | BLACKHOLE | ACTIVE | STORAGE ENGINE | NULL | GPL |
  47. | FEDERATED | DISABLED | STORAGE ENGINE | NULL | GPL |
  48. | ngram | ACTIVE | FTPARSER | NULL | GPL |
  49. | rpl_semi_sync_master | ACTIVE | REPLICATION | semisync_master.so | GPL |
  50. | rpl_semi_sync_slave | ACTIVE | REPLICATION | semisync_slave.so | GPL |
  51. +----------------------------+----------+--------------------+--------------------+---------+
  • Slave
    做同样动作
  1. root@localhost [(none)]>install plugin rpl_semi_sync_master soname 'semisync_master.so';
  2. ERROR 2006 (HY000): MySQL server has gone away
  3. No connection. Trying to reconnect...
  4. Connection id: 7
  5. Current database: *** NONE ***
  6. Query OK, 0 rows affected (0.02 sec)
  7. root@localhost [(none)]>install plugin rpl_semi_sync_slave soname 'semisync_slave.so';
  8. Query OK, 0 rows affected (0.01 sec)
  1. root@localhost [(none)]>show plugins;
  2. +----------------------------+----------+--------------------+--------------------+---------+
  3. | Name | Status | Type | Library | License |
  4. +----------------------------+----------+--------------------+--------------------+---------+
  5. | binlog | ACTIVE | STORAGE ENGINE | NULL | GPL |
  6. | mysql_native_password | ACTIVE | AUTHENTICATION | NULL | GPL |
  7. | sha256_password | ACTIVE | AUTHENTICATION | NULL | GPL |
  8. | PERFORMANCE_SCHEMA | ACTIVE | STORAGE ENGINE | NULL | GPL |
  9. | MRG_MYISAM | ACTIVE | STORAGE ENGINE | NULL | GPL |
  10. | MEMORY | ACTIVE | STORAGE ENGINE | NULL | GPL |
  11. | InnoDB | ACTIVE | STORAGE ENGINE | NULL | GPL |
  12. | INNODB_TRX | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
  13. | INNODB_LOCKS | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
  14. | INNODB_LOCK_WAITS | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
  15. | INNODB_CMP | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
  16. | INNODB_CMP_RESET | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
  17. | INNODB_CMPMEM | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
  18. | INNODB_CMPMEM_RESET | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
  19. | INNODB_CMP_PER_INDEX | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
  20. | INNODB_CMP_PER_INDEX_RESET | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
  21. | INNODB_BUFFER_PAGE | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
  22. | INNODB_BUFFER_PAGE_LRU | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
  23. | INNODB_BUFFER_POOL_STATS | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
  24. | INNODB_TEMP_TABLE_INFO | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
  25. | INNODB_METRICS | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
  26. | INNODB_FT_DEFAULT_STOPWORD | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
  27. | INNODB_FT_DELETED | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
  28. | INNODB_FT_BEING_DELETED | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
  29. | INNODB_FT_CONFIG | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
  30. | INNODB_FT_INDEX_CACHE | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
  31. | INNODB_FT_INDEX_TABLE | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
  32. | INNODB_SYS_TABLES | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
  33. | INNODB_SYS_TABLESTATS | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
  34. | INNODB_SYS_INDEXES | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
  35. | INNODB_SYS_COLUMNS | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
  36. | INNODB_SYS_FIELDS | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
  37. | INNODB_SYS_FOREIGN | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
  38. | INNODB_SYS_FOREIGN_COLS | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
  39. | INNODB_SYS_TABLESPACES | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
  40. | INNODB_SYS_DATAFILES | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
  41. | INNODB_SYS_VIRTUAL | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
  42. | CSV | ACTIVE | STORAGE ENGINE | NULL | GPL |
  43. | MyISAM | ACTIVE | STORAGE ENGINE | NULL | GPL |
  44. | ARCHIVE | ACTIVE | STORAGE ENGINE | NULL | GPL |
  45. | partition | ACTIVE | STORAGE ENGINE | NULL | GPL |
  46. | BLACKHOLE | ACTIVE | STORAGE ENGINE | NULL | GPL |
  47. | FEDERATED | DISABLED | STORAGE ENGINE | NULL | GPL |
  48. | ngram | ACTIVE | FTPARSER | NULL | GPL |
  49. | rpl_semi_sync_master | ACTIVE | REPLICATION | semisync_master.so | GPL |
  50. | rpl_semi_sync_slave | ACTIVE | REPLICATION | semisync_slave.so | GPL |
  51. +----------------------------+----------+--------------------+--------------------+---------+
  52. 46 rows in set (0.00 sec)

看到两个插件都已经处于ACTIVE状态了。

二、开启半同步

  1. root@localhost [(none)]>set global rpl_semi_sync_master_enabled=1;
  2. Query OK, 0 rows affected (0.00 sec)
  3. root@localhost [(none)]>show global variables like '%rpl_semi%';
  4. +-------------------------------------------+------------+
  5. | Variable_name | Value |
  6. +-------------------------------------------+------------+
  7. | rpl_semi_sync_master_enabled | ON |
  8. | rpl_semi_sync_master_timeout | 10000 |
  9. | rpl_semi_sync_master_trace_level | 32 |
  10. | rpl_semi_sync_master_wait_for_slave_count | 1 |
  11. | rpl_semi_sync_master_wait_no_slave | ON |
  12. | rpl_semi_sync_master_wait_point | AFTER_SYNC |
  13. | rpl_semi_sync_slave_enabled | OFF |
  14. | rpl_semi_sync_slave_trace_level | 32 |
  15. +-------------------------------------------+------------+
  16. 8 rows in set (0.00 sec)

这里对参数做个简单的说明:
rpl_semi_sync_master_enabled:主库启用半同步
rpl_semi_sync_master_timeout:半同步超时时间,即从库在超过这个时间无应答后,改为异步同步,生产上可以调小一些,设置为1-2秒即可
rpl_semi_sync_master_wait_for_slave_count :多个从库的环境下,只等待一个从库应答
rpl_semi_sync_master_wait_point:半主从同步模式,5.7默认AFTER_SYNC,生产建议为AFTER_SYNC ,5.6为AFTER COMMIT
rpl_semi_sync_slave_enabled:从库启用半同步
更改配置文件

  • master
    rpl_semi_sync_master_enabled=1 #主库配置文件添加,表示以后启动MySQL将会自动开启半同步复制

  • slave
    rpl_semi_sync_slave_enabled=1

三、半同步测试

从库停止复制以后在主库建表测试

  • slave:
  1. root@localhost [(none)]>stop slave;
  2. Query OK, 0 rows affected (0.01 sec)
  • master
  1. root@localhost [(none)]>use xucl;
  2. Database changed
  3. root@localhost [xucl]>create table t1(id int);
  4. Query OK, 0 rows affected (10.01 sec)

可以看到,主库在10秒内没有收到应答后自动改为异步复制,然后再引擎层提交事务。