CentOS7安装mysql5.7半同步复制

306 阅读5分钟

开始

官方文档,点击Replication,点击Replication Solutions,点击Semisynchronous Replication

image.png

基础环境

要使用半同步复制,必须满足以下要求

安装插件的能力需要支持动态加载的 MySQL 服务器。请检查 have_dynamic_loading系统变量的值是否为YES。二进制发行版应该支持动态加载。

# on master ,on slave
mysql> show variables like '%dynamic%';
+----------------------+-------+
| Variable_name        | Value |
+----------------------+-------+
| have_dynamic_loading | YES   |
+----------------------+-------+
1 row in set (0.00 sec)

复制必须已经在工作

参考执行 CentOS7安装mysql5.7主从复制

不得配置多个复制通道。半同步复制仅与默认复制通道兼容

默认即可

安装配置

半同步复制是使用插件实现的,因此必须将插件安装到服务器中以使其可用

查看MySQL 插件

# 可见在/usr/lib64/mysql/plugin/
#on master ,on slave
mysql> show variables like '%plugin%';
+-----------------------------------------------+--------------------------+
| Variable_name                                 | Value                    |
+-----------------------------------------------+--------------------------+
| default_authentication_plugin                 | mysql_native_password    |
| plugin_dir                                    | /usr/lib64/mysql/plugin/ |
| replication_optimize_for_static_plugin_config | OFF                      |
+-----------------------------------------------+--------------------------+
3 rows in set (0.00 sec)


# 查看插件库
#on master ,on slave
[root@localhost ~]# ll /usr/lib64/mysql/plugin/
总用量 59632
-rwxr-xr-x 1 root root   103544 11月 30 04:41 adt_null.so
-rwxr-xr-x 1 root root   357648 11月 30 04:41 authentication_ldap_sasl_client.so
-rwxr-xr-x 1 root root    43744 11月 30 04:41 auth_socket.so
-rwxr-xr-x 1 root root   943160 11月 30 04:41 connection_control.so
drwxr-xr-x 2 root root     4096 3月  23 15:31 debug
-rwxr-xr-x 1 root root 21797384 11月 30 04:42 group_replication.so
-rwxr-xr-x 1 root root   485584 11月 30 04:41 ha_example.so
-rwxr-xr-x 1 root root   947224 11月 30 04:41 innodb_engine.so
-rwxr-xr-x 1 root root   952448 11月 30 04:41 keyring_file.so
-rwxr-xr-x 1 root root   462096 11月 30 04:41 keyring_udf.so
-rwxr-xr-x 1 root root  1264984 11月 30 04:41 libmemcached.so
-rwxr-xr-x 1 root root  8974008 11月 30 04:41 libpluginmecab.so
-rwxr-xr-x 1 root root    21616 11月 30 04:41 locking_service.so
-rwxr-xr-x 1 root root    54080 11月 30 04:41 mypluglib.so
-rwxr-xr-x 1 root root    41376 11月 30 04:41 mysql_no_login.so
-rwxr-xr-x 1 root root 22106368 11月 30 04:43 mysqlx.so
-rwxr-xr-x 1 root root    49504 11月 30 04:41 rewrite_example.so
-rwxr-xr-x 1 root root   592368 11月 30 04:41 rewriter.so
-rwxr-xr-x 1 root root   937496 11月 30 04:41 semisync_master.so
-rwxr-xr-x 1 root root   160592 11月 30 04:41 semisync_slave.so
-rwxr-xr-x 1 root root   209928 11月 30 04:41 validate_password.so
-rwxr-xr-x 1 root root   507088 11月 30 04:41 version_token.so

安装插件

插件库文件的基本名称是 semisync_master和 semisync_slave

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

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

验证插件安装

# on master ,on slave
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.01 sec)


配置参数

运行中和未运行是一种方式,执行其中一种即可

主从复制运行中配置

# on master 
# 该值应为 1 以启用半同步复制或 0 以禁用它。默认情况下,这些变量设置为 0
mysql> SET GLOBAL rpl_semi_sync_master_enabled =1;
Query OK, 0 rows affected (0.00 sec)

