数据库容灾技术


数据库容灾技术与数据库的容灾架构紧密相关,在设计数据库容灾技术时,除了要考虑数据库容灾架构还要对数据的备份、恢复、传输等具体操作的实现细节。一套完整的数据库容灾技术既要有采用数据备份保护和恢复数据的功能,也要有保证数据安全、正确、高效传输的功能,同时还要有强大的应激防护能力。

(一)数据备份与恢复

数据备份是以容灾为目的,为防止故障导致的数据丢失,而将全部或者部分数据复制到其他存储介质的过程。备份过的数据往往通过压缩打包保存,提升存储效率。备份数据一般不能直接提供数据库服务,需要一套数据恢复操作流程进行备份逆操作,在现有数据库实例或基于空闲资源搭建新实例,覆盖原有数据,才能再次通过该数据库实例进行访问。所以数据备份也称为数据冷备。

1.数据备份

数据库的备份技术从备份机制可分为物理备份和逻辑备份两种。物理备份是针对数据库的数据文件进行备份的方式。物理备份往往是将数据库的数据文件连同备份时间窗口内的重做日志一同进行备份。备份完成后,备份程序会重新执行重做日志,保持数据文件中数据的一致性。由于物理备份主要备份内容是复制数据库数据文件,能最大程度利用IO,备份效率很高。逻辑备份是针对数据库的数据内容进行备份的方式。

2.数据恢复

全量备份是基于时间点的数据库镜像,而增量备份是将此时间点扩展到持续的时间窗口。通过全量备份和增量备份,数据库可以恢复备份覆盖的时间范围内任意时间点的数据状态。同时数据恢复也可指定恢复目标,将恢复范围限制为部分库表,可大幅降低恢复时间开销。

(二)数据同步与传输

按照监管要求,核心业务系统生产中心的数据库数据能实时同步传输到异地的灾备中心。下面以MySQL数据库场景为例,介绍几种不同的同步传输技术,供数据库容灾架构规划参考。

1.主从复制

MySQL主从复制6是一个异步的复制过程,主库发送更新事件到从库,从库读取更新记录,并执行更新记录,使得从库的内容与主库保持一致。

每一组主从复制的连接,都由三个独立的线程协作实现。在主库上为每一个连接到主库的从库创建一个二进制日志(以下简称“binlog”)输出线程。每一个发送给从库的SQL事件或者数据变更事件,都会基于binlog传输给从库。而每一个从库都会为同步创建一个I/O线程和一个SQL线程。I/O线程连接到主库并请求主库发送binlog事件到从库,读取到的binlog会更新到本地中继日志(以下简称“relay-log”)文件。而SQL线程读取到I/O线程写到relay-log的更新事件后,在数据库中进行执行,从而完成数据从主库到从库的同步。

2.半同步复制

半同步复制是MySQL 5.5版本引入的机制7。半同步复制出现前,虽然异步复制可以满足主从实例之间的数据同步要求,但如果主库崩溃,将从库提升为主库时,原来的主库上可能有一部分已经提交的数据还没有来得及被从库接收,主从不一致将导致切换后的新主库丢失这一部分数据。

半同步复制改进了事务提交的逻辑。客户端在主库上写入一个事务时,需要等待从库接收到主库相关的binlog数据,且主库接收到从库的应答之后,客户端才能收到事务成功提交的消息。

早期的半同步复制存在一些缺陷。主库在等待应答的过程中,存储引擎内部已经提交的事务,只是阻塞返回客户端消息而已,此时如果有其他会话对该会话事务修改数据进行查询会查询到数据。如果此时出现主库故障转移,非发起数据库提交的客户端可能会出现幻读。所以MySQL 5.7版本对半同步进行了优化,称为增强半同步复制。优化后一个事务在存储引擎内部提交之前,必须要先收到从库的应答确认,否则不进行事务的最后提交,从而解决上述提到的幻读问题。

3.组复制

MySQL在5.7版本正式推出组复制(MySQL Group Replication8,以下简称“MGR”)机制。MGR集群由若干个节点共同组成一个复制组,一个事务的提交,必须经过组内大多数节点决议并通过才能得以提交。

引入组复制,主要是为了解决异步主从复制和半同步复制可能产生数据不一致的问题。组复制依靠分布式一致性协议实现了分布式架构下数据的最终一致性,提供了MySQL集群的多主写入方案。

MGR技术与Oracle RAC类似,对集群网络的要求非常高。网络延时和不稳定会严重影响MGR集群的正常工作,所以多用在单数据中心的内网环境中,对于主备和多活容灾架构下异地同步的场景,存在一定的短板。

4.分组强同步

半同步复制机制保障了主库故障切换时事务数据能够在至少一个从库中持久化存储,保证切换过程不丢失最新数据。随着数据库集群规模逐渐增大,同城和异地多机房灾备架构对同步的要求也愈发提高。当跨多机房部署的集群出现大规模故障,例如机房故障或专线故障时,主库和完成接收binlog数据的从库节点可能同时出现故障。因此在半同步的基础上,出现了分组强同步机制。

分组强同步机制能够保证在跨机房的场景下仍然保持高可用和强同步的能力。任何一个集群的从库可以分成若干组,在每一组中,只要有一个从库返回成功,则认为该组复制成功。当所有的组都复制成功,主库的事务才能完成提交。

分组强同步复制算法可以保证已经提交成功事务的数据不丢失,修复了MySQL原生半同步可能丢失数据的隐患,确保在主库发生故障情况下,不会因为二进制日志丢失导致从库丢失数据,进一步提升了数据的可靠性。

5.云数据库数据同步服务

为了与数据库产品配套,云平台供应商和数据库厂商推出数据传输服务(DTS),该服务用于在异构数据库之间进行数据迁移、数据同步和数据订阅。DTS 支持在业务不影响源数据库服务的前提下进行数据库迁移,利用实时同步通道构建异地容灾的高可用数据库架构。DTS 往往支持在主流数据库之间进行结构迁移、全量数据迁移和实时增量数据同步,其迁移同步任务还可按照同步范围并行进行同步。

数据传输服务在异地灾备场景下也被作为异步同步的重要方案。

(三)故障自动切换

当分布式数据库各类节点出现故障时,其监控系统应该能实时感知到故障种类和范围,包括各类节点的进程故障、服务器故障、磁盘故障和网络故障等,都可以依据预案配置,自动进行故障切换。

主备容灾架构下,容灾机房内会建设一套与生产机房相同规模的服务。如果生产中心出现灾难而不可用,数据库管理系统应该能自动将数据库服务切换至灾备中心。在异地容灾架构下,数据库甚至能够抵御地理级灾难,如地震洪水等。该类灾难可能会影响整个城市区域,使得同城机房均不可用,从而将服务切换至异地容灾中心。

1.集中式架构

以SQL Server数据库为例,介绍集中式架构数据库的典型故障切换技术。SQL Server采用SQL Server Always On可用性组来支持对一组分散的数据库实施故障转移。一个可用性组支持一组读写主数据库,以及一至八组对应的辅助数据库(包括一个主副本和最多四个同步提交辅助副本),每个副本承载一组辅助数据库,同时也是可用性组的潜在故障转移目标。发生故障转移时,数据库通过一组独立的服务器故障转移群集服务,将实例的资源所有权转移到指定的故障转移节点。然后SQL Server实例在故障转移节点上重新启动,使数据库恢复如常。无论在任何时刻,故障转移群集中只有一个节点可以承载故障转移群集实例和基础资源。

Always On可用性组主副本将每个主数据库的事务日志记录发送到每个辅助数据库,每个次要副本则缓存事务日志记录,然后将日志记录应用到相应的辅助数据库。主数据库与每个连接的辅助数据库独立进行数据同步。因此一个辅助数据库可以挂起或失败,但不会影响其他辅助数据库,一个主数据库也可以挂起或失败,也不会影响其他主数据库。

2.分布式架构

分布式数据库架构由于进程、磁盘和服务器等故障,往往导致集群的少量节点实例不可用,应对措施主要是通过冗余和副本节点进行替换止损,替换过程中可能出现主备切换或主从切换;对于交换机、路由器等网络设备发生故障,除了导致部分节点实例不可用外,还可能出现集群分裂情况,因此分布式数据库需要建立应付各种类型和规模故障的容灾能力。

(1)计算节点故障切换

当其中一个计算节点出现故障,流量以秒级切换至其他计算节点。整个切换过程对用户透明,应用代码无需变更,应用进程无需重启。

计算节点自愈分为故障感知和故障处理两部分。故障感知是指通过节点代理的定时任务定期执行自愈监控项采集任务,对计算节点的监控指标进行采集,并上报至服务自愈模块,该模块对节点的监控数据进行分析,对可能的故障信息进行定位和二次检测,若确定为故障则发起故障处理任务。故障处理是指服务自愈模块检测到故障节点,任务调度模块创建自愈任务,自动对故障节点进行恢复处理,处理完成后故障节点重新上线恢复正常服务。

(2)存储节点故障切换

分布式数据库采用多副本保存数据,存储节点通过多副本方式构成集群。最常见的集群模式是主从集群,即一个主节点负责写入,并基于一定的一致性算法同步至其他从库。当对外提供数据库服务时,主库承担读写服务,从库提供只读服务。当主库节点故障时,系统会自动发现并尝试恢复主库,如果主库无法恢复则发起主从切换。

切换协调模块为切换核心模块,负责存储节点健康诊断、切换仲裁与协调,并变更集群的拓扑信息。如上图所示,数据库实例的三个节点代理构成了切换的协调者。节点代理通过与决策集群通信获取其托管的集群元信息,并借助集群取得集群中其它节点代理的通讯方式。

(四)分布式事务容灾

