数据库异地多活相关

异地多活指分布在异地的多个站点同时对外提供服务的场景。异地多活是高可用架构设计的一种,与传统的灾备设计的最主要区别在于多活,即所有站点都是同时在对外提供服务的,以下整理自知乎开发者头条

CAP 理论

CAP 定理,指对于一个分布式计算系统而言,不可能满足同时满足以下三点

  • 一致性(Consistency)
    所有节点访问同一份最新的数据副本
  • 可用性(Availability)
    每次请求都能获取到非错的响应,但是不保证为最新的数据
  • 分区容错性(Partition tolerance)
    以实际效果而言,分区相当于对通信的时限要求。系统如果不能再时限内达成数据一致性,就意味着发生了分区的情况,必须就当前操作在 C 和 A 之间做出选择

原理

异地多活本质上是一个分布式的 AP 方案,为了实现异地多活方案,必须要做出一部分的取舍,这个取舍就是对一致性上的取舍。

架构方案

关于数据的异地多活方案,架构通常有以下几种

  • 同城异区
  • 跨城异地
  • 跨国异地

同城异区

同城异区下,DC 之间包含以下特点

  • 延迟小于 10ms
  • 搭建高速网络
  • 极端灾难不能避免
  • 复杂度,成本,故障发生概率是应对多机房故障最优架构

跨城异地

  • 网络环境复杂,延迟不确定,大致 50ms -> 1s
  • 大概率避免极端灾难
  • 距离远,搭建专用网络通道复杂度和成本高
  • 肯定会出现数据不一致,需要保证数据短时间不一致能提供服务
  • 要求数据高度一致的服务不能跨城异地,例如支付

跨国异地

  • 为不同地区用户提供服务
  • 只读类业务多活

设计方面

三个原则

由于物理限制,实时一致性无法保证,这是要保证最终一致性,并且无法做到全部业务的异地多活,只需要实现核心业务的多活即可。并且要保证大部分用户的核心业务可用。

核心数据的异地多活

  • 物理限制,不可能做到数据实时同步
  • 减少数据不能实时同步的方案
    • 减少异地机房的距z离,搭建高速网络
    • 减少数据同步,只同步核心业务的关键数据
  • 保证最终一致性,不保证实时一致性
    • 业务不依赖与数据的同步的实时性,只要最终一致性即可

采用多种手段同步数据

  • 思维误区: 只使用存储系统的同步功能
    • MySQL 低版本的单线程复制,延迟时间长
    • Redis master slave 的全量同步,slave 不能对外服务
  • 消息队列
  • 二次读取
    • 读取本地机房失败,去另一个机房读
  • 回源读取
    • 根据路由判断数据的位置,去读取
  • 重新生成数据
    • session 重新生成,重新登录
  • 存储系统本身机制同步