负载均衡杂谈
最近春节临近,又到了一年一度春运时节,而春运又免不了各种抢票,由此抢票软件也就应运而生,此时,我们发出的大量请求会给网站带来负载。这当然很正常,但是当我们给这些服务器增加负载时,会发生什么呢?这时,事情可能变得很糟糕,如果负载过高(抢票的人太多),网站就可能出现性能损失。它会逐渐变慢,直到最后完全没有反应。而这当然不是我们所期望的。这时候,要解决这个问题,就需要更多的资源。可以选择购买一台配置更高的机器来代替当前的服务器(scale up,纵向扩展),或者购买另外一台普通配置的机器来和当前的服务器一起搭配工作(scale out,横向扩展)。下面对纵向扩展和横向扩展进行一下介绍。
纵向扩展
纵向扩展常用于应用需要更多的计算能力的情况。例如数据库增长过快,导致之前内存不够用;又如硬盘空间不足,或者数据库需要更大的计算能力和处理更多的请求。
总的来说,数据库是纵向扩张的很好的实例,因为传统来说,将数据分散到多台机器上运行会出现严重的问题。原因在于,很多在单台机器上理所当然的设计无法在多台机器上运行。比如,如何在多台机器上高效的共享数据表?这是一个很难解决的问题,也正是MongoDB和CouchDB一些新的数据库设计成以另外一种方式运行的原因。
但纵向扩展可能会非常昂贵(土豪无视)。通常,当需求达到特定规格时,服务器的价格会突然暴增。现在的机器都有一个高规格的RAID控制器、多个企业级硬盘和一个新型处理器(看起来很神秘,实际上和之前的处理器表现差不多,但标价却高出很多)。如果你只需要更新几个部件,可能纵向扩展比横向扩展便宜,但你很可能发现,这么做并不合算。也就是说,如果需要的只是额外的几千兆RAM或者更大的硬盘,或者只需要提高某种用途的性能,这才可能使你的最佳选择。
横向扩展
横向扩展会出现在你手里有两台或者三台机器,而非单台机器时,纵向扩展的问题在于,到了某种程度,你会碰到无法逾越的限制(土豪,这就是有价无市啊)。单台机器能容纳的计算能力和内存都有限。如果你需要的不止是那些,该这么办呢?其实很好解决,横向扩展的优势就是你可以不断的加机器,当然咯,到达某种程度之后,也会开始碰到存储空间以及计算能力的问题,但是通过横向扩展肯定能获得比纵向扩展更大的计算能力。除此之外,在进行横向扩展的时候,如果其中某台机器没法工作了,仍然可以用其他的机器来处理负载,而纵向扩展,若机器没法工作了,一切都将无法运行。横向扩展当然也会有问题,比如说如何对多台机器同时操作,来使它们能像单台机器一样工作?
这时,负载均衡就应运而生(词汇量不行,一个词用两遍,求不吐槽~)。那么问题来了:什么是负载均衡呢?
什么是负载均衡
伟大的度娘是这么说的:
负载均衡 (Load Balancing) 建立在现有网络结构之上,它提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽、增加吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性。
负载均衡(又称为负载分担),英文名称为Load Balance,其意思就是将负载(工作任务)进行平衡、分摊到多个操作单元上进行执行,例如Web服务器、FTP服务器、企业关键应用服务器和其它关键任务服务器等,从而共同完成工作任务。
下面来介绍一下基于DNS的负载均衡。
基于DNS的负载均衡
对于实际的负载均衡,它的工作机制非常简单。它使用一种称为轮转的方式,来向特定域的一组服务器分发连接请求。这种操作是顺序执行的(按照第一、第二、第三等步骤)。要向服务器增加基于DNS的负载均衡,只需为域增加多个A记录即可,是的,你没听错,就是这么简单。BND会负载完成其它工作!
基于DNS的负载均衡的优势
- 简便。你可以增加另一个完全一样的系统来增加负载能力,使其能处理更多请求。或者,你可以让几个几个带宽很小的直连互联网的地址指向同一台服务器,来增加服务器的总带宽。
- 配置简单。你只要把地址加入到DNS数据库即可,不能更简单有没有~
- 易于调试。调试和处理DNS问题有大量的工具可以使用,包括dig、ping、nslookup。
- 容易扩展。可以基于现有平台进行快速扩展。
基于DNS的负载的问题
1.粘性。这个问题经常出现在动态网页,众所周知,HTTP是一种无状态协议。它患有严重的慢性失忆症,无法将会话信息从一个请求保留到下一个请求。为了解决这个问题,你可以和每个请求一起,发送一个唯一的标识。这个标识就是cookie,当然也有其它方法来达到类似的效果,这个唯一的标识允许Web浏览器收集并保留你跟网站当前交互相关的信息,所有的信息都会跟那个唯一标识进行绑定。这里的问题在于,这个数据并非在所有的服务器上都有,所以如果有了新的DNS请求要求查找服务器IP时,不能保证你就一定能回到之前连接信息的那个服务器上。
2.负载处理方式。举个栗子,比如说,你可能会遇到这种情况,两个请求中,一个是高强度的请求,一个是低强度的请求。我们做个最坏的假设,所有的高强度请求都跑到一个服务器上,而所有的低强度请求都跑到另一个服务器上,这时就不再平衡了,若不进行处理,将有一半的用户无法使用该网站。
3.容错性。如果有一台服务器宕机了,基于DNS负载均衡器无法进行判别,所有它仍然向那台宕机的服务器发送请求,也就是说,会有一半的请求死掉,用户只能不断刷新(F5已烂,笑~),直到切换到某个正常工作的服务器为止。
好了,此次的负载均衡就到此为止了,如果本文有不对的地方敬请指出~
PS:本博客欢迎转发,但请注明博客地址及作者~
博客地址:http://www.cnblogs.com/voidy/
<。)#)))≦