高可用

发布时间 2023-07-10 13:52:32作者: 张家豪

高可用

存储高可用

问题:主要是副本冗余实现高可用

  • 数据如何复制
  • 各个节点的职责是什么
  • 如何应对复制延迟
  • 如何应对复制中断

主备复制

详细设计

  • 1.主机存储数据,通过复制渠道复制给备机
  • 2.正常情况下,所有的请求直接发给主机,备机只做数据的备份不提供任何的读写
  • 3.主机出现故障的情况下,所有的请求不会发送到备机,整个系统处于中断状态,不可读写数据,但数据并没有全部丢失,备机还存在数据备份
  • 4.主机恢复后,读写继续访问主机,主机数据继续复制给备机
  • 5.如果主机不可修复,可通过人工备机升为主机,但是为了保持主备,需要新增机器
  • 6.主机不可恢复情况下,可能存在数据只到主机还未复制到备机的情况,此种数据就需要人工修复,业务也需要考虑改情况
  • 7.复制可能存在延迟,但是备机不提服务,所以不会影响系统,但是若存在大量数据未同步,突然主机不可修复,会损失大量数据,所以不可掉以轻心,需要添加监控,若存在延迟过大需要人工介入

优点

  • 客户端无感知,只需要回复后进行重新连接
  • 只需要数据同步,不需要进行机器的状态判断和倒换

缺点

  • 备机只提供备份,不提供读写,造成成本浪费
  • 故障后需要人工干预,无法自动恢复

主从复制

详细设计

  • 1.主机存储数据,通过复制渠道复制给备机
  • 2.写操作发给主机,读操作则根据业务进行发给主机还是从机
  • 3.主机故障的情况下,客户端不可写入数据,读操作可以发给从机是不影响读数据。适用于读操作较多的场景如新闻网站
  • 4.如果主机恢复后,写操作还继续访问主机,主机数据绩溪复制到从机
  • 5.如果主机不可修复,可通过人工从机升为主机,为了保持主从需要添加新主机
  • 6.主机不可恢复情况下,可能存在数据只到主机还未复制到备机的情况,此种数据就需要人工修复,业务也需要考虑改情况
  • 7.主从之间可能存在同步延迟,导致读取主从数据不一致问题,若是需要强一致性,则需要直接读取主机

优点

  • 主机出现故障时读操作不会受到影响
  • 从机提供读,发挥了硬件的性能

缺点

  • 客户端需要感知主从,不同的命令发送到不同的机器

主备倒换和主从倒换

主从/主备的共性问题

  • 主机故障不能写操作
  • 如果主机无法恢复则需要人工参与

考虑的关键点

  • 状态判断
    • 状态传递渠道:相互连接还是三方仲裁
    • 状态检测的内容:机器能够正常提供服务
  • 倒换决策
    • 倒换时机:什么时候倒换,是主机停机 3s 还是其他参数
    • 倒换策略:主机恢复后还是主机还是恢复后变为从/备机
    • 自动程度:全自动还是半自动(人工确认)
  • 数据冲突
    • 同步中主机出现故障导致主机和从/备机数据不一致问题怎么处理

常见架构

  • 互联式:主备/主从相互连接
    • 问题:需要主、备、客户端左右做修改;连接通道出现问题就会出现多主或多从问题,若是多种连接通道就会浪费资源
  • 中介式:引入中介方,MongDB 就是这种模式
    • 优点:实现简单,只需要中介读取主从节点,然后根据状态进行确定各方是否主备情况
    • 缺点:为了保证中介方高可用就会引入新的问题
    • 开源中介 ZooKeeper
  • 模拟式:从节点模拟客户端访问主节点
    • 优点:实现更简单省去连接通道和状态管理
    • 缺点:基于有限状态做决定,可能出现偏差

主主复制

详细设计

  • 1.两台主机都存储数据,通过复制通道将数据复制到另外一台主机
  • 2.正常情况下,客户端可以将读写操作发送给任意一台主机
  • 3.一台主机故障情况下,客户端只需要把读写操作发送给另一个主机
  • 4.如果故障主机恢复,客户端继续访问两台主机,两台主机之间互相复制对方数据
  • 5.如果故障主机不能恢复则需要人工添加一台新的主机
  • 6.存在某个主机写入数据后还未同步至另一台主机,该主机崩溃导致的书记丢失,需要考虑此风险
  • 7.存在同步延迟,可能写入了A,在B上读取不到刚刚写入的数据

优点

  • 两台都是主机,不存在倒换概念
  • 客户端无需分辨不同角色的主机,随便将读写操作发送给哪台主机都行

缺点

  • 部分数据不能双向复制,例如库存,A-1 和B-2双向复制会导致数据错误

数据集群

集中集群:每个节点的数据都是完整的一份

  • 需要考虑的
    • 主机如何将数据复制给备机
    • 备机如何检测主机状态
    • 主机故障后,如何决定新的主机

分散集群:每台服务器都会负责存储一部分数据,为了提升硬件利用率,每台服务器又会备份一部分数据

  • 需要考虑的
    • 均衡性
    • 容错性
    • 可伸缩性

分布式算法

分布式一致性算法

  • Paxos算法
  • Raft算法
  • ZAB算法

数据分区

数据量,数据量越大分区规则越复杂

分区规则

