永无止境:网站的伸缩性架构
目录
所谓网站的伸缩性是指不需要改变网站的软硬件设计,仅仅通过改变部署的服务器数量就可以扩大或者缩小网站的服务处理能力。
京东网(www.360buy.com)在2011年年末的图书促销活动中,由于优惠幅度大引得大量买家访问,结果导致网站服务不可用,大部分用户在提交订单后,页面显示“Service is too busy”。当天晚上,京东网老板刘强东在微博发布消息称,已购买多台服务器以增加交易处理能力,第二天继续促销一天。结果第二天,用户在提交订单后,页面继续是“Service is too busy”。显然京东网当时的系统伸缩能力较弱,特别是订单处理子系统几乎没有什么伸缩能力。
与这些缺乏伸缩能力、关键时候掉链子的案例相对应的是淘宝网2012年“双十一”的促销活动,在活动开始的第一分钟,即有1000万独立用户访问网站,当天成功交易的订单总额达191亿,虽然淘宝网及支付宝网站出现了一些问题,但系统总体可用,绝大部分交易顺利完成。
大型网站的“大型”,在用户层面可以理解为大量用户及大量访问,如FaceBook有超过10亿用户;在功能方面可以理解为功能庞杂、产品众多,如腾讯有超过1600种产品;在技术层面可以理解为网站需要部署大量的服务器,如Google大约有近100万台服务器。
大型网站不是一开始就是大型网站的,而是从小型网站逐步演化而来的,Google诞生的时候也才只有一台服务器。设计一个大型网站或者一个大型软件系统,和将一个小网站主键演化成一个大型网站,其技术方案是完全不同的。前者如传统的银行系统,在设计之初就决定了系统的规模。如要服务的用户数、要处理的交易数等,然后采购大型计算机等昂贵的设备,将软件系统部署在上面,即成为一个大型系统,有朝一日这个大型系统也不能满足需求了,就花更多的钱打造一个更大型的系统。而网站一开始不可能规划出自己的规模,也不可能有那么多钱去开发一个大型的系统,更不可能到了某个阶段再重新打造一个系统,只能摸着石头过河,从一台廉价的PC服务器开始自己的大型系统演化之路。
在这个渐进式的演化过程中,最重要的技术手段就是使用服务器集群,通过不断地向集群中添加服务器来增强整个集群的处理能力。这就是网站系统的伸缩性架构,只要技术上能做到向集群中加入服务器的数量和集群的处理能力成线性关系,那么网站就可以以此手段不断提升自己的规模,从一个服务几十人的小网站发展成服务几十亿人的大网站,从只能存储几个G图片的小网站发展成存储几百P图片的大网站。
这个演化过程总体来说是渐进式的,而且总是在“伸”,也就是说,网站的规模和服务器的规模总是在不断扩大(通常,一个需要“缩”的网站可能已经无法经营下去了)。但是这个过程也可能因为运营商的需要而出现脉冲,比如前面案例中提交的电商网站的促销活动:在某个短时间内,网站的访问量和交易规模突然爆发式增长,然后又回归正常状态。这时就需要网站的技术架构具有极好的伸缩性——活动期间向服务器集群中加入更多服务器(及向网络服务商租借更多的网络带宽)以满足用户访问,活动结束后又将这些服务器下线以节约成本。
国内有许多传统企业“触网”,将传统业务搬到互联网上,这是一件值得称道的事,传统行业与互联网结合将会创造出新的经济模式,改善人们的生活。但遗憾的是,有些传统企业将自己的管理模式和经营理念也照搬到互联网领域,在技术方面的表现就是一开始就企图打造一个大型网站。
一、网站架构的伸缩性设计
回顾网站架构发展历程,网站架构发展史就是一部不断向网站添加服务器的历史,只要工程师能向网站的服务器集群中添加新的机器,只要新添加的服务器能线性提高网站的整体服务处理能力,网站就无需为不断增长的用户和访问而焦虑。
一般说来, 网站的伸缩性设计可分成两类,- -类是根据功能进行物理分离实现伸缩,一类是单一功能通过集群实现伸缩。前者是不同的服务器部署不同的服务,提供不同的功能;后者是集群内的多台服务器部署相同的服务,提供相同的功能。
1.1不同功 能进行物理分离实现伸缩
网站发展早期一通过增加服务器提高网站处理能力时,新增服务器总是从现有服务器中分离出部分功能和服务,如图6.1所示。
每次分离都会有更多的服务器加入网站,使用新增的服务器处理某种特定服务。事实上,通过物理上分离不同的网站功能,实现网站伸缩性的手段,不仅可以用在网站发展早期,而且可以在网站发展的任何阶段使用。具体又可分成如下两种情况。
纵向分离(分层后分离):将业务处理流程上的不同部分分离部署,实现系统伸缩性,如图6.2所示。
横向分离(业务分割后分离):将不同的业务模块分离部署,实现系统伸缩性,如图6.3所示。
横向分离的粒度可以非常小,甚至可以一个关键网页部署-一个独立服务, 比如对于电商网站非常重要的产品详情页面,商铺页面,搜索列表页面,每个页面都可以独立部署,专门维护。
1.2 单一功能通过集群规模实现伸缩
将不同功能分离部署可以实现- -定程度的伸缩性, 但是随着网站访问量的逐步增加,即使分离到最小粒度的独立部署,单- -的服务器也能满足业务规模的要求。因此必须使用服务器集群,即将相同服务部署在多台服务器上构成-一个集群整体对外提供服务。
以搜索服务器为例,如果一台服务器可以提供每秒1000 次的请求服务,即QPS( Query Per Second )为1000。那么如果网站高峰时每秒搜索访问量为10000,就需要部署10台服务器构成-一个集群。若以缓存服务器为例,如果每台服务器可缓存40GB数据,那缓存100GB数据,就需要部署3台服务器构成一-个集群。当然这些例子的计算都是简化的,事实上,计算一个服务的集群规模,需要同时考虑其对可用性、性能的影响及关联服务集群的影响。具体来说,集群伸缩性又可分为应用服务器集群伸缩性和数据服务器集群伸缩性。这两种集群由于对数据状态管理的不同,技术实现也有非常大的区别。而数据服务器集群也可分为缓存数据服务器集群和存储数据服务器集群,这两种集群的伸缩性设计也不大相同。.
二、应用服务器集群的伸缩性设计
应用服务器应该设计成无状态的,即应用服务器不存储请求上下文信息,如果将部署有相同应用的服务器组成一个集群,每次用户请求都可以发送到集群中任意- - 台服务器上去处理,任何一台服务器的处理结果都是相同的。这样只要能将用户请求按照某种规则分发到集群的不同服务器上,就可以构成- -个应用服务器集群,每个用户的每个请求都可能落在不同的服务器上。如图6.4所示。如果HTTP请求分发装置可以感知或者可以配置集群的服务器数量,可以及时发现集群中新上线或下线的服务器,并能向新上线的服务器分发请求,停止向已下线的服务器分发请求,那么就实现了应用服务器集群的伸缩性。这里,这个HTTP请求分发装置被称作负载均衡服务器。负载均衡是网站必不可少的基础技术手段,不但可以实现网站的伸缩性,同时还改善网站的可用性,可谓网站的杀手锏之一-。具体的技术实现也多种多样,从硬件实现到软件实现,从商业产品到开源软件,应有尽有,但是实现负载均衡的基础技术不外以下几种。
2.1 HTTP 重定向负载均衡
利用HTTP重定向协议实现负载均衡。如图6.5所示
HTTP重定向服务器是一台普通的应用服务器,其唯- -的功能就是根据用户的HTTP请求计算-一台真实的Web服务器地址,并将该Web服务器地址写入HTTP重定向响应中(响应状态码302 )返回给用户浏览器。在图6.5 中,浏览器请求www.mysite.com, DNS服务器解析得到IP地址是114.100.80.10, 即HTTP重定向服务器的IP地址。然后浏览器通过IP地址114.100.80.10 访问HTTP重定向负载均衡服务器后,服务器根据某种负载均衡算法计算获得一台实际物理服务器的