架构学习-设计计算高可用架构

前言

本文摘录于李运华老师的《从0开始学架构》课程,为精简总结。

复杂度

计算高可用架构复杂度主要体现在任务管理方面。旨当任务在某台服务器执行失败后,如何重新分配新的服务器

设计关键

1、 哪些服务器可以执行任务

  1. 每个服务器都可以执行任务

  2. 特定服务器可以执行任务,当特定服务器故障后,选定新的服务器作为特定服务器

2、任务如何重新执行

  1. 已经分配过的任务就算执行失败也不重新分配

  2. 设计一个任务分配器,服务器执行任务后需要向任务分配器反馈结果,如果服务器执行失败,则把任务重新分配到另一台服务器执行

注意:“任务分配器”是一个逻辑概念,并不一定要求系统存在一个独立的任务分配器模块,举例:

  • Nginx将页面请求发送给web服务器,这里Nginx的角色是反向代理并且承担了任务分配器的角色

  • 批量运算任务,可以单独设计一套任务分配系统

  • Zookeeper上的follower节点,当收到写请求会将请求转发给leader节点处理,这里的follower可以看做一个任务分配器

架构

主备

和存储高可用主备复制类似,但少了数据复制

架构图:

image

设计:

  • 主机执行所有的计算任务

  • 当主机宕机时,服务将不可用

  • 当主机宕机恢复时,任务分配器将把任务继续发送给主机

  • 如果主机不能够恢复或者恢复需要很久时,需要人工将备机设置为主机。同时为了维持主备方案,需要增加一台服务器作为备机

根据备机状态不同,主备架构又可细分为冷备和温备架构:

  • 冷备。备机上有和主机上相同的业务系统,但是并没有开启业务系统,此时备机服务器是开启的。主机故障后,需要人工手动将备机业务系统启动,并设置为主机。

  • 温备。备机上开启了业务系统,但是不对外提供服务。主机故障后,只需要切换备机为主机即可。

温备比冷备,在需要人工操作的时候更省时间,所以一般情况下采用温备。

主从

和存储高可用的主从类似,计算高可用的主从,从机也需要执行任务。任务分配器需要将任务分类,确定哪类任务可以发送给主机,哪类任务可以发送给从机。

架构图:

image

设计细节:

  • 一般情况下,主机执行自己的任务(上图计算任务A),从机执行自己的任务(上图计算任务B)

  • 当主机故障,任务分配器仍然将特定任务发给主机。不管成功与否

  • 当主机故障恢复时,任务分配器仍将特定任务发送给主机。

  • 当主机故障短期内无法恢复时,需要人工操作将备机切换为主机,增加新的机器为从机。按照原有分配任务执行

主从和主备架构优缺点:

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

  • 主从架构需要将任务分类,复杂度比主备要高一些

  • 主从/主备架构共存的一个问题就是,当主机发生故障时,人工恢复缓慢,效率低。

集群

鉴于以上主备和主从架构的了解,对于他们的缺点,衍生出了可以自动切换主备机的集群架构。

同时根据集群中节点角色不同又可分为

  1. 对称集群。集群中所有服务器角色都是一样的,都可以执行任何任务。

  2. 非对称集群。将集群中服务器分为多个角色,特定角色执行特定任务。例如最常见的Master-Slave角色。

对称集群

对称集群有种通俗的叫法,叫做负载均衡集群,架构图如下:

image

详细设计:

  • 一般情况下,任务分配器采取某种策略(轮询、随机、权重等)将任务均匀分发给集群中服务器

  • 如果集群中某台服务器故障,任务分配器不再将任务分发给他,而是分发给其他服务器执行

  • 故障服务器恢复正常,任务分配器将再次把任务分配给这台服务器执行

设计关键点:

  • 任务分配器需要分配策略

  • 任务分配器需要检测集群中各个服务器状态

分配策略比较简单,采取常用的轮询、随机等策略即可。

检测服务器状态复杂一些,一般情况下是任务分配器和服务器通过心跳来传递服务器信息。

非对称集群

非对称集群中不同服务器的角色是不同的,以Master-Slave为例,架构图:

image

详细设计:

  • 集群会通过某种方式区分各个服务器不同角色。

  • 任务分配器需要将特定任务分派给特定服务器执行。

  • 当指定类型服务器故障时,需要重新指定服务器为特定服务器。以Master-Slave为例,当Master服务器故障时,需要从Slave中指定一个为Master。当Slave服务器故障时,直接剔除即可。

非对称集群相较于对称集群,复杂度主要体现在以下几个方面:

  • 任务分配器需要区分任务类型,并将特定任务发送给特定服务器

  • 角色分配策略比较复杂。可能需要ZAB、Raft这类算法实现leader的选举。

举例Zookeeper:

  • 任务分配器:Zookeeper每个server都是一个分配器。Follower收到请求会判断,如果是写请求就发送给Leader进行处理,读请求就自己处理

  • 角色指定:Zookeeper当Leader故障时,会采用ZAB算法来选举新的Leader,在此期间,会暂停所有读请求,直到选出新的Leader为止

存储高可用和计算高可用复杂度对比

  • 存储高可用,复杂度还体现在数据复制上,容易出现网络延迟等造成数据不一致问题

  • 存储高可用是有状态的,计算高可用是无状态的,有状态就存在如何保存状态,同步状态问题

  • 计算无状态,存储有状态