您的位置:首页 > 数据库 > MySQL

MYSQL 半同步复制环境搭建

2017-12-13 16:02 756 查看
-----以下半同步复制是基于前面做的master-slave复制实现的,也就是异步复制。----------------------

1、master节点,加载semisynchronous插件

mysql> install plugin rpl_semi_sync_master SONAME 'semisync_master.so';

Query OK, 0 rows affected (0.01 sec)

查看库上插件信息,可以看到最后一行,已经有了该插件。

mysql> show plugins;

+----------------------------+----------+--------------------+----------------------+---------+

| Name                       | Status   | Type               | Library              | License |

+----------------------------+----------+--------------------+----------------------+---------+

| binlog                     | ACTIVE   | STORAGE ENGINE     | NULL                 | GPL     |

| mysql_native_password      | ACTIVE   | AUTHENTICATION     | NULL                 | GPL     |

| sha256_password            | ACTIVE   | AUTHENTICATION     | NULL                 | GPL     |

| CSV                        | ACTIVE   | STORAGE ENGINE     | NULL                 | GPL     |

| MEMORY                     | ACTIVE   | STORAGE ENGINE     | NULL                 | GPL     |

| MRG_MYISAM                 | ACTIVE   | STORAGE ENGINE     | NULL                 | GPL     |

| MyISAM                     | ACTIVE   | STORAGE ENGINE     | NULL                 | GPL     |

| PERFORMANCE_SCHEMA         | ACTIVE   | STORAGE ENGINE     | NULL                 | GPL     |

| InnoDB                     | ACTIVE   | STORAGE ENGINE     | NULL                 | GPL     |

| INNODB_TRX                 | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |

| INNODB_LOCKS               | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |

| INNODB_LOCK_WAITS          | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |

| INNODB_CMP                 | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |

| INNODB_CMP_RESET           | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |

| INNODB_CMPMEM              | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |

| INNODB_CMPMEM_RESET        | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |

| INNODB_CMP_PER_INDEX       | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |

| INNODB_CMP_PER_INDEX_RESET | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |

| INNODB_BUFFER_PAGE         | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |

| INNODB_BUFFER_PAGE_LRU     | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |

| INNODB_BUFFER_POOL_STATS   | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |

| INNODB_TEMP_TABLE_INFO     | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |

| INNODB_METRICS             | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |

| INNODB_FT_DEFAULT_STOPWORD | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |

| INNODB_FT_DELETED          | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |

| INNODB_FT_BEING_DELETED    | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |

| INNODB_FT_CONFIG           | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |

| INNODB_FT_INDEX_CACHE      | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |

| INNODB_FT_INDEX_TABLE      | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |

| INNODB_SYS_TABLES          | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |

| INNODB_SYS_TABLESTATS      | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |

| INNODB_SYS_INDEXES         | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |

| INNODB_SYS_COLUMNS         | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |

| INNODB_SYS_FIELDS          | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |

| INNODB_SYS_FOREIGN         | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |

| INNODB_SYS_FOREIGN_COLS    | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |

| INNODB_SYS_TABLESPACES     | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |

| INNODB_SYS_DATAFILES       | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |

| INNODB_SYS_VIRTUAL         | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |

| partition                  | ACTIVE   | STORAGE ENGINE     | NULL                 | GPL     |

| FEDERATED                  | DISABLED | STORAGE ENGINE     | NULL                 | GPL     |

| ARCHIVE                    | ACTIVE   | STORAGE ENGINE     | NULL                 | GPL     |

| BLACKHOLE                  | ACTIVE   | STORAGE ENGINE     | NULL                 | GPL     |

| ngram                      | ACTIVE   | FTPARSER           | NULL                 | GPL     |

| validate_password          | ACTIVE   | VALIDATE PASSWORD  | validate_password.so | GPL     |

| rpl_semi_sync_master       | ACTIVE   | REPLICATION        | semisync_master.so   | GPL     |

+----------------------------+----------+--------------------+----------------------+---------+

46 rows in set (0.00 sec)

--------------------------------------------------------------------------------------------------

2、slave节点,也需加载插件

mysql> install plugin rpl_semi_sync_slave SONAME 'semisync_slave.so';

Query OK, 0 rows affected (0.01 sec)

查看库上插件情况:看到最后一行,表明已经加载

mysql> show plugins;

+----------------------------+----------+--------------------+----------------------+---------+

| Name                       | Status   | Type               | Library              | License |

+----------------------------+----------+--------------------+----------------------+---------+

| binlog                     | ACTIVE   | STORAGE ENGINE     | NULL                 | GPL     |

| mysql_native_password      | ACTIVE   | AUTHENTICATION     | NULL                 | GPL     |

| sha256_password            | ACTIVE   | AUTHENTICATION     | NULL                 | GPL     |

| CSV                        | ACTIVE   | STORAGE ENGINE     | NULL                 | GPL     |

