文档库 最新最全的文档下载
当前位置:文档库 › 网站构架

网站构架


Mainz's Blog用开放的心态,打造专业的人生
大型网站系统架构分析
千万级的注册用户,千万级的帖子,nTB级的附件,还有巨大的日访问量,大型网站采用什么系统架构保证性能和稳定性?

首先讨论一下大型网站需要注意和考虑的问题。

数据库海量数据处理:负载量不大的情况下select、delete和update是响应很迅速的,最多加几个索引就可以搞定,但千万级的注册用户和一个设计不好的多对多关系将带来非常严重的性能问题。另外在高UPDATE的情况下,更新一个聚焦索引的时间基本上是不可忍受的。索引和更新是一对天生的冤家。
高并发死锁:平时我们感觉不到,但数据库死锁在高并发的情况下的出现的概率是非常高的。
文件存储的问题:大型网站有海量图片数据、视频数据、文件数据等等,他们如何存储并被有效索引?高并发的情况下IO的瓶颈问题会迅速显现。也许用RAID和专用存贮服务器能解决眼下的问题,但是还有个问题就是各地的访问问题,也许我们的服务器在北京,可能在云南或者海南的访问速度如何解决?如果做分布式,那么我们的文件索引以及架构该如何规划。
接下来讨论大型网站的底层系统架构,来有效的解决上述问题。

毋庸置疑,对于规模稍大的网站来说,其背后必然是一个服务器集群来提供网站服务,例如,2004年eBay的服务器有2400台,估计现在更多。当然,数据库也必然要和应用服务分开,有单独的数据库服务器集群。对于像淘宝网这样规模的网站而言,就是应用也分成很多组。



下面,就从服务器操作系统与Web服务器、数据库、服务器集群与负载均衡、缓存、独立的图片服务器、其它等几个方面来分析大型网站的系统架构。

服务器操作系统与Web服务器

最底层首先是操作系统。好的操作系统能提高好的性能、稳定性和安全性,而这些对大型网站的性能、安全性和稳定性都是至关重要的。

淘宝网(阿里巴巴): Linux操作系统 + Web 服务器: Apache
新浪:FreeBSD + Web 服务器:Apache
Yahoo:FreeBSD + Web 服务器:自己的
Google: 部分Linux + Web 服务器:自己的
百度:Linux + Web 服务器: Apache
网易:Linux + Web 服务器: Apache
eBay: Windows Server 2003/8 (大量) + Web 服务器:Microsoft IIS
MySpace: Windows Server 2003/8 + Web 服务器:Microsoft IIS
由此可见,开源操作系统做Web应用是首选已经是一个既定事实。在开源操作系统中Linux和FreeBSD差不太多,很难说哪个一定比另外一个要优秀很多、能够全面的超越对手,应该是各有所长。但熟悉Linux的技术人员更多些,利于系统管理、优化等,所以Linux使用更广泛。而Windows Server和I

IS虽然有的网站使用,但不开源,而且需要购买微软的一系列应用产品,限制了其使用。总之,开源操作系统,尤其是Linux做Web应用是首选已经是一个既定事实。

常用的系统架构是:

Linux + Apache + PHP + MySQL
Linux + Apache + Java (WebSphere) + Oracle
Windows Server 2003/2008 + IIS + C#/https://www.wendangku.net/doc/494140953.html, + 数据库
数据库

因为是千万人同时访问的网站,所以一般是有很多个数据库同时工作的,说明白一点就是数据库集群和并发控制,数据分布到地理位置不同的数据中心,以免发生断电事故。

主流的数据库有Sun的是MySQL和Oracle。

Oracle是一款优秀的、广泛采用的商业数据库管理软件。有很强大的功能和安全性,可以处理相对海量的数据。而MySQL是一款非常优秀的开源数据库管理软件,非常适合用多台PC Server组成多点的存储节点阵列(这里我所指的不是MySQL自身提供的集群功能),每单位的数据存储成本也非常的低廉。用多台PC Server安装MySQL组成一个存储节点阵列,通过MySQL自身的Replication或者应用自身的处理,可以很好的保证容错(允许部分节点失效),保证应用的健壮性和可靠性。可以这么说,在关系数据库管理系统的选择上,可以考虑应用本身的情况来决定。

