MySQL 8.0 半同步复制

备注:测试数据库版本为MySQL 8.0

这个blog我们来聊聊MySQL 的主从半同步复制

概述

异步复制方式不足之处在于,当主库把event写入二进制日志后,并不知道从库是否已经接受并应用日志了;如果主库发生意外宕机或者是奔溃,很有可能主库提交的事物没有传到任何一台从库机器上。在高可用集群架构下做主备切换,就会造成新的主库丢失数据。

mysql5.5版本之后引入了半同步复制功能,主从服务器必须安装半同步复制插件,才能开启该复制功能。该功能确保从库接收完主库传递过来的binlog内容已经写入到自己的relay log里面了,才会通知主库上面的等待线程,该操作完毕。

如果等待超时,超过rpl_semi_sync_master_timeout 参数设置时间,则关闭半同步复制,并自动转换为异步复制模式,直到至少有一台从库通知主库已经接收到binlog信息位置。

半同步复制提升了主从之间数据的一致性,让复制更加安全可靠,在mysql5.7版本中又增加了rpl_semi_sync_master_wait_point 参数,用来控制半同步模式下主库在返回给session事物成功之前的事务提交方式。

该参数有两个值:
AFTER_SYNC(缺省值):主服务器将每个事务写入其二进制日志和从服务器,并将二进制日志同步到磁盘。同步后,主设备等待从设备确认事务接收。在收到确认后,主服务器将事务提交给存储引擎,并将结果返回给客户端,然后客户端可以继续。

AFTER_COMMIT:主服务器将每个事务写入其二进制日志和从服务器,同步二进制日志,并将事务提交给存储引擎。主提交后等待从服务器确认事务接收。在收到确认后,主人将结果返回给客户端,然后客户端可以继续。

异步复制拓扑图
image.png

半同步复制拓扑图
image.png

一.环境准备

服务器类别 IP
主库 10.31.1.112
从库 10.31.1.113

此时已经搭建好了异步复制的主从

二.半同步复制搭建

1.1 主库

主库上先安装复制插件和开启半同步复制功能:

INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
set global rpl_semi_sync_master_enabled=on;
show variables like '%rpl_semi_sync_master%';
mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
Query OK, 0 rows affected (0.02 sec)

mysql> set global rpl_semi_sync_master_enabled=on;
Query OK, 0 rows affected (0.00 sec)

mysql> show variables like '%rpl_semi_sync_master%';
+-------------------------------------------+------------+
| Variable_name                             | Value      |
+-------------------------------------------+------------+
| rpl_semi_sync_master_enabled              | ON         |
| rpl_semi_sync_master_timeout              | 10000      |
| rpl_semi_sync_master_trace_level          | 32         |
| rpl_semi_sync_master_wait_for_slave_count | 1          |
| rpl_semi_sync_master_wait_no_slave        | ON         |
| rpl_semi_sync_master_wait_point           | AFTER_SYNC |
+-------------------------------------------+------------+
6 rows in set (0.01 sec)

主库参数文件添加:

