MySQL学习笔记12半同步复制
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL学习笔记12半同步复制相关的知识,希望对你有一定的参考价值。
1.1.1. 相关概念
默认情况下,mysql使用异步复制,即master上的事务执行与slave上的复制操作不需要同步,master不需要等待slave上的复制线程将Binary Log接收完毕即可执行其它事务。
半同步复制时,master上的事务执行与slave上的复制操作需要在某个步骤上进行同步,master需要等待slave上的复制线程接收完毕Binary Log。
异步复制的工作效率比较高,但是在特定条件下,有可能造成master和slave的数据不一致。半同步复制可以降低数据不一致的概率。半同步复制仅支持单源复制,不支持多源复制。
1.1.2. 部署半同步复制
建立半同步复制的环境,在已经建立好master-slave复制环境的情况下,还需要执行以下操作。
(1)在master上安装半同步复制插件。
mysql> show variables like ‘%semi%‘;
Empty set (0.02 sec)
mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME ‘semisync_master.so‘;
Query OK, 0 rows affected (0.05 sec)
mysql> show variables like ‘%semi%‘;
+-------------------------------------------+------------+
| Variable_name | Value |
+-------------------------------------------+------------+
| rpl_semi_sync_master_enabled | OFF |
| 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.00 sec)
其中 rpl_semi_sync_master_timeout变量控制半同步的超时时间,单位为毫秒,默认为10000,即10秒钟。
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)
(2)在slave上安装半同步复制插件。
mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME ‘semisync_slave.so‘;
Query OK, 0 rows affected (0.03 sec)
mysql> show variables like ‘%semi%‘;
+---------------------------------+-------+
| Variable_name | Value |
+---------------------------------+-------+
| rpl_semi_sync_slave_enabled | OFF |
| rpl_semi_sync_slave_trace_level | 32 |
+---------------------------------+-------+
2 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_slave | ACTIVE |
+---------------------+---------------+
1 row in set (0.00 sec)
(3)在master上启用半同步复制。
在master上的MySQL配置文件中:
[mysqld]
rpl_semi_sync_master_enabled=1
rpl_semi_sync_master_timeout=10000
【此处省略了异步复制必须的其它配置】
可以使用SQL命令动态启用半同步复制。
mysql> set global rpl_semi_sync_master_enabled=1;
Query OK, 0 rows affected (0.00 sec)
(4)在slave上启用半同步复制。
在slave上的MySQL配置文件中:
[mysqld]
rpl_semi_sync_slave_enabled=1
【此处省略了异步复制必须的其它配置】
可以使用SQL命令动态启用半同步复制。
mysql> stop slave;
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> set global rpl_semi_sync_slave_enabled=1;
Query OK, 0 rows affected (0.00 sec)
mysql> start slave;
Query OK, 0 rows affected (0.01 sec)
至此半同步复制环境建立成功。
1.1.3. 监控半同步复制的状态
(1)查看master上的半同步复制。
mysql> SHOW VARIABLES LIKE ‘rpl_semi_sync%‘;
+-------------------------------------------+------------+
| 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)
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 | 0 |
| 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 | 0 |
| Rpl_semi_sync_master_tx_wait_time | 0 |
| Rpl_semi_sync_master_tx_waits | 0 |
| Rpl_semi_sync_master_wait_pos_backtraverse | 0 |
| Rpl_semi_sync_master_wait_sessions | 0 |
| Rpl_semi_sync_master_yes_tx | 0 |
+--------------------------------------------+-------+
14 rows in set (0.00 sec)
其中,Rpl_semi_sync_master_clients表示通过半同步复制已经连接上的slave的数量。
Rpl_semi_sync_master_yes_tx表示已经成功发送了半同步ACK的slave的数量。
Rpl_semi_sync_master_no_tx表示没有成功发送半同步ACK的slave的数量。
(2)查看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_slave_status表示slave上的半同步复制已经成功启动了。
以上是关于MySQL学习笔记12半同步复制的主要内容,如果未能解决你的问题,请参考以下文章