MySQL数据库服务器的master-slave模式,利用数据库服务器在主从服务器间进行同步,应用只把数据写到主服务器,而读数据时则根据负载选择一台从服务器或者主服务器来读取,将数据按不同策略划分到不同的服务器(组)上,分散数据库压力。

服务器集群与负载均衡

服务器群集中每个服务结点运行一个所需服务器程序的独立拷贝,而网络负载均衡则将工作负载在这些主机间进行分配。负载均衡建立在现有网络结构之上,它提供了一种廉价有效的方法扩展服务器带宽和增加吞吐量,加强网络数据处理能力,提高网络的灵活性和可用性。它主要完成以下任务:解决网络拥塞问题,服务就近提供,实现地理位置无关性 ;为用户提供更好的访问质量;提高服务器响应速度;提高服务器及其他资源的利用效率;避免了网络关键部位出现单点失效。

常用的服务器集群和数据库集群负载均衡实现方法:

Citrix NetScaler的硬件负载均衡交换机做服务器集群的负载均衡。
MySQL Proxy做MySQL服务器集群的负载均衡并实现读写分离。其实现读写分离的基本原理是让主数据库处理事务性查询,而从数据库处理SELECT查询。数据库复制被用来把事务性查询导致的变更同步到集群中的从数据库。
CDN (Content Delivery Network): 几乎在各大网站都有使用该技术。例如,使得你的网站在各省市访问更快,其原理是采取了分布式网络缓存结

构(即国际上流行的web cache技术),通过在现有的Internet中增加一层新的网络架构,将网站的内容发布到最接近用户的cache服务器内,通过DNS负载均衡的技术,判断用户来源就近访问cache服务器取得所需的内容,解决Internet网络拥塞状况,提高用户访问网站的响应速度,如同提供了多个分布在各地的加速器,以达到快速、可冗余的为多个网站加速的目的。
缓存

众所周知,使用缓存能有效应对大负载,减少数据库的压力,并显著提高多层应用程序的性能,如果某个用户多次请求同一资源,则可以从缓存返回该资源,从而避免了重新从服务器或数据库请求该资源而产生的系统开销。缓存可以通过减少获取请求的资源所需的时间,提高应用程序性能。缓存还可以通过减少到服务器的往返次数,降低网络通信量。尽管缓存可以提高性能,但它也增加了返回到应用程序的资源可能变得陈旧的风险。这意味着,返回的资源可能与假设没有使用缓存的情况下,服务器有可能发送的资源并不完全相同(即取得“脏数据”)。


即便如此,简单的缓存策略也能大大提升网站性能。例如,Youtube把首页最新的视频列表缓存60秒,也就是说60秒内并发的request都是从缓存读取的,大大减少了数据库压力。再加上CDN,使得Youtube首页的并发访问速度很快。


单机内存缓存、文件缓存、数据库缓存等的策略都是可以很简单的实现的,例如可以使用微软的Caching Application Block,但如何在集群环境中使多个缓存、多层缓存并保存同步是个重大问题。大型网站一般都使用缓存服务器群,并使用多层缓存。业内最常用的有:

Squid cache,Squid服务器群,把它作为web服务器端前置cache服务器缓存相关请求来提高web服务器速度。Squid将大部分静态资源(图片,js,css等)缓存起来,直接返回给访问者,减少应用服务器的负载
memcache,memcache服务器群,一款分布式缓存产品,很多大型网站在应用; 它可以应对任意多个连接,使用非阻塞的网络IO。由于它的工作机制是在内存中开辟一块空间,然后建立一个HashTable,Memcached自管理这些HashTable。因为通常网站应用程序中最耗费时间的任务是数据在数据库的检索,而多个用户查询相同的SQL时,数据库压力会增大,而通过memcache的查询缓存命中,数据直接从memcache内存中取,每次缓存命中将替换到数据库服务器的一次往返,到达数据库服务器的请求更少,间接地提高了数据库服务器的性能,从而使应用程序运行得更快。它通过基于内存缓存对象来减少数据库查询的方式改善网站系统的反应,其最吸引人的一个特性就是支持分布式部署。有关mem

