镜像网站技术
镜像网站是指将一个彻底相同的站点放到几个服务器上,分别有本身的URL,这些服务器上的网站互相称为镜像网站。镜像网站和主站 并无太大差异,或者能够视为主站的拷贝。镜像网站的好处是:若是不能对主站做正常访问(如服务器故障,网络故障或者网速太慢等),仍能经过镜像服务器得到服务。不便之处是:更新网站内容的时候,须要同时更新多个服 务器;须要用户记忆超过一个网址,或须要用户选择访问多个镜像网站中的一个,而用户选择的,不必定是最优的。在用户选择的过程当中,缺少必要的可控性。
在互联网发展的初期,互联网上的网站内容不多,并且大都是静态内容,更新频率底。但由于服务器运算能力低,带宽小,网速慢,热门网站的访问压力仍是很大。 镜像网站技术在这种状况下做为一种有效解决方案,被普遍采用。随着互联网的发展,愈来愈多的网站使用服务器端脚本动态生成内容,同步更新愈来愈困难,对可 控性要求愈来愈高,镜像技术由于不能知足这类网站的须要,渐渐的淡出了人们的视线。但有一些大型的软件下载站,由于符合镜像网站的条件——下载的内容是静态的,更新频率较低,对带宽,速度要求又比较高, 如国外的SourceForge (http://www.SourceForge.net, 著名开源软件托管网站),Fedora(http://fedoraproject.org,RedHat 赞助的Linux发行版),国内的华军软件园(http://www.onlinedown.net), 天空软件站(http://www.skycn.com)等,还在使用这项技术。在网站建设的过程当中,能够根据实际状况,将静态内容做一些镜像,以加快访问速度,提高用户体验。 前端
CDN内容分发网络
CDN的全称是Content Delivery Network,即内容分发网络。其目的是经过在现有的互联网中增长一层新的网络架构,将网站的内容发布到最接近用户的网络“边缘”,使用户能够就近取得 所需的内容,分散服务器的压力,解决互联网拥挤的情况,提升用户访问网站的响应速度。从而解决因为网络带宽小、用户访问量大、网点分布不均等缘由所形成的 用户访问网站响应速度慢的问题。
CDN与镜像网站技术的不一样之处在于网站代替用户去选择最优的内容服务器,加强了可控制性。CDN实际上是夹在网页浏览者和被访问的服务器中间的一层镜像或 者说缓存,浏览者访问时点击的仍是服务器原来的URL地址,可是看到的内容实际上是对浏览者来讲最优的一台镜像服务器上的页面缓存内容。这是经过调整服务器 的域名解析来实现的。使用CDN技术的域名解析服务器须要维护一个镜像服务器列表和一份来访IP到镜像服务器的对应表。当一个用户的请求到来的时候,根据 用户的IP,查询对应表,获得最优的镜像服务器的IP地址,返回给用户。这里的最优,须要综合考虑服务器的处理能力,带宽,离访问者的距离远近等因素。当 某个地方的镜像网站流量过大,带宽消耗过快,或者出现服务器,网络等故障的时候,能够很方便的设置将用户的访问转到另一个地方。这样就加强了可控制性。
CDN网络加速技术也有它的局限性。首先,由于内容更新的时候,须要同步更新多台镜像服务器,因此它也只适用于内容更新不太频繁,或者对实时性要求不是很高的网站;其次,DNS解析有缓存,当某 一个镜像网站的访问须要转移时,主DNS服务器更改了IP解析结果,但各地的DNS服务器缓存更新 会滞后一段时间,这段时间内用户的访问仍然会指向该服务器,可控制性依然有不足。
目前,国内访问量较高的大型网站如新浪、网易等的资讯频道,均使用CDN网络加速技术,虽然网站的访问量巨大,但不管在什么地方访问,速度都会很 快。但论坛,邮箱等更新频繁,实时性要求高的频道,则不适合使用这种技术。 linux
应用层分布式设计
新浪播客为了得到CDN网络加速的优势,又必须避免CDN的不足,在应用层软件设计上,采起了一个替 代的办法。新浪播客提供了一个供播放器查询视频文件地址的接口。当用户打开视频播放页面的时候,播放器 首先链接查询接口,经过接口得到视频文件所在的最优的镜像服务器地址,而后再到该服务器去下载视频文件。这样,用一次额外的查询得到了所有的控制性,而这 次查询的通信流量很是小,几乎能够忽略不计。CDN中由域名解析得到的灵活性也保留了下来:由接口程序维护镜像网站列表及来访IP到镜像网站的对应表即 可。镜像网站中不须要镜像全部的内容,而是只镜像更新速度较慢的视频文件。这是彻底能够承受的。 web
网络层架构小结
从整个互联网络的高度来看网站架构,努力的方向是明确的:让用户就近取得内容,但又要在速度和可控制性之间做一个平衡。对于更新比较频繁内容,因为难以保 持镜像网站之间的同步,则须要使用其余的辅助技术。 算法
硬盘级缓存
硬盘级别的缓存是指将须要动态生成的内容暂时缓存在硬盘上,在一个可接受的延迟时间范围内,一样的请求再也不动态生成,以达到节约系统资源,提升网站承受能 力的目的。Linux环境下硬盘级缓存通常使用Squid。
Squid是一个高性能的代理缓存服务器。和通常的代理缓存软件不一样,Squid用一个单独的、非模块化的、I/O驱动的进程来处理全部的客户端请求。它接受来自客户端对目标对象的请求并适当地处理这些请求。好比说,用户经过 浏览器想下载(即浏览)一个web页面,浏览器请求Squid为它取得这个页面。Squid随之链接到页面所在的原始服务器并向服务器发出取得该页面的请 求。取得页面后,Squid再将页面返回给用户端浏览器,而且同时在Squid本地缓存目录里保存一份副本。当下一次有用户须要同一页面时,Squid可 以简单地从缓存中读取它的副本,直接返回给用户,而不用再次请求原始服务器。当前的Squid能够处理HTTP, FTP, GOPHER, SSL和WAIS等协议。 数据库
内存级缓存
内存级别的缓存是指将须要动态生成的内容暂时缓存在内存里,在一个可接受的延迟时间范围内,一样的请求再也不动态生成,而是直接从内存中读取。Linux环 境下内存级缓存Memcached是一个不错的选择。
Memcached是一套很是优秀的分布式内存对象缓存系统,用于在动态系统中减小数据库负载,提高性能。和 Squid 的前端缓存加速不一样,它是经过基于内存的对象缓存来减小数据库查询的方式改善网站的性能,而其中最吸引人的一个特性就是支持分布式部署;也就是说能够在一 群机器上创建一堆 Memcached 服务,每一个服务能够根据具体服务器的硬件配置使用不 同大小的内存块,这样,理论上能够创建一个无限大的基于内存的缓存系统。Memcached 是以守护程序方式运行于一个或多个服务器中,随时接受客户端的链接操做,客户端能够由各类语 言编写,目前已知的客户端 API 包括 Perl/PHP/Python/Ruby/Java/C#/C 等等[附录1]。客户端首先与 Memcached 服务创建链接,而后存取对象。每一个被存取的对象都有一个惟一的标识符 key,存取操做均经过这个 key 进行,保存的时候还能够设置有效期。保存在 Memcached 中的对象其实是放置在内存中的,而不是在硬盘上。Memcached 进程运行以后,会预申请一块较大的内存空间,本身进行管理,用完以后再申请一块,而不是每次须要的时候去向操做系统申请。Memcached将对象保存在一个巨大 的Hash表中,它还使用NewHash算法来管理Hash表,从而得到进一步的性能提高。因此当分配给Memcached的内存足够大的时候,Memcached的时间消耗基本上只是网络Socket链接了[33]。
Memcached也有它的不足。首先它的数据是保存在内存当中的,一旦服务进程重启(进程意外被关掉,机器重启等),数据会所有丢失。其次 Memcached以root权限运行,并且Memcached自己没有任何权限管理和认证功能,安全性不足。第一条是Memcached做为内存缓存服务使用没法避免的,固然,若是内存中的数据须要保存,可 以采起更改Memcached的源代码,增长按期写入硬盘的功能。对于第二条,咱们能够将Memcached服务绑定在内网IP上,经过Linux防火墙进行防御。 浏览器
CPU与IO均衡
在一个网站提供的全部功能中,有的功能可能须要消耗大量的服务器端IO资源,像下载,视频播放等,而有的功能则可能须要消耗大量的服务器CPU资源,像视频格式转换,LOG统计等。在一个服务器集 群中,当咱们发现某些机器上CPU和IO的利用率相差很大的时候,例如CPU负载很高而IO负责很低,咱们能够考虑将该服务器上的某些耗CPU资源的进程 换成耗IO的进程,以达到均衡的目的。均衡每一台机器的CPU和IO消耗,不只能够得到更充分的服务器资源利用,并且还可以支持暂时的过载,遇到突发事件,访问流量剧增的时候, 实现得体的性能降低(Graceful performance degradation),而不是当即崩溃。 缓存
读写分离
若是网站的硬盘读写性能是整个网站性能提高的一个瓶颈的话,能够考虑将硬盘的读,写功能分开,分别进行优化。在专门用来写的硬盘上,咱们能够在Linux 下使用软件RAID-0(磁盘冗余阵列0级)。RAID-0在得到硬盘IO提高的同时, 也会增长整个文件系统的故障率——它等于RAID中全部驱动器的故障率之和。若是 须要保持或提升硬盘的容错能力,就须要实现软件RAID-1,4或5,它们能在某一个(甚至几个)磁盘驱动器故障以后仍然保持整个文件系统的正常运行,但文件读写效率不如RAID-0。而专门用来读的硬盘,则不用如此麻烦,可使用普通的服务器硬盘,以下降开销。
通常的文件系统,会综合考虑各类大小和格式的文件的读,写效率,于是对特定的文件读或写的效率不是最优。若是有必要,能够经过选择文件系统,以及修改文件 系统的配置参数来达到对特定文件的读或写的效率最大化。好比说,若是文件系统中须要存储大量的小文件,则可使用ReiserFS来替代Linux操做系统默认的ext3系统,由于 ReiserFS是基于平衡树的文件系统结构,尤为对于大量文件的巨型文件系统,搜索速度要比使用局部的二分查找法的ext3快。 ReiserFS里的目录是彻底动态分配的,所以不存在ext3中常见的没法回收巨型目录占用的磁盘空间的状况。ReiserFS里小文件(< 4K)能够直接存储进树,小文件读取和写入的速度更快,树内节点是按字节对齐的,多个小文件可共享同一个硬盘块,节约大量空间。ext3使用固定大小的块 分配策略,也就是说,不到4K的小文件也要占据4K的空间,致使的空间浪费比较严重。 但ReiserFS对不少Linux内核支持的不是很好,包括2.4.三、2.4.9 甚至相对较新的 2.4.16,若是网站想要使用它,就必需要安装与它配合的较好的2.4.18内核——通常管理员都不是很乐意使用太新的内核,由于在它上面运行的软件, 都尚未通过大量的实践测试,也许有一些小的bug尚未被发现,但对于服务器来讲,再小的bug也是不能接受的。ReiserFS仍是一个较为年轻的, 发展迅速的文件系统,它相对于ext3来讲有一个很大的缺陷就是,每次ReiserFS文件系统升级的时候,必须彻底从新格式化整个磁盘分区。因此在选择 使用的时候,须要权衡取舍。 安全