分布式高可用架构之道
上QQ阅读APP看书,第一时间看更新

1.1.3 高可用策略

高可用策略实在太多,随随便便都可以说出几个:冗余备份、限流/熔断/降级、监控等。为了让读者更好地理解这些策略,将高可用策略按照时间维度分为3个阶段:事故前、事故中、事故后(不是很准确,主要是希望把高可用策略串起来),具体如图1-4所示。

图1-4 高可用策略划分

在系统出现异常之前,需要未雨绸缪,例如:

● 冗余备份:汽车容易爆胎,就多准备几个备胎在车上;单行道道路容易堵车,就改成两车道、三车道甚至更多;体现在系统上,就是保证系统的各个节点都要做冗余备份。单节点的应用改成多节点集群,单实例的数据库/缓存改成多实例数据库以及集群(多实例的数据库/缓存需要进行数据备份),当某个节点出现故障时,其他节点可以快速接管。

● 监控:当道路出现堵车时,如果交警不在现场,是没办法提前感知路况的,也不可能每条路都安排一个交警,所以需要在道路上安装摄像头,或者利用先进的监控技术来监控路况。重要的系统在上线之前,也需要提前搭建监控体系,收集监控指标,针对监控指标阈值设置相关的告警(短信、邮件等)。

● 安全防护:道路堵车不仅是因为车辆太多、车道太少等,还有可能是因为恐怖分子恶意制造混乱、地面塌陷等。类似的,系统也可能遭受黑客攻击、光缆被挖断等情况,因此需要网络应用防火墙(Web Application Firewall,WAF)来保护我们的系统。WAF是一种HTTP入侵检测和防御系统,工作在OSI七层模型中的应用层,为Web服务提供全面的防护,例如ModSecurity生产级的WAF产品。

● 运维值班:如果某个道路有重要领导人要通过,就需要提前安排警察等人员进行安全巡查,防止出现突发情况。类似的,对于系统中重要的服务,在重要的时间段也需要提前安排运维,开发人员三班制24小时不间断地看护。

● 硬件资源:道路也会坏掉,太久的道路多少会出现坑坑洼洼的现象,因此需要定期检查维护和保养。对于系统的硬件资源,比如磁盘、服务器、电源,也需要定期检查。

该提前准备的事项都准备了,系统也该上线了,流量慢慢进来,系统有条不紊地运行着。只要上线之前做好充足的测试(功能测试、性能测试、压力测试等),正常情况下,系统是不会出现什么大问题的。我们讲的高可用策略都是针对系统在突发情况下的一些应对措施,对应的策略有:

● 限流:每条路都有一个最大承重,超过路面所能承受的重量,道路就会凹陷,路面会受到破坏。类似的,每个系统/服务也有一个最大的承受能力,当流量太大,超过系统的承受能力时,就要进行一定的限制,这就是限流。很明显,限流是一种有损操作,是系统为了保护自己不得已才做出的动作。

● 降级:一般情况下,道路面前人人平等,但是当车流量很大,而救护车、110警车、消防车等重要的车辆需要通过时,我们都要优先让出车道,保证这些车辆的通行。同样,当系统有大量的请求流量进入(大促、秒杀、双十一活动、双十二活动),往往需要保证重要的服务而舍弃非重要的服务。例如,优先保证商品下单的完整流程,下单完成后通知用户消息可以先关闭。又比如日志降级,重要服务的日志打印功能保留,暂时关掉非重要服务的日志打印功能等。很明显,降级也是一种有损操作。

● 熔断:当高速公路并非堵车,而是出现道路坍塌或者山体滑坡等问题时,如果在高速入口没有及时通知,源源不断的车辆进入高速公路,就会让道路越来越堵,最后瘫痪,交警车辆也进不来,堵车车辆也出不去。同样,一个应用依赖多个服务是非常常见的,如果其中一个依赖由于延迟过高发生阻塞,调用该依赖服务的线程就会阻塞,如果相关业务的QPS较高,就可能产生大量阻塞,从而导致该应用/服务由于服务器资源被耗尽而拖垮。另外,故障也会在服务之间传递,如果故障服务的上游依赖较多,可能会引起服务的雪崩效应。

● 自动水平扩容:如果说限流/降级是一种有损操作,那么水平扩容就是一种比较积极正面的保障措施。普通时间高速路只开通两个车道进行车辆通行,因为车流量少,剩下的通道暂时关闭。而节假日车流量大,就放开剩下的车道,保障道路畅通。同样,如果流量暴增,就需要服务有自动扩容的能力,自动增加服务实例。对于容器化部署的服务,可以使用容器编排技术(比如k8s)对容器进行快速扩容和缩容。如果服务不是容器化部署,就需要运维人员手工创建新的服务实例,等流量降下来再手工回收服务实例,当然手工操作是非常麻烦的。

最后是事后阶段,具体包括:

● 人工接入:道路出现多起交通事故,实在太堵,整条路处于崩溃状态,甚至还出现吵架、打架流血等现象,实在难以恢复时,就只能由交警、警察介入处理。同样,服务出现难以恢复的故障时,就不得不让运维人员、开发人员介入,手工去重启或者排查原因。

● 自动恢复:道路堵车,有时仅仅是因为路面积水或者出现小障碍物,只需要把小障碍物移开或者把堵住下水道的杂物拿掉即可。同理,当服务出现一些小的问题,比如内存/CPU开始吃紧,服务能够自动检测,自动进行内存扩容,不需要人工介入。又比如服务超时,当服务请求变忙,出现超时情况的,服务可以自动延长超时时间,让慢请求可以正常执行。

最后需要注意的是,系统可用性越高,投入成本越大。所以,高可用是费钱的。