表格存储如何实现跨区域的容灾

系列文章

表格存储如何实现高可靠和高可用
表格存储如何实现跨区域的容灾

前言

上一篇文章介绍了表格存储如何实现高可靠和高可用,本文会介绍表格存储如何做跨区域的容灾。容灾跟高可用在概念上有一些交叉,但是场景和相关技术体系有很多不同,所以单独写一篇介绍容灾的文章。容灾是在集群本身的高可用基础上,再提供一层保障,防止罕见但却严重的故障发生,因此,读者可以先阅读上一篇高可用的文章,对表格存储如何保障高可靠和高可用有一个了解。

本文首先会介绍容灾的一些背景和相关场景,以及实现数据库容灾的两个重要能力,即数据同步和切换。然后介绍表格存储如何实现相应的功能,以及我们如何把相应的功能服务化,让用户能够方便而灵活的搭建容灾场景,给业务提供更高级别的可用性保障,或者是通过异地多活优化不同地域的终端用户的延迟。

表格存储是阿里自研的一款分布式NoSQL数据库,已经在阿里内部服务多年,并积累了很多容灾方面的场景和经验,本文介绍的内容也包含了我们对分布式NoSQL如何做好容灾的一些看法和经验教训等。

容灾实现方式和场景

容灾面向的问题范围与高可用有较大的不同,但是容灾确实也能够提高系统的可用性。容灾一般应对的是罕见但是却严重的故障发生,比如IDC断电/断网、地震、火灾,还有人为导致的大范围软硬件设施不可用等等,这些场景其实是打破了很多高可用设计上的假设。

容灾有两个重要的衡量指标,RTO和RPO。RTO是衡量故障的恢复时间,RPO是衡量故障发生前多久时间的数据会丢失。今天很多业务对可用性要求非常高,对RTO的要求常在一两分钟内,RPO则要尽可能小,一般在秒级,金融等场景常要求RPO为0。有时候RTO和RPO未必能同时满足,要在可用性和数据一致性之间做一些取舍。

实现容灾的思路与实现容错类似,仍然是通过冗余,即多搞一套或几套备用的数据和计算资源,这些备用的数据和计算资源分布在不同的地域,以防止天灾人祸。传统的容灾方式大部分是冷备份,不用多说,这种方式下RPO和RTO都难以满足今天的业务要求,而且不可靠。因此今天的容灾设计都是采用热备份和热切换的模式,这里面又有两种方式:
1. 采用一套分布式系统,把数据的多个副本分散到不同的地域,实现容灾。分布式系统中常会应用paxos等一致性算法维护多个副本的一致性,因此这种方式可以做到RPO为0。当某个机房或者地域发生故障时,如果集群中多数派仍可服务,可自动恢复,相当于一次failover。
2. 采用两套(或多套)独立的系统,在不同的系统之间建立同步,当发生故障时切换到另一套系统。这种模式下两套系统是独立的,只是通过数据同步保障两边拥有基本一致的数据。因为数据同步往往是异步的,所以真实故障情况下,RPO不为0,会有少量数据丢失。这种架构下也有两种访问模式,一种是平时只会访问一个系统,另一个系统是standby的,另一种模式是两套系统各自承担一部分流量,并做双向数据同步,在故障时把一套系统承担的流量切换到另一套系统。简单来说,第一种访问模式是主备,第二种是双活。

利用分布式系统的多副本做容灾

这种方式是指上面讲的方式1, 采用一套分布式系统,通过把多个副本分散到不同的地域来实现容灾。我们以表格存储为例,介绍一下这种方式如何实现,以及其适用的场景。

下图是表格存储的一个架构图,表格存储的服务层下面有个分布式存储系统盘古,我们依赖盘古的多副本强一致来保障数据可靠性。盘古已经具备了将多个副本分布在不同可用区的能力,具体来说我们使用了3个副本,这3个副本会分布在3个不同的可用区,每个可用区中都会部署盘古的master、chunkserver以及表格存储的前后端角色。跨越3个可用区的整套系统在逻辑上仍是属于一个集群,任意一个可用区故障不会影响服务,会进行自动的failover。


这种模式被称为同城三可用区模式,未来会在公共云推出。这种模式提供了抵御某个可用区故障的容灾能力,但是不能抵御整个地域发生的故障。因为三份副本仍分布在同一个城市,而没有跨城市或者更远的地域分布。原因一方面是三份副本是保障强一致性的,如果跨度太大,写数据时的网络延迟将会很大,这会对整个系统的性能造成较大影响,另一方面是这种模式下整个系统是一个整体,如果做到完全跨地域,相当于实现一套全局容灾的全球数据库,这是另一种产品形态,暂不讨论。

利用多套系统间的数据同步和切换做容灾

这种方式是上面讲的实现容灾的方式2,采用两套或多套不同的系统,通过数据同步和切换来做容灾。这种方式分为主备模式以及双活/多活模式。主备模式有同城双集群、两地三中心等,双活/多活模式有异地双活,异地多活(单元化)等。

1. 主备模式

下面以表格存储的双机房主备场景为例,介绍一下整个过程:


通过上面的流程可以看到,这种容灾方式中,最重要的两个内容就是数据同步和切换。在最初搭建双集群时,数据同步包括一次全量同步和实时的增量同步。在切换后,备集群开始提供服务,然后等主集群恢复后重新建立同步关系,并最终可以再切换回主集群。

需要额外说明的是,这里的数据同步是异步的,一条数据在主集群写入成功后即返回给客户端,此时可能还未同步给备集群。异步同步会带来一部分数据一致性问题,业务需要明确这种数据不一致带来的影响,并有相应的措施。
具体来说,在故障时刻我们触发切换,这时假设主集群还有一部分数据未同步给备集群,那么:
1. 原来的主集群上拥有切换前写入的所有数据,还包括切换前未同步给备集群的数据。
2. 除了切换前未同步的一部分数据外,新的主集群(即备集群)上拥有所有写入的数据。

当原来的主集群恢复,这时候有几种选择:
1. 以备集群数据为准,在原来的主集群上做备库重搭。什么意思呢,就是说以备集群数据为准,再同步一次全量数据,然后再进行实时增量同步。这种情况下主集群之前未同步的数据就消除了,也再不可见。
2. 一般而言,主集群故障不会导致表中存量数据的丢失,所以我们可以只将切换后新写入备集群的数据增量同步回主集群。这种情况下可以快速重建主备关系,因为只同步增量,数据量小的多。但当重新切换回主集群后,之前未同步到备集群的数据又可见了,或者被备集群的更新所覆盖(同一行情况下)。
3. 可以将主集群未同步给备集群的数据获取出来,重新补到备集群中或者做一些业务上的处理,然后进行增量同步。相当于在2的基础上做的更好,把不一致的问题解决掉。

下面简单说一下切换的问题,切换的目的是使应用层不再访问出现故障的系统,而转向访问备用的系统。因此,在从应用层到服务端的中间路径上,必须有一个点需要感知到发生了切换,然后走向另一个分支。可以从以下几个方面来考虑,仅供参考:
1. 因为用户是通过实例域名访问表格存储服务,服务端可以更改实例域名的cname记录,指向备集群。这种模式只适用于同城双集群模式,主备实例名是同一个,但是后端集群是主备的。
2. 应用层在自身代码中加入一个proxy层, 这个proxy层支持连接主备两套系统,其内部设置一个切换开关,当打开切换开关后,自动访问另一套系统。这种情况下主备实例完全可以是不同的实例,应用层准备好主备实例的各自配置即可。
3. 类似于2,采用某种配置推送的中间件来实现访问配置的动态更改。

2. 双活/多活模式

双活/多活的场景如下图所示:



以双活为例,解释一下其与主备模式的不同:
1. 双活模式下两套服务都接收访问,具体来说就是图中的表格存储华北2和华东1的两个实例都接受读写访问,而主备模式下备实例是不接受任何访问的。
2. 双活模式下数据同步是双向的,而主备模式下数据同步是单向的。

