大型互联网网站架构心得之一:分
我们知道,对于一个大型网站来说,可伸缩性是非常重要的,怎么样在纵向和横向有良好的可伸缩性,就需要在做架构设计的时候考虑到一个分的原则,我想在多个方面说一下怎么分:
首先是横向的分:
1. 大的网站化解为多个小网站:当我们一个网站有多个功能的时候,可以考虑把这个网站拆分成几个小模块,每一个模块可以是一个网站,这样的话我们到时候就可以很灵活地去把这些网站部署到不同的服务器上。
2. 静态动态分离:静态文件和动态文件最好分离开成2个网站,我们知道静态网站和动态网站对服务器来说压力的侧重不同,前者可能重IO后者重CPU,那么我们在选择硬件的时候也可以有侧重,而且静态和动态内容的缓存策略也不一样。典型的应用,我们一般会有独立的文件或图片服务器。而且,使用不用的域名还可以提高浏览器并行加载的能力。
3. 按照功能来分:比如有一个模块是负责上传的,上传操作很消耗时间,如果和其它应用混在一起的话很可能,一点点访问就会使服务器瘫痪,这种特殊的模块应该分开。安全的不安全的也要分开,还需要考虑到以后SSL的购买。
4. 我们不一定要全部用自己的服务器,搜索、报表可以依靠别人的服务,比如google的搜索和报表服务,自己做的不一定比得过别人,服务器带宽都省了。
其次是纵向的分:
1. 文件也相当于数据库,IO的流量可能比数据库还大,这也算是纵向级别的访问,上传的文件图片一定要和WEB服务器分开。当然,数据库和网站都放在一个服务器上的很少了,这是最基本的。
2. 对于涉及到数据库访问的动态程序来说,我们可以使用一个中间层(所谓的应用层或逻辑层)来访问数据库(部署在独立的服务器上),最大的好处就是缓存和灵活性。缓存的内存占用比较大,我们要把它和网站进程分开,而且这样做我们可以很方便的去改变一些数据访问的策略,即使到时候数据库有分布的话在这里可以做一个调配工作,这样灵活性就很大了。还有好处是中间层可以做电线网通桥梁,可能网通访问双线再访问电信会比网通直接访问电信服务器快。
有人说我不分,我可以做负载均衡,对,是可以的,但是如果分的话,同样的10台机器肯定比不分10台机器可以承受更多的访问量,而且对硬件的需求可能不会很高,因为知道需要哪个硬件特别好。争取让每一个服务期都不空闲,又都不是太忙,合理进行组合调整和扩充,这样的系统伸缩性就高了,能根据访问量来调整的前提就是之前有考虑到分,分的好处是灵活性、伸缩性、隔离性以及安全性。
对服务器来说,我们有几点是要长期观察的,任何一点都可能是瓶颈:
1. CPU:动态文件的解析需要比较多的CPU,CPU出现瓶颈就要看是不是哪个功能过长时间占用线程,如果是就分出去。或者就是每一个请求处理时间不长,但是访问量很高,那么就加服务器。CPU是好东西,不能让他干等,不做事情。
2. 内存:缓存从IIS进程独立出去,一般对WEB服务器来说内存不够的情况不是很多。内存比磁盘快,要合理利用。
3. 磁盘IO:用性能监视器找到哪些文件IO特别大,找到了就分到独立的一组文件服务器上去,或者直接做CDN。磁盘慢,大规模读取数据的应用靠缓存,大规模写入数据的应用可以靠队列来降低突发的并发。
4. 网络:我们知道,网络的通讯是比较慢的,比磁盘还慢,如果是做分布式缓存,分布式计算的话,要考虑到物理服务器之间网络通讯的时间,当然,在流量大了以后,这可以提高系统的接纳能力一个等级。静态内容可以借助CSD分担一部分,在做服务器假设的时候还要考虑中国特色的电信网通情况以及防火墙。
对SQL SERVER数据库服务器来说[UPDATE]:
其实还是水平分割和纵向分割,一个二维表,水平分割就是横过来切一刀,纵向分割就是竖直切一刀:
1、纵向分割就是,我们不同的应用可以分到不同的DB中,不同的实例中,或者说把某个拥有很多字段的表拆分成小表。
2、横向分割就是,某些应用可能不负载,比如用户注册,但是用户表会非常大,可以把大表分开。可以采用表分区,数据存储在不同文件上,然后再部署到独立物理服务器增加IO吞吐以改善读写性能,土一点的做法就是自己定期把老的数据存档。表分区的另外一个优势可以增加数据查询速度,因为我们的页索引可以有多层了,就像一个文件夹中的文件不要太多,多分几层文件夹一样。
3、还可以通过数据库镜像、复制订阅、事物日志,把读写分开到不同的镜像物理数据库上,一般来说够用,如果还不行可以用硬件来实现数据库的负载均衡。当然,对于BI,我们可能还会有数据仓库。
架构上考虑到了这些之后,流量大了,就可以在这个的基础上再去调整或者做WEB服务器或者应用服务器的负载均衡。很多时候我们都是在重复发现问题-》找到瓶颈-》解决这个过程。
典型的架构如下:

