解决方案架构师修炼之道
上QQ阅读APP看书,第一时间看更新

4.2 构建有韧性的架构

对故障进行容错设计,那么故障就不会发生。有韧性的架构意味着当发生故障时,应用程序仍然可供用户使用,并能从故障中恢复。实现有韧性的架构需要在各个方面都应用最佳实践,以使应用程序具备可恢复性。架构的各层都需要设计韧性,包括基础设施、应用程序、数据库、安全和网络层。

从安全性的角度来看,DDoS攻击可能会影响服务和应用程序的可用性,它通常会将伪造的流量提交到服务器并使其疲于应对,导致合法用户无法访问应用程序。这种攻击可能发生在网络层或应用程序层。有关DDoS攻击以及如何缓解的内容见第8章。

主动防御DDoS攻击至关重要。第一条原则就是尽量让应用程序的工作负载部署在专用网络内部,并且尽量不让应用程序的端点暴露到互联网。为了提前预防,必须了解流量的日常规律,并建立适当的机制,以便当应用程序层和网络数据包层出现大量可疑流量时可以识别出来。

通过CDN来暴露应用程序将使其具备CDN内置的弹性能力,同时,添加WAF规则将有助于防止非法的流量。伸缩(服务器)应该是你最后的选择,但是需要准备好自动伸缩机制,以便在必要时可以伸缩服务器。

为了在应用程序层实现韧性,冗余将是首选的方案,它通过将工作负载分布在不同地区使应用程序具备高可用性。为了实现冗余,可以在数据中心不同区域的不同机架上部署一个服务器机群副本(见图4-3)。如果服务器分布在不同的物理位置,则可以在流量到达负载均衡器之前使用域名系统(Domain Name System,DNS)来进行第一级路由。

图4-3 应用程序架构的韧性

从图4-3可以看到,需要在影响应用程序可用性的所有关键层中构建韧性,以实现容错设计。为了实现韧性,需要通过以下最佳实践来创建冗余环境:

□使用DNS服务器将流量路由到不同物理区域,以便当整个区域出现故障时应用程序仍可运行。

□使用CDN可以在靠近用户的位置分发和缓存静态内容(例如视频、图像和静态Web页面),这样,当发生DDoS攻击或本地入网点(Point-of-Presence,PoP)故障时,应用程序仍然可用。

□一旦流量到达某个区域,请使用负载均衡器将流量路由到服务器机群,这样即使区域内的某个位置出现故障,应用程序仍然能够运行。

□使用自动伸缩,根据用户需求添加或删除服务器,这样应用程序不会受到服务器单点故障的影响。

□创建备用数据库来保障数据库的高可用性,这意味着当数据库发生故障时应用程序仍然可用。

在上述架构中,如果任何组件发生故障,都应该拥有备份使其恢复,并实现韧性架构。负载均衡器和DNS服务器上的路由器应通过健康状态检查来确保流量仅路由到健康的应用程序实例。你可以通过配置来进行浅层健康检查,以监控本机故障,或通过深层健康检查来检测依赖项是否存在故障,但是深层健康检查比浅层健康检查需要更多的时间,并且会占用更多资源。

在应用程序层,必须避免级联故障,因为单一组件的故障可能导致整个系统瘫痪。避免级联故障的机制有很多,例如应用超时机制、流量拒绝、实现幂等操作以及断路模式,模式有关内容见第6章。