rpl_semi_sync_master_enabled=1
rpl_semi_sync_master_timeout=1000
show plugins;
SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS  WHERE PLUGIN_NAME LIKE '%semi%';
mysql> show plugins;
+---------------------------------+--------+--------------------+--------------------+---------+
| Name                            | Status | Type               | Library            | License |
+---------------------------------+--------+--------------------+--------------------+---------+
| binlog                          | ACTIVE | STORAGE ENGINE     | NULL               | GPL     |
| mysql_native_password           | ACTIVE | AUTHENTICATION     | NULL               | GPL     |
| sha256_password                 | ACTIVE | AUTHENTICATION     | NULL               | GPL     |
| caching_sha2_password           | ACTIVE | AUTHENTICATION     | NULL               | GPL     |
| sha2_cache_cleaner              | ACTIVE | AUDIT              | NULL               | GPL     |
| CSV                             | ACTIVE | STORAGE ENGINE     | NULL               | GPL     |
| MEMORY                          | ACTIVE | STORAGE ENGINE     | NULL               | GPL     |
| InnoDB                          | ACTIVE | STORAGE ENGINE     | NULL               | GPL     |
| INNODB_TRX                      | ACTIVE | INFORMATION SCHEMA | NULL               | GPL     |
| INNODB_CMP                      | ACTIVE | INFORMATION SCHEMA | NULL               | GPL     |
| INNODB_CMP_RESET                | ACTIVE | INFORMATION SCHEMA | NULL               | GPL     |
| INNODB_CMPMEM                   | ACTIVE | INFORMATION SCHEMA | NULL               | GPL     |
| INNODB_CMPMEM_RESET             | ACTIVE | INFORMATION SCHEMA | NULL               | GPL     |
| INNODB_CMP_PER_INDEX            | ACTIVE | INFORMATION SCHEMA | NULL               | GPL     |
| INNODB_CMP_PER_INDEX_RESET      | ACTIVE | INFORMATION SCHEMA | NULL               | GPL     |
| INNODB_BUFFER_PAGE              | ACTIVE | INFORMATION SCHEMA | NULL               | GPL     |
| INNODB_BUFFER_PAGE_LRU          | ACTIVE | INFORMATION SCHEMA | NULL               | GPL     |
| INNODB_BUFFER_POOL_STATS        | ACTIVE | INFORMATION SCHEMA | NULL               | GPL     |
| INNODB_TEMP_TABLE_INFO          | ACTIVE | INFORMATION SCHEMA | NULL               | GPL     |
| INNODB_METRICS                  | ACTIVE | INFORMATION SCHEMA | NULL               | GPL     |
| INNODB_FT_DEFAULT_STOPWORD      | ACTIVE | INFORMATION SCHEMA | NULL               | GPL     |
| INNODB_FT_DELETED               | ACTIVE | INFORMATION SCHEMA | NULL               | GPL     |
| INNODB_FT_BEING_DELETED         | ACTIVE | INFORMATION SCHEMA | NULL               | GPL     |
| INNODB_FT_CONFIG                | ACTIVE | INFORMATION SCHEMA | NULL               | GPL     |
| INNODB_FT_INDEX_CACHE           | ACTIVE | INFORMATION SCHEMA | NULL               | GPL     |
| INNODB_FT_INDEX_TABLE           | ACTIVE | INFORMATION SCHEMA | NULL               | GPL     |
| INNODB_TABLES                   | ACTIVE | INFORMATION SCHEMA | NULL               | GPL     |
| INNODB_TABLESTATS               | ACTIVE | INFORMATION SCHEMA | NULL               | GPL     |
| INNODB_INDEXES                  | ACTIVE | INFORMATION SCHEMA | NULL               | GPL     |
| INNODB_TABLESPACES              | ACTIVE | INFORMATION SCHEMA | NULL               | GPL     |
| INNODB_COLUMNS                  | ACTIVE | INFORMATION SCHEMA | NULL               | GPL     |
| INNODB_VIRTUAL                  | ACTIVE | INFORMATION SCHEMA | NULL               | GPL     |
| INNODB_CACHED_INDEXES           | ACTIVE | INFORMATION SCHEMA | NULL               | GPL     |
| INNODB_SESSION_TEMP_TABLESPACES | ACTIVE | INFORMATION SCHEMA | NULL               | GPL     |
| MyISAM                          | ACTIVE | STORAGE ENGINE     | NULL               | GPL     |
| MRG_MYISAM                      | ACTIVE | STORAGE ENGINE     | NULL               | GPL     |
| PERFORMANCE_SCHEMA              | ACTIVE | STORAGE ENGINE     | NULL               | GPL     |
| TempTable                       | ACTIVE | STORAGE ENGINE     | NULL               | GPL     |
| BLACKHOLE                       | ACTIVE | STORAGE ENGINE     | NULL               | GPL     |
| ngram                           | ACTIVE | FTPARSER           | NULL               | GPL     |
| mysqlx_cache_cleaner            | ACTIVE | AUDIT              | NULL               | GPL     |
| mysqlx                          | ACTIVE | DAEMON             | NULL               | GPL     |
| rpl_semi_sync_master            | ACTIVE | REPLICATION        | semisync_master.so | GPL     |
+---------------------------------+--------+--------------------+--------------------+---------+
43 rows in set (0.00 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)

1.2 从库

从库安装复制插件和开启半同步复制功能:

INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
set global rpl_semi_sync_slave_enabled=on;
mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
Query OK, 0 rows affected (0.01 sec)

mysql> set global rpl_semi_sync_slave_enabled=on;
Query OK, 0 rows affected (0.00 sec)

备库参数文件添加:

rpl_semi_sync_slave_enabled=1

由于之前是异步复制,需要重启从库IO线程,激活半同步复制。

STOP SLAVE IO_THREAD;
START SLAVE IO_THREAD;

3.查看半同步复制情况

此时查看主库:
已经有一个从库连接到主库了。而且是半同步方式。

mysql> show variables like '%rpl_semi_sync_master%';
+-------------------------------------------+------------+
| Variable_name                             | Value      |
+-------------------------------------------+------------+
| rpl_semi_sync_master_enabled              | ON         |
| rpl_semi_sync_master_timeout              | 1000       |
| rpl_semi_sync_master_trace_level          | 32         |
| rpl_semi_sync_master_wait_for_slave_count | 1          |
| rpl_semi_sync_master_wait_no_slave        | ON         |
| rpl_semi_sync_master_wait_point           | AFTER_SYNC |
+-------------------------------------------+------------+
6 rows in set (0.01 sec)

三.半同步方式切换成异步方式

3.1、主库超时超过指定参数时间

rpl_semi_sync_master_timeout 时间为10s。生产上建议设置的尽可能大。
set global rpl_semi_sync_master_timeout=xxx;

3.2、手动切换

主库
set global rpl_semi_sync_master_enabled=off;
从库:
set global rpl_semi_sync_slave_enabled=off
关闭从库I/O thread
stop slave io_thread;
start slave io_thread;

参考文献:

1.https://www.cnblogs.com/hmwh/p/9198705.html

猜你喜欢

转载自blog.csdn.net/u010520724/article/details/108069178