【架构设计】29-异地多活设计4步走

跨城异地设计的4个步骤:

第一步:业务分级

按照一定的标准,对业务进行分级,挑选出核心业务,只为核心业务设计异地多活,降低方案整体复杂度和成本。

常见的分级标准:

  • 访问量大的业务
  • 核心业务
  • 产生大量收入的业务

第二步:数据分类

挑选出核心业务后,需要对核心业务的数据进一步分析,目的在于所有数据及数据特征。这些数据特征会影响后面的方案设计。

常见的数据特征维度:

  • 数据量

    数据量包括总的数据量和新增、修改、删除的量。对异地多活的架构,新增、修改、删除的数据就是需要同步的数据。数据量越大,同步的延迟的概率就越高,同步方案需要考虑相应的解决方案。

  • 唯一性

    唯一性是批多个异地机房产生的同类数据必须保证唯一。例如:用户ID,如果多个机房的二个不同用户产生相同的用户ID,那么业务上就是错误的。

    数据的唯一性影响业务的多活设计,如果数据不要求唯一,那说明二个地方都产生同类数据是可能的。如果数据要求必须是唯一的,要么就是只能由一个中心点产生数据,要么就需要设计一个数据唯一生成算法。

  • 实时性

    实时性是指A机房修改数据后,要求多长时间同步到B机房,实时性要求越高,对同步的要求越高,方案越复杂。

  • 可丢失性

    可丢失性是指数据是否可以丢失。例如:写入A机房的数据还没有同步到B机房,此时A机房机器宕机会导致数据丢失,那这部分数据的丢失是否会对业务产生影响。

    例如:用户session数据是可以丢失的,而用户ID数据是不可以丢失的。

  • 可恢复性

    可恢复性是指在数据丢失后,是否可以使用某种方式进行恢复。如果数据可以恢复,至少说明对业务的影响不会很大,这样可以降低异地多活架构设计的复杂度。

第三步:数据同步

确定数据的特征后,我们可以根据不同的数据特征选择不同的数据同步方案:

  • 存储系统的同步,例如:使用Mysql的数据主从数据同步,主主数据同步。

    这类同步方案简单,几乎所有的存储方案都会有自己的数据同步方案,缺点是这类方案都是通用的,无法根据业务数据特点进行定制化的控制。

  • 消息队列同步

    采用独立的消息队列进行数据同步,常见的消息队列有:kafka,ActiveMQ,RocketMQ等。

    消息队列同步适合无事务性或无时序性要求的数据。

  • 重复生成

    数据不同步到异地机房,每个机房可以生成数据,这个方案适合生成可以重复生成的数据。

第四步:异常处理

无论数据同步方案如何设计,一旦出现极端异常的情况,总是会有部分数据会出现异常的。例如:同步延迟、数据丢失、数据不一致等。异常处理就是假设在出现这些问题时,系统将采取什么措施来应对。异常处理主要有以下几个目的:

  • 问题出现时,避免少量数据异常导致整体业务不可用。
  • 问题恢复后,将异常的数据进行修复。
  • 对用户进行安抚,弥补用户损失。

常见的异常处理方案:

  • 多通道同步设计
    多通道同步设计是采取多种方式进行数据同步,其中某条通道故障的情况下,系统可以通过其它方式进行同步,这各方式可应对单通道故障出故障的情况。

    多通道同步设计的关键点有:

    • 一般情况下,设计双通道即可,采取更多的通道理论上能够降低风险,但付出的成本也会增加很多。
    • 数据库同步和消息队列同步通道不能采用相同的网络连接,否则一旦网络故障,二个通道同时故障,可以一个走公网连接,一个走内网连接。
    • 数据是可以重复覆盖的,即无论哪个通道先到哪个通道后到,最终结果都是一致的。
  • 同步和访问结合
    访问是指异地机房通过系统的接口来进行访问。
    同步和访问结合的设计关键点:

    • 接口访问通道和数据同步通道不能采用相同的网络连接,不能让数据库同步和接口访问都走同一条网络通道,可以采用接口访问走公网,数据同步走内网的方式。
    • 数据有路由规则,可以根据数据来推断应该访问哪个机房的接口来访问数据。
    • 由于有同步通道,优先读取本地数据,本地数据无法读取到再通过接口去访问,这样可以大大降低跨机房的异地接口访问量,适合于实时性要求很高的数据。
  • 日志记录
    日志记录主要用于故障恢复后进行数据恢复,其主要方式是在关键操作前后增加日志记录,然后将日志保存到一个独立的地方,当故障恢复后,拿日志跟数据进行对比,对数据进行修复。

    为了应对不同级别的故障,日志保存的要求也不一致,常见的日志保存方式有:

    • 服务器上保存日志,数据库服务器上保存数据,这种方式可以应对数据库服务器宕机或故障的情况。
    • 本地独立系统保存日志,可以应对应用服务器和数据库服务器同时出现故障的情况。
    • 日志异地保存,这种方式可以应对机房宕机的情况。

      上面不同的日志保存方式,应对的故障越严重,方案本身的复杂度和成本就越高,实际选择时要考虑成本和效益。

  • 用户补偿

    无论采取合种措施,都只能最大限度的降低受到影响的范围和程度,无法完全做到没有任何影响。无论多么完美的方式,故障的情况下都有可能有一小部分用户业务出现问题,系统无法弥补这部分用户的损失。但我们可以用人工的方式对业务进行补偿,减少用户损失,增加用户忠诚度。简单来说,系统的方案是为了保障99.99的用户在故障情况下不受影响,人工的补偿是为了弥补这0.01%的损失。


   转载规则


《【架构设计】29-异地多活设计4步走》 孤独如梦 采用 知识共享署名 4.0 国际许可协议 进行许可。
 上一篇
【架构设计】30-如何应对接口级的故障? 【架构设计】30-如何应对接口级的故障?
异地多活主要是解决系统级别的故障,例如:机器宕机、机房故障、网络故障等。虽然这些故障的影响很大,但是发生概率低。还有一类故障是业务运行中经常遇到的:接口级故障。 接口级故障的表现是系统没有宕机、网络也没有中断,但业务却出问题了。例如:业务访
2019-05-29
下一篇 
【架构设计】45-架构重构内功心法第二式:合纵连横 【架构设计】45-架构重构内功心法第二式:合纵连横
45-架构重构内功心法第二式:合纵连横前文讲到的是有的放矢,需要架构师透过问题现象看到问题本质,找出真正需要通过架构解决的核心问题,而不是想一次性解决所有的问题。 下文讲述架构重构的合纵连横。 合纵架构重构是一个大动作,持续时间比较长,而且
2019-05-29
  目录