复制规则

  • 集中式:数据统一复制到总的备份中心
  • 互备式,节点之间相互备份
    • 优缺点
      • 设计比较复杂
      • 扩展麻烦
      • 成本低,可以直接利用已有的设备
  • 独立式:每个节点有自己的备份节点
    • 设计简单,各分区互不影响
    • 扩展容器,新增分区只需要搭建自己的备份中心即可
    • 成本高

计算高可用

设计关键点

  • 哪些服务器可以执行任务
  • 任务如何重新执行

主备

详细设计

    1. 主机执行所有的计算任务
  • 2.当主机故障时,任务分配其不会自动将任务发送给备机,此时系统不可用状态
  • 3.如果主机能够恢复,任务分配器继续将任务发送给主机
  • 4.如果主机不能恢复,则人工将备机升级为主机,需要添加新主机做备机

细分

  • 冷备:备机启动状态,但是未启动业务系统,当备机升级为主机时,启动业务系统
  • 温备:业务系统已经启动,但是不对外服务,当备机升级为主机时,让它正式提供服务

主从

详细设计

    1. 一般情况下,主机执行部分任务,备机执行部分任务
    1. 当主机出现故障时,任务分配器不会自动的将原来发给主机的任务发给从机,而是继续发送给主机,不管这些任务执行是否成功
  • 3.如果主机能够恢复,任务分配器继续将任务发送给主机
  • 4.如果主机不能恢复,则人工把原来的从机升为主机,然后添加新的主机为从机

优点

  • 主从架构的从机也执行任务,发挥了硬件的性能

缺点

  • 主从架构需要对任务进行分类,任务分配器会更复杂一些

根据节点角色分类

  • 解决的问题:从或主备,人工效率低,容器出错,不能及时处理故障
  • 对称集群(负载均衡集群):所有节点的角色一致
    • 详细设计
      • 1.正常情况下,任务采取某种策略(轮询、权重、资源)等方法,将任务分配到集群中的不同服务器
      • 2.当某台服务器出现故障,任务不再将任务分配给该机器,转而分配给其他的服务器
      • 3.当故障的服务器恢复后,任务将再次分配给该机器
  • 非对称集群:分角色master-slave
    • 详细设计
        1. 集群会通过某种方式区分服务器的不同角色,例如 Paxos 算法选举或者简单的 id 最小的为 master
      • 2.任务分配器将不同的任务分配给不同的角色
    • 复杂度的体现
      • 1.任务分配的策略更加复杂
      • 2.角色分配更加复杂

业务高可用

异地多活

两个标准

    1. 正常情况下用户访问不管哪一地点的业务系统,都能够得到正确的业务服务
  • 2.某地异常的情况下, 用户访问到另一地点的业务系统,也能够得到正确的业务服务

两个代价

  • 1.系统的复杂度会发生质的变化
  • 2.成本会上升

架构

  • 同城异区:相比设计和实现的降低了复杂度和成本,但是同城天灾时出现都不可用的概率增大
  • 跨城异地:相比同城天灾影响的概率降低,但是由于存在网络延迟等问题,相关成本大大增加
  • 跨国异地:成本最大

使用场景

  • 为不同的地区提供服务
  • 只读类做多活

技巧

  • 同城异区:网络延迟较低可以不用考虑设计
  • 跨城异地:主要网络延迟导致的数据不一致问题,架构是需要考虑
  • 跨国异地:为不同的地区提供服务和只读所以对系统的设计并不多
  • 技巧一:保证核心业务的异地多活
  • 技巧二:核心数据最终一致性
    • 减少异地多活的距离,搭建高速网络
    • 尽量减少数据同步,只同步核心数据
    • 保证数据最终一致性,不保证实时一致性
  • 技巧三:采用多种数据同步手段
    • 消息队列方式
    • 二次读取
    • 存储系统同步方式
    • 回源读取方式:优先访问上次请求的主机
    • 重新生成数据方式
  • 技巧四:只保证绝大部分用户的异地多活

设计步骤

  • 1.业务分级
    • 访问量大的业务
    • 核心业务
    • 产生大量收入的业务
  • 2.数据分类
    • 数据量
    • 唯一性
    • 实时性
    • 可丢失性
    • 可恢复性
  • 3.数据同步
    • 存储系统同步方式
    • 消息队列方式
    • 重新生成数据方式
  • 4.异常处理
    • 目的
      • 避免少量数据导致整体业务不可用
      • 问题恢复后,对异常数据进行修复
      • 对用户安抚,进行补偿
    • 措施
      • 多通道同步
        • 一般采用两个通道,再多成本较高
        • 通道尽量隔离,如使用同一个网络,若出现网络问题则都不可用
        • 需要数据覆盖,无论走哪一通道最后结果一致
      • 同步和访问结合
        • 接口访问和数据同步不要走同一个网络
        • 数据有路由规则,可以通过数据确定需要访问哪个去补偿
        • 优先本地数据,其次远程调用,可以节省大量的调用
      • 日志记录
        • 服务器上保存日志
        • 本地独立系统保存日志
        • 日志异地保存
      • 用户补偿

接口级的故障应对方案

降级:减少功能

  • 系统后门降级:通过参数设置变量控制降级
    • 存在安全问题
    • 主机多的情况需要操作多次,效率低
  • 独立降级系统:解决系统后门降级的问题,把所有的降级抽取为一个服务进行管理

熔断:外部依赖的系统存在故障时,要熔断防止影响该系统

限流:防止用户访问过于频繁,通过限流降低短时间内访问次数

  • 基于请求限流
  • 基于资源限流

排队:如双十一秒杀,通过 MQ 排队购买