zl程序教程

您现在的位置是:首页 >  数据库

当前栏目

Mysql之半同步复制

mysql同步 复制
2023-09-14 09:13:17 时间

一、半同步复制介绍

1、半同步复制简介

  Mysql数据库复制默认的方式是异步复制,但异步复制的不足之处是主库把event写入二进制日志后,并不知道从库是否已经接受并应有了。在异步模式下,如果主库崩溃,很有可能在主库中已经提交的事务,并没有传到任何一台从库服务器上,在高可用集群架构下做主备切换,就会造成新的主库丢失数据的现象。从Mysql5.5版本之后引入了半同步复制功能,需要主从服务器均安装半同步复制插件,才能开启该复制功能。在该功能下,确保从库接受了主库传递过来的binlog内容已经写入到自己的relay log里面了,才会通知主库上面的等待线程,该操作完毕。如果等待超时,超过rpl_semi_sync_master_timeout参数设置的时间,则关闭半同步复制,并自动转换为异步模式,直到从库通知主库已经接收到binlog信息为止。

2、半同步复制原理图

在这里插入图片描述

二、半同步复制配置步骤

1、主从规划

序号角色IP地址server-id端口
1master192.168.0.1241243306
2slave192.168.0.1251253306

2、搭建异步主从复制

按照异步主从复制模式搭建主从,搭建方式参照博文
Mysql之异步主从复制搭建

3、主库安装半同步插件

mysql> install plugin rpl_semi_sync_master soname ‘semisync_master.so’;
Query OK, 0 rows affected (0.01 sec)

4、主库启用半同步复制功能

mysql> set global rpl_semi_sync_master_enabled=on;
Query OK, 0 rows affected (0.00 sec)

5、主库检查插件是否加载成功

mysql> show plugins;
在这里插入图片描述
mysql> show 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.02 sec)

6、从库安装半同步插件

mysql> mysql> install plugin rpl_semi_sync_slave soname ‘semisync_slave.so’;
Query OK, 0 rows affected (0.01 sec)

7、从库启用半同步复制功能

mysql> set global rpl_semi_sync_slave_enabled=on;
Query OK, 0 rows affected (0.00 sec)

8、从库检查插件是否加载成功

mysql> show plugins;
±---------------------------±---------±-------------------±---------------------±--------+
| Name | Status | Type | Library | License |
±---------------------------±---------±-------------------±---------------------±--------+
| binlog | ACTIVE | STORAGE ENGINE | NULL | GPL |

| rpl_semi_sync_slave | ACTIVE | REPLICATION | semisync_slave.so | GPL |
±---------------------------±---------±-------------------±---------------------±--------+
46 rows in set (0.03 sec)

9、重启从库的I/O线程

mysql> stop slave io_thread;
Query OK, 0 rows affected (0.03 sec)

mysql> start slave io_thread;
Query OK, 0 rows affected (0.00 sec)

10、主库上查看半同步复制是否正常

mysql> show global 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 | 0 |
| Rpl_semi_sync_master_no_times | 1 |
| Rpl_semi_sync_master_no_tx | 2 |
| 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)

11、从库上查看半同步状态是否正常

Rpl_semi_sync_slave_status值为ON表示从库正常开启半同步复制模式。

mysql> show global status like ‘%semi%status%’;
±---------------------------±------+
| Variable_name | Value |
±---------------------------±------+
| Rpl_semi_sync_slave_status | ON |
±---------------------------±------+
1 row in set (0.00 sec)

12、插入数据验证

1)、主库插入数据

mysql> insert into t1 (id,name,age) values (‘3’,‘yueyue’,‘5’);

2)、主库查看状态

(Rpl_semi_sync_master_no_tx=2说明:在从库启用半同步复制前插入了2条数据)
在这里插入图片描述

3)、从库检查数据

mysql> select * from t1;
±—±-------±----+
| id | name | age |
±—±-------±----+
| 1 | wuhs | 33 |
| 2 | sunru | 32 |
| 3 | yueyue | 5 |
±—±-------±----+
3 rows in set (0.00 sec)

三、注意事项

  • 如果需要开启启动半同步状态需要将如下参数写入配置文件
    rpl_semi_sync_slave_enabled=on;
    rpl_semi_sync_master_enabled=on;
  • 重要参数变量说明

    Rpl_semi_sync_master_no_tx 代表没有成功接收slave提交的次数
    Rpl_semi_sync_master_yes_tx 代表成功接收slave事务回复的次数

  • rpl_semi_sync_master_timeout参数默认为10s,即主库在超过10s未收到从库的回复会自动切换为异步模式。为了保障数据的安全性,可以将该参数值调大。
  • 主库Rpl_semi_sync_master_status=off表示半同步复制停止,如果需要从异步复制模式恢复为半同步复制模式,只需要在从库重新开启I/O thread,命令:start slave io_thread
    在这里插入图片描述