转自:http://www.csdn.net/article/2012-01-05/310198web
Web2.0的兴起,掀起了互联网新一轮的网络创业大潮。以用户为导向的新网站建设概念,细分了网站功能和用户群,不只成功的造就了一大批新生的网站,也极大的方便了上网的人们。但Web2.0以用户 为导向的理念,使得新生的网站有了新的特色——高并发,高流量,数据量大,逻辑复杂等,对网站建设也提出了新的要求。算法
本文围绕高并发高流量的网站架构设计问题,主要研究讨论了如下内容:缓存
首 先在整个网络的高度讨论了使用镜像网站,CDN内容分发网络等技术对负载均衡带来的便利及各自的优缺点比较。而后在局域网层次对第四层交换技术,包括硬件 解决方案F5和软件解决方案LVS,进行了简单的讨论。接下来在单服务器层次,本文着重讨论了单台服务器的Socket优化,硬盘级缓存技术,内存级缓存 技术,CPU与IO平衡技术(即以运算为主的程序与以数据读写为主的程序搭配部署),读写分离技术等。在应用层,本文介绍了一些大型网站经常使用的技术,以及 选择使用该技术的理由。最后,在架构的高度讨论了网站扩容,容错等问题。服务器
本文以理论与实践相结合的形式,结合做者实际工做中获得的经验,具备较普遍的适用性。网络
1 引言架构
最近十年间,互联网已经从一个单纯的用于科研的,用来传递静态文档的美国内部网络,发展成了一个应用于各行各业的,传送着海量多媒体及动态信息的全球网络。 从规模上看,互联网在主机数、带宽、上网人数等方面几乎一直保持着指数增加的趋势,2006年7月,互联网上共有主机439,286,364 台,WWW 站点数量达到 96,854,877个 [1]。全球上网人口在2004 年达到 7 亿 2900万 [2],中国的上网人数 在 2006 年 12 月达到了约 1亿3700 万[3]。另外一方面,互联网所传递的内容也发生了巨大的变化,早期互联网以静态、文本的公共信息为主 要内容,而目前的互联网则传递着大量的动态、多媒体及人性化的信息,人们不只能够经过 互联网阅读到动态生成的信息,并且能够经过它使用电子商务、即时通 信、网上游戏等交互性很强的服务。所以,能够说互联网已经再也不仅仅是一个信息共享网络,而已经成为了一个无所不在的交互式服务的平台。并发
1.1 互联网的发展负载均衡
1.2 互联网网站建设的新趋势socket
互联网不断扩大的规模,日益增加的用户群,以及web2.0[4]的兴起,对互联网网站建设提出了新的要求:tcp
高 性能和高可扩展性。2000 年 5 月,访问量排名世界第一(统计数据来源[5])的Yahoo [6]声称其日页浏览数达到 6 亿 2500 万, 即每秒约 30,000 次HTTP 请求(按每一个页面浏览平均产生 4 次请求计算) 。这样大规模的访问量对服务的性能提出了很是高的要求。更为重要 的是, 互联网受众的普遍性,使得成功的互联网服务的访问量增加潜力和速度很是大,所以服务系统必须具备很是好的可扩展性,以应付未来可能的服务增加。
支持高度并发的访问。高度并发的访问对服务的存储与并发能力提出了很高的要求,当前主流的超标量和超流水线处理器能处理的并发请求数是有限的,由于随着并发 数的上升,进程调度的开销会很快上升。互联网广域网的本质决定了其访问的延迟时间较长,所以一个请求完成时间也较长,按从请求产生到页面下载完成 3 秒 计算, Yahoo 在 2000 年 5 月时平均有 90,000 个并发请求。并且对于较复杂的服务,服务器每每要维护用户会话的信息,例如一个互 联网网站若是天天有 100 万次用户会话,每次 20分钟的话,那平均同时就会有约 14000 个并发会话。
高 可用性。互联网服务的全球性决定了其天天 24 小时都会有用户访问,所以任何服务的中止都会对用户形成影响。而对于电子商务等应用,暂时的服务停止则意 味着客户的永久失去及大量的经济损失,例如ebay.com[7]1999 年 6 月的一次 22小时的网站不可访问,对此网站的 380万用户的忠诚 度形成巨大影响,使得 Ebay 公司不得不支付了近500万美圆用于补偿客户的损失,而该公司的市值同期降低了 40 亿美圆[8]。所以,关键互联网 应用的可用性要求很是高。
1.3 新浪播客的简介
以 YouTube[9]为表明的微视频分享网站近来方兴未艾,仅2006年一年,国内就出现近百家仿YouTube的微视频分享网站[10],试图复制 YouTube的成功模式。此类网站能够说是Web2.0概念下的表明网站,具备Web2.0网站全部典型特征:高并发,高流量,数据量大,逻辑复杂,用 户分散等等。新浪[11]做为国内最大的门户网站,在2005年成功运做新浪博客的基础上,于2006年末推出了新浪播客服务。新浪播客做为国内门户网站 中第一个微视频分享服务的网站,依靠新浪网站及新浪博客的巨大人气资源,在推出后不到半年的时间内,取得了巨大的成功:同类网站中上传视频数量第1、流量 增加最快、用户数最多[12],全部这些成绩的取得的背后,是巨大的硬件投入,良好的架构支撑和灵活的应用层软件设计。
2.1 镜像网站技术
镜像网站是指将一个彻底相同的站点放到几个服务器上,分别有本身的URL,这些服务器上的网站互相称为镜像网站[13]。镜像网站和主站并无太大差异,或 者能够视为主站的拷贝。镜像网站的好处是:若是不能对主站做正常访问(如服务器故障,网络故障或者网速太慢等),仍能经过镜像服务器得到服务。不便之处 是:更新网站内容的时候,须要同时更新多个服务器;须要用户记忆超过一个网址,或须要用户选择访问多个镜像网站中的一个,而用户选择的,不必定是最优的。 在用户选择的过程当中,缺少必要的可控性。
在 互联网发展的初期,互联网上的网站内容不多,并且大都是静态内容,更新频率底。但由于服务器运算能力低,带宽小,网速慢,热门网站的访问压力仍是很大。镜 像网站技术在这种状况下做为一种有效解决方案,被普遍采用。随着互联网的发展,愈来愈多的网站使用服务器端脚本动态生成内容,同步更新愈来愈困难,对可控 性要求愈来愈高,镜像技术由于不能知足这类网站的须要,渐渐的淡出了人们的视线。但有一些大型的软件下载站,由于符合镜像网站的条件——下载的内容是静态 的,更新频率较低,对带宽,速度要求又比较高,如国外的SourceForge (http://www.SourceForge.net,著名开源软件托管网站),Fedora(http://fedoraproject.org,RedHat赞助的Linux发行版),国内的华军软件园(http://www.onlinedown.net),天空软件站(http://www.skycn.com)等,还在使用这项技术(图1)。
图1 上图:天空软件站首页的镜像选择页面
下图:SourceForge下载时的镜像选择页面
在网站建设的过程当中,能够根据实际状况,将静态内容做一些镜像,以加快访问速度,提高用户体验。
2.2 CDN内容分发网络
CDN 的全称是Content Delivery Network,即内容分发网络。其目的是经过在现有的互联网中增长一层新的网络架构,将网站的内容发布到最 接近用户的网络“边缘”,使用户能够就近取得所需的内容,分散服务器的压力,解决互联网拥挤的情况,提升用户访问网站的响应速度。从而解决因为网络带宽 小、用户访问量大、网点分布不均等缘由所形成的用户访问网站响应速度慢的问题[14]。
CDN 与镜像网站技术的不一样之处在于网站代替用户去选择最优的内容服务器,加强了可控制性。CDN实际上是夹在网页浏览者和被访问的服务器中间的一层镜像或者说缓 存,浏览者访问时点击的仍是服务器原来的URL地址,可是看到的内容实际上是对浏览者来讲最优的一台镜像服务器上的页面缓存内容。这是经过调整服务器的域名 解析来实现的。使用CDN技术的域名解析服务器须要维护一个镜像服务器列表和一份来访IP到镜像服务器的对应表。当一个用户的请求到来的时候,根据用户的 IP,查询对应表,获得最优的镜像服务器的IP地址,返回给用户。这里的最优,须要综合考虑服务器的处理能力,带宽,离访问者的距离远近等因素。当某个地 方的镜像网站流量过大,带宽消耗过快,或者出现服务器,网络等故障的时候,能够很方便的设置将用户的访问转到另一个地方(图2)。这样就加强了可控制 性。
图2 CDN原理示意图
CDN 网络加速技术也有它的局限性。首先,由于内容更新的时候,须要同步更新多台镜像服务器,因此它也只适用于内容更新不太频繁,或者对实时性要求不是很高的网 站;其次,DNS解析有缓存,当某一个镜像网站的访问须要转移时,主DNS服务器更改了IP解析结果,但各地的DNS服务器缓存更新会滞后一段时间,这段 时间内用户的访问仍然会指向该服务器,可控制性依然有不足。
目前,国内访问量较高的大型网站如新浪、网易等的资讯频道,均使用CDN网络加速技术(图3),虽然网站的访问量巨大,但不管在什么地方访问,速度都会很快。但论坛,邮箱等更新频繁,实时性要求高的频道,则不适合使用这种技术。
2.1 镜像网站技术
镜像网站是指将一个彻底相同的站点放到几个服务器上,分别有本身的URL,这些服务器上的网站互相称为镜像网站[13]。镜像网站和主站并无太大差异,或 者能够视为主站的拷贝。镜像网站的好处是:若是不能对主站做正常访问(如服务器故障,网络故障或者网速太慢等),仍能经过镜像服务器得到服务。不便之处 是:更新网站内容的时候,须要同时更新多个服务器;须要用户记忆超过一个网址,或须要用户选择访问多个镜像网站中的一个,而用户选择的,不必定是最优的。 在用户选择的过程当中,缺少必要的可控性。
在 互联网发展的初期,互联网上的网站内容不多,并且大都是静态内容,更新频率底。但由于服务器运算能力低,带宽小,网速慢,热门网站的访问压力仍是很大。镜 像网站技术在这种状况下做为一种有效解决方案,被普遍采用。随着互联网的发展,愈来愈多的网站使用服务器端脚本动态生成内容,同步更新愈来愈困难,对可控 性要求愈来愈高,镜像技术由于不能知足这类网站的须要,渐渐的淡出了人们的视线。但有一些大型的软件下载站,由于符合镜像网站的条件——下载的内容是静态 的,更新频率较低,对带宽,速度要求又比较高,如国外的SourceForge (http://www.SourceForge.net,著名开源软件托管网站),Fedora(http://fedoraproject.org,RedHat赞助的Linux发行版),国内的华军软件园(http://www.onlinedown.net),天空软件站(http://www.skycn.com)等,还在使用这项技术(图1)。
图1 上图:天空软件站首页的镜像选择页面
在网站建设的过程当中,能够根据实际状况,将静态内容做一些镜像,以加快访问速度,提高用户体验。
下图:SourceForge下载时的镜像选择页面
2.2 CDN内容分发网络
CDN的全称是Content Delivery Network,即内容分发网络。其目的是经过在现有的互联网中增长一层新的网络架构,将网站的内容发布到最 接近用户的网络“边缘”,使用户能够就近取得所需的内容,分散服务器的压力,解决互联网拥挤的情况,提升用户访问网站的响应速度。从而解决因为网络带宽 小、用户访问量大、网点分布不均等缘由所形成的用户访问网站响应速度慢的问题[14]。
CDN与镜像网站技术的不一样之处在于网站代替用户去选择最优的内容服务器,加强了可控制性。CDN实际上是夹在网页浏览者和被访问的服务器中间的一层镜像或者说缓 存,浏览者访问时点击的仍是服务器原来的URL地址,可是看到的内容实际上是对浏览者来讲最优的一台镜像服务器上的页面缓存内容。这是经过调整服务器的域名 解析来实现的。使用CDN技术的域名解析服务器须要维护一个镜像服务器列表和一份来访IP到镜像服务器的对应表。当一个用户的请求到来的时候,根据用户的 IP,查询对应表,获得最优的镜像服务器的IP地址,返回给用户。这里的最优,须要综合考虑服务器的处理能力,带宽,离访问者的距离远近等因素。当某个地 方的镜像网站流量过大,带宽消耗过快,或者出现服务器,网络等故障的时候,能够很方便的设置将用户的访问转到另一个地方(图2)。这样就加强了可控制 性。
图2 CDN原理示意图
CDN网络加速技术也有它的局限性。首先,由于内容更新的时候,须要同步更新多台镜像服务器,因此它也只适用于内容更新不太频繁,或者对实时性要求不是很高的网 站;其次,DNS解析有缓存,当某一个镜像网站的访问须要转移时,主DNS服务器更改了IP解析结果,但各地的DNS服务器缓存更新会滞后一段时间,这段 时间内用户的访问仍然会指向该服务器,可控制性依然有不足。
目前,国内访问量较高的大型网站如新浪、网易等的资讯频道,均使用CDN网络加速技术(图3),虽然网站的访问量巨大,但不管在什么地方访问,速度都会很快。但论坛,邮箱等更新频繁,实时性要求高的频道,则不适合使用这种技术。
图3 新浪网使用ChinaCache CDN服务。
ChinaCache的服务节点全球超过130个,
其中中国节点超过80个,
覆盖全国主要6大网络的主要省份[15]。
2.3 应用层分布式设计
新浪播客为了得到CDN网络加速的优势,又必须避免CDN的不足,在应用层软件设计上,采起了一个替代的办法。新浪播客提供了一个供播放器查询视频文件地址 的接口。当用户打开视频播放页面的时候,播放器首先链接查询接口,经过接口得到视频文件所在的最优的镜像服务器地址,而后再到该服务器去下载视频文件。这 样,用一次额外的查询得到了所有的控制性,而此次查询的通信流量很是小,几乎能够忽略不计。CDN中由域名解析得到的灵活性也保留了下来:由接口程序维护 镜像网站列表及来访IP到镜像网站的对应表便可。镜像网站中不须要镜像全部的内容,而是只镜像更新速度较慢的视频文件。这是彻底能够承受的。
2.4 网络层架构小结
从整个互联网络的高度来看网站架构,努力的方向是明确的:让用户就近取得内容,但又要在速度和可控制性之间做一个平衡。对于更新比较频繁内容,因为难以保持镜像网站之间的同步,则须要使用其余的辅助技术。
3 交换层架构
3.1 第四层交换简介
按 照OSI[16]七层模型,第四层是传输层。传输层负责端到端通讯,在IP协议栈中是TCP和UDP所在的协议层。TCP和UDP数据包中包含端口号 (port number),它们能够惟一区分每一个数据包所属的协议和应用程序。接收端计算机的操做系统根据端口号肯定所收到的IP包类型,并把它交给合 适的高层程序。IP地址和端口号的组合一般称做“插口(Socket)”。
第 四层交换的一个简单定义是:它是一种传输功能,它决定传输不只仅依据MAC地址(第二层网桥)或源/目标IP地址(第三层路由),并且依据IP地址与 TCP/UDP (第四层) 应用端口号的组合(Socket)[17]。第四层交换功能就像是虚拟IP,指向实际的服务器。它传输的数据支持多种协议, 有HTTP、FTP、NFS、Telnet等。
以HTTP协议为例,在第四层交换中为每一个服务器组设立一个虚拟IP(Virtue IP,VIP),每组服务器支持某一个或几个域名。在域名服务器(DNS)中存储服务器组的VIP,而不是某一台服务器的真实地址。
当 用户请求页面时,一个带有目标服务器组的VIP链接请求发送给第四层交换机。第四层交换机使用某种选择策略,在组中选取最优的服务器,将数据包中的目标 VIP地址用实际服务器的IP地址取代,并将链接请求传给该服务器。第四层交换通常都实现了会话保持功能,即同一会话的全部的包由第四层交换机进行映射 后,在用户和同一服务器间进行传输[18]。
第四层交换按实现分类,分为硬件实现和软件实现。
3.2 硬件实现
第 四层交换的硬件实现通常都由专业的硬件厂商做为商业解决方案提供。常见的有Alteon[19],F5[20]等。这些产品很是昂贵,可是可以提供很是优 秀的性能和很灵活的管理能力。Yahoo中国当初接近2000台服务器使用了三四台Alteon就搞定了[21]。鉴于条件关系,这里不展开讨论。
3.3 软件实现
第 四层交换也能够经过软件实现,不过性能比专业硬件稍差,可是知足必定量的压力仍是能够达到的,并且软件实现配置起来更灵活。 软件四层交换经常使用的有 Linux上的LVS(Linux Virtual Server),它提供了基于心跳(heart beat)的实时灾难应对解决方案,提升了系统的鲁 棒性,同时提供了灵活的VIP配置和管理功能,能够同时知足多种应用需求[22]。
4 服务器优化
4.1 服务器总体性能考虑
对 于价值昂贵的服务器来讲,怎样配置才能发挥它的最大功效,又不至于影响正常的服务,这是在设计网站架构的时候必需要考虑的。常见的影响服务器的处理速度的 因素有:网络链接,硬盘读写,内存空间,CPU速度。若是服务器的某一个部件满负荷运转仍然低于须要,而其余部件仍有能力剩余,咱们将之称为性能瓶颈。服 务器想要发挥最大的功效,关键的是消除瓶颈,让全部的部件都被充分的利用起来。
4.2 Socket优化
以 标准的 GNU/Linux 为例。GNU/Linux 发行版试图对各类部署状况都进行优化,这意味着对具体服务器的执行环境来讲,标准的发行版可能并 不是最优化的[23]。GNU/Linux 提供了不少可调节的内核参数,可使用这些参数为服务器进行动态配置,包括影响 Socket 性能的一些重 要的选项。这些选项包含在 /proc 虚拟文件系统中。这个文件系统中的每一个文件都表示一个或多个参数,它们能够经过 cat 工具进行读取,或使 用 echo 命令进行修改。这里仅列出一些影响TCP/IP 栈性能的可调节内核参数[24]:
/proc/sys/net/ipv4/tcp_window_scaling “1”(1表示启用该选项,0表示关闭,下同) 启用 RFC[25] 1323[26] 定义的 window scaling;要支持超过 64KB 的窗口,必须启用该值。
/proc /sys/net/ipv4/tcp_sack “1”启用有选择的应答(Selective Acknowledgment),经过有选择地应答乱序接 收到的报文来提升性能(这样可让发送者只发送丢失的报文段);对于广域网通讯来讲,这个选项应该启用,可是这也会增长对 CPU 的占用。
/proc/sys/net/ipv4/tcp_timestamps “1” 以一种比重发超时更精确的方法(参阅 RFC 1323)来启用对 RTT 的计算;为了实现更好的性能应该启用这个选项。
/proc /sys/net/ipv4/tcp_mem “24576 32768 49152” 肯定 TCP 栈应该如何反映内存使用;每一个值的单位都是内存页 (一般是 4KB)。第一个值是内存使用的下限。第二个值是内存压力模式开始对缓冲区使用应用压力的上限。第三个值是内存上限。超过这个上限时能够将报文 丢弃,从而减小对内存的使用。
/proc /sys/net/ipv4/tcp_wmem “4096 16384 131072” 为自动调优定义每一个 socket 使用的内存。第一个值是 为 socket 的发送缓冲区分配的最少字节数。第二个值是默认值(该值会被 wmem_default 覆盖),缓冲区在系统负载不重的状况下能够增 长到这个值。第三个值是发送缓冲区空间的最大字节数(该值会被 wmem_max 覆盖)。
/proc/sys/net/ipv4/tcp_westwood “1” 启用发送者端的拥塞控制算法,它能够维护对吞吐量的评估,并试图对带宽的总体利用状况进行优化;对于 WAN 通讯来讲应该启用这个选项。
与 其余调优努力同样,最好的方法实际上就是不断进行实验。具体应用程序的行为、处理器的速度以及可用内存的多少都会影响到这些参数对性能做用的效果。在某些 状况中,一些认为有益的操做可能偏偏是有害的(反之亦然)。所以,须要逐一试验各个选项,而后检查每一个选项的结果,最后得出最适合具体机器的一套参数。
若是重启了 GNU/Linux 系统,设置的内核参数都会恢复成默认值。为了将所设置的值做为这些参数的默认值,可使用 /etc/rc.local 文件,在系统每次启动时自动将这些参数配置成所须要的值。
在检测每一个选项的更改带来的效果的时候,GNU/Linux上有一些很是强大的工具可使用: