前言
续上节大型网站架构核心要素性能之后,我们今天要讲的是第三个要素:伸缩性,所谓的网站伸缩性是指不需要改变网站的软硬件设计,仅仅通过改变部署的服务器数量就可以扩大或者缩小网站的服务处理能力。
前面我们已经介绍过一个大型网站都是从小网站一步步演变过来的,在这个渐进式的演化过程中,最重要的手段就是使用服务器集群,通过不断向集群中添加新的服务器来增强整个集群的处理能力,这就是网站系统的伸缩性架构,只要技术上能够做到向集群中加入服务器的数量和集群的处理能力成线性关系,那么网站就可以以此手段不断提升自己的规模和处理能力。
上面说的这个渐进式演化过程,说的都是“伸”,也就是说,网站的规模和服务器规模总是在不断扩大,但是这个过程也可能因为运营上的策划调整,需要进行“缩”,例如电商网站的年中大促,仅仅是在活动的那几天访问量和交易量规模突然爆发式增长,这个时候就得向集群中增加服务器的数量来满足此时网站的流量访问,活动结束后,这个访问量和交易量又恢复到正常水平,这时候我们就需要将新加入的那些服务器下线以此节约成本,这才是网站真正的伸缩性。
网站的伸缩性我们主要从下面4个方向展开介绍:网站架构的伸缩性设计、应用服务器集群的伸缩性设计、分布式缓存集群的伸缩性设计、数据存储服务器集群的伸缩性设计。
网站架构的伸缩性设计
一般来说网站的伸缩性设计可以分为2类,一类是根据功能进行物理分离实现伸缩(不同的服务器部署不同的服务,提供不同的功能),另一类是单一功能通过集群实现伸缩(集群内的多台服务器部署相同服务,提供相同的功能)
-
不同功能进行物理分离实现伸缩
网站早期都是通过增加服务器提高网站处理能力,新增服务器总是从现有服务器中分离部分功能和服务,如下图:
每次分离都会有更多的服务器加入,使用新增加的服务器处理某种特定服务,具体的分离手段我们又可以分为2类:纵向分离和横向分离
-
纵向分离(分层后分离):将业务处理流程上的不同部分分离部署
-
横向分离(业务分割后分离):将不同的业务模块分离部署,横向分离的粒度可以非常小,甚至某些热点访问的一个页面都可以独立服务,具体粒度根据网站实际情况划分;
-
-
单一功能通过集群规模实现伸缩
将不同功能分离部署可以实现一定程度上的伸缩性,但是随着网站访问量的逐步增加,即使分离到最小粒度独立部署,单一服务器也不能满足业务规模要求。因此必须使用服务器集群,即将相同服务部署在多台服务器上构成一个集群整体对外服务(有句话形容最合适:当一头牛拉不动车的时候,不要企图去寻找一头更强壮的牛来,而是应该用两头牛来拉车)
应用服务器集群的伸缩性设计
上节我们提过,应用服务器应该设计成无状态的,也就是说应用服务器不存储请求上下文信息,如果将部署有相同应用的服务器组成一个集群,每次用户请求都可以发送到集群中任意一台服务器上处理,任何一台服务器处理的结果都是一样的(幂等性),这样只要将用户请求按照某个规则分发到集群上就可以构成应用服务器集群如下所示:
如果HTTP请求转发器可以感知或者可以配置集群的服务器数量可以及时发现集群中新加入或者下线的机器,并能向新上线的机器分发请求,停止向已下线的机器分发请求