大型网站的发展都是由一个小网站开始的,随着现在越来越多的大型网站出现,导致越来越少的架构师能够去经历一个网站真正从小到大历程。从这点上来说,不对不说是有点遗憾,但是不管是农业社会的发展,还是工业社会的发展,以及当下互联网时代的发展,我们人类教育,科技,文明发展无一不是站在巨人的肩膀上。只有这样才能迅速成长。在这个知识大爆炸的时代,这兴许是已成为自然规律。
虽然现在越来越少有机会去亲身去经历一个小型网站如何逐步进化,蜕变成庞然大物的,但是我们可以参考现有的大型网站,研究它们是如何一步一步走到今天的。不管何种的大型网站架构,一般都会经历从简单到复杂,从单服务器到集群的演变。鄙人不才,作为新手,初探此径。总结了它们一般所经历的几个演变阶段。由于每个行业的业务存在较大差别,所以在某些方面可能会有不同,该演变阶段只是提供了一个简单的演变思路。真正的演变历程,原比我们想象要复杂的多,那是多少前辈与先驱者辛勤劳动与智慧的结晶。
第一阶段:有家网站初长成
由于网站规模很小,所有的程序,文件都会部署在通一台应用服务器上,甚至采用虚拟技术与其它网站共同部署在一台应用服务器上。
那么它的架构大致如下图:
第二阶段:分而治之
随着网站规模增大,将应用程序,文件存储,数据库单独部署,从而满足更多用户请求
由于每台应用服务器作用不同,它们关注的东西也不尽相同,如应用服务器,我们通常所说的
程序代码都跑在上面,那么最关注的是CPU。
单独部署架构大致如下:
第三阶段:二八定律
耳熟能详的二八定律再次降临,无论在管理,销售,教育等等领域,都有这经典二八理论一说。那么它对架构有着什么影响呢?
上个阶段我们已经将数据库,文件,应用程序作了单独部署,但是随着用户量的增大,数据库压力将面临挑战。由于大多数用户感兴趣所访问的数据(热门商品,公共数据),一般占了总数据的20%,就像热卖的商品只有性价比高的,或促销的那几样一个道理。那么既然如此我们可以把经常访问的数据事先加载入缓存,这样就不用每次都去访问数据库了。
加入缓存后的架构:
第四阶段:人多力量大的应用
加了缓存后,数据库的压力是得到了缓解,但是应用还是要被每个用户实实在在访问的,随着用户进一步增大,考虑增加应用服务器,实现集群技术采用负载均衡很好分摊了各服务器的压力。
应用服务器集群化后的架构图:
第五阶段:速度与主仆
在之前阶段中我们已经对经常访问的数据做了缓存,减轻了数据库的压力。但是缓存的只能是用户需要访问的数据,对于用户需要写入的数据,还是需要实实在在去访问数据库的,所以随着该类型的业务增长,数据库模块必须做出改变。一般我们会采用读写分离的技术,某几台数据服务器负责写操作,某几台数据服务器负责读操作,负责写的一般称之为主服务器,负责读的则称之为从服务器。然后将主服务器的数据同步到从服务器,从而保证数据的一致性。一般在这个阶段,说明我们网站的用户规模已经不可小觑了,那么用户体验将变得更加重要。用户体验最直接的影响就是用户通过浏览器来访问你的网页,你让用户看到网页上内容的时间。这个时间不仅仅取决服务的提供者我们,还取决于用户使用的浏览器,用户的使用网络服务商。所以我们必须尽可能让用户第一时间看到他们想要看到的。一般我们会在负载均衡前再部署2类应用设备,一类叫反向代理服务器,一类叫CDN(内容分发网络,有专门的服务提供商)这二者的本质还是缓存,我们将一些静态元素(html,js,css)和常用的数据缓存在上面,用户发起请求时,部分请求可直接由它们负责响应,大大提升了响应速度。由于用户有着区域性特点,通过在不同区域增加CDN节点,也能起到提升用户体验的效果。
该阶段的架构图大致如下:
第六阶段:集群普遍化
随着用户规模越来越大,主从式的数据库也出现了瓶颈,管理的文件也增加了不少,那么我们就将它们也集群化吧
数据库的集群还可以采用关系数据库与NoSQL数据库混合模式,不仅高效而且灵活。还有可以增加搜索引擎来检索数据。
第七阶段:SOA与分类
一般到了第六阶段,已经能够应付比较大规模的用户了,但是有的网站,由于其业务繁多,逻辑复杂,或者某些应用在特殊的应用场景下,其压力远远大于其他应用服务器。那么一般我们会采用SOA思想,将不同的应用拆分到不同的应用服务器集群,将相同的应用封装成公共服务,统一管理。不同应用之间还可以采用异步方式,缓解压力,加速响应。
一般到此为止,能够应付绝大多数海量用户了。当然一样的架构,由于其内部模块设计,算法,数据结构等因素,最后的表现也不尽相同。还有不同的企业,由于其业务导向,侧重点不一样,架构上也会做相应的调整。所以没有一成不变的大型网站架构,不变的只有其本质思想。
该阶段的架构图: