精华内容
下载资源
问答
  • 数据库异地活解决方案
    2021-02-05 02:13:43

    异地多活指分布在异地的多个站点同时对外提供服务的业务场景。异地多活是高可用架构设计的一种,与传统的灾备设计的最主要区别在于“多活”,即所有站点都是同时在对外提供服务的。

    以一个简单的业务单元的IT系统为例,整个IT系统的异地多活方案如下图所示。

    70177275_2020052710133006208ENUZWMQRRLMZGNMCE.jpg

    整个方案将各站点分为:分流量层、应用层和数据层。

    本文聚焦数据层的异地多活解决方案。目前针对数据层设计异地多活解决方案时,需遵循以下几个原则:

    l单元封闭:应用要走向异地,首先要面对的便是物理距离带来的延时。如果某个应用请求需要在异地多个单元对同一行记录进行修改,为满足异地单元间数据库数据的一致性和完整性,我们需要付出高昂的时间成本。此外,如果某个应用请求需要多次访问异地单元,且各单元间服务再被服务调用,那物理延时将无法预估。因此,数据库异地多活的问题转移到了如何避免跨单元的问题,即要做到单元内数据读写封闭,不能出现不同单元对同一行数据进行修改,所以我们需要找到一个维度去划分单元,避免数据写冲突。

    l数据拆分:选择什么维度来解决单点写的问题,要从业务本身入手去分析。例如电商的业务,最重要的流程即下单交易流程,从下单业务对数据划分单元时,改造成本最低、用户体验相对好的便是买家维度,即通过买家ID进行下单业务拆分,如下图所示。买家的下单操作在买家所在的本单元内即可完成读写封闭。按照上述示例划分业务,就意味着非买家维度的就需要做一定的妥协。对于非买家维度的操作,比如卖家操作(例如商品数据的修改)就可能会跨单元,对于买家与卖家数据读一致的问题,

    可以接受“最终一致”的就通过读写分离的方案, 不能接受“最终一致”的则需要跨单元访问。

    l数据同步:将业务划分多个单元以后,对于数据库来说,面临的最大挑战就是数据同步,因为对于单元封闭的买家维度的数据(unit类型)需要把单元的数据全部同步到中心,对于读写分离类型的(copy类型),我们要把中心的数据同步到单元。原生的数据库复制无法满足单元化复杂的同步需求(例如,只同步部分的数据、库表的过滤、双向循环、API服务化等定制化的需求 ),在普通业务逻辑场景下,DTS的同步性能更高效、更稳定,DTS也成为多活的基础设施。具体的数据同步如下图所示。

    l缓存失效实现数据层异地多活后,业务希望实时获取数据库变更消息,单元的缓存失效实现可通过数据订阅实现。通过数据订阅提供的消费 SDK,业务层可订阅 RDS 增量数据然后触发更新单元的缓存,通过这样的方式,应用无需实现缓存更新逻辑,架构更加简单。

    核心产品

    阿里云数据库异地多活解决方案使用以下阿里云核心产品,按照架构设计原则提供数据层多活解决方案。

    DRDS

    按照之前说的业务数据拆分的维度,阿里云DRDS有两种集群分别支持买家维度与卖家维度:

    lunit模式的DRDS集群:多地用户分别在本地域读写本地域的数据,且本地域的数据会和中心数据做双向同步。

    lcopy模式的DRDS集群:此集群数据在中心数据库写,完成后全量同步到各个单元。需要注意的是,DRDS层面需要增加对数据写入路由的判断:如果是跨单元的写,则判断为非法操作并抛出异常,确保数据不会跨单元写。

    更多DRDS的介绍请参考分布式关系型数据库DRDS一文。

    DTS

    数据复制是数据库多活设计关键的一环,其中数据复制的正确性是第一位,同时效率也很关键。阿里云DTS支持多重的check ,避免循环复制(用事务表,或者thread_id方案), 采用并行复制(串行的分发,冲突检测,并行的执行)、大事务切割来保证最终一致性。

    数据校验也是关键的一环,阿里云DTS 通过全量校验工具(TCP)和增量校验工具(AMG)来保证实时/定时检查中心和单元的数据准确性,确保线上数据的万无一失。

    更多的数据传输相关内容请参考数据传输服务一文。

    HDM

    阿里云HDM提供了DRDS集群的搭建、同步链路的创建、多活的数据库监控、数据校验、集群扩缩容以及自动化的容灾等服务,都可通过HDM完成,通过HDM实现了异地多活场景下数据库的管理。

    更多的数据管理请参考混合云数据库管理一文。

    典型应用场景

    两地容灾切换方案

    容灾是异地多活中最核心的一环, 以两个城市异地多活部署架构图为例:

    70177275_2020052710133007458UBAS7CYU6LWEH8RTS.jpg

    l在两个城市(城市1位于华南1地域、城市2位于华东1地域)均部署一套完整的业务系统。

    l下单业务按照“user_id”% 100 进行分片,在正常情况下:[00~49]分片所有的读写都在城市1的数据库实例主库。[50~99]分片所有的读写都在城市2的数据库实例主库。

    l“城市1的数据库实例主库”和 “城市2的数据库实例主库”建立DTS双向复制

    当出现异常时,需要进行容灾切换。可能出现的场景有以下4种:

    序号异常情况操作1城市1数据库主库故障1、数据库引擎完成主备切换;2、DTS自动切换到城市1新主库读取新的增量更新,然后同步到城市2的数据库实例2城市1所有APP Server故障有两种处理方案:方案1:数据库层无任何操作,APP Server切换到城市2,并跨城市读写城市1的数据库;方案2:APP Server和数据库都切换到城市23城市1所有数据库故障有两种处理方案:方案1:数据库层切换到城市2,APP

    Server跨城市读写城市2的数据库;方案2:APP Server和数据库都切换到城市24城市1整体故障(包括所有APP Server +数据库等)1、城市1的全部数库流量切换到城市2;2、城市1数据库到城市2数据库的DTS数据同步链路停止3、在城市2中,DTS启动,保存[00-49]分片的变更4、城市1故障恢复后,[00-49]的增量数据同步到城市1的数据库实例。5、同步结束后,将[00-49]的数据库流量从城市2切回到城市1启动[00-49]分片从城市1到城市2的DTS同步

    将第2种、第3种异常情况,全部采用第2种方案进行处理,那么不管是所有的APP Server异常、所有的数据库异常、整个城市异常,就直接按照城市级容灾方案处理,直接将APP Server、数据库切换到到另一个城市。

    多城异地多活

    多城市异地多活模式指的是3个或者3个以上城市间部署异地多活。该模式下存在中心节点和单元节点:

    l中心节点:指单元节点的增量数据都需要实时的同步到中心节点,同时中心节点将所有分片的增量数据同步到其他单元节点。

    l单元节点:即对应分片读写的节点,该节点需要将该分片的增量同步到中心节点,并且接收来自于中心节点的其他分片的增量数据。

    下图是3城市异地多活架构图,其中华东1就是中心节点,华南1和华北1是单元节点

    70177275_202005271013300760S2JEYTVCZQAL1UPZF9.jpg

    单元城市级故障

    当单元城市出现故障,业务需要切换时,以华南1城市级故障为例:

    70177275_202005271013300792XDD8EK8V87Q8BDO4WA.jpg

    1.容灾华南1(单元)的全部数库流量切换到华东1(中心);华南1(单元)数据库到华东1(中心)数据库的DTS数据同步链路停止,并记录同步位点分片[00-29]的读写切换到华东1(中心)

    2.恢复重建华南1(单元);华南1(单元)数据迁移和同步完成后,停止分片[00-29]在华东1(中心)的读写;停止华东1(中心)到华南1(单元)分片[00-29]的数据同步;创建华南1(单元)到华东1(中心)的数据同步;将分片[00-29]的读写切换到华南1(单元);华南1(单元)的数据库主库开启写入;检查;

    中心城市级故障

    当中心城市出现故障,业务需要切换时,以华东1城市级故障为例:

    70177275_20200527101330080754CYKWDS41XOAC2DSO.jpg

    3.容灾华东1(中心)的全部数库流量切换到华南1(单元);华东1(中心)数据库到华南1(单元)数据库的DTS数据同步链路停止;华东1(中心)数据库到华北1(单元)数据库的DTS数据同步链路停止;华南1(单元)数据库到华东1(中心)数据库的DTS数据同步链路停止;华北1(单元)数据库到华东1(中心)数据库的DTS数据同步链路停止;新增华南1(单元)数据库到华北1(单元)分片[30~99]的DTS数据同步链路;

    4.恢复重建华东1(中心);华东1(中心)数据迁移和同步完成后,停止分片[30-69]在华南1(单元)的读写;停止华东1(中心)到华南1(单元)分片[00-29]的数据同步;创建华东1(中心)到华南1(单元)的数据同步;创建华东1(中心)到华北1(单元)的数据同步;将分片[00-29]的读写切换到华南1(单元);华南1(单元)的数据库主库开启写入;检查;

    更多相关内容
  • 阿里异地多活的背景以及解决方案 阿里异地多活的演进路程 阿里同城双活的新挑战 阿里基于多活架构的容灾及扩展能力 阿里异地多活技术未来展望
  • 高可用的一些解决方案 高可用,从发展来看,大致经过了这几个过程: 冷备 双机热备 同城双活 异地双活 异地多活 在聊异地多活的时候,还是先看一些其他的方案,这有利于我们理解很多设计的缘由。 冷备 冷备,通过...

    点击上方“民工哥技术之路”,选择“设为星标”

    回复“1024”获取独家整理的学习资料!

    后台服务可以划分为两类,有状态和无状态。高可用对于无状态的应用来说是比较简单的,无状态的应用,只需要通过F5或者任何代理的方式就可以很好的解决。后文描述的主要是针对有状态的服务进行分析。服务端进行状态维护主要是通过磁盘或内存进行保存,比如MySQL数据库,redis等内存数据库。除了这两种类型的维护方式,还有jvm的内存的状态维持,但jvm的状态生命周期通常很短。

    高可用的一些解决方案

    高可用,从发展来看,大致经过了这几个过程:

    • 冷备

    • 双机热备

    • 同城双活

    • 异地双活

    • 异地多活

    在聊异地多活的时候,还是先看一些其他的方案,这有利于我们理解很多设计的缘由。

    冷备

    冷备,通过停止数据库对外服务的能力,通过文件拷贝的方式将数据快速进行备份归档的操作方式。简而言之,冷备,就是复制粘贴,在linux上通过cp命令就可以很快完成。可以通过人为操作,或者定时脚本进行。有如下好处:

    • 简单

    • 快速备份(相对于其他备份方式)

    • 快速恢复。只需要将备份文件拷贝回工作目录即完成恢复过程(亦或者修改数据库的配置,直接将备份的目录修改为数据库工作目录)。更甚,通过两次mv命令就可瞬间完成恢复。

    • 可以按照时间点恢复。比如,几天前发生的拼多多优惠券漏洞被人刷掉很多钱,可以根据前一个时间点进行还原,“挽回损失”。

    以上的好处,对于以前的软件来说,是很好的方式。但是对于现如今的很多场景,已经不好用了,因为:

    • 服务需要停机。n个9肯定无法做到了。然后,以前我们的停机冷备是在凌晨没有人使用的时候进行,但是现在很多的互联网应用已经是面向全球了,所以,任何时候都是有人在使用的。

    • 数据丢失。如果不采取措施,那么在完成了数据恢复后,备份时间点到还原时间内的数据会丢失。传统的做法,是冷备还原以后,通过数据库日志手动恢复数据。比如通过redo日志,更甚者,我还曾经通过业务日志去手动回放请求恢复数据。恢复是极大的体力活,错误率高,恢复时间长。

    • 冷备是全量备份。全量备份会造成磁盘空间浪费,以及容量不足的问题,只能通过将备份拷贝到其他移动设备上解决。所以,整个备份过程的时间其实更长了。想象一下每天拷贝几个T的数据到移动硬盘上,需要多少移动硬盘和时间。并且,全量备份是无法定制化的,比如只备份某一些表,是无法做到的。

    如何权衡冷备的利弊,是每个业务需要考虑的。

    双机热备

    热备,和冷备比起来,主要的差别是不用停机,一边备份一边提供服务。但还原的时候还是需要停机的。由于我们讨论的是和存储相关的,所以不将共享磁盘的方式看作双机热备。

    Active/Standby模式

    相当于1主1从,主节点对外提供服务,从节点作为backup。通过一些手段将数据从主节点同步到从节点,当故障发生时,将从节点设置为工作节点。数据同步的方式可以是偏软件层面,也可以是偏硬件层面的。

    偏软件层面的,比如mysql的master/slave方式,通过同步binlog的方式;sqlserver的订阅复制方式。

    偏硬件层面,通过扇区和磁盘的拦截等镜像技术,将数据拷贝到另外的磁盘。偏硬件的方式,也被叫做数据级灾备;偏软件的,被叫做应用级灾备。后文谈得更多的是应用级灾备。

    双机互备

    本质上还是Active/Standby,只是互为主从而已。双机互备并不能工作于同一个业务,只是在服务器角度来看,更好的压榨了可用的资源。比如,两个业务分别有库A和B,通过两个机器P和Q进行部署。那么对于A业务,P主Q从,对于B业务,Q主P从。整体上看起来是两个机器互为主备。这种架构下,读写分离是很好的,单写多读,减少冲突又提高了效率。

    其他的高可用方案还可以参考各类数据库的多种部署模式,比如mysql的主从、双主多从、MHA;redis的主从,哨兵,cluster等等。

    同城双活

    前面讲到的几种方案,基本都是在一个局域网内进行的。业务发展到后面,有了同城多活的方案。和前面比起来,不信任的粒度从机器转为了机房。这种方案可以解决某个IDC机房整体挂掉的情况(停电,断网等)。

    同城双活其实和前文提到的双机热备没有本质的区别,只是“距离”更远了,基本上还是一样(同城专线网速还是很快的)。双机热备提供了灾备能力,双机互备避免了过多的资源浪费。

    在程序代码的辅助下,有的业务还可以做到真正的双活,即同一个业务,双主,同时提供读写,只要处理好冲突的问题即可。需要注意的是,并不是所有的业务都能做到。

    业界更多采用的是两地三中心的做法。远端的备份机房能更大的提供灾备能力,能更好的抵抗地震,恐袭等情况。双活的机器必须部署到同城,距离更远的城市作为灾备机房。灾备机房是不对外提供服务的,只作为备份使用,发生故障了才切流量到灾备机房;或者是只作为数据备份。原因主要在于:距离太远,网络延迟太大。如上图,用户流量通过负载均衡,将服务A的流量发送到IDC1,服务器集A;将服务B的流量发送到IDC2,服务器B;同时,服务器集a和b分别从A和B进行同城专线的数据同步,并且通过长距离的异地专线往IDC3进行同步。当任何一个IDC当机时,将所有流量切到同城的另一个IDC机房,完成了failover。当城市1发生大面积故障时,比如发生地震导致IDC1和2同时停止工作,则数据在IDC3得以保全。同时,如果负载均衡仍然有效,也可以将流量全部转发到IDC3中。不过,此时IDC3机房的距离非常远,网络延迟变得很严重,通常用户的体验的会受到严重影响的。上图是一种基于Master-Slave模式的两地三中心示意图。城市1中的两个机房作为1主1从,异地机房作为从。也可以采用同城双主+keepalived+vip的方式,或者MHA的方式进行failover。但城市2不能(最好不要)被选择为Master。

    异地双活

    同城双活可以应对大部分的灾备情况,但是碰到大面积停电,或者自然灾害的时候,服务依然会中断。对上面的两地三中心进行改造,在异地也部署前端入口节点和应用,在城市1停止服务后将流量切到城市2,可以在降低用户体验的情况下,进行降级。但用户的体验下降程度非常大。

    所以大多数的互联网公司采用了异地双活的方案。上图是一个简单的异地双活的示意图。流量经过LB后分发到两个城市的服务器集群中,服务器集群只连接本地的数据库集群,只有当本地的所有数据库集群均不能访问,才failover到异地的数据库集群中。

    在这种方式下,由于异地网络问题,双向同步需要花费更多的时间。更长的同步时间将会导致更加严重的吞吐量下降,或者出现数据冲突的情况。吞吐量和冲突是两个对立的问题,你需要在其中进行权衡。例如,为了解决冲突,引入分布式锁/分布式事务;为了解决达到更高的吞吐量,利用中间状态、错误重试等手段,达到最终一致性;降低冲突,将数据进行恰当的sharding,尽可能在一个节点中完成整个事务。

    对于一些无法接受最终一致性的业务,饿了么采用的是下图的方式:对于个别一致性要求很高的应用,我们提供了一种强一致的方案(Global Zone),Globa Zone是一种跨机房的读写分离机制,所有的写操作被定向到一个 Master 机房进行,以保证一致性,读操作可以在每个机房的 Slave库执行,也可以 bind 到 Master 机房进行,这一切都基于我们的数据库访问层(DAL)完成,业务基本无感知。

    也就是说,在这个区域是不能进行双活的。采用主从而不是双写,自然解决了冲突的问题。

    实际上,异地双活和异地多活已经很像了,双活的结构更为简单,所以在程序架构上不用做过多的考虑,只需要做传统的限流,failover等操作即可。但其实双活只是一个临时的步骤,最终的目的是切换到多活。因为双活除了有数据冲突上的问题意外,还无法进行横向扩展。

    异地多活根据异地双活的思路,我们可以画出异地多活的一种示意图。每个节点的出度和入度都是4,在这种情况下,任何节点下线都不会对业务有影响。但是,考虑到距离的问题,一次写操作将带来更大的时间开销。时间开销除了影响用户体验以外,还带来了更多的数据冲突。在严重的数据冲突下,使用分布式锁的代价也更大。这将导致系统的复杂度上升,吞吐量下降。所以上图的方案是无法使用的。

    回忆一下我们在解决网状网络拓扑的时候是怎么优化的?引入中间节点,将网状改为星状:改造为上图后,每个城市下线都不会对数据造成影响。对于原有请求城市的流量,会被重新LoadBalance到新的节点(最好是LB到最近的城市)。为了解决数据安全的问题,我们只需要针对中心节点进行处理即可。但是这样,对于中心城市的要求,比其他城市会更高。比如恢复速度,备份完整性等,这里暂时不展开。我们先假定中心是完全安全的。

    如果我们已经将异地多活的业务部署为上图的结构,很大程度解决了数据到处同步的问题,不过依然会存在大量的冲突,冲突的情况可以简单认为和双活差不多。那么还有没有更好的方式呢?

    回顾一下前文提到的饿了么的GlobalZone方案,总体思路就是“去分布式”,也就是说将写的业务放到一个节点的(同城)机器上。阿里是这么思考的:实际上我猜测很多业务也是按照上图去实现的,比如滴滴打车业务这种,所有的业务都是按城市划分开的。用户、车主、目的地,他们的经纬度通常都是在同一个城市的。单个数据中心并不需要和其他数据中心进行数据交互,只有在统计出报表的时候才需要,但报表是不太注重实时性的。那么,在这种情况下,全国的业务其实可以被很好的sharding的。

    但是对于电商这种复杂的场景和业务,按照前文说的方式进行sharding已经无法满足需求了。因为业务线非常复杂,数据依赖也非常复杂,每个数据中心相互进行数据同步的情况无可避免。淘宝的解决方式和我们切分微服务的方式有点类似:注意看图中的数据同步箭头。以交易单元为例,属于交易单元的业务数据,将与中心单元进行双向同步;不属于交易单元的业务数据,单向从中心单元同步。中心单元承担了最复杂的业务场景,业务单元承担了相对单一的场景。对于业务单元,可以进行弹性伸缩和容灾;对于中心单元,扩展能力较差,稳定性要求更高。可以遇见,大部分的故障都会出现在中心单元。

    按照业务进行单元切分,已经需要对代码和架构进行彻底的改造了(可能这也是为什么阿里要先从双活再切到多活,历时3年)。比如,业务拆分,依赖拆分,网状改星状,分布式事务,缓存失效等。除了对于编码的要求很高以外,对测试和运维也有非常大的挑战。如此复杂的情况,如何进行自动化覆盖,如何进行演练,如何改造流水线。这种级别的灾备,不是一般公司敢做的,投入产出也不成正比。不过还是可以把这种场景当作我们的“假想敌”,去思考我们自己的业务,未来会怎么发展,需要做到什么级别的灾备。相对而言,饿了么的多活方案可能更适合大多数的企业。

    本文只是通过画图的方式进行了简单的描述,其实异地多活是需要很多很强大的基础能力的。比如,数据传输,数据校验,数据操作层(简化客户端控制写和同步的过程)等。

    来源 | https://blog.dogchao.cn/?p=299

    推荐阅读 点击标题可跳转

    华为第一款台式机正式上线!

    用了 10 年 Windows 后,我最终转向 Linux

    从 lsof 开始,深入理解 Linux 虚拟文件系统

    一款超牛逼的 Linux 终端复用神器(附安装、使用教程)

    Linux 日志文件系统原来是这样工作的

    超详细 116 页 Elasticsearch 实战文档!高清可下载

    抓包工具 tcpdump 用法说明

    Linux 系统多网卡环境下的路由配置

    展开全文
  • 主要介绍了MySQL 双活同步复制四种方案,主从复制分成三步,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
  • 双活数据中心方案

    2019-02-19 15:33:38
    本文主要讨论基于DNS和GSLB技术实现数据中心异地双活 转载他人资源
  • 异地双活实践笔记

    千次阅读 2019-01-22 11:58:53
    最近恰好在搞异地双活,以下是一个梳理: 基本概念 1、异地容灾。这仅仅是一个冷备的概念。也就是在平时正常的时候,另外一个机房只是当做备份。 2、异地双(多)活。而异地双(多)活,却是指有两个或者多个可以...

    最近恰好在搞异地双活,以下是一个梳理:

    基本概念

    1、异地容灾。这仅仅是一个冷备的概念。也就是在平时正常的时候,另外一个机房只是当做备份。

    2、异地双(多)活。而异地双(多)活,却是指有两个或者多个可以同时对外服务的节点,任意一个点挂了,也可以迅速切换到其他节点对外服务,节点之间的数据做到准实时同步。

    分类

    根据是否需要数据同步大体分为三类:

    1、必须同步型。(比如数据库)

    2、无须同步型。比如缓存,仅仅是当做缓存,就可以这样做(这个有待商榷,其实缓存也需要同步的,严格来说的话)。

    3、只能单活(对全局原子要求较高),不接受有一定时延的“不一致”窗口。

    核心问题

    数据同步、网络时延。

    切换方式

    1、自动切换。自动切换表现为当灾难来临时,程序内部可以自动识别出问题然后切换至可用机房。

    2、手动切换。通过简单的配置,在几分钟或者一两小时内切换到另外的机房。

    异地多活面临的挑战

    1、切换问题。

    切换问题不仅仅是灾难发生自动切换到好的机房,还有另外一个问题,就是灾难机房恢复能力后,如何再切换回去,切换回去的数据同步问题又是需要解决的。

    2、跨机房流量问题。

    跨机房的流量是花钱的。所以不是无限大的。控制跨机房消息体大小,越小越好。然而,很多时候要想保证数据同步是一件很耗费流量的事情。但跨机房流量真的是一座山。

    既然跨机房流量有限制,而且不稳定。所以有一种解决方案就是不跨机房。既然不跨机房就要做用户分区,确保每个用户只能访问自己所在的区,这样至少能保证该用户自己的数据的完整。

    3、所有的业务都适合做异地双活吗?

    异地多活效果看起来很诱人,但如果不假思索贪大求全的要求所有业务都实现异地多活的话,就会把自己带到坑里去。

    第一个原因是异地多活是有成本的,包括开发成本和维护成本。需要实现异地多活的业务越多,方案越复杂,投入的设计开发时间越多;同时维护成本也会越高,需要更多的机器,需要更多的带宽。

    第二个原因是有的业务理论上就无法实现异地多活。典型的有“余额”和“库存”这两个业务。

    以余额为例,假设我们实现了余额的异地多活业务,用户小明有10000块钱,在A机房给女友转账了5000块,还剩余5000块;如果此时A机房异常且数据还没同步到B机房,小明登录到B机房发现自己又有10000块了,小明感觉中彩票了,赶紧又转了10000块给女友,最后出现了小明只有10000块却转账了15000块的问题,对于和资金相关的业务,这样的问题是绝对无法容忍的,哪怕一个用户有问题都不行。

    所以,异地多活也不能保证所有业务都异地多活,在设计异地多活方案的时候,需要从业务和用户的角度出发,识别出核心和关键业务,明确哪些业务是必须实现异地多活,哪些是可以不实现异地多活,哪些是不能实现异地多活的。比如“登录”必须实现异地多活、“注册”和“修改用户信息”不一定要实现异地多活。

    4、冷备还是热备。冷备了以后,一直冷备,当真正出现问题,你还有勇气去切换到那个一直冷的机房吗?恐怕需要点勇气。

    5、数据一致性问题。

    解决方案:

    (1)、守护进程同步。

    (2)、客户端双写。

    (3)、不去解决。不需要解决的前提是用户分区。分区后,从本质上说,其实是没有做到双活的。只是看起来一个业务确实被分到了多个机房而已。

    6、读取问题。

    这个相对来说要好解决一些,就是就近读取。

    业务以及基础组件异地双活方案

    业务实例异地双活

    业务实例的异地双活。这个相对来说要简单一些,只要做到无状态,再如果通过docker这些容器结束,基本上是相对来说容易一些。

    消息队列的异地双活

    rabbitmq 每个机房部署一套server,然后每个机房的业务使用各自机房的mq。通过haproxy自动映射到本机房的broker。topic同步,通过rest api读取到

    配置文件,然后同步到另外一个机房的rabbitmq下。

    具体restapi:

    http://17X.XXX.X.XXX:15672/api/definitions

    以上只是同步了rabbitmq的元数据,而且是全量同步。

    消息同步问题:如果不同步会导致消息丢失。所以mq消息其实也是需要同步的。

    同步可以通过客户端双写,或者服务端复制。双写更加容易。

    Redis的异地双活

    Redis 的异地双活。就是分别在每个机房搭建一套Redis集群。 然后每个机房的业务都去访问各自机房的Redis集群。

    但这样只是能保证基本的缓存能力。如果业务中涉及到一些全局的原子操作,那么这样的做法显然不能满足需求。

    原因很简单,比如你使用redis incr自增命令:

    a 机房 加1 后变为了1,b机房的业务也加1, 本来应该是2。结果由于各自都是访问了自己的redis,所以全局计数显然是有问题的。

    怎么解决呢?就需要涉及到全局操作的业务,去单独的连接 一个全局的唯一的那个 redis集群,这个redis集群专门用于 业务的全局操作。

    但这样的后果,就是会涉及到跨机房流量问题,因为这个全局的redis集群无论放在哪个机房,另外一个机房的业务要想访问都得跨机房。

    读取流程:

    写入流程:

    全局操作:

    数据库的异地双活

    canal:

    早期,阿里巴巴B2B公司因为存在杭州和美国双机房部署,存在跨机房同步的业务需求。不过早期的数据库同步业务,主要是基于trigger的方式获取增量变更,不过从2010年开始,阿里系公司开始逐步的尝试基于数据库的日志解析,获取增量变更进行同步,由此衍生出了增量订阅&消费的业务,从此开启了一段新纪元。

    基于日志增量订阅&消费支持的业务:

    1. 数据库镜像
    2. 数据库实时备份
    3. 多级索引 (卖家和买家各自分库索引)
    4. search build
    5. 业务cache刷新
    6. 价格变化等重要业务消息

    otter:

    阿里巴巴B2B公司,因为业务的特性,卖家主要集中在国内,买家主要集中在国外,所以衍生出了杭州和美国异地机房的需求,同时为了提升用户体验,整个机房的架构为双A,两边均可写,由此诞生了otter这样一个产品。

    otter第一版本可追溯到04~05年,此次外部开源的版本为第4版,开发时间从2011年7月份一直持续到现在,目前阿里巴巴B2B内部的本地/异地机房的同步需求基本全上了otter4。

    目前同步规模:

    1. 同步数据量6亿
    2. 文件同步1.5TB(2000w张图片)
    3. 涉及200+个数据库实例之间的同步
    4. 80+台机器的集群规模

    说明:

    a. 数据涉及网络传输,S/E/T/L几个阶段会分散在2个或者更多Node节点上,多个Node之间通过zookeeper进行协同工作 (一般是Select和Extract在一个机房的Node,Transform/Load落在另一个机房的Node)

    b. node节点可以有failover / loadBalancer. (每个机房的Node节点,都可以是集群,一台或者多台机器)

    Zookeeper异地双活

    先来点背景知识:

    1、zookeeper中的server机器之间会组成leader/follower集群,1:n的关系。采用了paxos一致性算法保证了数据的一致性,就是leader/follower会采用通讯的方式进行投票来实现paxos。

    2、zookeeper还支持一种observer模式,提供只读服务不参与投票,提升系统。

    异地多活决定了我们需要进行跨机房操作,比如杭州,美国,香港,青岛等多个机房之间进行数据交互。

    跨机房之间对应的网络延迟都比较大,比如中美机房走海底光缆有ping操作200ms的延迟,杭州和青岛机房有70ms的延迟。

    为了提升系统的网络性能,在部署zookeeper网络时会在每个机房部署节点,多个机房之间再组成一个大的网络保证数据一致性。(zookeeper千万别再搞多个集群)。

    最后的部署结构就会是:

    • 杭州机房 >=3台 (构建leader/follower的zk集群)
    • 青岛机房 >=1台 (构建observer的zk集群)
    • 美国机房 >=1台 (构建observer的zk集群)
    • 香港机房 >=1台 (构建observer的zk集群)

    一句话概括就是: 在单个机房内组成一个投票集群,外围的机房都会是一个observer集群和投票集群进行数据交互。 这样部署的一些好处,大家可以细细体会一下。

    针对这样的部署结构,我们就可以实现就近访问: 比如在美国机房的机器就去优先访问本机房的zk集群,访问不到后才去访问杭州机房。

    默认在zookeeper3.3.3的实现中,认为所有的节点都是对等的。并没有对应的优先集群的概念,单个机器也没有对应的优先级的概念。

    扩展代码:(比较暴力,采用反射的方式改变了zk client的集群列表)

    • 先使用美国机房的集群ip初始化一次zk client
    • 通过反射方式,强制在初始化后的zk client中的server列表中又加入杭州机房的机器列表

    Java代码

    ZooKeeper zk = null;  
            try {
                zk = new ZooKeeper(cluster1, sessionTimeout, new AsyncWatcher() {
    
    public void asyncProcess(WatchedEvent event) {
          //do nothing   
          }
    
          });
          if (serveraddrs.size() > 1) {
          // 强制的声明accessible  
          ReflectionUtils.makeAccessible(clientCnxnField);
          ReflectionUtils.makeAccessible(serverAddrsField);
          // 添加第二组集群列表  
          for (int i = 1; i < serveraddrs.size(); i++) {
          String cluster = serveraddrs.get(i);
          // 强制获取zk中的地址信息  
          ClientCnxn cnxn = (ClientCnxn) ReflectionUtils.getField(clientCnxnField, zk);
          List<InetSocketAddress> serverAddrs = (List<InetSocketAddress>) ReflectionUtils
          .getField(serverAddrsField, cnxn);
          // 添加第二组集群列表  
          serverAddrs.addAll(buildServerAddrs(cluster));
          }
          }
          }  

    异地双活思维误区

    异步双活思维误区:

    1、所有业务异地多活!

    2、实时一致性。我要所有数据都同步!

    3、只使用存储系统的同步功能!

    4、我要保证业务100%可用!

    5、所有用户异地多活

    一句话谈“异地多活”

    综合前面的分析,异地多活设计的理念可以总结为一句话:采用多种手段,保证绝大部分用户的核心业务异地多活

    选型时需要考虑的维度

    以下是方案选型时需要考虑的一些维度:

    • 能否整业务迁移:如果机器资源不足,建议优先将一些体系独立的服务整体迁移,这样可以为核心服务节省出大量的机架资源。如果这样之后,机架资源仍然不足,再做异地多活部署。
    • 服务关联是否复杂:如果服务关联比较简单,则单元化、基于跨机房消息同步的解决方案都可以采用。不管哪种方式,关联的服务也都要做异地多活部署,以确保各个机房对关联业务的请求都落在本机房内。
    • 是否方便对用户分区:比如很多游戏类、邮箱类服务,由于用户可以很方便地分区,就非常适合单元化,而SNS类的产品因为关系公用等问题不太适合单元化。
    • 谨慎挑选第二机房:尽量挑选离主机房较近(网络延时在10ms以内)且专线质量好的机房做第二中心。这样大多数的小服务依赖问题都可以简化掉,可以集中精力处理核心业务的异地多活问题。同时,专线的成本占比也比较小。以北京为例,做异地多活建议选择天津、内蒙古、山西等地的机房。
    • 控制部署规模:在数据层自身支持跨机房服务之前,不建议部署超过两个的机房。因为异地两个机房,异地容灾的目的已经达成,且服务器规模足够大,各种配套的设施也会比较健全,运维成本也相对可控。当扩展到三个点之后,新机房基础设施磨合、运维决策的成本等都会大幅增加。
    • 消息同步服务化:建议扩展各自的消息服务,从中间件或者服务层面直接支持跨机房消息同步,将消息体大小控制在10k以下,跨机房消息同步的性能和成本都比较可控。机房间的数据一致性只通过消息同步服务解决,机房内部解决缓存等与消息的一致性问题。跨机房消息同步的核心点在于消息不能丢,微博由于使用的是MCQ,通过本地写远程读的方式,可以很方便的实现高效稳定的跨机房消息同步。

    人们的总结以及经验

    1 、如果业务量不大,没必要做异地多活,因为异地多活需要的运维资源成本、开发成本都非常高; 2 、注意机房间的延时问题,延时大的可能达到100ms以上,如果业务需要多次跨机房请求应用的话,延迟的问题会彻底放大; 3 、跨机房的专线很大概率会出问题,要做好运维或者程序层面的容错; 4 、不能依赖MySQL双写,必须有适应自身业务的跨机房消息同步方案; 5 、MySQL或者其他存储的数据同步问题,在高延时和较差的网络质量的情况下,考虑如何保证同步质量; 6、 考虑使用docker等容器虚拟化技术,提高动态调度能力;

    7、Devops流程配套。devops要支持推送到两个机房。

    真实的异地双活案例

    真实的异地双活案例:

    5.27日下午17时许,支付宝被反映故障;18时许,支付宝通过官方微博给出回应,解释是因为电信运营商光纤被挖断。19时许,支付宝服务恢复正常。22时许,支付宝官方微博正式回应复原了整个事件。   围绕整个事件有很多讨论,讨论的中心最主要的有两点:“为什么光纤被挖断,会造成整个机房瘫痪”、“为什么支付宝的业务恢复用了两个小时”。   其中,第一个问题,应该是电信运营商的光纤灾备出现问题。第二个焦点问题“为什么支付宝用了2个小时恢复了业务”,一堆所谓“业内人士”众说纷纭。其实,这应该是中国金融史上,首次完全意义的灾难成功切换案例。   在此之前,中国金融行业投入重金建设的灾备系统基本上有这么两类用武之地(一般来说,增建一个灾备数据中心的建设成本是单数据中心成本的1.1-1.2倍):   1,计划内灾备切换演习,全副武装、如临大敌、不开一枪、全身而退。   2,因系统升级造成的被动灾备切换。   例如2013年闹得沸沸扬扬的某行DB2升级造成的系统回滚切换。万幸的是,这是发生在凌晨的系统升级故障,当时没有实时交易发生;某行也准备了各种应急预案,只是恢复的时间超出了计划,网点推迟了一个小时开业而已;而另一家西部的区域银行就没有这么强的科技实力了,同样是DB2升级失败,系统恢复时间用了37小时40分钟(37小时啊,吼吼,坐火车都到莫斯科了)   像支付宝这种突发情形下的灾备切换还真是头一遭,而且居然成功了。支付宝虽然运气差了点,但技术能力还真不是一般金融机构能拼的。   在支付宝微博答复中,有一个新名词——“异地多活”。在传统了灾备方案中,一般提的都是同城灾备、异地灾备、两地三中心。与传统的灾备技术相比,异地多活的特点是:在不同地点的数据中心都可以同时支持业务,而且每个地点发生的交易都是真实业务流量,而不是常见的一主一备,如果主中心没有问题,备份中心永远都是“备胎”。   这种多活数据中心的好处是:因为所有的数据中心都在支持交易,所以能节约IT成本;另外传统方式中备份系统都不在真实的交易活动状态,所以很难判断它的状态到底怎么样,在出现问题时,都不一定敢切过去。   大规模的“异地多活”,据说目前全球除了阿里能做到,也就Google和Facebook实现了,还是非金融类的业务。中国银行业,只有某国有大行在去年6月份实现了上海同城两个数据中心的双活,是“同城双活”,还没有实现“异地多活”,而且在灾难真正发生时,切换效果如何,还有待验证。   昨天是支付宝“异地双活”第一次真刀实枪的上战场,支付宝因为要满足金融行业的很多要求,特别是对交易一致性、数据完整性等方面的要求,目前还处于小范围试用阶段,没有全体上线,例如昨天杭州机房瘫痪后,有一部分流量跑在支付宝异地机房。因此,在昨天支付宝2小时整体恢复之前,并不是所有交易都停止的,并且基于“异地多活”技术,实现了这部分用户的无感知切换。   对另外没有通过“异地多活”技术切换的交易流量,支付宝选择了最稳妥的做法:首先进行了完整的数据校验,保证所有客户的客户信息、账户信息、资金信息、交易信息都是正确的,一切确认完成后,才重新“开门迎客”。这个过程耗时了一个多小时,不过相比较支付宝数亿客户所对应的校对数据量,这个时间还是可以接受的。   侧面印证切换效果的是:被挖断的光纤修到半夜才恢复,而支付宝的业务在晚间19点多恢复正常。   客观来讲,支付宝的这次表现,是一次说不上完美、但很成功的真实灾难切换,也是中国金融史上第一次在完全突发情形下,成功完成切换的真实案例。整个切换过程中,没有一条客户数据丢失,也体现了金融级的数据高可用要求,虽然切换的时间对用户来说长了点,但“就像是一次跳水,整体完成的质量很高,只是落水时水花没有压好,水花稍微大了点。”   估计经过这次折腾,支付宝全盘推进“异地多活”的速度会加快,可能在今年七八月份实现。

    部分内容整理自网络

    展开全文
  • 后台服务可以划分为两类,有状态和无状态。高可用对于无状态的应用来说是比较简单的,无状态的应用,只需要通过F5或者任何代理的方式就可以很好的解决。... 异地双活 异地多活 在聊异地多活的时候

    后台服务可以划分为两类,有状态和无状态。高可用对于无状态的应用来说是比较简单的,无状态的应用,只需要通过F5或者任何代理的方式就可以很好的解决。后文描述的主要是针对有状态的服务进行分析。服务端进行状态维护主要是通过磁盘或内存进行保存,比如MySQL数据库,redis等内存数据库。除了这两种类型的维护方式,还有jvm的内存的状态维持,但jvm的状态生命周期通常很短。

    高可用的一些解决方案

    高可用,从发展来看,大致经过了这几个过程:

    • 冷备
    • 双机热备
    • 同城双活
    • 异地双活
    • 异地多活

    在聊异地多活的时候,还是先看一些其他的方案,这有利于我们理解很多设计的缘由。

    冷备

    冷备,通过停止数据库对外服务的能力,通过文件拷贝的方式将数据快速进行备份归档的操作方式。简而言之,冷备,就是复制粘贴,在linux上通过cp命令就可以很快完成。可以通过人为操作,或者定时脚本进行。有如下好处:

    • 简单
    • 快速备份(相对于其他备份方式)
    • 快速恢复。只需要将备份文件拷贝回工作目录即完成恢复过程(亦或者修改数据库的配置,直接将备份的目录修改为数据库工作目录)。更甚,通过两次mv命令就可瞬间完成恢复。
    • 可以按照时间点恢复。比如,几天前发生的拼多多优惠券漏洞被人刷掉很多钱,可以根据前一个时间点进行还原,“挽回损失”。

    以上的好处,对于以前的软件来说,是很好的方式。但是对于现如今的很多场景,已经不好用了,因为:

    • 服务需要停机。n个9肯定无法做到了。然后,以前我们的停机冷备是在凌晨没有人使用的时候进行,但是现在很多的互联网应用已经是面向全球了,所以,任何时候都是有人在使用的。
    • 数据丢失。如果不采取措施,那么在完成了数据恢复后,备份时间点到还原时间内的数据会丢失。传统的做法,是冷备还原以后,通过数据库日志手动恢复数据。比如通过redo日志,更甚者,我还曾经通过业务日志去手动回放请求恢复数据。恢复是极大的体力活,错误率高,恢复时间长。
    • 冷备是全量备份。全量备份会造成磁盘空间浪费,以及容量不足的问题,只能通过将备份拷贝到其他移动设备上解决。所以,整个备份过程的时间其实更长了。想象一下每天拷贝几个T的数据到移动硬盘上,需要多少移动硬盘和时间。并且,全量备份是无法定制化的,比如只备份某一些表,是无法做到的。

    如何权衡冷备的利弊,是每个业务需要考虑的。

    双机热备

    热备,和冷备比起来,主要的差别是不用停机,一边备份一边提供服务。但还原的时候还是需要停机的。由于我们讨论的是和存储相关的,所以不将共享磁盘的方式看作双机热备。

    Active/Standby模式

    相当于1主1从,主节点对外提供服务,从节点作为backup。通过一些手段将数据从主节点同步到从节点,当故障发生时,将从节点设置为工作节点。数据同步的方式可以是偏软件层面,也可以是偏硬件层面的。

    偏软件层面的,比如mysql的master/slave方式,通过同步binlog的方式;sqlserver的订阅复制方式。

    偏硬件层面,通过扇区和磁盘的拦截等镜像技术,将数据拷贝到另外的磁盘。偏硬件的方式,也被叫做数据级灾备;偏软件的,被叫做应用级灾备。后文谈得更多的是应用级灾备。

    双机互备

    本质上还是Active/Standby,只是互为主从而已。双机互备并不能工作于同一个业务,只是在服务器角度来看,更好的压榨了可用的资源。比如,两个业务分别有库A和B,通过两个机器P和Q进行部署。那么对于A业务,P主Q从,对于B业务,Q主P从。整体上看起来是两个机器互为主备。这种架构下,读写分离是很好的,单写多读,减少冲突又提高了效率。

    其他的高可用方案还可以参考各类数据库的多种部署模式,比如mysql的主从、双主多从、MHA;redis的主从,哨兵,cluster等等。

    同城双活

    前面讲到的几种方案,基本都是在一个局域网内进行的。业务发展到后面,有了同城多活的方案。和前面比起来,不信任的粒度从机器转为了机房。这种方案可以解决某个IDC机房整体挂掉的情况(停电,断网等)。

    同城双活其实和前文提到的双机热备没有本质的区别,只是“距离”更远了,基本上还是一样(同城专线网速还是很快的)。双机热备提供了灾备能力,双机互备避免了过多的资源浪费。

    在程序代码的辅助下,有的业务还可以做到真正的双活,即同一个业务,双主,同时提供读写,只要处理好冲突的问题即可。需要注意的是,并不是所有的业务都能做到。

    业界更多采用的是两地三中心的做法。远端的备份机房能更大的提供灾备能力,能更好的抵抗地震,恐袭等情况。双活的机器必须部署到同城,距离更远的城市作为灾备机房。灾备机房是不对外提供服务的,只作为备份使用,发生故障了才切流量到灾备机房;或者是只作为数据备份。

    原因主要在于:距离太远,网络延迟太大。如上图,用户流量通过负载均衡,将服务A的流量发送到IDC1,服务器集A;将服务B的流量发送到IDC2,服务器B;同时,服务器集a和b分别从A和B进行同城专线的数据同步,并且通过长距离的异地专线往IDC3进行同步。当任何一个IDC当机时,将所有流量切到同城的另一个IDC机房,完成了failover。

    当城市1发生大面积故障时,比如发生地震导致IDC1和2同时停止工作,则数据在IDC3得以保全。同时,如果负载均衡仍然有效,也可以将流量全部转发到IDC3中。不过,此时IDC3机房的距离非常远,网络延迟变得很严重,通常用户的体验的会受到严重影响的。

    上图是一种基于Master-Slave模式的两地三中心示意图。城市1中的两个机房作为1主1从,异地机房作为从。也可以采用同城双主+keepalived+vip的方式,或者MHA的方式进行failover。但城市2不能(最好不要)被选择为Master。

    异地双活

    同城双活可以应对大部分的灾备情况,但是碰到大面积停电,或者自然灾害的时候,服务依然会中断。对上面的两地三中心进行改造,在异地也部署前端入口节点和应用,在城市1停止服务后将流量切到城市2,可以在降低用户体验的情况下,进行降级。但用户的体验下降程度非常大。

    所以大多数的互联网公司采用了异地双活的方案。

    上图是一个简单的异地双活的示意图。流量经过LB后分发到两个城市的服务器集群中,服务器集群只连接本地的数据库集群,只有当本地的所有数据库集群均不能访问,才failover到异地的数据库集群中。

    在这种方式下,由于异地网络问题,双向同步需要花费更多的时间。更长的同步时间将会导致更加严重的吞吐量下降,或者出现数据冲突的情况。吞吐量和冲突是两个对立的问题,你需要在其中进行权衡。例如,为了解决冲突,引入分布式锁/分布式事务;为了解决达到更高的吞吐量,利用中间状态、错误重试等手段,达到最终一致性;降低冲突,将数据进行恰当的sharding,尽可能在一个节点中完成整个事务。

    对于一些无法接受最终一致性的业务,饿了么采用的是下图的方式:

    对于个别一致性要求很高的应用,我们提供了一种强一致的方案(Global Zone),Globa Zone是一种跨机房的读写分离机制,所有的写操作被定向到一个 Master 机房进行,以保证一致性,读操作可以在每个机房的 Slave库执行,也可以 bind 到 Master 机房进行,这一切都基于我们的数据库访问层(DAL)完成,业务基本无感知。

    也就是说,在这个区域是不能进行双活的。采用主从而不是双写,自然解决了冲突的问题。

    实际上,异地双活和异地多活已经很像了,双活的结构更为简单,所以在程序架构上不用做过多的考虑,只需要做传统的限流,failover等操作即可。但其实双活只是一个临时的步骤,最终的目的是切换到多活。因为双活除了有数据冲突上的问题意外,还无法进行横向扩展。

    异地多活

    根据异地双活的思路,我们可以画出异地多活的一种示意图。每个节点的出度和入度都是4,在这种情况下,任何节点下线都不会对业务有影响。但是,考虑到距离的问题,一次写操作将带来更大的时间开销。时间开销除了影响用户体验以外,还带来了更多的数据冲突。在严重的数据冲突下,使用分布式锁的代价也更大。这将导致系统的复杂度上升,吞吐量下降。所以上图的方案是无法使用的。

    回忆一下我们在解决网状网络拓扑的时候是怎么优化的?引入中间节点,将网状改为星状:

    改造为上图后,每个城市下线都不会对数据造成影响。对于原有请求城市的流量,会被重新LoadBalance到新的节点(最好是LB到最近的城市)。为了解决数据安全的问题,我们只需要针对中心节点进行处理即可。但是这样,对于中心城市的要求,比其他城市会更高。比如恢复速度,备份完整性等,这里暂时不展开。我们先假定中心是完全安全的。

    如果我们已经将异地多活的业务部署为上图的结构,很大程度解决了数据到处同步的问题,不过依然会存在大量的冲突,冲突的情况可以简单认为和双活差不多。那么还有没有更好的方式呢?

    回顾一下前文提到的饿了么的GlobalZone方案,总体思路就是“去分布式”,也就是说将写的业务放到一个节点的(同城)机器上。阿里是这么思考的:

    实际上我猜测很多业务也是按照上图去实现的,比如滴滴打车业务这种,所有的业务都是按城市划分开的。用户、车主、目的地,他们的经纬度通常都是在同一个城市的。单个数据中心并不需要和其他数据中心进行数据交互,只有在统计出报表的时候才需要,但报表是不太注重实时性的。那么,在这种情况下,全国的业务其实可以被很好的sharding的。

    但是对于电商这种复杂的场景和业务,按照前文说的方式进行sharding已经无法满足需求了。因为业务线非常复杂,数据依赖也非常复杂,每个数据中心相互进行数据同步的情况无可避免。淘宝的解决方式和我们切分微服务的方式有点类似:

    注意看图中的数据同步箭头。以交易单元为例,属于交易单元的业务数据,将与中心单元进行双向同步;不属于交易单元的业务数据,单向从中心单元同步。中心单元承担了最复杂的业务场景,业务单元承担了相对单一的场景。对于业务单元,可以进行弹性伸缩和容灾;对于中心单元,扩展能力较差,稳定性要求更高。可以遇见,大部分的故障都会出现在中心单元。

    按照业务进行单元切分,已经需要对代码和架构进行彻底的改造了(可能这也是为什么阿里要先从双活再切到多活,历时3年)。比如,业务拆分,依赖拆分,网状改星状,分布式事务,缓存失效等。除了对于编码的要求很高以外,对测试和运维也有非常大的挑战。如此复杂的情况,如何进行自动化覆盖,如何进行演练,如何改造流水线。这种级别的灾备,不是一般公司敢做的,投入产出也不成正比。不过还是可以把这种场景当作我们的“假想敌”,去思考我们自己的业务,未来会怎么发展,需要做到什么级别的灾备。相对而言,饿了么的多活方案可能更适合大多数的企业。

    本文只是通过画图的方式进行了简单的描述,其实异地多活是需要很多很强大的基础能力的。比如,数据传输,数据校验,数据操作层(简化客户端控制写和同步的过程)等。

    来源 | https://blog.dogchao.cn/?p=299 https://www.cnblogs.com/gaoyanbing/p/14066859.html
    展开全文
  • 后台服务可以划分为两类,有状态和无状态。高可用对于无状态的应用来说是比较简单的,无状态的应用,只需要通过F5或者任何代理的方式就可以很好的解决。后文描述的主要是针对有状态的服务进行分析。...
  • 后台服务可以划分为两类,有状态和无状态。高可用对于无状态的应用来说是比较简单的,无状态的...高可用的一些解决方案 高可用,从发展来看,大致经过了这几个过程: 冷备 双机热备 同城双活 异地
  • 在业务不断复杂化和容灾要求不断严格化的今天,如何实现云原生的异地活解决方案,成为了中大型企业不得不面对的挑战。在第十一届中国数据库技术大会(DTCC2020)上,阿里云高级数据库专家张鑫就为大家分享了阿里...
  • 我今天的分享是饿了么在数据库和多数据库...跨地域网络延时是现阶段很难突破的点,因为饿了么面临的是异地的多,所以我们需要基于延时这个前提来考虑方案。从北京到上海中间有 30 毫秒的延迟,这个会带来什么问...
  • 数据库跨云备份和异地活解决方案.PDF数据库跨云备份和异地活解决方案数据库跨云备份和异地活解决方案是一种高效、可靠、灵活、可控的数据库跨云解决方案 ,为客户提供数据库同城或异地多活、跨云备份的多云...
  • VMware双活数据心解决方案详解;2;3;作者;双活是两个或多个数据中心,每个都具有独立运行生产应用所需要的所有资源。此架构下所有的应用请求会被动态负载均衡到两个数据中心,当其中一个数据中心故障时,另外一个数据...
  • 数据库的双活设计对于异地双活,前面我很多文章都已经谈到过,实际上最难的就是数据库如何保证双活,大部分的异地容灾方案数据库本身都是单活的,一个做为备份库。根据这篇文章我们可以看到,实际上在数据库层面分为...
  • 异地双活数据库架构实战.docx
  • 互联网异地双活数据库架构.pptx
  • 饿了么异地双活数据库实战.pdf
  • MySQL异地的数据双向复制方案.docx

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,041
精华内容 1,616
热门标签
关键字:

异地双活解决方案