一般来讲,一个网站发展的演化过程,几乎都会经历单机架构、集群架构、分布式架构。伴随业务系统架构一同演变的还有外围系统和存储系统,如关系型数据库的分库分表改造、从本地缓存过渡到分布式缓存等等。本文对其中单机系统与集群系统的特点做简单总结。
单机系统
每一个网站创立初期肯定不可能拥有庞大的用户流量和海量数据,而是一步步演变其自身架构,满足自身业务,因为系统的做大往往与业务的做大呈正比的。对于一个刚上线的项目,我们往往会将Web服务器、文件服务器和数据库全都部署在同一台物理服务器上,最大好处是低成本。这样的部署对于刚起步的小网站是非常实惠的,而当业务发展、用户逐渐增多时,系统瓶颈便开始暴露出来,此时需对网站做出以下四点调整:
独立部署,避免不同的系统之间相互争夺共享资源(比如CPU、内存、磁盘等);
Web服务器集群,实现可伸缩性;
部署分布式缓存系统,使查询操作尽可能在缓存命中;
数据库实施读写分离,实现HA(High Availability)架构。
集群架构
在用户开始增多这个阶段,需要解决的主要问题是提升系统的并行处理能力,降低单机系统负载,一边支撑更多的用户访问操作。集群技术可以将多台独立的服务器通过网络相互连接组合起来,形成一个有效整体对外提供服务,使用集群的意义在于其目的收益高于所付出的实际成本和代价。互联网业内有一个共同的认知,那就是当一台服务器的处理能力接近或已超出其容量上限时,不要企图更换一台性能更强劲的服务器(scale up),通常的做法是采用集群技术(scale out),通过增加新的服务器来分散并发访问流量,2台不够就扩到4台,4台不够就扩到8台,只要业务系统能够随意支持服务器的横向扩容,那么从理论上来说就应该无惧任何挑战,从而实现可伸缩性和高可用性架构。
如下图所示,对于无状态的 Web 节点来说,通过 Nginx 来实现负载均衡调度是个不错的选择,但是在生产环境中, Nginx 也应该具备高可用性,这可以依靠DNS 轮询来实现。在集群环境中, Web 节点的数量越多,并行处理能力就越强,哪怕其中某些节点因为种种原因岩机,也不会使系统的整体服务不可用。
伴随着 Web 集群改造的还有分布式缓存和数据库,对于查询操作我们应该尽可能在缓存命中,从而降低数据库的负载压力。尽管缓存技术可以解决数据库的大部分查询压力,但是写入操作和无法在缓存命中的数据仍然需要频繁地对数据库进行读/写操作,因此对数据库实施读/写分离改造也非常重要。业务发展到一定阶段后必然会变得更加复杂,用户规模也会线性上升,此时可以对现有网站架构做出以下两点调整:
利用CDN 加速系统响应;
业务垂直化,降低藕合,从而实现分而治之的管理。
中国的网络环境复杂,不同网络和地区的用户访问网站时,速度会有差别,当流量增大时,可以将系统的一些静态资源数据缓存到CDN节点上,如下图所示,用户请求不会直接落到企业网站上,而是请求到离用户最近的ISP(互联网服务提供商)上,故大幅度提升系统整体的响应速度。
参考书目:*《人人都是架构师》,高翔龙著。