开始
官方文档,点击Replication,点击Replication Solutions,点击Semisynchronous Replication
基础环境
要使用半同步复制,必须满足以下要求
安装插件的能力需要支持动态加载的 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)
复制必须已经在工作
不得配置多个复制通道。半同步复制仅与默认复制通道兼容
默认即可
安装配置
半同步复制是使用插件实现的,因此必须将插件安装到服务器中以使其可用
查看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)
系统变量启用半同步复制监控
-
控制是否在源上启用半同步复制。要启用或禁用插件,请将此变量分别设置为 1 或 0。默认值为 0(关闭)。
-
一个以毫秒为单位的值,用于控制源在超时和恢复到异步复制之前等待来自副本(指SLAVE)的确认提交的时间。默认值为 10000(10 秒)
-
类似于
rpl_semi_sync_master_enabled,但控制副本插件
状态变量启用半同步复制监控
-
半同步副本的数量。
-
半同步复制当前是否在源上运行。如果插件已启用且未发生提交确认,则值为 1。如果未启用插件或源由于提交确认超时而退回到异步复制,则为 0。
-
副本未成功确认的提交数。
-
副本成功确认的提交数。
-
半同步复制当前是否在副本上运行。如果插件已启用并且复制 I/O 线程正在运行,则为 1,否则为 0
监控
当源由于提交阻塞超时或副本追赶而在异步或半同步复制之间切换时,它会 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 指示半同步复制当前是否可操作