Mysql金融版成员管理

举报
GaussDB数据库 发表于 2019/04/15 14:29:31 2019/04/15
【摘要】 简介 日前,华为云数据库推出MySQL金融版,基于Paxos协议,采用一主两备三节点架构,解决数据库分布式环境下数据一致性的问题,实现了自动脑裂保护机制,保证数据库高可用和高可靠,满足金融场景下的数据库高要求。 一主两备的三节点架构,是华为云MySQL金融版一大亮点。在该方案中,用户提交事务时,需要等待至少一个备库收到日志副本,才返回给用户事务成功结束的信号,且收到的确认事务...

  简介

日前,华为云数据库推出MySQL金融版,基于Paxos协议,采用一主两备三节点架构,解决数据库分布式环境下数据一致性的问题,实现了自动脑裂保护机制,保证数据库高可用和高可靠,满足金融场景下的数据库高要求。

一主两备的三节点架构,是华为云MySQL金融版一大亮点。在该方案中,用户提交事务时,需要等待至少一个备库收到日志副本,才返回给用户事务成功结束的信号,且收到的确认事务会自动持久化到多数派主机中,确保数据库的可靠性。此外,在该架构下,无论任意一台服务器挂掉,也不影响业务可用性,因为已提交的数据至少有2份副本,挂掉一台,还有至少1台是包含了已提交事务的持久化内容。

 3.jpg

Mysql金融版主要是通过Group Replication的开源插件来构建一主两备集群的,该插件由Mysql官方提供,其主要逻辑可以分为两部分:事务的处理逻辑和成员的管理逻辑;金融版的成员管理模块让Mysql具备了自动主从切换和故障恢复的能力,它能自动发现主节点crash,通过选主产生新的主节点对外提供服务。同时,旧的primary节点重启后,执行start group_replication即可将crash节点重新加入到Group中,在运维便利性和系统健壮性上有很大提升。本文主要分析Mysql金融版成员管理的主要逻辑。

基本原理

金融版的成员管理模块主要分为两大部分:成员状态管理,成员故障恢复;其中,成员状态管理通过对组视图的管理来实现,故障恢复是指成员加入组,完成视图切换后,将自己缺失的数据从其他成员上复制过来,从而达到金融版成员的一致性。

2.1 成员状态管理

2.1.1  

Group Replication插件引入组(Group)的概念,上面提到的被Group Replication插件连接在一起的Mysql服务器为一个GroupGroup内的成员分为主节点和备节点;Group的创建是在第一个成员启动的时候,组内各个Mysql节点均可以主动或被动的加入、离开Group,这就造成了Group成员状态的切换,Mysql成员管理即是在这种情况下起作用,保证金融版数据不丢失、高可靠。

2.1.2 组视图

组视图(View)是指Group在一段时间内的成员状态,如果在这段时间内没有成员变化,也就是说没有成员加入或退出,则这段连续的时间为一个视图,如果发生了成员加入或退出变化,则视图也就发生了变化,Mysql金融版使用视图IDView ID)来跟踪视图的变化并区分视图的先后时间。

4.png


举例:

  1. Group当前的视图ViewID12345:2,该视图中包括2个成员,分别为DB1DB2

  2. 一段时间后DB3节点请求加入Group,成功加入后视图切换为12345:3,包括3个成员,分别为DB1DB2DB3

  3. 之后DB2节点crash而退出了Group,视图切换为12345:4

  4. 之后DB4加入Group,视图切换为12345:5

从上面的例子可以看出,viewID分为两部分:

  • 前缀部分: Group初始化时产生,随机数,Group存活期间该值不会发生变化。所以,该字段可用于区分2个视图是否为同一个Group的不同时间点;

  • 序号部分:Group初始化时,第一个视图的序号从1开始,其成员只有1个,为进行初始化的节点。以后Group出现任何成员的加入或退出序号都需要增1

    Group Replication插件启动后,也可以在performance_schema.replication_group_member_stats中查询到当前系统的ViewID

5.png

2.1.3组视图切换

首先,以一个节点如何加入到Group为例:

 6.png


1. 节点请求加入Group时,首先会根据配置的group_replication_group_seeds参数跟Group的种子成员建立TCP连接 Gcs_xcom_control::do_join())。该种子成员会根据自己的group_replication_ip_whitelistip白名单)检查是否允许新节点加入,金融版默认不限制新节点的ip。连接建立后,新节点发送请求申请加入组;

