如何通过技术实现更好的业务可靠性保障?在特殊情况下如何实现业务、数据的恢复、容灾和多活?如何在实现多活业务架构中降低系统架构的复杂性及 IT 成本?

本次,青小云从技术角度出发,推出「真正多活,不惧宕机」系列专题文章,为大家解密高可用的企业 IT 架构背后的技术实现,同时也会从一些具体的电商、金融客户案例中,给大家带来一些经验分享,帮助从业者快速掌握自身业务高可用和多地访问、容灾备份等业务场景的具体应对之策。

数据库服务于企业的核心交易业务和实时交互应用,承载着企业的核心数据,因此企业对于数据库的数据一致性和高可用性有强烈的需求。

今天的内容主要集中在金融级数据库如何保证自身的高可用,支撑企业业务稳定运行。

金融级数据库——MySQL Plus

作为 MySQL 的升级版本,QingCloud MySQL Plus 是一款具备金融级强一致性、主从秒级切换,集 InnoDB + TokuDB 双存储引擎支持的增强型 MySQL 集群应用,适用于对数据一致性和高可用性有强烈要求的企业用户。

目前关于 MySQL 集群的方案、架构比较多,常见的方案是存在中心管理节点。而 MySQL Plus 的一个核心特性就是无中心化自主选主,不需要依赖中心节点去管理控制集群中的服务节点。

另外两个特性:一是集群数据强一致性;二是集群主从秒级切换的特性。

MySQL Plus 核心架构

多主数据库架构是什么 数据库多活架构_MySQL

MySQL Plus 是基于 Raft 构建的 MySQL 中自动选主及维护主从的套件,上图是 MySQL Plus 的核心架构,一个典型的 3 节点集群。之所以这样配置是因为: Raft 协议的机制要求集群节点数是奇数个,例如 3 个节点、5 个节点和 7 个节点。

图中圆圈节点是 Xenon 进程,可以认为它是一个 Agent。在其下面为 MySQL 服务,一个主机节点上会有一个 Xenon,它会管理 MySQL 服务。每个节点上有一个 Agent 和 MySQL 服务,Agent 之间通过 Raft 机制来为集群选主。

通过 MySQL 本身的 Semi-Sync 实现数据同步,在数据一致性层面完全由 MySQL 本身的同步机制实现。Raft 主要用于选主,每一个 Xenon 进程会探测 MySQL 服务是否正常,集群中 Leader 节点会定期向 Follower 节点发送心跳,Follower 节点接收 Leader 节点心跳超时后会发起新的选举。

以上就是 MySQL Plus 的一个整体架构。

MySQL Plus 实现原理

多主数据库架构是什么 数据库多活架构_MySQL无中心化集群_02

Raft 主要有两个功能:一是选主,二是数据同步。

MySQL Plus 只用 Raft 的选主功能,数据同步是基于GTID + Binlog方式,多数派确认通过 Semi-Sync 机制。

下面详细和大家介绍基于 Raft 选主和 Leader 自动降级机制,以及关于 Semi-Sync 的一些配置。

Raft 选主机制

多主数据库架构是什么 数据库多活架构_MySQL无中心化集群_03

如上图所示,MySQL Plus 集群节点的三种状态:一是 Leader,二是 Follower,三是 Candidate。

Leader 会定期给 Follower 发心跳,以确定这个节点的状态。Follower 节点会定期接收 Leader 的心跳,当 Follower 无法接收到 Leader 的心跳,它将会变为 Candidate 角色,并发起选举操作。

Leader 定期给 Follower 发送心跳,如果 Follower 无法接收 Leader 发送的心跳,它会把自己的状态变成 Candidate,然后向所有的节点发起选举请求,如果它能获得多数(n/2 + 1,n 为集群节点数,比如 3 节点集群至少需要获得两票赞成票)节点投的赞成票就会提升为 Leader。

Raft 选主规则

多主数据库架构是什么 数据库多活架构_MySQL_04

集群选主机制,主要基于 Raft,跟 MySQL 相关的是选主投票时,如何决定投赞成票,这与 MySQL 相关,通过比较 binlog 位点决定是否给候选人投赞成票。

集群初始节点状态都是 Follower ,所有 Follower 节点定期接收 Leader 心跳,如果在超时后没有接收到 Leader 心跳,就会发起选举。接收到选举请求节点会通过比较 MySQL binlog位点来决定是否投赞成票。

发起选举的节点如果获得多数票,就会成为 Leader,如果没有获得多数选票,则会把自己的状态降级为Follower。

多主数据库架构是什么 数据库多活架构_数据同步_05

左图是上面介绍的集群选举的一个过程。集群初始化起来后,这三个节点是 Follower 的状态。其中有一个节点 Timeout,等待接收 Leader 的心跳超时后,它自己会成为 Candidate 状态,会给其他节点发起投票。如果其他节点给它投的赞成票,这个节点就会当选成为 Leader。

右图是选主结束后集群正常的状态。Leader 节点定期给其他节点发送心跳。Follower 节点会从 Leader 节点同步数据。

集群节点不同角色状态时对应的操作

多主数据库架构是什么 数据库多活架构_数据_06

集群中节点成为 Leader 后,需要定期向Follower节点发送心跳,检查、获取集群中所有节点的状态。

对应的 MySQL 服务作为 Master节点,首先要等待 Relay-log 应用完成,其实就是 SQL 线程将 relay日志重放完, 然后 Stop Slave,清理复制配置信息。

下来设置数据库服务可以读写。等完成这一系列操作后,整个集群对外可用,这时候才会启动 VIP,应用就可以连接进来。

多主数据库架构是什么 数据库多活架构_多主数据库架构是什么_07