| MEMORY                     | ACTIVE   | STORAGE ENGINE     | NULL                 | GPL     |

| MRG_MYISAM                 | ACTIVE   | STORAGE ENGINE     | NULL                 | GPL     |

| MyISAM                     | ACTIVE   | STORAGE ENGINE     | NULL                 | GPL     |

| PERFORMANCE_SCHEMA         | ACTIVE   | STORAGE ENGINE     | NULL                 | GPL     |

| InnoDB                     | ACTIVE   | STORAGE ENGINE     | NULL                 | GPL     |

| INNODB_TRX                 | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |

| INNODB_LOCKS               | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |

| INNODB_LOCK_WAITS          | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |

| I
4000
NNODB_CMP                 | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |

| INNODB_CMP_RESET           | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |

| INNODB_CMPMEM              | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |

| INNODB_CMPMEM_RESET        | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |

| INNODB_CMP_PER_INDEX       | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |

| INNODB_CMP_PER_INDEX_RESET | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |

| INNODB_BUFFER_PAGE         | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |

| INNODB_BUFFER_PAGE_LRU     | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |

| INNODB_BUFFER_POOL_STATS   | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |

| INNODB_TEMP_TABLE_INFO     | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |

| INNODB_METRICS             | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |

| INNODB_FT_DEFAULT_STOPWORD | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |

| INNODB_FT_DELETED          | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |

| INNODB_FT_BEING_DELETED    | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |

| INNODB_FT_CONFIG           | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |

| INNODB_FT_INDEX_CACHE      | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |

| INNODB_FT_INDEX_TABLE      | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |

| INNODB_SYS_TABLES          | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |

| INNODB_SYS_TABLESTATS      | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |

| INNODB_SYS_INDEXES         | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |

| INNODB_SYS_COLUMNS         | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |

| INNODB_SYS_FIELDS          | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |

| INNODB_SYS_FOREIGN         | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |

| INNODB_SYS_FOREIGN_COLS    | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |

| INNODB_SYS_TABLESPACES     | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |

| INNODB_SYS_DATAFILES       | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |

| INNODB_SYS_VIRTUAL         | ACTIVE   | INFORMATION SCHEMA | NULL                 | GPL     |

| partition                  | ACTIVE   | STORAGE ENGINE     | NULL                 | GPL     |

| FEDERATED                  | DISABLED | STORAGE ENGINE     | NULL                 | GPL     |

| ARCHIVE                    | ACTIVE   | STORAGE ENGINE     | NULL                 | GPL     |

| BLACKHOLE                  | ACTIVE   | STORAGE ENGINE     | NULL                 | GPL     |

| ngram                      | ACTIVE   | FTPARSER           | NULL                 | GPL     |

| validate_password          | ACTIVE   | VALIDATE PASSWORD  | validate_password.so | GPL     |

| rpl_semi_sync_slave        | ACTIVE   | REPLICATION        | semisync_slave.so    | GPL     |

+----------------------------+----------+--------------------+----------------------+---------+

46 rows in set (0.00 sec)

-----------------------------------------------------------------------------------------------

3、通过设置参数,启动半同步复制

首先是master节点:

set global rpl_semi_sync_master_enabled = 1;

set global rpl_semi_sync_master_timeout = 3000;  默认10s,改成3s

slave节点:

set global rpl_semi_sync_slave_enabled = 1;

-----------------------------------------------------------------------------------------------

4、重新启动slave节点的IO_THREAD线程,这一步是为了让slave节点重新连接master节点,

注册成为半同步slave身份,如果不重启io_thread,那么slave就一直保持异步复制模式

mysql> stop slave io_thread;

Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> start slave io_thread;

Query OK, 0 rows affected (0.00 sec)

-----------------------------------------------------------------------------------------------

5、太随意了,这个半同步复制就搭建完了,下面就做些测试,看看效果。

mysql的半同步插件,会将一些与同步相关的统计信息写入到状态变量中,因此我们可以通过查看

这些变量值,帮助我们判断当前的数据同步模式,也可监控同步状态。

show status like '%Rpl_semi_sync%';

master节点:

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.01 sec)

slave节点:只有一个变量

mysql> show status like '%Rpl_semi_sync%';

+----------------------------+-------+

| Variable_name              | Value |

+----------------------------+-------+

| Rpl_semi_sync_slave_status | ON    |

+----------------------------+-------+

1 row in set (0.00 sec)

此时:在master节点插入数据

mysql> use test;

Database changed

mysql> insert into t values(23);

Query OK, 1 row affected (0.01 sec)

mysql> select * from t;

+------+

| id   |

+------+

|    1 |

|    2 |

|    3 |

|   23 |

+------+

4 rows in set (0.00 sec)

在slave节点查看:

mysql> select * from t;

+------+

| id   |

+------+

|    1 |

|    2 |

|    3 |

+------+

3 rows in set (0.00 sec)

哇哇,出事了,没有同步过来,肿么回事?

