MySQL学习笔记12半同步复制

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL学习笔记12半同步复制相关的知识,希望对你有一定的参考价值。

1.1.1. 相关概念

 

默认情况下,mysql使用异步复制,即master上的事务执行与slave上的复制操作不需要同步,master不需要等待slave上的复制线程将Binary Log接收完毕即可执行其它事务。

半同步复制时,master上的事务执行与slave上的复制操作需要在某个步骤上进行同步,master需要等待slave上的复制线程接收完毕Binary Log

异步复制的工作效率比较高,但是在特定条件下,有可能造成masterslave的数据不一致。半同步复制可以降低数据不一致的概率。半同步复制仅支持单源复制,不支持多源复制。

 

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表示已经成功发送了半同步ACKslave的数量。

 Rpl_semi_sync_master_no_tx表示没有成功发送半同步ACKslave的数量。

 

 

 

(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半同步复制的主要内容,如果未能解决你的问题,请参考以下文章

MySQL学习(二十四)主从同步-半同步

MySQL 基础知识梳理学习----半同步复制

快速笔记02-MySQL主从复制原理半同步操作步骤及原理

Mysql 半同步复制

MySQL数据库在线热备(半同步复制)

MySQL中的半同步复制