金融类业务数据模型复杂度较高,往往需要多维度进行数据处理和分析。进行业务系统分布式改造时,分片策略往往无法避免一个事务可能跨越多个数据分片的情况,需要通过分布式事务保证数据的强一致性。为保障分布式事务在跨节点处理时事务的原子性和一致性,一般使用分布式协议处理。常用两阶段提交、三阶段提交协议保障事务的原子性;使用Paxos、Raft等协议同步数据库的事务日志从而保障事务的一致性。支持分布式事务是金融级分布式数据库产品的核心特性,分布式事务的容灾能力是分布式系统容灾能力的重要考量指标。

百度分布式数据库GaiaDB-X采用基于优化的XA协议及两阶段提交算法实现分布式事务机制。其优势有:1)自研DMVCC11算法,解决分布式全局读一致性问题;2)解决MySQL原生XA在事务一致性和持久性上的缺陷;3)在宕机等故障场景下,能够基于持久化的全局事务状态对悬挂事务进行提交或回滚,保证分布式事务的容灾恢复能力;4)支持备份恢复的事务一致性、死锁检测等高级功能。

上图为GaiaDB-X的分布式事务架构,其中分布式事务处理器(Distributed Transaction Manager,以下简称“DTM”)负责SQL路由并管理分布式事务,是业务端访问数据库服务的入口。DTM使用Redis存储多版本的读视图基线并存储数据节点的分布式事务状态信息。

在宕机等故障场景下,全局事务状态持久化在高可用Redis集群中,故障自愈后,新节点能通过Redis恢复悬挂的事务,决定事务应该提交或回滚,保障分布式事务的高可用能力。

当分布式表进行备份和恢复时,如何保证恢复数据的一致性也是考验分布式数据库的难题。GaiaDB-X实现了基于全局事务点的备份恢复机制。

所有分片同时通过备库上定时任务启动备份任务独立进行备份,根据备份结果获取全局事务标识(简称“GTID”),并从主库日志中解析得到备份快照点及对应分片的全局事务信息,与备份数据一同备份。这样基于快照点与全局事务信息的对应关系,即可在备份恢复时保证各分片的全局事务一致性。

(五)应用应激防护

1.过载保护

为了保障数据库服务不受业务系统突发过量压力影响,导致系统稳定性下降,数据库需要提供对请求流量进行控制的功能,保障数据库服务在极端应用负载情况下仍能稳定运行。当监测到连接可用性下降时,会触发进入限流模式,基于实时查询量对主库和从库的访问量进行限制。限制策略有连接数限制、查询量限制和处理时间限制等。

2.SQL入侵防御

SQL入侵防御是对用户发送的SQL进行语法解析,过滤非法SQL的一种安全能力。数据库产品一般通过中间件或基于计算节点集成防火墙功能,对非法SQL进行过滤、阻断和报警,有效的预防SQL注入或恶意非法攻击。对于不同SQL,防火墙采用拦截模式或告警模式进行处理:拦截模式是指当发现非法SQL时,防火墙会自动阻断其执行,并发送报警通知;告警模式是指当发现非法SQL时,防火墙会允许其继续执行,但会发送告警通知。

基于SQL入侵防御技术,数据库可以有效识别和拦截外部的SQL攻击行为,并记录日志,供事后追查。例如各类SQL注入攻击模式,包括脱库、高危SQL等,SQL防火墙都能实现有效拦截。

3.数据回滚

在存储限额范围内,数据库将删除的数据库表移动到数据回收站保存。对于误操作或者需要恢复删除的情况,可以对数据库表进行DROP操作后进行快速“闪回”。数据回收站的数据会自动按照清理策略进行清除,不会影响正常数据库服务。

4.弹性扩容
当分布式数据库的负载不断增加,或出现短期的业务浪涌,可以使用弹性扩容功能对计算节点和存储节点进行扩容,保障数据库服务平稳运行。
(1)计算节点水平扩容

当集群的处理能力不足的时候,分布式数据库支持在线增加计算节点,扩展服务能力。同时,当集群的计算节点资源利用率较低时,支持降低集群规模,减少计算节点数量,降低服务能力,提供服务能力弹性扩展能力。

由于在分布式数据库系统中计算节点往往被设计为无状态,通过新增或减少计算节点数量,并在配置节点中进行相关元数据的更新即可完成计算节点的调整。

(2)存储节点水平扩容

存储节点水平扩展通过增加存储节点线性提升集群整体容量和吞吐性能,分布式数据库的控制台可以发起扩容操作。以百度分布式数据库为例,该操作主要分成四个步骤:1)创建新的存储节点;2)重新分布数据,并保持新节点和原节点数据实时同步;3)变更计算节点拓扑,切换流量到新节点;4)清理原节点上的数据。

在整体扩容过程中,第三步会对业务有秒级的连接闪断(一般应用层具有重连机制),因此分布式数据库往往提供手动触发第三步切换操作,运维人员可选择业务低峰期完成切换。

本文聚焦金融领域的数据库在灾备方面的技术内容。介绍了容灾与备份的定义、分类,分析了金融机构灾备现状、需求与灾备市场情况,梳理了主流数据库容灾备份技术架构、实现方式与部署方案


‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧  END  ‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧

(0)

相关推荐