#on master
该值*`N`*以毫秒为单位。默认值为 10000(10 秒)
mysql> SET GLOBAL rpl_semi_sync_master_timeout = 30000;
Query OK, 0 rows affected (0.00 sec)

# on slave 
mysql> SET GLOBAL rpl_semi_sync_slave_enabled = 1;
Query OK, 0 rows affected (0.00 sec)


主从复制运行中启动

如果复制 I/O 线程已经在运行并且您没有重新启动它,则副本将继续使用异步复制

# on slave
mysql> STOP SLAVE IO_THREAD;
Query OK, 0 rows affected (0.00 sec)

mysql> START SLAVE IO_THREAD;
Query OK, 0 rows affected (0.00 sec)

主从复制未运行配置

# on master 增加
[mysqld]
rpl_semi_sync_master_enabled=1
rpl_semi_sync_master_timeout=1000
#on slave 增加
[mysqld]
rpl_semi_sync_slave_enabled=1

主从复制未运行启动

# on master ,on slave
[root@localhost ~]# sudo service mysqld restart Redirecting to /bin/systemctl restart mysqld.service

# on slave
mysql> start slave; 
Query OK, 0 rows affected (0.00 sec)

检查

检查复制状态

参考

检查半同步复制状态

检查master

mysql> SHOW VARIABLES LIKE 'rpl_semi_sync%';
+-------------------------------------------+------------+
| Variable_name                             | Value      |
+-------------------------------------------+------------+
| rpl_semi_sync_master_enabled              | ON         |
| rpl_semi_sync_master_timeout              | 30000      |
| 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.00 sec)

mysql> SHOW STATUS LIKE 'Rpl_semi_sync%';
+--------------------------------------------+-------+
| Variable_name                              | Value |
+--------------------------------------------+-------+
| Rpl_semi_sync_master_clients               | 1     |
| Rpl_semi_sync_master_net_avg_wait_time     | 0     |
| Rpl_semi_sync_master_net_wait_time         | 0     |
| Rpl_semi_sync_master_net_waits             | 2     |
| Rpl_semi_sync_master_no_times              | 0     |
| Rpl_semi_sync_master_no_tx                 | 0     |
| Rpl_semi_sync_master_status                | ON    |
| Rpl_semi_sync_master_timefunc_failures     | 0     |
| Rpl_semi_sync_master_tx_avg_wait_time      | 767   |
| Rpl_semi_sync_master_tx_wait_time          | 1534  |
| Rpl_semi_sync_master_tx_waits              | 2     |
| Rpl_semi_sync_master_wait_pos_backtraverse | 0     |
| Rpl_semi_sync_master_wait_sessions         | 0     |
| Rpl_semi_sync_master_yes_tx                | 2     |
+--------------------------------------------+-------+
14 rows in set (0.00 sec)

检查slave

mysql> SHOW VARIABLES LIKE 'rpl_semi_sync%';
+---------------------------------+-------+
| Variable_name                   | Value |
+---------------------------------+-------+
| rpl_semi_sync_slave_enabled     | ON    |
| rpl_semi_sync_slave_trace_level | 32    |
+---------------------------------+-------+
2 rows in set (0.00 sec)

mysql> SHOW STATUS LIKE 'Rpl_semi_sync%';
+----------------------------+-------+
| Variable_name              | Value |
+----------------------------+-------+
| Rpl_semi_sync_slave_status | ON    |
+----------------------------+-------+
1 row in set (0.00 sec)

系统变量启用半同步复制监控

状态变量启用半同步复制监控

监控

当源由于提交阻塞超时或副本追赶而在异步或半同步复制之间切换时,它会 Rpl_semi_sync_master_status 适当地设置状态变量的值。在源上从半同步复制自动回退到异步复制意味着 rpl_semi_sync_master_enabled 系统变量可能在源端具有值 1,即使此时半同步复制实际上无法运行。您可以监视 Rpl_semi_sync_master_status 状态变量以确定源当前是使用异步复制还是半同步复制。

要查看连接了多少半同步副本,请检查 Rpl_semi_sync_master_clients.

副本已成功或未成功确认的提交数由 Rpl_semi_sync_master_yes_tx 和Rpl_semi_sync_master_no_tx 变量指示。

在副本端, Rpl_semi_sync_slave_status 指示半同步复制当前是否可操作