cache,以下文章可以参考:参考1,参考2,参考3官方站点。
e-Accelerator,比较特殊,PHP的缓存和加速器。是一个免费开源的PHP加速、优化、编译和动态缓存的项目,它可以通过缓存PHP代码编译后的结果来提高PHP脚本的性能,使得一向很复杂和离我们很远的 PHP脚本编译问题完全得到解决。通过使用eAccelerator,可以优化你的PHP代码执行速度,降低服务器负载,可以提高PHP应用执行速度最高达10倍。
独立的图片服务器

无论从管理上,还是从性能上看,只要有可能,尽量部署独立的图片服务器。这几乎成为常识了。具备独立的图片服务器或者服务器集群后,在 Web 服务器上就可以有针对性的进行配置优化。

其他

一个互联网应用,除了服务器的操作系统,Web Server软件,应用服务器软件,数据库软件外,我们还会涉及到一些其他的系统,比如一些中间件系统、文件存储系统(图片服务器,视频服务器,管理服务器,RSS和广告服务器等等)、全文检索、搜索、等等。会在以后介绍。

或许您对以下相关文章有兴趣:

CTO谈豆瓣网和校内网技术架构变迁
Fixing Twitter - 提高世界上最流行的微博客系统性能和可扩展性
开心农场的架构
DAL - 手机之家的数据访问层实践
与冯大辉谈数据库架构(InfoQ)
大型网站架构演变和知识体系
说 说企业架构(企业级架构)和应用程序架构
架构设计之性能设计经验
也谈系统设计的一些原则
谈谈设计不足(under-engineering)与过度设计(over-engineering)
利用 squid 反向代理提高网站性能
@:Mainz → https://www.wendangku.net/doc/494140953.html,/Mainz
?: 博文是本人当时的学习笔记及知识整理,由于自身局限错误在所难免,敬请斧正. 博文中源码只作为例子学习参考之用,不保证能运行,对后果不负任何责且无任何质保,如有不明请给我留言
?: 本文版权属于博客园和本人,版权基于署名 2.5 中国大陆许可协议发布,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接和署名Mainz(包含链接),不得删节,否则保留追究法律责任的权利。

分类: 架构与设计模式
标签: 架构, 设计, 性能
绿色通道:好文要顶关注我收藏该文与我联系
Mainz
关注 - 11
粉丝 - 127荣誉:推荐博客
+加关注40(请您对文章做出评价)? 博主前一篇:ExtJS服务器端技术的选择
? 博主后一篇:ExtJS之https://www.wendangku.net/doc/494140953.html,服务器端实现ashx和asmx处理客户端请求

posted on 2009-04-28 14:36 Mainz 阅读(6882) 评论(9) 编辑 收藏


评论
2148342 #1楼 2009-04-28 19:41 DiryBoy 开眼界,收藏了。 回复 引用 查看

#2楼 2009-07-24 11:26 埃保常[未注册用户] Linux和freebsd有

什么区别 回复 引用

#3楼 2009-09-19 13:18 ITLOVER 回复 引用 查看

#4楼 2009-10-10 09:25 ljsheng 高深莫测 回复 引用 查看

#5楼 2009-11-02 13:24 凯林资讯在线[未注册用户] 是越来越深了,以前学的东西现在都过时了!!技术换代快呀!! 回复 引用

#6楼 2009-11-12 21:58 zhengli[未注册用户] 受教了,谢谢! 回复 引用

#7楼 2009-12-07 20:00 24xinhui[未注册用户] 总结的非常好,多谢 回复 引用

#8楼 2011-07-05 19:51 五香瓜子 mark 回复 引用 查看

#9楼 2011-07-11 20:05 老刘哈哈 收藏! 回复 引用 查看

注册用户登录后才能发表评论,请 登录 或 注册,返回博客园首页。
最新IT新闻:
· 惠普 PC 业务何去何从?
· 不要偷黑客的东西
· 传腾讯筹建大连分公司 主做移动互联网业务
· 900团被曝下单后人间蒸发
· Facebook成为全美第三大网络视频网站
? 更多新闻...
最新知识库文章:

· 能大大提升工作效率和时间效率的9个重要习惯
· 高效的面试方式:结对编程
· 如何学习一门新的语言
· 持续交付的八条原则,你能做到几条?
· 人们最初厌恶编程的10个原因

? 更多知识库文章...

