网站的伸缩性架构
所谓网站的伸缩性是指不需要改变网站的软硬件设计,仅仅通过改变补数单服务器数量就可以扩大或者缩小网站的服务处理能力。
大型网站的“大型”,在用户层面可以理解为大量用户及大量访问,Facebook有超过10亿用户;在功能方面可以理解为功能庞杂、产品众多,如腾讯有超过1600种产品;在技术层面可以理解为网站需要部署大量的服务器,如Google大约有近100万台服务器。
大型网站不是一开始就是大型网站的,而是从小型网站逐步演化而来的,Google诞生的时候也才只有一台服务器。设计一个大型网站或者一个大型软件系统,和将一个小网站逐渐演化成一个大型网站,其技术方案是完全不同的。前者如传统的银行系统,在设计之初就决定了系统的规模,如要服务的用户数、要处理的交易数等,然后采购大型计算机等昂贵的设备,将软件系统部署在上面,即成为一个大型系统,有朝一日这个大型系统也不能满足需求了,就花更多的钱打造一个更大型的系统。而网站一开始不可能规划出自己的规模,也不可能有那么多钱去开发一个大型系统,更不可能到了某个阶段再重新打造一个系统,只能摸着石头过河,从一台廉价的PC 服务器开始自己的大型系统演化之路。
在这个渐进式的演化过程中,最重要的技术手段就是使用服务器集群,通过不断地向集群中添加服务器来增强整个集群的处理能力。这就是网站系统的伸缩性架构,只要技术上能做到向集群中加入服务器的数量和集群的处理能力成线性关系,那么网站就可以以此手段不断提升自己的规模,从一个服务几十人的小网站发展成服务几十亿人的大网站,从只能存储几个G图片的小网站发展成存储几百P图片的大网站。
这个演化过程总体来说是渐进式的,而且总是在“伸”,也就是说,网站的规模和服务器的规模总是在不断扩大(通常,一个需要“缩”的网站可能已经无法经营下去了)。但是这个过程也可能因为运营上的需要而出现脉冲,比如前面案例中提到的电商网站的促销活动:在某个短时间内,网站的访问量和交易规模突然爆发式增长,然后又回归正常状态。这时就需要网站的技术架构具有极好的伸缩性——活动期间向服务器集群中加入更多服务器(及向网络服务商租借更多的网络带宽)以满足用户访问,活动结束后又将这些服务器下线以节约成本。
不同功能进行物理分离实现伸缩
纵向分离(分层后分离):将业务处理流程上的不同部分分离部署,实现系统伸缩性
横向分离(业务分割后分离):将不同的业务模块分离部署,实现系统伸缩性
横向分离的粒度可以非常小,甚至可以一个关键网页部署一个独立服务,比如对于电商网站非常重要的产品详情页面,商铺页面,搜索列表页面,每个页面都可以独立部署,专门维护。
单一功能通过集群规模实现伸缩
将不同功能分离部署可以实现一定程度的伸缩性,但是随着网站访问量的逐步增加,即使分离到最小粒度的独立部署,单一的服务器也不能满足业务规模的要求。因此必须使用服务器集群,即将相同服务部署在多台服务器上构成一个集群整体对外提供服务。
具体来说,集群伸缩性又可分为应用服务器集群伸缩性和数据服务器集群伸缩性。这两种集群由于对数据状态管理的不同,技术实现也有非常大的区别。而数据服务器集群也可分为缓存数据服务器集群和存储数据服务器集群,这两种集群的伸缩性设计也不大相同。