Leader 降级处理,首先会把 VIP 停掉,保证集群处于不可用时,不会对外提供服务。Leader 会把自己降级为 Follower 角色。

多主数据库架构是什么 数据库多活架构_MySQL无中心化集群_08

Follower 会接收 Leader 心跳,接收到 Leader 心跳后,根据Leader节点信息,配置并启动复制线程,从 Leader 上同步数据。

多主数据库架构是什么 数据库多活架构_数据_09

Candidate 比较简单,发起选举,获得多数票后成为 Leader,获得少数票会降级为 Follower。

Leader 自动降级机制

以上是集群节点不同角色对应的操作处理,下面介绍下 Leader 自动降级机制,基本分为两种情况:第一,网络隔离问题;第二,Leader 故障。

多主数据库架构是什么 数据库多活架构_MySQL_10

网络隔离的故障处理,Leader 节点跟 Follower 节点之间网络不通,这种情况下,Leader 会把自己降级成 Follower。

其他 Follower 节点无法接收 Leader 发送的心跳,会把自己变为 Candidate,然后发起选举。获得多数选票后,把自己升级为 Leader 节点,这时候整个集群可以对外服务。

多主数据库架构是什么 数据库多活架构_多主数据库架构是什么_11

MySQL 服务不可用之后,Leader 会把自己降级成 Follower 角色。降级成 Follower 角色后,整个集群中目前没有 Leader,这两个 Follower 节点接收 Leader 心跳会超时,其中有一个节点会发起选举。

目前集群中剩余的两个 Follower 节点至少有一个节点跟之前 Leader 节点数据完全一致。如果集群中数据同步有延时的节点首先发起选举,会收到完整数据节点投的反对票,发起选举失败会降级为 Follower 角色。

拥有完整数据的节点接收 Leader 心跳 Timeout 后会把自己变成 Candidate,发起选举。这时候数据不完整节点会给它投赞成票,加上自己的一票,获得两票赞成票后会升级为 Leader。变成两个节点后,这两个节点之间目前是完全强一致的同步。如果故障节点恢复加进来后,整个集群中只要有一个节点数据跟主节点保持一致就可以了。

前面谈到 MySQL Plus 其中一个特性就是秒级切换,集群故障后,不需要依靠其他的中心节点,集群内的节点可以快速选出主节点。通过数据库并行复制和相关 I/O 参数的优化,切主后能快速重放完成 Relay 日志对外提供服务,实现集群秒极切换、服务快速响应。

Leader 故障后,大家会想到数据一致性问题。MySQL Plus 是基于 Semi-Sync 机制做的数据同步,比如三个节点,集群中会至少有一个从节点跟主节点数据保持一致。

MySQL Plus 中 Semi-Sync 配置

多主数据库架构是什么 数据库多活架构_数据同步_12

大家对 MySQL 比较了解,也比较熟悉 Semi-Sync 机制。MySQL Plus 集群用的 MySQL 是基于 5.7 版本的,对于 rpl_semi_sync_master_timeout 参数设置比较大,所以不会出现降级的情况,参数 rpl_semi_sync_master_wait_point 默认配置是 AFTER_SYNC,来避免出现幻读的情况。

前面大家看到的是三个节点集群,通过 Semi-Sync 机制,集群中配置的 rpl_semi_sync_master_wait_for_slave_count 是 1,如果是 5 个节点,需要配置成 2,至少要保证集群中有 2 个从节点和 Leader 的节点数据保持一致。

MySQL Plus 自动化运维

多主数据库架构是什么 数据库多活架构_多主数据库架构是什么_13

目前集群数据同步主要依靠 MySQL 自身的复制,MySQL 本身的复制由于一些原因,或多或少会存在不稳定的情况。

MySQL Plus 提供自动化运维的工具,通过这些工具可以获取集群的状态,对集群中故障节点做诊断,对于预期的故障类型,可以快速对故障节点进行自动化重建。

多主数据库架构是什么 数据库多活架构_数据同步_14

获取集群的状态,包括 Leader、Follower 及 SQL 线程的运行情况。获取集群状态后,可以了解到 IO 或者 SQL 线程的状态,针对错误信息来做相应处理。

多主数据库架构是什么 数据库多活架构_MySQL_15

获取集群 GTID ,了解节点 GTID 的变化,可以了解节点数据同步是否存在异常。

例如,通过比较时间段内节点获取到的 GTID 和 已经执行的 GTID 变化,来判断SQL 线程重放是否有 wait 或者 hang 住的异常情况。

多主数据库架构是什么 数据库多活架构_多主数据库架构是什么_16

这是 MySQL Plus 提供快速重建的工具,是基于 Xtrabackup 做的。当集群中有节点故障,需要重建时,可以通过 Rebuildme 工具快速重建,节点快速恢复后会自动再加到集群。重建可以基于 Leader 节点,也可以指定基于某个节点重建,避免对 Leader 节点产生过多的负载影响。

多主数据库架构是什么 数据库多活架构_MySQL_17

多主数据库架构是什么 数据库多活架构_多主数据库架构是什么_18

多主数据库架构是什么 数据库多活架构_数据同步_19

目前青云新用户基本使用的 MySQL Plus,很多老用户也在逐步迁移到 Plus。上面是 QingCloud 云平台上 MySQL Plus 的几个相关监控展示,包括事务提交,查询数量、连接数。还有一些没有列出来的,如慢查询、全表扫描相关等。

总结

◆ ◆ ◆

认识高可用架构,部署实现实现高可用架构,每一家互联网企业可能摸索出数千种探索道路并给出数万种答案,但符合自身企业技术环境发展的答案可能有且只有一种,帮助用户用最快速度安全便捷方式构建高可用系统,是青云QingCloud 一直在努力实现的目标。