多活模式与双活类似,但是会有中心和单元的概念,所以这种异地多活架构又被称为单元化。单元写入的数据会全部同步给中心,中心会向某个单元同步其他单元的数据,最终保证所有单元和中心都拥有完整的数据。

双活/多活模式下,业务层必须限制一条记录只被一个节点修改,因为多节点写入同一条数据会带来数据的不一致,从业务层面来看可能就是某个用户或者某个设备的信息只在某个节点上修改。假如业务面向的是终端用户,那么通过单元化架构可以减少延迟,优化终端用户的体验,特别是在某些全球性的业务中。

另一方面就是避免数据的循环同步,否则数据流向会形成一个环,一条记录不停的在各节点上进行同步。避免循环复制的方法是对每条数据附带上该数据已经写过的节点信息,当发现要同步的节点已经写过该条数据时,停止同步。

双活/多活模式下的切换非常灵活。还是以业务面向的是终端用户为例,某个终端用户访问哪个单元的服务是由业务层进行设置的,所以业务层可以通过更改规则,将访问某个节点的用户切换到另外的节点去。需要注意的是,业务需要考虑异步的数据同步可能造成的数据不一致问题。正常情况下,数据同步的RPO在秒级或者亚秒级,如果业务在切换时对数据写入做一些限制或者对数据同步做一些检测,是可以避免非故障场景下造成数据不一致的。当然业务也要考虑如果出现某些数据不一致时,是否可以容忍或者通过其他手段修复。

表格存储如何实现增量数据同步

通过上面对容灾场景的介绍,我们可以发现,增量数据同步是构造容灾场景的核心功能,而这一节会重点介绍表格存储如何实现增量数据同步。除了增量数据同步,为了搭建一个容灾场景还需要表Meta同步功能、全量数据同步功能、切换相关功能等等,是一个很复制的系统,暂不对这些功能进行介绍。

数据库的实时增量同步常被称为Replication,Replication的前提是说如果两套数据库有序的应用相同的更改,可以获得相同的最终结果。比如使用MySQL的binlog进行主备同步,就是将同样的修改有序的应用到备库中,表格存储的Replication也是采用的类似的方式。

我们首先看一下表格存储的写入过程,表格存储使用了log structured merge tree的结构,如下图所示(图片来自互联网):


图中的Write-ahead log也称为commitlog,一条数据更新会先写入commitlog进行持久化,然后再写入内存中的MemTable,MemTable会定期的flush成一个新的数据文件,后台定期对不同的数据文件进行compaction,合并为一个更大的数据文件,并清理垃圾数据等。

表格存储一张表的每个分片都拥有独立的commitlog,每次修改的内容都会顺序的append写入commitlog,保证了写入的数据被持久化。当节点故障时,内存中的MemTable还未flush成数据文件,此时发生failover,分片被另外的节点加载,只需要重新replay一部分commitlog即可恢复MemTable,保证写入的数据不丢。

commitlog是一种redo log,其顺序的记录了对一个分片的所有修改,并且是确定性的修改,一些写入时未决的值(比如自增列的值、未自定义的时间戳)在commitlog里都已经变成确定性的值。表格存储的Replication就是通过对commitlog进行回放来实现的。与单机数据库相比的复杂之处在于,一方面表格存储一个表拥有众多的分片,每个分片都有独立的commitlog,分片还会分裂与合并,是一个有向无环图结构。另一方面表格存储作为大规模的分布式NoSQL,很多表的写入量都在几个GB/s,这要求数据同步模块也必须是分布式的。

目前Replication功能是作为表格存储服务端Table Worker的一个模块。对每一个开启了Replication的表的分片,Table Worker中的这个模块会负责按照commitlog中的顺序,发送这个分片新写入的数据到目的端,记录checkpoint用于failover,在分片分裂与合并时生成新分片的replication配置等等一系列与Replication相关的事情。我们也通过这个模块进行Replication流控、监控RPO指标等等。

