前言
本文摘录于李运华老师的《从0开始学架构》课程,为精简总结。
复杂度
计算高可用架构复杂度主要体现在任务管理方面。旨当任务在某台服务器执行失败后,如何重新分配新的服务器
设计关键
1、 哪些服务器可以执行任务
每个服务器都可以执行任务
特定服务器可以执行任务,当特定服务器故障后,选定新的服务器作为特定服务器
2、任务如何重新执行
已经分配过的任务就算执行失败也不重新分配
设计一个任务分配器,服务器执行任务后需要向任务分配器反馈结果,如果服务器执行失败,则把任务重新分配到另一台服务器执行
注意:“任务分配器”是一个逻辑概念,并不一定要求系统存在一个独立的任务分配器模块,举例:
Nginx将页面请求发送给web服务器,这里Nginx的角色是反向代理并且承担了任务分配器的角色
批量运算任务,可以单独设计一套任务分配系统
Zookeeper上的follower节点,当收到写请求会将请求转发给leader节点处理,这里的follower可以看做一个任务分配器
架构
主备
和存储高可用主备复制类似,但少了数据复制
架构图:
设计:
主机执行所有的计算任务
当主机宕机时,服务将不可用
当主机宕机恢复时,任务分配器将把任务继续发送给主机
如果主机不能够恢复或者恢复需要很久时,需要人工将备机设置为主机。同时为了维持主备方案,需要增加一台服务器作为备机
根据备机状态不同,主备架构又可细分为冷备和温备架构:
冷备。备机上有和主机上相同的业务系统,但是并没有开启业务系统,此时备机服务器是开启的。主机故障后,需要人工手动将备机业务系统启动,并设置为主机。
温备。备机上开启了业务系统,但是不对外提供服务。主机故障后,只需要切换备机为主机即可。
温备比冷备,在需要人工操作的时候更省时间,所以一般情况下采用温备。
主从
和存储高可用的主从类似,计算高可用的主从,从机也需要执行任务。任务分配器需要将任务分类,确定哪类任务可以发送给主机,哪类任务可以发送给从机。
架构图:
设计细节:
一般情况下,主机执行自己的任务(上图计算任务A),从机执行自己的任务(上图计算任务B)
当主机故障,任务分配器仍然将特定任务发给主机。不管成功与否
当主机故障恢复时,任务分配器仍将特定任务发送给主机。
当主机故障短期内无法恢复时,需要人工操作将备机切换为主机,增加新的机器为从机。按照原有分配任务执行
主从和主备架构优缺点:
主从架构,从机也执行了任务,发挥了硬件的性能
主从架构需要将任务分类,复杂度比主备要高一些
主从/主备架构共存的一个问题就是,当主机发生故障时,人工恢复缓慢,效率低。
集群
鉴于以上主备和主从架构的了解,对于他们的缺点,衍生出了可以自动切换主备机的集群架构。
同时根据集群中节点角色不同又可分为
对称集群。集群中所有服务器角色都是一样的,都可以执行任何任务。
非对称集群。将集群中服务器分为多个角色,特定角色执行特定任务。例如最常见的Master-Slave角色。
对称集群
对称集群有种通俗的叫法,叫做负载均衡集群,架构图如下:
详细设计:
一般情况下,任务分配器采取某种策略(轮询、随机、权重等)将任务均匀分发给集群中服务器
如果集群中某台服务器故障,任务分配器不再将任务分发给他,而是分发给其他服务器执行
故障服务器恢复正常,任务分配器将再次把任务分配给这台服务器执行
设计关键点:
任务分配器需要分配策略
任务分配器需要检测集群中各个服务器状态
分配策略比较简单,采取常用的轮询、随机等策略即可。
检测服务器状态复杂一些,一般情况下是任务分配器和服务器通过心跳来传递服务器信息。
非对称集群
非对称集群中不同服务器的角色是不同的,以Master-Slave为例,架构图:
详细设计:
集群会通过某种方式区分各个服务器不同角色。
任务分配器需要将特定任务分派给特定服务器执行。
当指定类型服务器故障时,需要重新指定服务器为特定服务器。以Master-Slave为例,当Master服务器故障时,需要从Slave中指定一个为Master。当Slave服务器故障时,直接剔除即可。
非对称集群相较于对称集群,复杂度主要体现在以下几个方面:
任务分配器需要区分任务类型,并将特定任务发送给特定服务器
角色分配策略比较复杂。可能需要ZAB、Raft这类算法实现leader的选举。
举例Zookeeper:
任务分配器:Zookeeper每个server都是一个分配器。Follower收到请求会判断,如果是写请求就发送给Leader进行处理,读请求就自己处理
角色指定:Zookeeper当Leader故障时,会采用ZAB算法来选举新的Leader,在此期间,会暂停所有读请求,直到选出新的Leader为止
存储高可用和计算高可用复杂度对比
存储高可用,复杂度还体现在数据复制上,容易出现网络延迟等造成数据不一致问题
存储高可用是有状态的,计算高可用是无状态的,有状态就存在如何保存状态,同步状态问题
计算无状态,存储有状态