高可用架构

Feb 5, 2022 22:30 · 1463 words · 3 minute read Architecture

高可用存储架构

常见的高可用存储架构:

  • 主备
  • 主从
  • 主主
  • 集群
  • 分区

1. 主备

备机平时不承担实际的业务读写,需要人工操作将备机升级为主机。

  • 优点:
    • 备机升级为主机对客户端透明
    • 主备之间只需要复制数据,无需状态判断和主备切换
  • 缺点:
    • 备机平时不提供读写,浪费硬件和算力
    • 故障需要人工干预,容易翻车

2. 主从

主机可读写,从机只读。

  • 优点:
    • 主机故障不影响读操作
    • 从机提供读操作,对硬件有一定的利用率
  • 缺点:
    • 客户端需要感知主从关系,写操作不能发送给从机
    • 主从复制延迟会导致数据不一致
    • 故障需要人工干预

适合写少读多的业务:论坛、BBS、新闻网站

3 主备/主从切换

主备/主从共同存在的问题:

  • 主机故障后无法进行写操作
  • 发生故障需要人工干预

由系统自动决定角色并实现切换。

3.1 关键点

  • 主备/主从间状态判断
    • 状态传递渠道:
      • 互连
      • 连接至第三方中介
    • 状态检测:
      • 机器是否挂了
      • 进程是否挂了
      • 响应速度
  • 切换决策
    • 切换时机

      • 主机挂了
      • 主机上进程挂了
      • 主机响应过慢
    • 切换策略

      主机故障恢复后

      • 再次切换成为主机
      • 成为备机
    • 自动程度

      • 全自动
      • 半自动(需要人工确认)
  • 解决数据冲突

3.2 架构

3.2.1 互连

主备/主从机之间直接建立状态传递通道。

状态传递通道实现:

  • 网络连接/串口连接
  • 主机主动发送给备机/备机从主机拉取状态信息
  • 共用数据复制通道/独立通道

主备机绑定虚拟 IP,对客户端透明。

主要缺点:状态传递通道故障会导致脑裂。

3.2.2 中介

主备/从机将状态上报给中介,通过中介传递状态信息。

状态决策:

  1. 所有节点初始状态都是备机,只要与中介断开连接就降级为备机
  2. 主机与中介断连后,中介能够告知备机,备机升级为主机
  3. 原来的主机恢复后,以备机的身份向中介上报状态,新的主机不会降级

关键在于实现中介的高可用,选用成熟的方案:

  • keepalived
  • ZooKeeper
  • etcd
3.2.3 模拟

备机模拟客户端向主机发送读写操作,根据读写操作的响应情况来判断主机的状态。

  • 优点:实现简单,不需要状态传递通道
  • 缺点:响应状态有限,可能有偏差
    • HTTP 状态码
    • 超时

4. 主主

主要优点:

  • 两台都是主机,不用切换
  • 客户端读写操作随便发送给其中一台即可

实现数据双向复制,但是有很多数据是不能双向复制的。

适合临时性、可丢失数据、数据可被覆盖的业务:用户登录产生的 token,内容草稿数据

5. 集群(两台以上)

  • 复制集群:数据量不大,集群节点数量不多
  • 切片集群:业务数据量巨大,集群节点数量庞大

5.1 复制集群

1 主 N 备/从

只有主机可读写,备/从机只读。

关键点:

  • 主机如何将数据复制给备/从机
  • 主机如何检测备机状态
  • 如何从多台备/从机中选出新的主机

5.2 切片集群

数据分散到不同的服务器上,每个服务器只存储一部分数据,而且备份一部分数据。

关键点:

  • 数据分配均衡
  • 当部分节点故障,要将分配给故障服务器的数据重新分配给其他节点
  • 扩充服务器后自动将部分数据迁移至新节点

切片集群中的所有节点都可以处理读写请求,需要某个组件来负责数据分配。

  • 使用一台独立的服务器(Hadoop)
  • 选举出集群中的某个节点(Elasticsearch)

6. 分区

应对地震、火灾等极端灾难事故。 将数据分布在不同的地理位置(城市)上,每个分区存储一部分数据。

6.1 分区规则

  • 洲际分区

    网络延迟很大,一般仅用作备份

  • 国家分区

    不同国家有不同语言、法律、业务等,一般也仅用作备份

  • 城市分区

    网络延迟较低,分区可以同时对外提供服务

6.2 复制规则

分区的数据量也不小,如果被破坏同样损失惨重,需要考虑复制方案。

  1. 集中式

    所有分区的数据都备份到同一个备份中心。

    • 设计简单
    • 扩展容易,新增分区的数据同样复制到备份中心
    • 成本高
  2. 互备式

    每个分区备份另外一个分区的数据。

    • 设计复杂,每个分区除了存储业务数据,还要存储备份数据
    • 扩展麻烦,要迁移备份数据
    • 成本低
  3. 独立式

    每个分区自己有独立的异地备份中心。

    • 设计简单
    • 扩展容易
    • 成本最高