表格存储Stream功能:增量数据同步能力服务化

上面讲到,增量数据同步是构造容灾场景的核心。事实上,增量数据的价值已经在各种场景中体现出来,包括增量数据的实时ETL、离线导入MaxCompute/Spark进行分析,实时导入ElasticSearch提供全文搜索能力等等。下图描绘了表格存储与各种计算生态的打通,其中增量数据通道都扮演重要的角色。为了把增量数据同步能力开放出来,我们开发了Stream功能,提供了一套Stream API用于读取表中的增量数据。


另一方面,我们也希望把Replication功能开放出来,因为目前Replication模块做在Table Worker内部,在Table Worker内部管理同步的checkpoint,处理各种数据同步逻辑等等,与系统其他功能耦合太多,不够灵活,难以适应越来越多的容灾场景和定制化需求。在此同时,Stream功能也提供了出来,对外发布,基于Stream来实现Replication的想法也逐渐明确下来,开始进行开发。

基于Stream来实现Replication,一方面可以把Replication模块从系统内部独立出来,微服务化,与其他模块进行解耦,另一方面可以把这套Replication模块服务化,作为一个数据平台提供给用户灵活的定制空间,甚至用户可以基于我们提供的lib自己实现Replication,或者使用函数计算用Serverless的思想做Replication。

总结

本文基于表格存储实现各种容灾场景的一些经验和实践,总结了各种容灾场景的实现方式,介绍了表格存储如何实现容灾场景中的重要功能——增量数据同步,并简要介绍了表格存储的Stream功能,以及我们将在Stream功能基础上实现容灾能力、增量数据同步能力的服务化。欢迎各位读者加我们表格存储的公开交流群进行交流,钉钉公开群群号:11789671。

时间: 2024-08-27 05:45:46

表格存储如何实现跨区域的容灾的相关文章

表格存储如何实现高可靠和高可用

系列文章 表格存储如何实现高可靠和高可用表格存储如何实现跨区域的容灾 前言 本文会介绍一款分布式NoSQL如何实现数据高可靠和服务高可用,这是一款云上的NoSQL服务,叫做表格存储.对于分布式NoSQL,大家可能会想到很多名字,比如HBase.Cassandra,AWS的DynamoDB等,这类NoSQL在设计之初就作为一个分布式系统支持超大规模的数据量与并发.此外大家可能还会想到MongoDB和Redis,这两个也提供集群功能,但是一般需要人为的配置sharding和复制集/主从等. 表格存储

表格存储服务在社交应用场景的实践