2. 收到请求后,leader广播视图变化的消息给Group中的所有节点,包括申请加入的节点;

3. 各个成员收到消息后开始做视图切换。首先,每个成员都会广播一个状态交换消息出去,每个状态交换消息包含了节点的当前状态和信息;

4. 发送了交换消息后,各个节点开始接收其他节点广播的消息,将其中的节点信息更新到本节点所维护的成员列表中;当收到所有成员中的最后一个状态交换消息时,通信模块将完整的新视图以视图数据包(View_change_log_event,包含冲突检测数据库)的形式返回给全局事务认证模块进行处理,视图切换至此结束;

这里,视图数据包会和事务数据一起走paxos协议,进入全局事务认证模块;事务认证模块会对每个事务数据包创建一个View_change_log_eventVCLE),写入Relay log,然后由group_replication_applier读取relay log中的VCLE,写入binlog;这样,VCLEBinlog文件中的事务划分为多个区间,每个区间都代表一个视图内的事务;恢复阶段会用到VCLE


 

  2.2 恢复


视图切换完成后,成员就正式加入到组内了,此时,它可以收到当前视图任何事务的数据包,但切换完成前是收不到的;因此,在成员加入组后,不能立即对外提供服务,需将自己缺失的数据从其他成员上复制过来,这就是恢复(Recovery);在视图切换完成后,新成员会立即将自己的状态设置为recovering,表示正在恢复;

恢复过程分为三个阶段:本地恢复、全局恢复、缓存事务执行;

Mysql金融版所涉及的数据复制及其通道(channel):

  • group_replication_applier:金融版正常运行时,节点间通过Paxos协议传输事务数据,异地事务经过认证后写入relay log中,由该通道进行relaylog回放;

  • group_replication_recovery:当有节点加入Group时,需要用到该通道,它是一个传统的Master-Slave异步复制通道。


    2.2.1本地恢复

     

    首先进行故障恢复初始化,包括故障恢复线程初始化,Group成员信息初始化等;

若待加入的成员是曾经加入过的节点,之前的Relay log可能还有一些未回放,需要先将这部分Relay log回放掉。

引入本地恢复的优点:提高恢复性能,无需在拉取这部分Binlog;提高恢复过程健壮性,减小所需Binlogpurge的风险。

本地恢复完成后,开始全局恢复。


2.2.2全局恢复

全局恢复是通过group_replication_recovery通道进行;金融版会随机选择一个online成员作为donor,然后进行复制通道配置,启动复制,复制时是基于GTID复制;

            恢复线程随机选择一个在线节点(donor),调用rpl_slave.cc中的request_dump函数建立与donor的复制关系,请求数据,该函数携带了恢复节点的gtid_executed信息。donor端会逆序遍历其Binlog文件,找到第一个不属于gtid_executed的事务,开始进行数据复制。

当碰到vcleviewID等于当前viewID时,recovery通道会将vcle中携带的冲突检测数据库写入本节点,然后停止运行;

7.png

2.2.3 缓存事务执行

唤醒在被阻塞的认证队列处理线程,处理视图切换过程中缓存的事务,让本节点逐步跟上Group中的其他节点,进而将其设置为online

 

这里,应该在什么时候允许节点online呢?金融版引入参数group_replication_recovery_complete_at进行控制,可选TRANSACTIONS_CERTIFIEDTRANSACTIONS_APPLIED(默认),分别表示认证队列为空或回放完所有已认证的事务时。在达到了group_replication_recovery_complete_at所确定的条件后,发送Recovery_message::RECOVERY_END_MESSAGE消息,通知Group中的各个节点,将该节点设置为在线状态。


2.2.4 手动恢复


需要手动恢复的场景:

  • 待加入的节点加入时,滞后太久,其他节点的需要的binlog可能被purge了,这时,无法自动进行恢复;

  • 当需要复制的binlog的非常多,使用异步复制效率低,需要花费很长时间;

手动恢复的方式:先利用备份数据,将待加入的节点恢复到一个比较近的时间节点,然后再加入Group


 

  总结


本文主要介绍了,金融版的成员管理模块中的两大部分:成员状态管理,成员故障恢复;其中,成员状态管理介绍了组视图相关的概念及其实现,故障恢复介绍了成员加入组,完成视图切换后,恢复的几个主要阶段,包括本地恢复、全局恢复、缓存事务执行。正因为这样的机制,金融版具有高可用和高可靠的特点,且大大减少了传统主备架构下,主从切换的时间和成本。


 

 

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。