综述
现在越来越多的公司追求高可以,额异地多活是当前比较热门的方案, 最近和其他公司的同事交流,有一点点收获分享出来给大家.

一. 网络条件的支持
image.png

在专线环境上,基本上在国内可以保持在100ms内的延时,这个的级别的延时基本上打王者都不会太有卡的感觉,这得益于国家对于骨干网络的建设,但是这个是走专线下的效果,如果完全走外网的话延时会大很多.

有了这个基础,跨数据中心之间的数据传输就有了保障.

二. 整体的架构
image.png

可以看用户通过智能dns来路由到不同cdn节点, cdn上通过用户的id(也有可能是其他的用户标识,cookie 值等), 将请求转发到不同的部署单元.
每个部署单元都有完整的部署一套系统, 存储一份全量的数据

从这可以看出,这样的架构下,每个部署单元都是可以提供完整的服务的,但是为了解决各个部署单元之间的数据同步出现 aba问题, 即对同一份数据在多个部署单元都有写入,这样会造成数据的同步时产生冲突, 所以为了解决这个问题, 需要保证, 每个部署单元只能写入自己负责那部分用户的数据(此处的id范围配置由中心节点配置). 读取是可以的,所以当一个用户的写请求被cdn 错误的路由到错误的部署单元时, 会报错, 由前端进行重试. 或者由本单元的应用层远程调用对应的单元来实现.

三. 存储层是数据同步

image.png

可以看到,整个异地多活的难点就是在于存储层的数据同步, 因为应用层是没有状态了, 存储层状态一致的情况下, 请求在不同的应用运行的结果是一致是(前提是代码一致).

由于在数据访问层对写入数据的范围进行限制, 全局使用统一的主键生成机制保证主键不冲突, 各个部署单元写入的数据不会冲突,所以数据在部署单元之间数据同步是不会产生冲突的

当部署单元较多时, 让每个数据中心互联是比较麻烦, 所以由一个统一地方, 由各个数据中心 传输过来,并拉取其他的数据中心的数据更改记录. 这样网络就会比较简单.

四. 总结
异地多活的一个核心目标是在保障系统高可用的情况下,减低成本,因为畅通异地冷备的方案下, 需要一套完整的系统部署着不进行请求, 由于长期没有访问团队对于他的重要性会慢慢的懈怠, 到真正要用的时候会发现各种问题.
第二点就是cdn,一般的公司流量直接就进入自己的应用接入层, 在接入层增加cdn的优势有如下几点.

  1. 客户端访问cdn的边缘节点网络速度是很好的, cdn到我们的应用接入层走cdn的内部专线,其网络质量是要比客户端走外网路由跳很多跳要来得快些
  2. 可以在cdn上做很多缓存减轻后端应用压力
  3. 在cdn上可以做精确的流量调度

所以异地多活就两个点, 1.精确的流量调度, 2.可靠的数据同步