在mater节点查看变量信息:

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             | 1     |

| 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      | 1238  |

| Rpl_semi_sync_master_tx_wait_time          | 1238  |

| Rpl_semi_sync_master_tx_waits              | 1     |

| Rpl_semi_sync_master_wait_pos_backtraverse | 0     |

| Rpl_semi_sync_master_wait_sessions         | 0     |

| Rpl_semi_sync_master_yes_tx                | 1     |

+--------------------------------------------+-------+

14 rows in set (0.00 sec)

发现Rpl_semi_sync_master_yes_tx  值为1,表明当前已经成功发送到slave节点1个事务,

可是,为啥我slave节点没有收到?

于是我只好重启slave:

mysql> stop slave;

Query OK, 0 rows affected (0.00 sec)

mysql> start slave;

Query OK, 0 rows affected (0.00 sec)

mysql> show status like '%semi%';

+----------------------------+-------+

| Variable_name              | Value |

+----------------------------+-------+

| Rpl_semi_sync_slave_status | ON    |

+----------------------------+-------+

1 row in set (0.00 sec)

mysql> select * from t;

+------+

| id   |

+------+

|    1 |

|    2 |

|    3 |

|   23 |

+------+

4 rows in set (0.00 sec)

结果,数据就出来了。。可能是由于我在配置半同步的时候,先将slave节点的应用停掉了导致的。

再做一次插入,看看:

master节点:

mysql> insert into t values(24);

Query OK, 1 row affected (0.00 sec)

mysql> select * from t;

+------+

| id   |

+------+

|    1 |

|    2 |

|    3 |

|   23 |

|   24 |

+------+

5 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      | 949   |

| Rpl_semi_sync_master_tx_wait_time          | 1899  |

| 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> select * from t;

+------+

| id   |

+------+

|    1 |

|    2 |

|    3 |

|   23 |

|   24 |

+------+

5 rows in set (0.00 sec)

数据如期而至。

-------------------------------------------------------------------------------------------------

6、前面还记得我们设置了一个超时参数:set global rpl_semi_sync_master_timeout = 3000; 

做一个测试,将slave节点的应用停掉,然后在master节点再次执行insert操作,看看会发生啥?

slave节点:

mysql> stop slave;

Query OK, 0 rows affected (0.00 sec)

master节点:

mysql> insert into t values(25);

Query OK, 1 row affected (3.00 sec)

仔细看看,发现这个简单的insert花费3秒钟时间,其实就是由于slave节点的复制停掉了,产生了超时。

那么超时的后果呢?

mysql> show status like '%semi%';

+--------------------------------------------+-------+

| Variable_name                              | Value |

+--------------------------------------------+-------+

| Rpl_semi_sync_master_clients               | 0     |

| 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              | 1     |

| Rpl_semi_sync_master_no_tx                 | 1     |

| Rpl_semi_sync_master_status                | OFF   |

| Rpl_semi_sync_master_timefunc_failures     | 0     |

| Rpl_semi_sync_master_tx_avg_wait_time      | 949   |

| Rpl_semi_sync_master_tx_wait_time          | 1899  |

| 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.01 sec)

可以看到,Rpl_semi_sync_master_status  被自动置为OFF了

将slave节点应用开启:

mysql> start slave;

Query OK, 0 rows affected (0.00 sec)

在master节点再次执行操作:

mysql> insert into t values(26);

Query OK, 1 row affected (0.01 sec)

查看slave:

mysql> select * from t;

+------+

| id   |

+------+

|    1 |

|    2 |

|    3 |

|   23 |

|   24 |

|   25 |

|   26 |

+------+

7 rows in set (0.00 sec)

发现数据都过来了,包括之前的25

再看master节点的status:

mysql> show status like '%semi%';

+--------------------------------------------+-------+

| 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             | 4     |

| Rpl_semi_sync_master_no_times              | 1     |

| Rpl_semi_sync_master_no_tx                 | 1     |

| Rpl_semi_sync_master_status                | ON    |

| Rpl_semi_sync_master_timefunc_failures     | 0     |

| Rpl_semi_sync_master_tx_avg_wait_time      | 831   |

| Rpl_semi_sync_master_tx_wait_time          | 2493  |

| Rpl_semi_sync_master_tx_waits              | 3     |

| Rpl_semi_sync_master_wait_pos_backtraverse | 0     |

| Rpl_semi_sync_master_wait_sessions         | 0     |

| Rpl_semi_sync_master_yes_tx                | 3     |

+--------------------------------------------+-------+

14 rows in set (0.00 sec)

瞧瞧,Rpl_semi_sync_master_status 又自动置为on了。

------------------------------------------------------------------------------------------

简单总结一下:

半同步的搭建也很简单,加载个插件,设置点参数即可,相当方便。

当slave节点的复制应用出现问题的时候,master节点会根据设置的超时参数自动断掉两节点间的复
d191
制,

当slave节点恢复正常后,master节点自动恢复复制。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: