第1章  分布式系统概述

1999年8月6日,CNN报道了一起eBay网站的事故:从7:30开始,整个网站崩溃,一直持续了9个多小时。下午5:30后,技术人员开始进行系统恢复,但搜索功能依然不能使用。

2011年4月21日至22日,亚马逊EC2(Elastic Computer Cloud)服务出现大面积事故,导致数以千计的初创公司受到影响,而且造成大约11小时的历史数据永久性丢失。

2013年4月27日,《大掌门》游戏的开发商玩蟹科技CEO叶凯在微博上吐槽,“我们在阿里云上用了20多台机器。半年时间,出现过1次所有机器全部断电,2次多个硬盘突然只读,3次硬盘I/O突然变满……”。

2013年12月28日,春运第一天,铁道部首次推出了网上订票系统,但很快就出现许多用户无法访问、响应缓慢甚至串号等事故。

2017年9月17日,谷歌的网盘服务Drive出现故障,成千上万用户受到影响。

上面的这几起事故,当时都闹得沸沸扬扬,不仅给受影响的用户带来了很大的损失,也极大地影响了厂商的形象。事实上,几乎每一家互联网公司的后台系统都曾经不止一次地经历过这样或那样的尴尬时刻。可以这样说,几乎每一家互联网公司的后台架构都是在发现问题、解决问题的循环中发展起来的。

即便是执分布式系统技术牛耳的谷歌,在2017年9月,也出现过分布式系统的故障。可见,开发并维护一个成功的分布式系统是多么不易!

最早得到广泛应用的分布式系统是诞生于20世纪70年代的以太网。尽管分布式系统存在的历史已经有近半个世纪,然而其大规模的发展和应用则是2000年以后的事情。

21世纪以来,随着雅虎、谷歌、亚马逊、eBay、Facebook、Twitter等众多互联网公司的崛起,其用户量以及要处理的数据量迅速增长,远远超过了传统的计算机系统能够处理的范围,因此,以谷歌为代表的互联网公司提出了许多新技术(如HDFS、Bigtable、MapReduce等)。以BAT为代表的中国互联网公司,也在21世纪整体崛起,在初期借鉴美国公司技术的基础上,他们也自行开发了许多新的技术(如淘宝的管理海量小文件的分布式存储系统TFS、阿里巴巴开源的分布式调用框架Dubbo、阿里巴巴开源的数据库中间件Cobar等)。

为了解决分布式系统中的各种各样的问题,各大互联网公司开发了各种各样的技术,当然,这也促进了当今分布式系统技术领域的飞速发展。为了存储大量的网站索引,谷歌设计了GFS分布式文件存储系统和基于列存储的Bigtable NoSQL数据库系统;为了计算PageRank算法中的页面rank值,谷歌又设计了MapReduce分布式计算系统;为了方便其分布式系统中不同主机间的协调,谷歌还设计了Chubby分布式锁系统;为了解决不同语言实现的组件间的通信问题,Facebook设计了Thrift;为了解决大量消息的快速传递问题,领英设计了Kafka……这个列表可以很长很长。

为了“压榨”分布式系统中每个组件的性能,人们已经不再仅仅满足于在程序库(如网络编程库Netty、内存管理库TCMalloc等)、程序框架(如Spring)等“略显浅薄”的地方提高,而是已经渗透到了硬件(如谷歌为其计算中心专门设计了计算机)、网络(如SDN)、操作系统(如各大互联网公司定制的Linux内核)、语言(如谷歌设计的Go语言)、数据库系统(如各种NoSQL系统)、算法(如人工智能领域的突飞猛进)等各种计算机基础领域。

毫无疑问,我们处于计算机技术发展最为迅猛的时代。在这个如火如荼的时代里,许多尘封多年的计算机技术(如人工智能、分布式系统、移动计算、虚拟计算等),一改往日不温不火的模样,在互联网这片广袤的土地上如日中天,发展迅速。

今天的计算机领域,已经与20年前大为不同。20年前,只需要对操作系统、数据库、网络、编译等领域有深刻的理解,再熟练掌握几门计算机语言,了解一些常见的软件架构(客户服务器架构、管道架构、分层架构等)和软件工程(主要是瀑布模型)的知识,基本上就能胜任大多数软件开发工作了。而今天,仅了解这些基础知识已经远远不够,因为在近20年内,人类创造了太多的新技术,而这些新技术又大都起源并服务于分布式计算领域。