mysql(四)基于GDIT的半同步

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/wzj_110/article/details/96020720

一    问题引入

        MySQL默认的复制即是异步的,主库在执行完客户端提交的事务后会立即将结果返还给客户端,并不关心从库是否已经接收并处理。这样就会有一个问题如果crash(挂了)掉了,此时主上已经提交的事务可能并没有传到从上,如果此时强行将从提升为主,可能导致新主上数据不完整

       他是介于异步复制全同步复制之间的,主库在执行完客户端提交的事务后不是立刻返回给客户端,而是等待至少一个从库接收到并写到relay log中才返回给客户端。相对于异步复制,半同步复制提高了数据的安全性,同时它也造成了一定程度的延迟,这个延迟最少是一个TCP/IP往返的时间。所以半同步复制最好在低延时的网络中使用。在5.7版本后新增ack线程(单线程工作)用于接受应答,分摊dump线程的压力
 

       半同步复制就是为了解决数据丢失的问题

二  半同步复制的特点

  • 5.5集成到mysql,以插件的形式存在,需要单独安装
  • 确保事务提交后binlog至少传输到一个从库
  • 不保证从库应用完这个事务的binlog
  • 性能有一定的降低,响应时间会更长
  • 网络异常或从库宕机,卡主主库,直到超时或从库恢复

二   部署过程:

(1)主库安装服务插件,并且开启半同步复制

-- master -->mysql1

INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';

SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME LIKE '%semi%';

SET GLOBAL rpl_semi_sync_master_enabled = 1;

补充:mysql.gtid_executed表的更新机制

mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so'; # 安装插件
Query OK, 0 rows affected (0.02 sec)

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

mysql> SET GLOBAL rpl_semi_sync_master_enabled = 1; # 设置全局变量
Query OK, 0 rows affected (0.00 sec)

mysql> show variables like '%semi%';
+-------------------------------------------+------------+
| Variable_name                             | Value      |
+-------------------------------------------+------------+
| rpl_semi_sync_master_enabled              | ON         |
| rpl_semi_sync_master_timeout              | 10000      |# 默认10000毫秒(10秒),生产环境中
| 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               | 0     |
| 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)

(2)在从端也安装插件,开启半同步复制

INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';

SET GLOBAL rpl_semi_sync_slave_enabled = 1;

show variables like '%semi%';  -- 查看一下

STOP SLAVE IO_THREAD;

START SLAVE IO_THREAD;

注意:要重启从上的IO线程,如果没有重启,则默认还是异步复制,重启后,slave会在master上注册为半同步复制的slave角色

测试 半同步失败的情况

1)先测试一个没有通过半同步复制的

STOP SLAVE IO_THREAD -->把从的I/O线程关闭了!

-- 类似于:关闭网络!

2)在主端表中插入数据,会等待10秒中,10s后会变为异步复制

insert into wzj.usertb values ('user3','789');
Query OK, 1 row affected (10.01 sec)

从库的结果

mysql> select * from wzj.usertb;
+----------+----------+
| username | password |
+----------+----------+
| user1    | 123      |
| user2    | 456      |
+----------+----------+
3 rows in set (0.00 sec)

说明:此时会变成异步,后续再插入数据就没有延时

此时在主端发现半同步失败次数+1
(1)Rpl_semi_sync_master_no_tx
表示没有成功接收slave提交的次数,也就是使用半同步失败的次数,10s后没有得到反馈信息,会转为异步复制
(2)Rpl_semi_sync_master_yes_tx
使用半同步成功的次数,数据的一致性能提高

mysql> show status like '%rpl%';
+--------------------------------------------+-------+
| 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             | 0     |
| Rpl_semi_sync_master_no_times              | 1     |
| Rpl_semi_sync_master_no_tx                 | 2     |
| Rpl_semi_sync_master_status                | OFF   |
| 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)

半同步:保证业务上线正常运行

解决:半夜,峰值不是太高的时候,手动同步!

测试2:半同步正常情况

 

 

展开阅读全文

没有更多推荐了,返回首页