可伸缩 Web 架构与分布式系统

冗余

为了能够优雅地处理失败问题,Web架构必须做到服务和数据的冗余。比如,如果在单台服务器上仅有一份文件,那么失去那台服务器就意味着丢失那份文件。丢失数据很少是件好事情,而通常的解决方案是创建多个、冗余的备份。


该准则同样适用于服务。如果应用有一个核心功能,那么通过确保多个拷贝(多个同类服务实例)或者版本同时运行能够免于单点失败的情况。

在一个系统中创建冗余能够去除单点失败,并提供一个备份或在必要的紧急时刻替换功能。例如,如果在生产环境有同一服务的两个实例在运行,其中一个失败或者降级了,系统可以(启动)failover到那个健康状态的服务。Failover可以自动发生或者需要人工干预。

服务冗余的另一个关键点在于创建一个非共享的架构(译者理解为无状态架构)。通过这种架构,每个节点都能够独立操作,并且没有中央“大脑”来管理状态或者协调其他节点的活动。这对于可伸缩性非常有帮助,因为新的节点不需要特殊的条件或知识就能加入(到集群)。但是,最重要的是在这些系统中不会存在单点失败问题,所以它们能够更加弹性地面对失败。

例如,在我们的图片服务应用,所有的图片会在另一个地方的硬件中有冗余的备份(理想情况是在一个不同的地理位置,以防地震或者数据中心火灾这类的灾难发生),而访问图片的服务同样是冗余的,所有(服务)都可能会服务请求。(见图1.3)(负载均衡器可以将其变为现实,详情请见下文。)

图1.3:图片托管应用,带有冗余特性