MySQL5.7半同步复制


实验实现:

master:192.168.1.117

slave1:192.168.1.228

slave2:192.168.1.229

一、安装前提

1、MySQL5.5 版本或更高

2、主、备库的 have_dynamic_loading 系统变量值为 yes

3、主、备异步复制已部署

二、过程

1.mster(192.168.1.117)

mysql> install plugin rpl_semi_sync_master soname ‘semisync_master.so’;

Query OK, 0 rows affected (0.03 sec)

mysql> show variables like ‘%rpl%’;

+——————————————-+————+

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

| rpl_stop_slave_timeout                    | 31536000   |

+——————————————-+————+

7 rows in set (0.03 sec)

master接收到N个slave的应答后,才commit事物,等待1s用户可以设置应道slave的数量。

rpl_semi_sync_master_wait_for_slave_count=1 默认是1 

set global rpl_semi_sync_master_wait_for_slave_count=2;

mysql> set global rpl_semi_sync_master_enabled=ON;

Query OK, 0 rows affected (0.00 sec)

mysql> show variables like ‘%rpl%’;

+——————————————-+————+

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

| rpl_stop_slave_timeout                    | 31536000   |

+——————————————-+————+

7 rows in set (0.00 sec)

slave节点(192.168.1.228/229)

mysql> install plugin rpl_semi_sync_slave soname ‘semisync_slave.so’;

Query OK, 0 rows affected (0.02 sec)

mysql> set global rpl_semi_sync_slave_enabled=ON;

Query OK, 0 rows affected (0.00 sec)

mysql> show variables like ‘%rpl%’;

+———————————+———-+

| Variable_name                   | Value    |

+———————————+———-+

| rpl_semi_sync_slave_enabled     | ON       |

| rpl_semi_sync_slave_trace_level | 32       |

| rpl_stop_slave_timeout          | 31536000 |

+———————————+———-+

3 rows in set (0.01 sec)

  1. 配置(建议一定这样做)

–主节点配置增加以下

[mysqld]

rpl_semi_sync_master_enabled=on

rpl_semi_sync_master_timeout=10000 # 10 second

备注: rpl_semi_sync_master_enabled 参数控制主节点是否开启半同步复制;rpl_semi_sync_master_timeout 参数控制主节点等待备节点返回确认信息的超时时间,单位为毫秒,超过这个时间后半同步复制转变成异步复制,这里设置成 10 秒。

Slave节点配置

[mysqld]

rpl_semi_sync_slave_enabled=on

备注:rpl_semi_sync_slave_enabled 参数控制备节点是否开启半同步复制; 之后重启主、备库。

3.做同步(GTID,发现半同步例子都是gtid)

change master to master_host=’192.168.1.117′,master_user=’test1′,master_password=’MyPass1!’,MASTER_AUTO_POSITION=1;

start slave;

4.测试

117插入一条数据

master:

mysql> show status like “%semi%”;

+——————————————–+——-+

| Variable_name                              | Value |

+——————————————–+——-+

| Rpl_semi_sync_master_clients               | 2     |有多少个Semi-sync的备库

| 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     |一共有几次从Semi-sync跌回普通状态

| Rpl_semi_sync_master_no_tx                 | 0     |库未及时响应的事务数,如果这个值很大就有问题不是用半同步复制的

| Rpl_semi_sync_master_status                | ON    |主库上Semi-sync是否正常开启

| Rpl_semi_sync_master_timefunc_failures     | 0     |时间函数未正常工作的次数

| Rpl_semi_sync_master_tx_avg_wait_time      | 4847  |开启Semi-sync,事务返回需要等待的平均时间

| Rpl_semi_sync_master_tx_wait_time          | 4847  |事务等待备库响应的总时间

| 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     |Semi-sync模式下,成功的事务数

+——————————————–+——-+

14 rows in set (0.01 sec)

Rpl_semi_sync_master_clients 用于显示有多少个从服务器配置成了半同步模式

Rpl_semi_sync_master_status 用于指示主服务器是使用异步还是半同步模式,ON->半同步

Rpl_semi_sync_master_yes_tx 用于显示从服务器确认的成功提交数量

mysql> show global variables like ‘%semi%’;

+——————————————-+————+

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

Slave1(228)

mysql>  show status like “%semi%”;

+—————————-+——-+

| Variable_name              | Value |

+—————————-+——-+

| Rpl_semi_sync_slave_status | ON    |

+—————————-+——-+

1 row in set (0.00 sec)

Rpl_semi_sync_slave_status 表示从服务器的半同步复制模式已经开始工作。