最近有粉丝反馈说面试阿里和京东都遇到了同一个题,问题都是都是在第二面,考察候选人架构设计能力:设计一个高可用系统。
题目很开放,也更能考察一个人都能力,这位粉丝表示不知道如何下手,今天针对这个问题写一篇高可用系统的扫盲贴文章,理解什么是高可用系统。
背景:
可靠的系统是业务稳定、快速发展的基石。那么,如何做到系统高可靠、高可用呢?下面首先讲一下高可用需要面临的常见问题,再从技术方面介绍几种提高系统可靠性、可用性的方法。
服务常见不可用原因:
在本文中,我们将讨论具体的高可用性意味着什么,以及它如何提高基础架构的可靠性。
在计算中,术语可用性用于描述服务可用的时间段,以及系统响应用户请求所需的时间。高可用性是系统或组件的质量,可确保在给定时间段内的高水平操作性能。
可用性通常表示为一个百分比,表示在给定的时间段内特定系统或组件的正常运行时间,其中100%的值表示系统永不宕机。例如,在一年的时间内保证99%可用性的系统最多可以有3.65天的停机时间(1%)。
这些值是根据几个因素计算的,包括计划和非计划维护周期,以及从可能的系统故障中恢复的时间。
高可用性用作基础架构的故障响应机制。它的工作方式在概念上非常简单,但通常需要一些专门的软件和配置。
在建立稳健的生产系统时,最大限度地减少停机时间和服务中断通常是首要任务。不管如何可靠的系统和软件,可能会出现问题,可以降低你的应用程序或服务器。对于你的基础架构实现高可用性是减少这类事件的影响的有用策略。高度可用的系统可以自动从服务器或组件故障中恢复。
高可用性的目标之一是消除基础架构中的单点故障。单点故障是技术堆栈的一个组件,如果它变得不可用,将导致服务中断。因此,这是为你的应用程序,没有冗余的正常功能的必要条件的任何部件被认为是单一故障点。 要消除单点故障,必须为堆栈的每一层做好冗余准备。例如,假设你的基础架构由负载均衡器后面的两个相同的冗余Web服务器组成。来自客户端的流量将在Web服务器之间平均分配,但如果其中一个服务器出现故障,负载均衡器会将所有流量重定向到剩余的在线服务器。
此方案中的Web服务器层不是单点故障,因为:
但是如果负载均衡器脱机会发生什么?
利用所描述的场景,这在现实生活中并不罕见,负载平衡层本身仍然是单点故障。然而,消除这个剩余的单点故障可能具有挑战性; 即使你可以轻松配置额外的负载均衡器以实现冗余,但在负载均衡器上方没有明显的点来实现故障检测和恢复。
仅冗余不能保证高可用性。必须有一种机制来检测故障,并在堆栈的某个组件不可用时采取措施。
可以使用从上到下的方法实现冗余系统的故障检测和恢复:顶部的层负责监视其下方的层以确定故障。在我们之前的示例场景中,负载均衡器是顶层。如果其中一个Web服务器(底层)变得不可用(虚线箭头部分),则负载平衡器将停止重定向该特定服务器的请求。
这种方法往往更简单,但它有局限性:你的基础架构中有一个点,顶层不存在或不可及,负载均衡器层就是这种情况。为外部服务器中的负载均衡器创建故障检测服务只会创建新的单点故障。
在这种情况下,分布式方法是必要的。必须将多个冗余节点连接在一起作为一个集群,其中每个节点应该同样能够进行故障检测和恢复。
然而,对于负载平衡器的情况,由于名称服务器的工作方式,还有一个额外的复杂性。从负载平衡器故障中恢复通常意味着故障转移到冗余负载平衡器,这意味着必须进行DNS更改才能将域名指向冗余负载平衡器的IP地址。这样的更改可能需要相当长的时间才能在Internet上传播,这会导致此系统严重停机。
可能的解决方案是使用DNS循环负载平衡。但是,这种方法不可靠,因为它使客户端应用程序的故障转移。
更强大和可靠的解决方案是使用允许灵活IP地址重映射的系统,例如浮动IP。按需IP地址重新映射通过提供可在需要时轻松重新映射的静态IP地址,消除了DNS更改中固有的传播和缓存问题。域名可以保持与相同的IP地址关联,而IP地址本身在服务器之间移动。
这就是使用浮动IP的高可用性基础架构的样子:
在实践中实现高可用性时,必须仔细考虑几个组件。除了软件实现之外,高可用性还取决于以下因素:
高可用性系统的每一层在软件和配置方面都有不同的需求。但是,在应用程序级别,负载平衡器是创建任何高可用性设置的重要软件。
HAProxy(High Availability Proxy)是负载平衡的常见选择,因为它可以处理多个层的负载平衡,以及不同类型的服务器,包括数据库服务器。
在系统堆栈中向上移动,为应用程序入口点(通常是负载均衡器)实施可靠的冗余解决方案非常重要。要消除此单点故障,如前所述,我们需要在浮动IP后面实现一组负载均衡器。Corosync和Pacemaker是在Ubuntu和CentOS服务器上创建此类设置的流行选择。
高可用性是可靠性工程的重要子集,专注于确保系统或组件在给定的时间段内具有高水平的操作性能。乍一看,它的实施可能看起来相当复杂; 但是,它可以为需要提高可靠性的系统带来巨大的好处。