China-pub 2011秋季教材巡展
China-Pub 计算机绝版图书按需印刷服务

网站导航: 网站首页知识库IT新闻我的园子闪存程序员招聘博问 导航

首页
新随笔
联系
订阅
管理
公告
.NET专家,攻城师,PMP,常居上海;专注于微软平台技术架构、项目管理和企业解决方案,略懂WinForm、https://www.wendangku.net/doc/494140953.html,、WPF、WCF、WF、Silverlight,JS,PHP,HTML,CSS,UNIX,C,SQL...活到老,学到老,学的越多才知道自己不知道的更多...博文受本人知识局限错误在所难免,请多多赐教!


Tags
WCF 架构 哲理 Unix 网页设计 Entity Framework 设计 UML Ria JavaScript Logging ExtJS SNS 性能 网站 代码生成器 Silverlight XML Spring Prism SQL MVVM 创业 修行 项目管理 https://www.wendangku.net/doc/494140953.html, 内存泄露 jQuery 管理 沟通 linq 正则表达式
Links
MSDN杂志 云风的blog Jeffrey Zhao 阿一(杨正祎) 旁观者 李天平 张逸 蓝色理想 前端工具 SL游戏 周公的专栏
昵称:Mainz
园龄:3年
荣誉:推荐博客
粉丝:127
关注:11
统计
随笔 - 338
文章 - 61
评论 - 1107
引用 - 99
最新闪存
Please enjoy the pain which is unable to avoid.-- 哈佛图书馆管训 08-06 20:56
当你觉得为时已晚的时候,恰恰是最早的时候。-- 哈佛图书馆管训 02-23 22:05
见贤思齐,勿以善小而不为,用平等心来对待人、事和外界事物,用精进的心来对待你要做的工作 02-23 14:15
更多闪存...
搜索

随笔分类(334)
C#(37) (rss)
Database / SQL(15) (rss)
SilverLight(9

3) (rss)
SOA / WCF(5) (rss)
XML(1) (rss)
架构与设计模式(21) (rss)
其它(78) (rss)
商业/技术不是全部(32) (rss)
算法(2) (rss)
项目管理与流程改进(29) (rss)
职场(21) (rss)
文章分类(64)
C++/ATL/COM(9) (rss)
UNIX(9) (rss)
技术(21) (rss)
项目管理(7) (rss)
英语(6) (rss)
用户体验/可用性(1) (rss)
正则表达式(1) (rss)
职场(10) (rss)
收藏夹(531)
https://www.wendangku.net/doc/494140953.html, AJAX(78) (rss)
C++内存管理(5) (rss)
CLR(33) (rss)
Comet(9) (rss)
CSS(20) (rss)
Database-SQL-SP(55) (rss)
Effective C#(11) (rss)
Enterprise Library(3) (rss)
Flex(6) (rss)
Https(2) (rss)
JavaScript(69) (rss)
P2P(12) (rss)
SAP(2) (rss)
SEO搜索优化(1) (rss)
SOA / WebServices(7) (rss)
SSL(5) (rss)
Testing(2) (rss)
UML(6) (rss)
Visual Studio技巧(11) (rss)
WCF(9) (rss)
Winform(8) (rss)
XML XSD XSLT XPATH(7) (rss)
插件架构(5) (rss)
产品策划运营(1) (rss)
多线程(10) (rss)
敏捷开发(1) (rss)
其它(44) (rss)
设计模式 & UML(26) (rss)
算法与数据结构(11) (rss)
网页设计与配色(13) (rss)
未分类 (rss)
项目管理(23) (rss)
用户体验设计(6) (rss)
正则表达式 (12) (rss)
职场职业创业(18) (rss)
最新随笔
1. [Silverlight入门系列]用扩展方法解决Prism导航Navigation在页面间传递复杂对象的问题
2. [Silverlight入门系列]如何做x轴平推动画效果
3. [Silverlight入门系列]Button的鼠标经过默认背景色如何自定义(Hover background)
4. [Silverlight入门系列]仿Facebook的关闭按钮的ChildWindow样式
5. [Silverlight入门系列]实现局部元素全屏(Element部分全屏)
6. [Silverlight入门系列]页面加载完默认自动执行一个操作
7. 什么是商业模式(Business Model)?
8. Android电子书下载:Google Android SDK开发范例大全(第2版)pdf+源码
9. [Silverlight入门系列]树形DataGrid/TreeDataGridView/树形列表
10. 几个C++单元测试框架
11. JavaScript命名空间namespace的实现方法
12. JavaScript类的几种写法
13. JavaScript中this的指向问题
14. [Silverlight入门系列]修改VS2010的默认Silverlight模板
最新评论
1. Re:[Silverlight入门系列]用扩展方法解决Prism导航Navigation在页面间传递复杂对象的问题
Mainz神马的最给力了。
--Ray.Yan
2. Re:[Silverlight入门系列]用扩展方法解决Prism导航Navigation在页面间传递复杂对象的问题
@潇潇兮
我刚试了在VS正常,你用的是IE浏览器?最好用Firefox。
--Mainz
3. Re:[Silverlight入门系列]用扩展方法解决Prism导航Navigation在页面间传递复杂对象的问题
引用Mainz:@潇潇兮按住Alt+鼠标左键选列模式直接删除行号引用没研究明白,而且我把你的代码copy到VS里后,所有的代码都是在一行里的。。。...
--潇潇兮
4. Re:[Silverlight入门系列]用扩展方法解决Prism导航Navigation

在页面间传递复杂对象的问题
@潇潇兮1 拷贝到VS2010里面,按住Alt+鼠标左键选列模式直接删除行号,非常方便。2 头像不是我,没那么年轻,比较像而已。呵呵。...
--Mainz
5. Re:[Silverlight入门系列]用扩展方法解决Prism导航Navigation在页面间传递复杂对象的问题
1. 本文源码已经在文中提供,请自行拷贝,本文结束。每一行代码都会有行号1234的,太不方便了。
2. Mainz头像是你本人啊?跟明星似的?
--潇潇兮
6. Re:[Silverlight入门系列]Prism中TreeView真正实现MVVM模式和Expanded发生时异步动态加载子节点(WCFRiaService)
求解压缩密码,Email: A791208@https://www.wendangku.net/doc/494140953.html, 多谢了!!
--webson
7. Re:JavaScript中this的指向问题
恩,那个说法是欠妥了,楼主深究精神令在下佩服@~@
--bird1986
8. Re:[Silverlight入门系列]Prism中TreeView真正实现MVVM模式和Expanded发生时异步动态加载子节点(WCFRiaService)
收到啦,谢谢M哥
--小师弟
9. Re:JavaScript中this的指向问题
@bird1986再补充一点,你说的“javascript是按行解析执行的”不妥,js是块编译的(类似预编译),你可以参考this和this。...
--Mainz
10. Re:JavaScript中this的指向问题
@bird1986恩,你表达的很好。我补充一点:就具体这个例子来说,函数function e() 的实例在运行期被tom.f引用,注意是函数实例被函数“引用”而已;所以这个运行期闭包是全局的,这样理解...
--Mainz
阅读排行榜
1. 同是80后,为什么程序员与程序员的差距那么大呢?(26464)
2. string和byte[]的转换 (C#)(19335)
3. 说说几种让人烦心的开发人员(7356)
4. 大型网站系统架构分析(6882)
5. 架构设计之性能设计经验(6653)
6. CTO谈豆瓣网和校内网技术架构变迁(5391)
7. 能大大提升工作效率和时间效率的9个重要习惯(5052)
8. 什么是专业的程序员(4944)
9. 程序员办网站创业,几个问题你想好了吗?(4940)
10. 使用VS2008进行WEB负载测试(4435)
评论排行榜
1. 同是80后,为什么程序员与程序员的差距那么大呢?(122)
2. 说说几种让人烦心的开发人员(107)
3. 程序员办网站创业,几个问题你想好了吗?(74)
4. 新浪微博OAuth第三方登录C#源代码下载(73)
5. [Silverlight入门系列]Prism中TreeView真正实现MVVM模式和Expanded发生时异步动态加载子节点(WCFRiaService)(66)
6. 什么是专业的程序员(50)
7. 团队管理中的有效沟通(41)
8. 能大大提升工作效率和时间效率的9个重要习惯(40)
9. 用户体验这点事儿(29)
10. 团队管理中的有效沟通(续)(23)
Powered by:
博客园
Copyright ? Mainz

相关文档