MySQL 8.0 搭建半同步复制

说明:搭建半同步复制需要预先有基本的主从复制环境,具体可以看我之前的文章:

https://github.com/solidSpoon/solidSpoon.github.io/wiki

半同步超时的时候,会自动降为异步工作。当Slave开启半同步后,或者当主从之间网络延迟恢复正常的时候,半同步复制会自动从异步复制又转为半同步复制,还是相当智能的。

Master 配置

安装半同步模块并启动

这里 Windows 版本有个坑

对于 Linux 来说:此模块位置在 /usr/local/mysql/lib/plugin/semisync_master.so
对于 Windows Zip 版本来说:插件的位置本来在 ..\lib\semisync_master.dll ,但是 MySQL 默认的位置是 \bin\lib\plugin\semisync_master.so 

要解决这个问题,我们把 lib 目录复制一份过去就好了。

也可以在配置文件中指定插件目录:

1
2
[mysqld]
plugin_dir=/path/to/plugin/directory

如果 plugin_dir 的值是相对路径名,则将其视为相对于 MySQL 基本目录( basedir 系统变量的值)。

下面是安装模块的命令:

Linux:

1
mysql> install plugin rpl_semi_sync_master soname 'semisync_master.so';

Windows:

1
mysql> install plugin rpl_semi_sync_master soname 'semisync_master.dll';

安装完后:

1
mysql> show global variables like '%semi%';
1
2
3
4
5
6
7
8
9
10
11
12
mysql> show global variables like '%semi%';
+-------------------------------------------+------------+
| Variable_name | Value |
+-------------------------------------------+------------+
| rpl_semi_sync_master_enabled | OFF | -> 是否启用半同步协议
| rpl_semi_sync_master_timeout | 10000 | -> 链接 Slave 超时时间
| 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 | -> MySQL 5.7 之后默认值
+-------------------------------------------+------------+
6 rows in set, 1 warning (0.02 sec)
1
2
mysql> set global rpl_semi_sync_master_enabled = 1;
mysql> set global rpl_semi_sync_master_timeout = 2000;

安装后启动和定制主从连接错误的超时时间默认是 10s 可改为 2s,一旦有一次超时自动降级为异步。(以上内容要想永久有效需要写到配置文件中)

1
2
3
4
[[email protected] ~]# cat /etc/my.cnf
[mysqld]
rpl_semi_sync_master_enabled = 1;
rpl_semi_sync_master_timeout = 2000;

Slave 配置

1)安装半同步模块并启动

Linux:

1
mysql> install plugin rpl_semi_sync_slave soname 'semisync_slave.so';

WIndows:

1
mysql> install plugin rpl_semi_sync_slave soname 'semisync_slave.dll';

同样,如果报错就把插件目录移动一下

lib -> bin\lib

接着执行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
mysql> set global rpl_semi_sync_slave_enabled = 1;
mysql> show global variables like '%semi%';
+-------------------------------------------+------------+
| 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 |
| rpl_semi_sync_slave_enabled | ON |
| rpl_semi_sync_slave_trace_level | 32 |
+-------------------------------------------+------------+
8 rows in set, 1 warning (0.00 sec)

2)从节点需要重新连接主服务器半同步才会生效

1
2
mysql> stop slave io_thread;
mysql> start slave io_thread;

PS:如果想卸载异步模块就使用 uninstall 即可。

Master 上查看是否启用了半同步

现在半同步已经正常工作了,主要看 Rpl_semi_sync_master_clients 是否不为 0,Rpl_semi_sync_master_status 是否为 ON。如果 Rpl_semi_sync_master_status 为 OFF,说明出现了网络延迟或 Slave IO 线程延迟。

验证

半同步超时,是否会自动降为异步工作

Slave

关闭半同步;

1
2
3
mysql> set global rpl_semi_sync_slave_enabled = 0 ;
mysql> stop slave io_thread;
mysql> start slave io_thread;

Master

1
2
3
4
mysql> insert into t1(id) values(5),(4);
Query OK, 2 rows affected (10.06 sec)
mysql> insert into t1(id) values(6),(7);
Query OK, 2 rows affected (0.03 sec)