为了满足日益增长的业务需求,工程师们不断上线性能更加强悍的服务器。直到有一天,老板实在招架不住高昂的成本了。这里的成本不仅指购买机器的成本,更多的是这些机器的维护成本——由于高端机器的维护都需要受过专业培训的人员,普通工程师难以胜任;另一方面,受摩尔定律的限制,单核 CPU 的发展也跑不过业务的发展。
这个时候工程师们就想起了“三个臭皮匠,顶个诸葛亮”的老话(当然是开玩笑)。
虽然 IBM小型机的价格非常昂贵,但那个时代有种硬件相对来说要便宜许多,而且也拥有与小型机一样的计算功能(注意是功能而不是能力),那就是 Intel X86 普通 PC,即常见的“电脑”,虽然单从计算能力上来讲,普通 PC 相比 IBM 小型机简直相差万里,但是它们的计算架构却是一致的。例如小型机可能动辄就是 128GB 的内存,普通 PC 最多也就 8GB,因此单从计算能力上,普通 PC 在服务领域是没有任何使用场景的;不过随着一种被称为“负载均衡(Load Balance)”设备的出现(例如经典的 F5Networks BIG 系列,如图1.3所示),工程师们得以汇集微小的力量于一体。
图1.3 “经典的 F5 BIG-IP 硬件负载均衡设备”
负载均衡设备虽然五花八门,但其工作的基本原理大同小异,都是通过网关的形式将流量反向代理并转发给下游的,下游是多个功能一致的 X86 服务器,以此组成一个集群。负载均衡设备往往会对外暴露一个统一的接口,让外界用户感觉是在向同一个主机发起请求,然而实际上,后端的服务器已经集群化了。集群化的好处是可以随时水平扩展,因为每台机器的功能都是一样的,也就是说如果需要将原来的压力缩小一半,只需要将机器的数量扩充一倍即可。
“负载均衡”设备一般还会支持健康检测,当有新的服务器加入时,可以动态将流量分配给它们;同时在某台服务器出现故障时,又能够及时将其从流量下发列表中摘除,避免无效的流量转发。
同时负载均衡设备还是服务的入口与出口门户,即网关。利用这个优势,它们可以对流量进行清洗与预处理工作,例如安全流量打标与防 DDos 攻击等。
负载均衡使得 PC 能够将微小的力量结合起来,形成一个集群,并第一次引入了水平扩展的概念,实现了动态扩缩,相对于之前笨重的单机部署,可以说是质的突破。
之前小型机无论多么强大,运算能力都受硬件限制,而硬件的采购、部署周期又非常长,因此为了保险,早先很多公司的运维都会预留好机器资源以供业务发展不时之需。
这样做的问题在于,会出现大量的闲置硬件资源。比如,企业预估业务在年底能够达到80GB 内存的需求量,而年初采购时业务实际只有 20GB 的需求,根据上面的策略,企业仍然会将 80GB 内存的机器买回调试好以期待其用武之地。那么,也就是说 60GB 的内存很多时候就真的是在空转了。如果业务发展顺利,那还好,虽然等待时间有些长,但终归还是用上了,但是出现不及所期那就惨了,因为硬件在使用后厂商一般是不允许退货的,也就是说不能以这60GB多余内存用不上为由,希望厂商回收。
而且,随着业务的多样化,特别是电商类场景,经常需要组织一些大的促销,业务压力往往会急剧上升,单机即便性能高,也有极限,在达到瓶颈后很难有所作为。
使用集群则不一样,可以施展化整为零的功夫。虽然一台普通 PC 内存一般为 8GB(实际上 2010 年的时候一般只有 2GB 左右),但工程师可以用 10 台PC 组合成一个服务集群,形成 80GB 的服务能力。这样在年初的时候,只需采购 3 台回来组成集群就够用了,到了年底的时候,可以再采购剩下的部分或者业务将出现瓶颈的时候再采购,要知道采购部署一台普通PC 可比 IBM 之类的小型机轻松多了。
当初小型机甚至大型机之所以有市场,是因为那个时候的普通 PC 硬件及软件技术没有达到企业高稳定性、高容错性的需求,也就是说普通 PC 可能没用几天就会不是这里坏就是那里有故障,IBM 等优秀的公司很好地帮助企业渡过了那个难关,也确实为计算机历史做出了贡献。不过随着 X86 及 Linux 开源生态的发展,普通 PC 变得愈加稳定,再加上 HP、DELL 等一系列优秀的服务器生产厂商的加入,普通 PC 作为服务器已经不再是什么新鲜事了(当然这里的普通 PC 还是不能与家用的画等号的,一些细小的部分是针对企业应用专门优化的,例如双CPU 双通道内存主板)。
回到之前谈论的集群部署架构,通过普通PC的堆砌,工程师们成功将架构进化成了如图1.4所示的样子。
现在性能问题是解决了,如果业务规模再上升,就可以通过单纯的堆砌机器来解决。集群思想不仅适合服务器,后端的数据库也适用,在这样的思想上产生了“一主一备”“一主多备” 等经典的部署结构,并出现了分库分表 中间件。
图1.4 “集群化后的部署架构”
早先时候的负载均衡设备都是基于硬件的,后来工程师们为了节省成本,编写软件使用普通 PC 开发了廉价的负载均衡设备,例如 LVS(Linux Virtual Server) 这样的产品,与硬件的功能一致,只不过使用了软件的形式来工作,这些产品的诞生标志着负载正式进入“软负载”时代。
但渐渐地,工程师们发现,很多功能都被重复建设了,例如其中的“聊天室”与“论坛”都会涉及用户信息功能(例如登录、用户基本信息采集等);另外,由于应用分开部署,都需各自设计一套,从前端的信息录入到后端的存储结构。图1.4只有4个系统,问题也许还不太明显;但今天,一个复杂的系统包含成百上千个应用是常见的事,这样的功能重复显然对企业来说是严重的资源浪费。