动态WEB服务器配好点的CPU,静态WEB服务器和文件服务器磁盘好点
应用服务器内存大点,缓存服务器也是,数据库服务器当然内存和CPU都要好
请大家讨论。。。。
posted @ 2008-06-18 11:22
lovecherry 阅读(12278)
评论(68) 编辑 收藏 所属分类:
构架相关
发表评论
没有做过网站,不过觉得博主说的有道理,先收藏了~~
已收藏到个人知识库!
题目建议改为 大型互联网网站架构心得,必竟内网要考虑的问题有很多不同,如带宽、搜索引擎友好性等
“2. 对于涉及到数据库访问的动态程序来说,我们可以使用一个最中间层来访问数据库,最大的好处就是缓存和灵活性。”请问,指的是一个虚拟的Data Access 层(dll)吗?还是单独的服务器(群),再通过web service,WCF之类的交互?
怎么没有谈到数据库的水平分割呢?
还有我觉得这个“典型架构”不是很普适,一个问题的解决方案还是很多的,还是具体谈一下比较好,呵呵。
例如你说的中间层,WCF——这是典型的企业应用,而不是大部分Web 2.0应用值得使用的方案。大部分Web 2.0应用业务简单,业务逻辑层本身就很薄,再加一层的话,只是无谓地增加了消耗而已。
--引用--------------------------------------------------
美文宝车: 异步队列起什么作用?能否说说
--------------------------------------------------------
异步队列的一大重要好处就是解耦。
如果A和B是同步的话,B失败A也就失败了,异步队列的话,A完成B可以稍后完成,B失败了A也可以成功。灵活使用异步队列对于提高应用的可伸缩性很重要。
--引用--------------------------------------------------
石旭湘: 博主 能不能 写一下数据库怎么划分的 详细点
--------------------------------------------------------
楼主说的纵向划分就是指——
User一个数据库
Article一个数据库
Post一个数据库
Comment一个数据库
这种分割方式,也就是纵向分割或者垂直分割。
博客园里现牛人,见牛不怪矣!
严重支持!感谢分享!用心学习!
网站可以分 数据库最好是集中,可以通过异步镜像来分担查询的压力
说得好,但一般的小型网站或者BS的管理平台都用得不多,除非是那种访问量特别大的
@lovecherry
如果不是网站是一个B/S的OA系统呢,里面的模块一般怎么分呢?
#27楼[
楼主]2008-06-18 15:15 |
@赵俊
比如一个网站有购物和新闻两部分,理所当然会想到有news.xx.com 和 shop.xx.com 并不是说把权限这样的模块分出来,当然如果权限判断非常消耗资源也完全可以有一个单独的权限网站,通过URL跳转或WEB服务等方式来分离,不过要考虑这么做是否值得
#29楼[
楼主]2008-06-18 15:17 |
@Jack Niu
不是说数据访问层,分出去特别是分到独立的物理服务器要有其目的,如果你数据访问层只是来访问数据库的,对CPU和IO和内存都没有任何压力,分出去就不值得了,白白增加了网络的高延迟,如果你有充足的理由,比如降低CPU、内存或IO压力或为了安全等那就考虑有单独的物理服务器来host这个,当然你逻辑上还是可以分层。
#30楼[
楼主]2008-06-18 15:19 |
@<∩扫地僧∩>
需要大家自己体会了
@lovecherry
如果不是网站是一个B/S的OA系统呢,里面的模块一般怎么分呢?
--引用--------------------------------------------------
路过: 网站可以分 数据库最好是集中,可以通过异步镜像来分担查询的压力
--------------------------------------------------------
要大规模,必须要拆分的。
@lovecherry
如果不是网站是一个B/S的OA系统呢,里面的模块一般怎么分呢?
架设在互联网上的,按搂主说的分就行,局域网上的我觉得不分也罢,部署还不够麻烦的呢,直接加硬件吧。
--引用--------------------------------------------------
石旭湘: 博主 能不能 写一下数据库怎么划分的 详细点
--------------------------------------------------------
楼主说的纵向划分就是指——
User一个数据库
Article一个数据库
Post一个数据库
Comment一个数据库
这种分割方式,也就是纵向分割或者垂直分割。
------------------------------------------------------------
针对数据库这样说水平分,垂直分,有些不妥吧
水平分是将表分为多个表。这样,每个表包含的列数相同,但是行更少
垂直分是将表分为多个表,每个表包含较少的列
老赵说的那个应该属于架构上的划分吧?而不是数据库划分吧
@jillzhang
数据表的划分和数据库的划分吧,我是这样理解的。:P
@Jeffrey Zhao
数据库的水平分割可以使用分区吧?
另外比如可以将5000万个用户划分一个单元表。
我觉得超大型的应用中,数据库的设计还要充分考虑数据冗余带来的好处。
2. 内存:缓存从IIS进程独立出去,一般对WEB服务器来说内存不够的情况不是很多。内存比磁盘快,要合理利用。
不明白这个如何做到,请教楼主
#46楼[
楼主]2008-06-18 20:58 |
@PerfectDesign
.net remoting / wcf 不都提供了ipc/tcp的实现吗? 把dll使用windows服务host到独立进程
问一下楼主,如果我想把一个网站的新闻模块独立出来,比如按照你说的news.xx.com的形式,那这个独立出来的模块是建立成asp.net网站呢还是建立成asp.net web 应用程序或者还是其它的形式呢(个人觉得好像建立成asp.net web 应用程序会在系统进程中启动多个asp.net进程),而且现在只有一台应用服务器,谢谢!
看你们全讨论的都是IIS,大型的用WINDOWS做服务器可能不行哟
一般都LINUX做服务器,目前主流的WEB 2.0基本都是用PHP开发
对于涉及到数据库访问的动态程序来说,我们可以使用一个中间层(所谓的应用层或逻辑层)来访问数据库(部署在独立的服务器上)--逻辑层部署在独立的服务器上,那么展示层如何或许逻辑层的接口???难道你说的逻辑层是用webservice来实现的?
#61楼[
楼主]2008-09-08 09:36 |
@zzuyongp
通过接口
@lovecherry
如果是webservice实现我就没疑问了,但您说的应该不仅仅这种方式,那么您说的通过接口究竟是什么方式实现?能否举例说明一下。谢谢
@lovecherry
您说的 中间层 和展示层不在一个应用程序中,甚至不在同一台服务器,是吗?
#64楼[
楼主]2008-09-08 14:38 |
@zzuyongp
wcf, .net remoting 都可以根据接口进行跨机器的调用
可以根据负载分布在不同的物理服务器
请教一下博主,网站的横纵分割是怎么来区分的?
为什么说 1. 大的网站化解为多个小网站 2. 按照功能来分, 这些是属于横向分割呢?我感觉更像是纵向的.