跟朋友聊天的时候,发现很多人对大型网站系统架构非常感兴趣,我也很感兴趣,经常会在家里2台笔记本和1台服务器组成的局域网环境里作些实验。我进入IT行业的时间,大约是97,98年吧,那时候PC客户端软件最为盛行,做软件开发是一份很体面也很喜欢的工作。我从Win3.1上的VC1.5开始一直到VC6.0,然后转为.Net开发,基本上都是从事客户端软件开发。本人的性格是危机意识向来严重,所以深感互联网必将盛行,传统软件必将走向没落,于是转向了WEB开发。记得以前去某Portal网站应聘的时候,主考官就问我:你认为客户端开发和互联网开发有什么不同。我当时的回答是:互联网开发比客户端软件开发简单多了,我再也不用考虑那么多的用户环境因素了,一点部署,何时何地都可用。
很多年过去了,我再想起当初我的回答,依然觉得那个回答是正确的。就产品开发层面来讲,互联网开发确实简单多了。这里首先澄清一个概念,我所说的互联网开发并不是指所有的B/S应用,例如B/S方式的银行内部业务系统。我所说的互联网应用是指在互联网上服务于公众的应用。企业级的业务系统,它的特点是业务逻辑是比较复杂的,但用户一般不太大;互联网应用则相反,业务逻辑一般很简单,但面对的是海量用户。
既然互联网应用开发的业务逻辑不复杂,但为什么大型网站都投入了那么多的技术人员呢?主要是因为运营的环境太复杂,这种复杂性形成的原因以下:
1、公开性
网站的服务是公开的,任何人都可以来访问,所以就会直接面对大量的不良用户,系统数据的安全面临很大的风险,一旦系统被攻入,结果将是灾难性的。
2、访问量大
访问量大,就意味着网站必须能够承受高并发大流量的考验,如果网站的服务能力和健壮性等达不到要求,你的系统就会被冲垮。
3、用户体验
用户体验要好,除了产品设计的因素之外,就要求访问网站的速度要快,具有高可用性,别用一会就挂。
网站各子系统如何进行部署,如何提高系统的健壮性和高可用性,如何实现网站的安全,如何提高访问速度,如何进行负载均衡,甚至于采用什么的硬件设备,另外,网站发展的不同时期会可能会采用不同的架构,如何实现架构的平滑过渡,如何使目前的架构具有弹性,具备可扩展的能力,这都是大型网站必须解决的问题,也是小网站成长过程中迟早会遇到的问题。我后面的文章将会逐步就这个话题展开。
网站机构包括网站的软件架构和系统架构两部分,软件架构主要是指子系统和逻辑层的划分结构;系统架构,一般是系统部署结构。
系统架构师的知识体系比较庞杂,所谓的见多识广,多数是由运维工程师成长起来的,他们开发能力不强,编码不多,但动手能力很强,脚本编写非常熟练,经常会做各种类型的实验,密切跟踪最新技术最新产品的相关信息。当然,一个大型的网站,需要一个架构师团队,他们各自承担擅长领域的架构设计,比如安全架构、存储架构等等。
我觉得一般的开发人员还是很难走上这条路的,这份工作需要经验,需要不断实践,但如果开发人员一旦走上了这条路,会有很大的发展,主要源于开发人员的思考习惯和技术的深度。我的这系列文章,开发人员可以作为参考,比如如何开发可分布式部署的系统,另外很多朋友都是身兼数职,从开发到实施,到部署全部包办。我个人深感精力有限,所以又特意找了几个朋友从Unix/Linux系统和Windows系统不同角度进行探索,以造福正在摸索中的朋友,有兴趣的朋友也可以参与。
其实,这部分内容我一直在写,比如PHP深度探索系列,写了大量的关于apache的内容,我已经大体把apache代码阅读了一遍,很费时间,进度缓慢,但我想这有助于我们理解apache的配置和调优。
在介绍网站架构之前,我们先介绍一些网站架构中最基础和常见的概念,以便更好的理解后面的有关负载均衡和分布式存储等技术。第一个,首先讲讲CDN。
1、CDN是什么
CDN(Content Delivery Network),就是内容发布网或者内容分发网,它的主要目的:通过在现有的Internet中增加一层新的网络架构,将网站的内容发布到最接近用户的网络边缘,使用户可以就近取得所需的内容,从而提高用户访问网站的响应速度,提升用户体验,同时能够分散访问压力,把本来用户集中访问分散到各地去。网站的内容提供商(比如新浪、搜狐、网易等等)使用CDN,就可以在宏观层解决一部分大流量、海量用户并发等令人头疼的问题。
2、CDN的组成
内容发布网(CDN)是一个经策略性部署的整体系统,包括分布式存储、负载均衡、网络请求的重定向和内容管理4个要件,而内容管理和全局的网络流量管理是CDN的核心所在。通过用户就近性和服务器负载的判断,CDN确保内容以一种极为高效的方式为用户的请求提供服务,达到用户所要求的服务距用户仅有"一跳"(Single Hop)之遥。
我们通常的内容发布模式都是将网站数据放到一处,然后应对来自世界各地的访问,我们多数考虑的是软件部署架构,很少考虑网络硬件架构。与之形成对比的是,CDN则强调了网络在内容发布中的重要性。通过引入主动的内容管理层的和全局负载均衡,CDN从根本上区别于传统的内容发布模式。
内容提供商承担了他们不该干也干不好的内容发布服务。
3、互联网服务的产业链
纵观整个宽带服务的价值链,内容提供商和用户位于整个价值链的两端,中间依靠网络服务提供商将其串接起来。随着互联网工业的成熟和商业模式的变革,在这条价值链上的角色越来越多也越来越细分,出现了内容运营商、托管服务提供商、骨干网络服务提供商、接入服务提供商等等。在这一条价值链上的每一个角色都要分工合作、各司其职才能为客户提供良好的服务,从而带来多赢的局面。从内容与网络的结合模式上看,内容的发布已经走过了ICP的内容(应用)服务器和IDC这两个阶段。IDC的热潮也催生了托管服务提供商这一角色。但是,IDC并不能解决内容的有效发布问题。内容位于网络的中心并不能解决骨干带宽的占用和建立IP网络上的流量秩序。因此将内容推到网络的边缘,为用户提供就近性的边缘服务,从而保证服务的质量和整个网络上的访问秩序就成了一种显而易见的选择,这就是CDN服务模式。CDN的建立解决了困扰内容运营商的内容"集中与分散"的两难选择,无疑对于构建良好的互联网价值链是有价值的,也是不可或缺的最优网站加速服务。
4、CDN服务提供商
ChinaCache是中国最大的CDN服务提供商,是不是唯一未可知也。要想成为CDN服务提供商,恐怕要摆平电信、网通、铁通等等运营商,这得需要什么样的能力和背景不得而知。它的服务节点在全球已经超过130个,其中国内节点超过80个,覆盖全国主要6大网络(所谓6线机房,就是这么来的)的主要省份,象各大门户网站,比如新浪、网易等等都是租用了他们的服务。所以,你无论是在南方,或者北方,还是在北美,访问这些门户网站,感觉速度都很快,最主要的原因之一就是CDN发挥了效果。一般小网站是用不起这服务的,所以慢点就慢点了吧,可以租用互联互通的6线机房,如果网络足够宽的话,用户也可以忍受。如果想继续提升用户体验的话,就需要做一些网站镜像,部署在具有代表性的几个大城市,比如华南可以部署在广州,华东可以部署在上海,华北可以部署在北京,不过内容镜像的过程,就需要自己去部署和维护。还有的网站,采用内容分割的方式,比如建立针对各地的分站,业务情况不同,可能部署的策略不同。CDN可以认为是基础网络建设的一种策略
前面介绍了cdn的一些原理和概念,以及提供cdn基础网络服务的途径。cdn看起来对于静态内容的,比如html,js,image是非常合适的,通过cdn的部署,用户只需要一跳就可以访问到网站的内容。那对于动态内容怎么办呢?我回答一下:
动态内容按照存在形态可以分为三类。
第一类:内容长时间不需变化,这类内容一般是通过网页静化技术,实现动态内容转换成静态内容,从而达到cdn部署,典型的就是内容类网站,比如新浪、搜狐、网易等等的内容发布系统cms,内容的增删改等管理工作被准实时同步到各个节点。
第二类:内容可能会短时间内发生变动,但是最终会稳定。比如论坛、博客等应用,这类服务提供的内容按照一定的时间间隔,实现批量静化,当然也有实时静化,像Mop的大杂烩、网易社区就是使用了这样的策略。
第三类:内容会实时变化,非常个性化。比如邮箱应用,这类服务提供的内容无法实现静化,只能通过实行分区域部署和负载均衡等手段进行优化。
对于提供cdn服务的厂商来讲,静态内容的cdn自然没有问题,对于第三类服务,只能从通信链路层进行相应的优化。
对于很多网站的伪静化,有的出于Seo的考虑,有的出于安全性的考虑,手段基本上是rewrite Url。它只不过是一种外在的表现形式,与Html静化是两回事,它依然是一种动态内容。
1. 负载均衡的分类
负载均衡技术在网站运营过程中应用非常普遍,技术也很成熟。负载均衡技术按照软硬件形式分为软均衡和硬均衡。软均衡就是基于软件技术的均衡,硬均衡是基于硬件技术的均衡;
按照网络协议划分又分为四层均衡和七层均衡。四层均衡就是基于OSI网络层的数据均衡,七层均衡是基于OSI应用层的数据均衡。
各种均衡方式在大型网站中均有采用,而且大多数情况下,是多种均衡方式的组合。
2. DNS轮询均衡
这种方式,算是比较独立的一种方式,不在上述划分之列,但使用比较广泛,一般用在网站最前端。你可以做个试验,在dos命令行中运行nslook命令。比如:nslookup www。163。com,你会看到命令给出了一堆解析后的IP地址。这些地址就是www.163.com这个域名绑定的多条A记录。我们从浏览器发起的访问请求http://www.163.com/,那么你输入的域名首先需要经过DNS服务器进行解析,Dns服务器的解析的过程就是按照A记录的顺序,依次分配IP地址。Dns轮询方式实现均衡就是利用这个原理,在一个域名下面绑定N个IP地址,访问请求被均衡到不同的设备。Dns轮询方式提供的IP地址,在大型网站中往往是一个集群的地址,可能是均衡交换机也可能是均衡服务器。对于小网站的话,挂接多台服务器也没有问题。
DNS轮询均衡的优点:
1、零成本:只是在Dns服务器上绑定几个A记录,域名注册商一般都提供;
2、部署简单:就是在网络拓扑进行设备扩增,然后在Dns服务器上添加记录。
DNS轮询均衡的缺点:
1、流量分配不均:Dns解析过程其实环节很多,而且是一种层层缓存的机制,你的dns服务器虽然进行更新,但是客户机、以及网络上其它的dns服务器不会实时更新,所以流量很难保证100%的平均。目前,dns服务器都提供了多种手段可以调整dns轮询分配的策略,但是确实无法保证很完美的均衡。
2、健康检查:Dns服务器中A记录地址中的某一台服务器宕机,DNS服务器是无法知道的,仍旧会将访问分配到此服务器。所以需要人员或者工具进行实时检测,在某台机器宕机之后,把备份机推上生产线,如果想要从A记录地址摘除某个地址,这个通知过程需要几个小时甚至更久才能扩散到所有的客户机。
Dns轮询方式推到服务的最前端还是很有效的,它通过最原始的方式,把访问用户映射到不同的服务集群上。对于大型网站来讲,对外服务的IP地址是不可能经常变动的,而且后端的集群一旦宕掉,可以迅速推上冗余集群。再加上,一般都是经过CDN部署,服务被拆分到各个局部,所以在运营过程中不会产生太大的影响。
3. OSI七层模型
我们接下来讲讲七层均衡。要理解四七层均衡的原理,就先要回忆一下大学课本里学的网络七层模型(OSI)。
OSI是一个开放性的通行系统互连参考模型,他是一个定义的非常好的协议规范。OSI模型有7层结构,每层都可以有几个子层。
OSI七层模型是一个很好的理论模型,但是在实际应用中都做了裁剪。尤其是TCP/IP的盛行,把7层结构压成了4层,
所以很多人都批评OSI七层模型过于复杂,但是作为一个完整的全面的网络模型,还是被大家非常认可的。OSI的7层从上到下分别是应用层、表示层、会话层、传输层、网络层、数据链路层、物理层。
OSI 7层的功能描述:
(1)应用层:与其他计算机进行通讯的一个应用,它是对应应用程序的通信服务的。例如,一个没有通信功能的字处理程序就不能执行通信的代码,从事字处理工作的程序员也不关心OSI的第7层。但是,如果添加了一个传输文件的选项,那么字处理器的程序员就需要实现OSI的第7层。示例:telnet,HTTP,FTP,WWW,NFS,SMTP等。
(2)表示层:这一层的主要功能是定义数据格式及加密。例如,FTP允许你选择以二进制或ASII格式传输。如果选择二进制,那么发送方和接收方不改变文件的内容。如果选择ASII格式,发送方将把文本从发送方的字符集转换成标准的ASII后发送数据。在接收方将标准的ASII转换成接收方计算机的字符集。示例:加密,ASII等。
(3)会话层:他定义了如何开始、控制和结束一个会话,包括对多个双向小时的控制和管理,以便在只完成连续消息的一部分时可以通知应用,从而使表示层看到的数据是连续的,在某些情况下,如果表示层收到了所有的数据,则用数据代表表示层。示例:RPC,SQL等。
(4)传输层:这层的功能包括是否选择差错恢复协议还是无差错恢复协议,及在同一主机上对不同应用的数据流的输入进行复用,还包括对收到的顺序不对的数据包的重新排序功能。示例:TCP,UDP,SPX。
(5)网络层:这层对端到端的包传输进行定义,他定义了能够标识所有结点的逻辑地址,还定义了路由实现的方式和学习的方式。为了适应最大传输单元长度小于包长度的传输介质,网络层还定义了如何将一个包分解成更小的包的分段方法。示例:IP,IPX等。
(6)数据链路层:他定义了在单个链路上如何传输数据。这些协议与被讨论的歌种介质有关。示例:ATM,FDDI等。
(7)物理层:OSI的物理层规范是有关传输介质的特性标准,这些规范通常也参考了其他组织制定的标准。连接头、针、针的使用、电流、电流、编码及光调制等都属于各种物理层规范中的内容。物理层常用多个规范完成对所有细节的定义