支持MySQL半同步复制的virtual_slave组件

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sun_ashe/article/details/84386563

一、简介

在设计高可用架构时,为了保证主从故障切换时的数据一致性,有各种处理方式。在5.5/5.6的单机房数据库架构中,我们采取了共享存储的方式,来保证master服务器宕机后,slave即便有延迟,也可以从存储中拿到自己缺失的binlog文件,来进行数据补偿,这种做法在当时已经算是比较完善的了。但还是存在一些问题,比如说,存储莫名的不可写入问题,由于对他的内部实现并不是十分了解,相当于一个黑盒,我们开始寻求新的解决方案。

在master 宕机后,slave对可用区域A进行抢占,读取binlog。
image_1csv5st7m15prl6e1rgu1ol526m16.png-39.9kB

二、新的技术架构

MySQL-5.7半同步复制功能的完善让我们找到了新的架构实施方案。插一句为什么之前的after_commit模式不行呢?不行在哪里?after_commit的半同步复制在事务完全提交之后,返回给客户端之前进行ack的等待,其实此时其他客户端已经可以看到提交的数据,如果此时master故障,发生切换行为,slave很有可能丢失这部分数据。

为什么after_sync可以呢?after_sync模式下,是在事务提交的binlog落盘之后进行ack的等待,此时存储引擎层并没有提交,其他客户端亦看不到此部分的数据,虽然binlog已经落盘,redo已经落盘。此时master发生故障,slave有可能丢失这部分数据,但是这部分数据在客户端看来是未提交成功的。所以可以进行切换。但是考虑到一主一从半同步复制架构中,如果出现slave宕机,或者master-slave之间的网络抖动,则会出现事务无法提交的情况,影响master性能,所以引入了virtual_slave组件。如下
image_1csvdt02411001gbrbsoe4bmmi9.png-17.6kB
virtual_slave组件增强了整个集群性能和服务的持续性,不会因为单方面的网络或其他原因导致master不可写入。

三、virtual_slave

virtual_slave使用原生主从半同步复制协议,进行binlog同步与返回ack的动作,其只是作为MyKeeper的一个组件,可以单独使用,也可以配合Mykeeper来一起使用。我会在另外的文章中介绍MyKeeper,它是一个负责管理MySQL服务的高可用组件集合。

virtual_slave的开发灵感来源于mysqlbinlog的远程日志同步功能,进而对这一过程进行了模仿,并且加入了半同步复制的特性,使其可以替代一个slave节点进行工作。并且这种处理速度要快于slave节点返回ack的速度。随后带来的就是主库更快的性能。

virtual_slave可以单独进行使用。

单独使用方式如下:

  • 配置文件 virtual_slave.cnf
#replication protocol GTID or file+pos
opt_remote_proto=1

#mode for get start pos.
get_start_gtid_mode=1

exclude_gtids=cdfe45e6-c227-11e8-abf5-001c42bf9720:1-4

virtual_slave_server_id=123456

raw_mode=1

master_host=10.211.55.32

master_port=13307

master_user=ashe

master_password=ashe

binlog_dir=/data/binlog_backup/

heartbeat_period = 15
  • 启动
nohup ./virtual_slave ./virtual_slave.cnf &
  • 查看同步的binlog
-rw-r-----  1 ashe  wheel   911 11 23 13:06 mysql-bin.000005
-rw-r-----  1 ashe  wheel   241 11 23 13:06 mysql-bin.000006
-rw-r-----  1 ashe  wheel  1584 11 23 13:06 mysql-bin.000007
-rw-r-----  1 ashe  wheel   440 11 23 13:06 mysql-bin.000008
-rw-r-----  1 ashe  wheel  1584 11 23 13:06 mysql-bin.000009
-rw-r-----  1 ashe  wheel  3209 11 23 13:06 mysql-bin.000010
-rw-r-----  1 ashe  wheel   123 11 23 13:06 mysql-bin.000011
ashe@macos /data/binlog_backup $
  • master 上查看virtual_slave 信息
mysql> show processlist;
+----+------+-------------------+------+------------------+------+---------------------------------------------------------------+------------------+
| Id | User | Host              | db   | Command          | Time | State                                                         | Info             |
+----+------+-------------------+------+------------------+------+---------------------------------------------------------------+------------------+
| 51 | ashe | 10.211.55.2:51855 | NULL | Binlog Dump GTID | 1370 | Master has sent all binlog to slave; waiting for more updates | NULL             |
| 52 | root | localhost         | NULL | Query            |    0 | starting                                                      | show processlist |
+----+------+-------------------+------+------------------+------+---------------------------------------------------------------+------------------+
2 rows in set (0.00 sec)

mysql> show slave hosts;
+-----------+-----------+------+-----------+--------------------------------------+
| Server_id | Host      | Port | Master_id | Slave_UUID                           |
+-----------+-----------+------+-----------+--------------------------------------+
|    123456 | 127.0.0.1 | 3239 |  12713307 | 63cf7450-9829-11e7-8a58-000c2985ca33 |
+-----------+-----------+------+-----------+--------------------------------------+
1 row in set (0.01 sec)

目前组件的功能并不是十分完善,代码暂时不公布了,持续完善中。比如说自动清理binglog策略,自动寻找同步位点的策略,数据补偿策略等。

欢迎加入MySQL内核交流群 群号:860945825 ,互相学习交流。

猜你喜欢

转载自blog.csdn.net/sun_ashe/article/details/84386563