译者序

互联网从一穷二白发展到今天,“可伸缩性”“水平伸缩”这些以前只有大型互联网公司才面临的技术挑战,现在几乎是任何一家互联网公司都需要想办法去解决的难题。在我看来,写好一段代码不难,写好一个单机软件也不难,但是写好一个伸缩性良好的大规模分布式系统却很难。这其中最难的地方首先在于思想观念的转变。程序员一开始接触到的就是确定的概念和世界,当程序逻辑一定时,什么样的输入就应该有什么样的输出。

但是在面对大规模系统时,我们首先要承认的是不确定性,即有很多我们想不到、料不到的事情会发生,一个边角的小错误都可能导致整个系统全面“雪崩”。因此,我们不能再把系统当作一个稳定的、确定的程序看待,而需要在设计时充分考虑到那些可能不确定的情况。其次,就是要改变管理整个系统的有效手段。随着系统规模的不断增长,之前的人工操作方式已经明显无法跟上机器的增长速度,规模增长所带来的可靠性、可用性问题时刻都在挑战着整个团队的极限。因此,如何有效地评估、预测、管理、监控一个大规模的系统,这件事本身已经变成一个复杂的系统性工程,需要有效的方法论、原则、工具及最佳实践经验的相应支撑。

当一个系统的规模开始扩张时,可用性往往是系统首先要面临的问题。在激增的流量面前,每一次系统处理缓慢、崩溃都会给公司的业务带来损失,因此理解什么是高可用性对系统保障来说至关重要。为了维持或提高系统的可用性,我们需要一套标准和手段来测量系统的可用性,从而在第一时间发现系统可用性是否发生了变化,并制定相应的解决方案。

随着系统规模不断扩大,各种不确定的因素会被放大,这些不确定性会给系统带来更多的不确定性。在构建大规模可伸缩系统的时候,需要先梳理清楚系统中存在哪些不确定性,把它们定义成风险因素并建立相应的风险模型,定期回顾并确保更新风险因素。在这之后,我们要针对每个风险因素制定相应的应对方案和措施,并持续对风险管理计划、缓和计划和容灾计划进行测试和评估,这样才能避免在风险发生时手忙脚乱。

当系统规模发展到一定程度时,系统本身的架构瓶颈就会突显出来,之前的单体系统已经难以再开发和维护。这时候,不管是从技术角度出发,还是从团队人员角度出发,服务化都是一个必然的趋势。我们需要将原有的系统功能和逻辑拆分成多个独立的服务来进行管理。但是,随着服务越来越多,如何管理各个服务、服务间如何通信,以及团队如何划分都是新的问题。随着业界在这些方面的经验越来越多,经过Netflix、Amazon等公司的实践和推广,微服务的概念出现,完善的解决方案和工具也开始出现。

在解决这些问题之后,我们会发现,系统规模再继续发展就会遇到IDC(互联网数据中心)的限制,单个数据中心甚至没有空间来存放服务器,也支持不了所需的网络带宽。幸运的是,云计算及各种云服务的出现为我们创造了无限的可能。我们无须再考虑硬件和场地的问题,无须再处理烦琐的运维事项,可以按照使用量来付费,甚至很多服务也无须自己搭建,可以直接使用云服务提供商提供的各种高性能、高可用服务。云计算给我们带来的是一种颠覆性的变化,不仅影响到我们的开发、运维、技术栈,而且更深远地影响到我们对技术和架构的思考方式,进而为创造更多商业价值提供可能。

本书作者Lee Atchison是New Relic的首席云架构师和布道师,负责领导公司基础设施产品的搭建,并且帮助公司设计了一个稳定的、基于服务的系统架构。他曾在Amazon担任了7 年高级技术经理,深刻了解如何设计基于云的、可伸缩的系统,也主导创建了AWS Elastic Beanstalk等产品。在本书中,Lee根据自身多年的经验,为我们分享了在大规模可伸缩系统的设计和实现中应该注意的几个方面,这其中的方法和技巧都是经过时间考验的无价经验。相信各位读者看完此书后,不会再惧怕那些未知的困难,能够在保持系统规模增长的同时,保证系统的高可用性和可伸缩性。

愿以后的每个系统都是高可用、可伸缩的系统。