网站、数据库的衍变之路(下篇)
本文与前两篇文章内容关联不大,将主要讨论网站在压力下演变过程中的一般性。
作为一个网站管理员来说,但网站遇到性能瓶颈,那就会思考,为什么网站遇到的性能问题,有什么样的解决思路。在前两篇中,我们讲到了一些办法,讲得最多的是拆分应用或者叫做垂直划分。那为什么会产生垂直划分这种思路?
来思考下以下的几种场景:
1、任何一台服务器安装Windows操作系统,并没有出现性能瓶颈;
2、全世界有那么多的小网站,如果把它们当作一个整体,那么他们并没有遇到性能瓶颈。
这就表明,性能瓶颈的出现是因为把用户往有限的服务器上集中而产生的。而作为一个网站,一般来说,为了方便我们的用户或者说是打造一个良好的品牌,一般来说只是有一个或者几个域名。那么问题就产生了。如果把大量的用户当作是一条河流,但网站初期的时候,这条河流是干枯的。随着网站的发展,河流里的水位越来越高,而我们的网站实际上起到了一个水闸的作用。但一个水闸不能满足的时候,我们用多个水闸来进行分流,像是98年特大洪水的时候在某些地方进行泄洪。这种应用就是垂直分割。而上面描述的第二中场景可以看成是有N个水闸的情况。但水流量过大,水闸越少,那么压力就越大。
实际上我认为,网站其本身是因为internet的产生而产生的,那其局限性也是由internet的解决方案引起的。假设,我们的一个域名可以绑定到N台服务器上,就不会产生web服务器性能上不能满足的情况。也就是说域名指向的那台服务器就是水闸,水闸能通过的水是有限的。要让水闸能通过尽可能多的水,有一些办法,在其他地方也开水闸,或者扩大这个水闸,或者加快水的流速。
在其他地方加水闸,就是垂直分割,把用户浏览导入到不同的子域名上,而子域名是可以绑定到不同的服务器上的。扩大水闸就是要在硬件上买更好的服务器,服务器就能有更好的性能。加快水的流速就是要让用户连接的时间尽可能短,这个不但是在web上,在网络游戏上也是如此。
实际上目前为止最为终极的解决方案还是让用户连接的时间尽可能短。为什么这么说呢?在理论上,一个网站可以划分为任意个子应用,但是不方便管理。比如你划分了5个应用,而5个应用中某个应用又产生了性能问题,怎么办?
在网络游戏服务端中(曾经作私服,见过传奇的服务端),连接、登录游戏等应用是分开的。用户在使用时并没有感觉,那就像是你把网站的数据库服务器和web服务器分离,并不会让用户察觉道理是一样的。在我们普遍开发中使用缓存等方式,提高用户操作的响应速度,但是用户并没有离开服务器。比如把www.a.com这样的域名,指向到111.111.111.111这样的IP地址(假定为服务器A),虽然这个地址的服务器在局域网内使用了一些办法让用户响应速度更快,但是用户并没有离开这台服务器。而现在像集群这样的方式,是通过4底层TCP/IP协议让其到达A服务器的请求重新执向到B服务器,然后B服务器收到的数据直接回发给client。这样,A服务器实际上的工作量就很小了,从而实现了网站的高负载,而实际上这些负载已经被分发掉了。
上面简单讲到了集群的原理,由于缺乏研究的环境,没办法自己组网实验,因此,贫道对这方面并没有深刻的理解,而只是停留在理论理解上。在评论里,看到有朋友让我讲讲这方面,那我就讲一些我的理解,同时附上一些资源。大家都知道,完整的OSI是分7层的。一般来说,集群使用的OSI模型的第四层或者第七层进行扩展的。按我的理解,从性能上4层要由于7层,而功能上,7层要优于4层。而这个扩展也分硬件和软件的,硬件的价格贵,但是物有所值;而软件的,比如Windows集群服务这种,价格上相对便宜,而性能上肯定不如专门的集群交换机。
关于为什么使用第四层扩展来实现集群:
第四层交换是一种功能,它决定传输不仅仅依据MAC地址(第二层网桥)或源/目标IP地址(第三层路由),而且依据TCP/UDP(第四层) 应用端口号。第四层交换功能就象是虚IP,指向物理服务器。它传输的业务服从的协议多种多样,有HTTP、FTP、NFS、Telnet或其他协议。这些业务在物理服务器基础上,需要复杂的载量平衡算法。在IP世界,业务类型由终端TCP或UDP端口地址来决定,在第四层交换中的应用区间则由源端和终端IP地址、TCP和UDP端口共同决定。
关于OSI模型:
#p#分页标题#e#
OSI是Open System Interconnection的缩写,意为开放式系统互联。国际标准化组织(ISO)制定了OSI模型,该模型定义了不同计算机互联的标准,是设计和描述计算机网络通信的基本框架。OSI模型把网络通信的工作分为7层,分别是物理层、数据链路程、网络层、传输层、会话层、表示层和应用层。
TCP/IP的连接方式决定了第四层的可扩展性。在TCP/IP连接中,用到的东西有客户端IP,客户端MAC,服务器IP,服务MAC。但客户端对服务器发出请求时候,客户端是不知道服务器的MAC地址是多少的,只是请求服务器端的IP。服务器端拿到请求客户端的IP,就可以用一组算法,定位到另外一台服务器进行处理,这是理想的情况。但是这种理想的情况比较难实现。而用过RAWSocket的朋友都知道,传到某局域网的数据并不是只有目标机器能接收,其它机器也可以拿到。而Windows的集群就是利用这样的方式,在N台服务器中,服务器M拿到数据后验证为自己要处理的,那么M就会有响应。其它服务器则会丢掉这个包。关键问题是M服务器与主服务器的IP和MAC地址都不一样,这就注定了,如果M直接对客户端回应,那么客户端会丢掉这个包。而Windows集群服务,虚拟了一个MAC地址,这个MAC地址为集群内的计算机公用。但服务器回复客户端时,就使用这个MAC地址。相当于M回复客户端时,使用了主服务器为代理的一种模式。这种方式很像是面试投递简历,你把简历投递出去,你并不知道简历是哪个人处理的,而处理完后,回复给你的还是这个邮箱地址就行了。这个邮箱要是是很多人公用的,那么就和这里的原理一样了。
集群的知识在中小项目中并不需要使用,这就注定了学习集群是高成本的。但是使用集群确实能降低成本。比如,你的网站访问量越来越大了,网站支撑不住,如果不使用集群,你也可以使用垂直分割等办法。但是那样你将不得不修改整个程序,包括架构。甚至很多流程都需要修改,并且数据结构也完全变掉了。可以说开发成本异常高。而使用集群,只需要把原先的程序在多台服务器上放上拷贝就可以了。改动量非常小。
小编结语:
那么讲到这里,网站、数据库的衍变之路的内容就告一段落了~
更多内容尽在课课家教育!