阿里云的表格存储服务(http://www.aliyun.com/product/ots)是一款面向PB级结构化/半结构化数据存储和百万级高并发读写访问的NoSQL数据库服务,在移动社交场景中有着非常广发的应用,如今非常火热的钉钉也将后台的消息推送和存储功能从MySQL迁移到表格存储上,以获得更加优秀的高并发和规模扩展能力:同时也有非常多的创业企业将企业自身针对客户的消息推送能力基于表格存储来构建.本文将详细介绍表格存储在移动社交中的技术实践.本文的主要内容已经在2016年云栖大会深圳场的存储论

如何将日志服务的数据秒级同步到表格存储

最近在容器服务的官方镜像中,新增了loghub-shipper的镜像,使用该镜像,可以订阅日志服务中的日志库,以秒级的延时将日志数据从日志服务中读出并转换成结构化数据存储在表格存储中,以满足实时在线服务的精确查询需求. 什么是日志服务? 日志服务(Log Service,Log)是针对日志场景的一站式解决方案,解决海量日志数据采集/订阅.转储与查询功能,比如在海量游戏日志收集与分析场景上的应用. 什么是表格存储? 表格存储(TableStore)提供海量NoSQL数据的存储与实时访问服务,能够支

安徽移动:云存储下的容灾建设

关于云计算的讨论在持续升温,越来越多的以运营商为代表的企业开始对云计算进行研究和部署.然而,在云存储环境中存在着大量的异构环境,而传统容灾技术以同构存储为主,无法在异构环境中实现容灾保护.中国移动安徽公司(以下简称安徽移动)就对云存储环境下的异构存储容灾进行了探索.建设独立.开放的容灾系统容灾系统的独立性和开放性,对于安徽移动现在以及将来保持系统平台和存储平台的灵活性都至关重要.一个好的容灾系统不仅能够满足企业目前的容灾需要,而且还能够为将来的数据平台选择提供更大的灵活性.容灾系统的独立性.开放

大话存储系列19——数据容灾

数据备份系统只能保证数据被安全地复制了一份,但是一旦生产系统发生故障,比如服务器磁盘损坏致使数据无法读写.主板损坏造成直接无法开机或者机房火灾等意外事件,我们必须将备份的数据尽快地恢复到生产系统中继续生产,这个动作就叫做容灾. 容灾可以分为四个级别: 数据级容灾:也就是只考虑将生产站点的数据如何同步 到远程站点即可. 与应用结合的数据级容灾:也就是可以保证对应应用程序数据一致性的数据同步,以及可感知应用层数据结构的.有选择的同步部分关键重要数据的数据容灾: 应用级容灾:也就是灾难发生时,不仅可以

MaxCompute( 原名ODPS)大数据容灾方案与实现(及项目落地实例)专有云

一,背景与概述     复杂系统的灾难恢复是个难题,具有海量数据及复杂业务场景的大数据容灾是个大难题.     MaxCompute是集团内重要数据平台,是自主研发的大数据解决方案,其规模和稳定性在业界都是领先的.在周边系统众多,业务场景复杂,海量数据存储和计算调度都是一个难题的情况下,需要保证大数据系统在灾难发生时能够尽快切换到备用系统服务,最小限度影响客户使用.     容灾系统及方案的建设有很多种方式,如同城双活,异地多活,冷备容灾等.MaxCompute大数据的容灾方案是在多年集团内部断

容灾发展的那些个拐点 你知道几个?

  [拐点]:又称反曲点,在数学上指改变曲线向上或向下方向的点,借指事物的发展趋势开始改变的地方. 毋庸置疑,数据早已成为信息化社会的生存与发展的基础.据Accel Partners相关调查,截止2013年,2006年以来的数据的增长率为400%,在2016年将再次翻倍,预计2020年将呈现指数级增长趋势.在数据不断爆炸式增长的同时,作为数据和物业保护屏障的容灾备份领域也呈现出多重发展趋势. 一.数据容灾to应用容灾 说起容灾的发展趋势,我们有必要从数据的备份与恢复开始.从上世纪中期开始,一些国

高可用数据容灾 同有科技助力河北省人民检察院数据中心升级

随着我国政府职能向数字化.服务化转型,越来越多的应用.业务.数据被集中处理,数据中心需要更完备的安全保障.河北省人民检察院在其数据中心改造项目中,选择了北京同有飞骥科技股份有限公司(以下简称"同有科技")为其量身打造的高可用数据容灾存储解决方案. 原数据中心无法满足业务发展需求 作为省级检察院,河北省检察院管理着全省11个市级院和169个县区级检察院,现有22个内设机构,分管不同的业务内容.其信息化系统包含办公系统.档案系统.统一业务软件系统.数据库系统等.随着各种大数据应用的增多,原

华为云容灾解决方案 开创集约化容灾新时代

[天极网HCC&HENC2013消息]华为在HCC2013上宣布其具有划时代意义的集约化容灾解决方案--华为云容灾解决方案http://www.aliyun.com/zixun/aggregation/18782.html">正式发布.该方案主要针对政府和大企业客户多分支机构的集中容灾应用场景,通过融合华为在存储.网络安全.服务器等IT领域的技术创新和领先的容灾技术,为客户构建集约共享.管理便捷.安全可靠的容灾系统,极大的降低了客户对大型容灾系统的管理和维护难度. 华为HCC201