导读:《架构设计》系列为极客时间李运华老师《从0开始学架构》课程笔记。本文为第六部分,主要介绍高可用计算架构,介绍了高可用架构设计的要点以及不同架构方式的优缺点。

扫描文末二维码 关注公众号 回复 “架构设计” 获取架构设计笔记完整思维导图

高可用计算架构

设计思想:通过增加更多服务器来达到计算高可用
设计复杂度:主要体现在任务管理方面,即当任务在某台服务器上执行失败后,如何将任务重新分配到新的服务器进行执行

哪些服务器可以执行任务

  • 每个服务器都可以执行任务
  • 只有特定服务器(通常叫“主机”)可以执行任务。当执行任务的服务器故障后,系统需要挑选新的服务器来执行任务

任务如何重新执行

  • 对于已经分配的任务即使执行失败也不做任何处理,系统只需要保证新的任务能够分配到其他非故障服务器上执行即可
  • 设计一个任务管理器来管理需要执行的计算任务,服务器执行完任务后,需要向任务管理器反馈任务执行结果,任务管理器根据任务执行结果来决定是否需要将任务重新分配到另外的服务器上执行

架构设计

主备

主备架构是计算高可用最简单的架构,和存储高可用的主备复制架构类似,但是要更简单一些,因为计算高可用的主备架构无须数据复制

详细设计

  • 主机执行所有计算任务
  • 当主机故障(例如,主机宕机)时,任务分配器不会自动将计算任务发送给备机,此时系统处于不可用状态
  • 如果主机能够恢复(不管是人工恢复还是自动恢复),任务分配器继续将任务发送给主机。
  • 如果主机不能够恢复(例如,机器硬盘损坏,短时间内无法恢复),则需要人工操作,将备机升为主机,然后让任务分配器将任务发送给新的主机(即原来的备机);同时,为了继续保持主备架构,需要人工增加新的机器作为备机。

备机

  • 冷备:备机上的程序包和配置文件都准备好,但备机上的业务系统没有启动
  • 温备:备机上的业务系统已经启动,只是不对外提供服务

优缺点

  • 优点就是简单,主备机之间不需要进行交互,状态判断和切换操作由人工执行,系统实现很简单
  • 缺点正好也体现在“人工操作”这点上

主从

计算高可用的主从架构中的从机也是要执行任务的。任务分配器需要将任务进行分类,确定哪些任务可以发送给主机执行,哪些任务可以发送给备机执行

详细设计

  • 正常情况下,主机执行部分计算任务,,备机执行部分计算任务
  • 当主机故障(例如,主机宕机)时,任务分配器不会自动将原本发送给主机的任务发送给从机,而是继续发送给主机,不管这些任务执行是否成功
  • 如果主机能够恢复(不管是人工恢复还是自动恢复),任务分配器继续按照原有的设计策略分配任务
  • 如果主机不能够恢复,则需要人工操作,将原来的从机升级为主机(一般只是修改配置即可),增加新的机器作为从机,新的从机准备就绪后,任务分配器继续按照原有的设计策略分配任务

优缺点

  • 优点:主从架构的从机也执行任务,发挥了从机的硬件性能。
  • 缺点:主从架构需要将任务分类,任务分配器会复杂一些。

集群

计算高可用集群包含 2 台服务器的集群,这点和存储高可用集群不太一样。存储高可用集群把双机架构和集群架构进行了区分;而在计算高可用集群架构中,2 台服务器的集群和多台服务器的集群,在设计上没有本质区别,因此不需要进行区分

对称集群

通俗的叫法是负载均衡集群。集群中每个服务器的角色都是一样的,都可以执行所有任务

详细设计
  • 正常情况下,任务分配器采取某种策略(随机、轮询等)将计算任务分配给集群中的不同服务器
  • 当集群中的某台服务器故障后,任务分配器不再将任务分配给它,而是将任务分配给其他服务器执行。
设计关键点
  • 任务分配器需要选取分配策略

    • 任务分配策略比较简单,轮询和随机基本就够了
  • 任务分配器需要检测服务器状态

    • 状态检测稍微复杂一些,既要检测服务器的状态,例如服务器是否宕机、网络是否正常等;同时还要检测任务的执行状态,例如任务是否卡死、是否执行时间过长等。
    • 常用的做法是任务分配器和服务器之间通过心跳来传递信息,包括服务器信息和任务信息,然后根据实际情况来确定状态判断条件。

非对称集群

非对称集群中不同服务器的角色是不同的,不同角色的服务器承担不同的职责

详细设计
  • 集群会通过某种方式来区分不同服务器的角色。
  • 任务分配器将不同任务发送给不同服务器。
  • 当指定类型的服务器故障时,需要重新分配角色。
设计复杂度
  • 任务分配策略更加复杂:需要将任务划分为不同类型并分配给不同角色的集群节点。
  • 角色分配策略实现比较复杂:例如,可能需要使用 ZAB、Raft 这类复杂的算法来实现 Leader 的选举。

个人思考

相对高可用存储架构,计算架构相对简单,不涉及数据同步和一致性。关键点在于如何将请求路由到合适的实例上。

reference

  1. 从 0 开始学架构

aneutron
6 声望2 粉丝