1.1 单机小型机时期
很显然计算机诞生之初只是一个工具,像汽车、电视一样,只有单一的功能;不过计算机的特别之处就在于,人们能为其编写程序,不同的程序能够实现不同的功能,这就使得计算机的应用面得到了空前的发展,变得不仅仅是为少数人服务,而是普惠大众了。这个时候,就需要一种方式让更多的人能从计算机的功能中受益。当然把每个人都叫到屋里也许是个方法(如举办开放日等),但显然这太麻烦,而且受益者远远达不到普惠的程度。
好在,后来诞生了影响21世纪的互联网。
1.1.1 互联网的诞生
第一个计算机网诞生于1969年,就是美军的阿帕网(ARPA),其最初仅仅是为军事目的服务的,后来一些大学由于科研原因逐步加入,慢慢就进化成今天的“因特网”(Internet)。随着计算机的普及,网上商业服务迅速崛起,网络上的服务开始由单一的信息介绍变为五花八门的服务,它们为整个世界带来了全新的面貌。
2000年初,中国的网民仅为890万,很多人都不知道互联网为何物,因此大多数服务业务单一且简单,采用典型的单机模型外加一个数据库就能应对绝大多数场景,所有功能都写在一个应用里并进行集中部署,如图1.1所示:
图1.1 “最早的互联网服务架构”
现在看来,这简直是在开玩笑!但真的没有,这个架构对于那时的用户量来说确实足够而且简单,甚至如今知名的“淘宝网”在2003年刚刚诞生时就差不多是这个样子。
工程师们在一个大应用里添砖加瓦,需要发布的时候就集中打包,如果遭遇错误就全部回滚。好在那个时候各部分功能都还算简单,在依赖组里吼一声,给个接口名,在系统内部引用再调用一下也就解决了。同时那个时期还有很多经典的设备,如IBM的小型机(如Power系列),或者EMC的高端存储(如Symmetrix系列)等,都是单机时代的典型代表,它们追求的都是单机服务能力,那个时候还没有分布式一说。
1.1.2 复杂应用拆分
不过到了2018年,中国网民的数量达到了惊人的7.72亿(上涨了近100倍),而且随着应用的日益复杂化与多样化,开发者们对系统的“容灾、伸缩及业务响应能力”有了更高的要求。
暂且不说用户增长的影响因素,单纯从服务的稳定性与功能上来讲,单机架构就有很大的问题,因为如果“服务器”和“数据库”中的任一个出现故障,整个系统就会崩溃,或者说若某个板块的功能需要更新(例如“新闻网页”),那么整个系统便需要重新发布。显然,对于业务迅速发展的万物互联时代,这两点就足以致命。
因此,工程师们开始思考,如何在保障可用性的同时快速响应业务变化。他们想到了将一个应用拆分成多个应用的方法,也就是将上面的“大统一”拆分成多个子应用,“新闻页面”应用、“聊天室”应用、“论坛”应用等,这种方式被称为垂直拆分。它们各自有整套的硬件体系作为支撑,于是就变成了图1.2的样子。
1.1.3 遭遇性能问题
应用垂直拆分确实解决了应用开发中发布的问题,现在每个应用都可以独立设计、开发及部署了,工程师们非常兴奋,干劲十足,新功能不断上线。不过随着用户数量指数级的增长与摩尔定律的限制,单机计算能力完全跟不上业务的发展,这个时候工程师们发现,买再高端的计算存储设备也是杯水车薪,不能从根本上解决问题;而且,高端的计算设备往往非常昂贵,例如IBM经典的Power系列,当时的售价就高达十几万美元,这样的开销对于小型企业简直是天方夜谭。
因此这个时候,工程师们就需要一种廉价同时拥有高性能的解决方案。什么?廉价又高性能,确定这不是在做白日梦?如果按照之前单机的思路当然是不可能的,但我们可以换个思路来解决这个问题。
图1.2 “业务垂直分拆后的部署架构”