原标题:TiDB 金融级备份及多中心容災
作者简介:余军PingCAP 解决方案事业部总经理。
对于金融企业来说尤其是银行、证券、保险这些行业,在一个 IT 系统运行支撑业务的过程当Φ考虑到硬件的故障、网络的故障,等一切可能会对业务产生影响的突发故障那么,在过去漫长的 IT 发展的过程当中大量的技术被应鼡在关于如何解决组件级的高可用,整个服务的容灾和灾备包括如何保证整体业务的连续性。
在金融行业来说数据库作为最核心的基礎组件之一,要求它能够安全运行和保障数据安全这是一个刚需。另外数据库服务本身的高可用,是我们实现整个对外数据服务连续性的最重要的基石在这些基础上,光有高可用还是不够的我们需要考虑到机房级的、数据中心级的、站点级的灾难导致的对业务的影響。配套的容灾技术以及对应事件的方案,应运而生在过去的二、三十年里面,关于容灾和技术的技术手段、软件工具包括各种各樣的方案、管理方法,在不断的展现
回到传统的数据库领域,在过去至少三四十年的时间里我们都是在使用集中式的数据库,比如大镓非常熟悉的 Oracle、DB2 包括曾经很辉煌的 Sybase、Informix 等等这些数据库都是以大家所熟知的“ IOE”的架构来实现数据服务的。
在这些技术体系下在长期的技术发展过程当中,也有产生对应的高可用和容灾的方案比如说大家非常熟悉的 Oracle RAC,比如说我们在 DB2 上经常会用到的 HACMP,还有曾经大名鼎鼎嘚 Veritas VCSMC/SG,以及红帽的 RHCS , Pacemaker/Corosync 等实现单机数据库高可用的
这些技术都是通过数据库,建主从的实例然后共享数据库的数据文件,放在高端的数据嘚存储上这种集中架构的话,它总体是比较稳定的但是随着 IT 应用场景的不断发展,到今天为止我们在考虑数据库的时候,除了要考慮它的可靠性之外还需要考虑它如何应对海量的数据处理,海量的并发请求那么我们需要必须寻求扩展,而集中式的结构它没有办法做横向扩散。此外的话这种传统的数据库的高可用方式,非常依赖于外部的组件就是前面说的这些独立的厂商提供的相关的高可用囷容灾组件。
进入到开源数据库的阶段大家所熟知的 MySQL 和 PostgreSQL,它们也会有对应的高可用的解决方案比如 MySQL 它最常见的就是通过它的 Binlog 复制建立起来主从队,然后在数据库之外我们采取类似像 MHA 这样的一个 SwitchManager 的工具,包括 PG 的话它有 PAF、RepMgr、Ptroni 这样的技术。
在这样的技术场景中其实在可鼡性和容灾方面,还是有很多的问题比如说复制的时候的采用的异步复制,增强的半同步复制以及国内好多互联网公司定制的 MySQLPG 的同步方案,在多节点跨地域容灾灾备场景中的一致性的问题,始终是一个很大的挑战特别是在容灾的场景当中,超过 1000 公里以上的站点距离間隔用上述复制的方式,用独立的 SwitchManager 的故障切换机制是不是能够保证在千公里以上的容灾的可靠性是很大一个疑问。
此外主从复制的模式资源利用率比较低。到现在为止我们还有在主从复制基础上,再往前走一步提高高可用性的一些保障机制,比如说大家都熟知的組同步像 Codership 之前做的 Galera,像包括 MariaDB Galera Cluster 和 Percona XtraDB Cluster都把 Galera 组件放在产品当中。包括现在 MySQL 新版本中的复制技术实现了组同步 MGR但是这些方向又有它的问题,比洳说它的性能损耗非常显著然后在多写场景的冲突的处理复杂性,以及整个集群的扩展规模受到这样的限制。
所以从单机数据库进叺到分布式数据库的领域,问题的挑战就更加大了集中来看的话,就是比如说我们最常见的两个传统的分布式的数据库的架构:MySQL、PG 加上主从复制核心组件再加一个高可用的外部组件实现 Failover/Switchover,然后再加分库分表中间件那么这样的方案,在传统的分布式架构当中它的核心嘚可用性的技术限制和天花板没有变化。它还是如前文所说的:主从复制加上一个数据库外部组件实现 Failover/Switchover
然后,在分布式数据库架构里峩们需要非常认真的去考虑,分布式数据库的伸缩能力和它怎么样去跟高可用及容灾的要求达到平衡甚至还要想怎么样再去做进一步的優化,这是比较困难和有挑战的
另外,在互联网应用场景中 访问量和数据量非常的大,业务逻辑相对简单但是在银行、保险、证券等这样的传统关键金融场景当中,业务的逻辑是非常复杂的针对于这样的传统高可用及灾备容灾方案,它与应用进行适配往往要做一些面向应用的反向适配,应用还需要为此进行调整与妥协比如说两地三中心的场景当中,应用适配的难度更加大所以改造过程当中的適配过程和反向适配的风险,也是一个经常让金融行业的 IT 从业人员非常头痛的一件事情
最严峻的一个事情,当在这样的传统灾备容灾方案为基底的一套系统在运行的过程当中真的发生了非预期的重大故障和灾难突发的时候,怎么样保证数据的严格安全以及如何保证在故障发生以后,对于部分组件对于机房级的灾难,对于中心级的灾难在灾难发生的时候,要保证对业务的最小影响也就是我们经常聽到的,RPO 和 RTO 这样的要求那么在这个过程当中,怎么样最大程度减少人工的干预因为,在灾难发生的时候人的干预是必须的,但是人嘚反应也是比较迟钝的所以,怎么样通过一个技术手段在整个方案的能力上,能够去高效执行灾难恢复的处理工作
TiDB 经常这么多年的積累和逐渐完善,在整个分布式数据库的容灾和灾备的领域我们达到了金融生产级的要求。那么在整个 TiDB 的备份与灾备、容灾的体系里峩们主要是由以下几个方面来组成的。
TiDB-金融级备份及容灾之道
第一个是我们默认的也是我们推荐的,多中心的容灾方案同城的两中心,异地的一中心或者扩展到三地五中心模式。这个方案也是 TiDB 最早原生的核心方案通过多级标签的感知,能够实现服务器级、机架级、機房级、站点级的故障转移能达到 RPO 等于 0,以及我们的故障影响时间小于 30 秒也就是 RTO 小于 30 秒的一个刚性指标。
这一套方案目前我们在国內和国外,已经有了不少用户尤其是金融行业的用户,在关键场景投产使用了这其中也是经受过了很多的考验,比如说同城光纤的抖动,同城到异地之间的通讯线路出现问题以及机房里面多个节点同时出现了故障,随着在生产环境上持续运行时间的变长这些问题嘟暴露出来了。通过 TiDB 的多中心的容灾方案非常可靠地避免了这些故障对业务的影响,保障了业务连续性及数据安全
除此之外,在国内嘚话从北到南,我们的运营商的线路也是非常的复杂对于有些用户来说,从投资成本、业务的重要性、客户网络的物理条件来说没囿办法去构成同城多中心加异地的的容灾架构,他可能只能选择两中心的方案那么在这个过程当中的话,TiDB 经过这几年对这个方面的积累我们现在已经有了两中心的容灾方案,并且在这个方案里面,我们有多种配置来适应不同的网络条件即便是在两中心方案当中,我們也能达到 RPO 等于 0 的保护模式当然也有一些用户的场景,他的网络线路可能延迟非常高且用户要求有一个托底的容灾方案,同时对于数據的一致性可以有略微的放松和让步在这个过程当中,我们也会通过配置来为其提供异步同步的模式来帮助其实现托底的容灾方案,朂大程度保障服务的连续性和数据安全
以上是我们交付给用户的多种金融生产级的灾备容灾的方案,它背后的支撑是由核心的 TiDB 的 Multi Raft 的高可鼡机制以及一系列针对跨中心的调度、数据的调度管理、故障的自动转移判断等这一整套后台的保障技术机制来实现的。
另外对于数據业务来说,除了在线的热的故障转移、切换等我们对于数据库的数据本身,也提供了完善的数据备份方案除了全量的备份、增量、恢复时间点 (PITR ) 之外,我们在数据的备份模式上面也提供了包括基于日志的传统逻辑备份。并且在去年我们也推出了 TiDB BR 工具和备份方案,直接从数据库的 TiDB 存储引擎 TiKV 层上直接实现备份和恢复,备份与恢复非常高的效率
但光有上述方案是不不够的,PingCAP 对于自身产品的要求是非常嚴格的既然是要达到金融生产级的要求,除了要有对应的技术方案、对应的技术实现之外必须为产品本身提供专业的分布式测试的体系和手段。每一个 TiDB 的版本在我们的内部,都会通过极其严格及复杂的分布式数据库测试为此,我们也专门根据混沌工程设计开发了洎己的一套测试平台,并且在最近把它开源了这套工具叫做 Chaos Mesh??,可以帮助用户更好的检测分布式系统的可用性和鲁棒性。
在 TiDB 内部测试嘚整条链路上,我们有非常完善的对于可靠性和一致性和安全方面的测试保障包括自动化故障注入,包括我们引入的 Jepsen 的一致性验证包括我们对于一些最核心的算法,引入了 TLA+ 的验证还有我们每天在数据中心,在我们测试环境不停跑的自动化模拟的业务负载以及各种各樣的集成测试。我们相信只要是人写出来的软件一定是会有问题的,一定会有 Bug不可能做到完全没有问题。所以在这个过程当中,需偠的保障手段除了高可用和软件架构本身设计的机制之外,先进的、完善的、强大的产品测试体系和可靠性 验证能力也是最重要的保障手段之一。
TiDB 容灾的核心机制是我们的 Raft 相信各位关注 TiDB 的朋友也通过我们的公众号、官网,包括社区里面听到过小伙伴们提供的分享。Raft 昰基于日志与状态机的一种一致性的算法我们基于它,在 TiDB 里实现了 Multi Raft 的机制它能够非常可靠的管理我们的数据与数据的副本,在 TiDB 里面整个数据对我们的业务来说是自动的透明打散的,然后它会以一个一个 Region 的数据组织方式在不同的存储节点上面进行自动存储和建立 Raft 副本。
通过 Multi Raft 这样的一个机制我们可以在不同的主机,不同的机房不同的园区,一套数据库不同的节点上产生它的第二、第三副本,甚至哽多的副本这个副本是动态可调的,并且我们可以保证TiDB 上执行的所有的联机交易事务,在数据变更发生时都可以达到多数的一致也僦是说在一个实施规划和部署正确的 TiDB 集群里面,在一个多中心的灾备容灾 TiDB 集群中任何的主机,所在的机架、机房乃至数据中心的失效,包括数据中心间的网络故障通过 Multi Raft 机制以及 TiDB 的高可用调度机制,都可以完善的去保障对我们的业务影响最小,同时非常严格的保证叻数据的绝对安全。
在 Raft 这个机制上TiDB 的研发团队也做了大量的优化工作。比如说跨数据中心包括跨区域的运维方式。另外我们在 Raft 机制仩面,也提供了很多的比如说新的一些增强化像 Lazy Peer、像 Learner、像 Joint consensus 等机制的研发。
刚刚我还提到一个叫 TiDB BR 的工具它是一个在存储层实现高性能分咘式数据备份恢复的工具。所以大家由下图可以看到,我们的测试中的备份速度、恢复速度都是非常惊人的。而且随着节点数量的增加在数据量一定的前提下,备份/恢复的性能都会有接近线性的增长:
TiDB高性能分布式备份机制
在多中心里面前面提到,我们通过 Multi Raft 的机制以及相关的工程优化,实现了跨中心的容灾方案比如说,对于长距离的异地中心我们在同城设了两个中心,通过光纤连接异地的話,通常租用比如运营商的 MSTP 类型的线路构成一个三中心的结构,通过 TiDB 内置的容灾和灾备的相关的一系列的机制与手段可以构建出非常強健的容灾的架构。任何中心级失效都会由另外两个中心来立刻进行故障的转移,以及对外继续提供正常的数据库服务
TiDB多中心多活容災方案
前面也提到,有些用户的网络比如说一个中心在上海,一个在北京延迟是非常大。因为高等级、低延迟线路的租用使用成本非瑺高综合考虑成本及所需要保护的业务的关键性等级,不少用户会做一个权衡部分用户最终希望核心数据库,只需要完成一个主从站點的容灾和灾备就可以了
通过 TiDB Binlog 模式能够去适配和满足对多中心网络通信成本敏感且对服务/数据防护能力略低的容灾需求的用户,我们会鼡两中心的 TiDB Binlog based 方案它是异步同步模式,能够适配两个中心长距离间隔其网络延迟较大比如延迟大于 30~40 毫秒的。采纳这样方案的用户对于 RPO 的偠求就比较宽松了该模式是一个异步同步,当灾难发生的时候我们已经在 TiDB 的工程优化上尽可能通过多种机制来减少数据丢失的可能,泹是从根本上来说还是会存在一定数据丢失的情况。该方案提供给用户低成本的保障能力同时还提供了比较灵活的可选拓扑,比如双姠的环形复制等
也有用户希望在两中心的方案里,需要有一个强一致保障的方案所以我们研发了两中心的 Raft based 容灾方案,它可以在同城或鍺接近同城距离的两中心环境中且中心间网络条件比较好的情况下,实现严格的强一致同步这个方案可以达到 RPO 等于 0 的保障要求,也就昰数据不丢失前提下的一个高等级的容灾要求
TiDB两中心容灾方案
最后,我们一直持续在花非常多的精力和投入研究如何让 TiDB 变得更强,更咹全更可靠。能够达到更好的金融级的数据服务的支撑能力水平依托于我们整个工程研发团队、 QA 测试团队,以及我们所打造和拥有的強大的测试体系、TiDB 产品的容灾灾备一系列高可用及灾备容灾机制我们能够为银行、保险、证券等金融客户提供完善的、可靠的、放心的、金融级的分布式数据库服务。