Six Principles and Implementation of Web Load Balancing

 

 

Six Principles and Implementation of Web Load Balancing

 Let's start by understanding the so-called "equilibrium"

It cannot be narrowly understood as assigning the same amount of workload to all actual servers, because the carrying capacity of multiple servers is different, which may be reflected in the difference in hardware configuration and network bandwidth, or because a certain server has multiple roles. What we call "balanced" means that we hope that all servers are not overloaded and can function to the greatest extent possible.

 

1. http redirection

When an HTTP proxy (such as a browser) requests a URL from the web server, the web server can return a new URL through the Location tag in the HTTP response header. This means that the HTTP proxy needs to continue to request this new URL to complete the automatic jump.

 

Performance flaws:

1. Throughput limit

The throughput of the primary site server is evenly distributed to the servers being moved. Now suppose that the RR (Round Robin) scheduling strategy is used, the maximum throughput rate of the sub-server is 1000reqs/s, then the throughput rate of the main server must reach 3000reqs/s to fully play the role of the three sub-servers, then if there are 100 sub-servers, then Can the throughput rate of the main server be conceivably large? On the contrary, if the maximum throughput rate of the main service is 6000reqs/s, then the average throughput rate allocated to the subservers is 2000reqs/s, and the maximum throughput rate of the current subservers is 1000reqs/s, so the number of subservers must be increased. Increase to 6 to meet.

 

2. Different depth of redirection access

Some redirect a static page, and some redirect a complex dynamic page, so the load difference of the actual server is unpredictable, but the main site server does not know anything. Therefore, it is not very good to use the redirection method for load balancing on the entire site.

 

We need to balance the overhead of transferring the request with the overhead of processing the actual request. The smaller the former is relative to the latter, the more meaningful the redirection is, such as downloading. You can go to many mirror download sites to try, and you will find that the basic downloads are redirected using Location .

 

2. DNS load balancing

DNS 负责提供域名解析服务,当访问某个站点时,实际上首先需要通过该站点域名的DNS服务器来获取域名指向的IP地址,在这一过程中,DNS服务器完成了域名到IP地址的映射,同样,这样映射也可以是一对多的,这时候,DNS服务器便充当了负载均衡调度器,它就像http重定向转换策略一样,将用户的请求分散到多台服务器上,但是它的实现机制完全不同。

 

使用dig命令来看下"baidu"的DNS设置

20141120181216406.png

可见baidu拥有三个A记录

 

相比http重定向,基于DNS的负载均衡完全节省了所谓的主站点,或者说DNS服务器已经充当了主站点的职能。但不同的是,作为调度器,DNS服务器本身的性能几乎不用担心。因为DNS记录可以被用户浏览器或者互联网接入服务商的各级DNS服务器缓存,只有当缓存过期后才会重新向域名的DNS服务器请求解析。也说是DNS不存在http的吞吐率限制,理论上可以无限增加实际服务器的数量。

 

特性:

1、可以根据用户IP来进行智能解析。DNS服务器可以在所有可用的A记录中寻找离用记最近的一台服务器。

2、动态DNS:在每次IP地址变更时,及时更新DNS服务器。当然,因为缓存,一定的延迟不可避免。

 

不足:

1、没有用户能直接看到DNS解析到了哪一台实际服务器,加服务器运维人员的调试带来了不便。

2、策略的局限性。例如你无法将HTTP请求的上下文引入到调度策略中,而在前面介绍的基于HTTP重定向的负载均衡系统中,调度器工作在HTTP层面,它可以充分理解HTTP请求后根据站点的应用逻辑来设计调度策略,比如根据请求不同的URL来进行合理的过滤和转移。

3、如果要根据实际服务器的实时负载差异来调整调度策略,这需要DNS服务器在每次解析操作时分析各服务器的健康状态,对于DNS服务器来说,这种自定义开发存在较高的门槛,更何况大多数站点只是使用第三方DNS服务。

4、DNS记录缓存,各级节点的DNS服务器不同程序的缓存会让你晕头转向。

5、基于以上几点,DNS服务器并不能很好地完成工作量均衡分配,最后,是否选择基于DNS的负载均衡方式完全取决于你的需要。

 

三、反向代理负载均衡

这个肯定大家都有所接触,因为几乎所有主流的Web服务器都热衷于支持基于反向代理的负载均衡。它的核心工作就是转发HTTP请求。

相比前面的HTTP重定向和DNS解析,反向代理的调度器扮演的是用户和实际服务器中间人的角色:

1、任何对于实际服务器的HTTP请求都必须经过调度器

2、调度器必须等待实际服务器的HTTP响应,并将它反馈给用户(前两种方式不需要经过调度反馈,是实际服务器直接发送给用户)

 

特性:

1、调度策略丰富。例如可以为不同的实际服务器设置不同的权重,以达到能者多劳的效果。

2、对反向代理服务器的并发处理能力要求高,因为它工作在HTTP层面。

3、反向代理服务器进行转发操作本身是需要一定开销的,比如创建线程、与后端服务器建立TCP连接、接收后端服务器返回的处理结果、分析HTTP头部信息、用户空间和内核空间的频繁切换等,虽然这部分时间并不长,但是当后端服务器处理请求的时间非常短时,转发的开销就显得尤为突出。例如请求静态文件,更适合使用前面介绍的基于DNS的负载均衡方式。

4、反向代理服务器可以监控后端服务器,比如系统负载、响应时间、是否可用、TCP连接数、流量等,从而根据这些数据调整负载均衡的策略。

5、反射代理服务器可以让用户在一次会话周期内的所有请求始终转发到一台特定的后端服务器上(粘滞会话),这样的好处一是保持session的本地访问,二是防止后端服务器的动态内存缓存的资源浪费。

 

 

四、IP负载均衡(LVS-NAT)

因为反向代理服务器工作在HTTP层,其本身的开销就已经严重制约了可扩展性,从而也限制了它的性能极限。那能否在HTTP层面以下实现负载均衡呢?

 

NAT服务器:它工作在传输层,它可以修改发送来的IP数据包,将数据包的目标地址修改为实际服务器地址。

从 Linux2.4内核开始,其内置的Neftilter模块在内核中维护着一些数据包过滤表,这些表包含了用于控制数据包过滤的规则。可喜的是,Linux提供了iptables来对过滤表进行插入、修改和删除等操作。更加令人振奋的是,Linux2.6.x内核中内置了IPVS模块,它的工作性质类型于Netfilter模块,不过它更专注于实现IP负载均衡

想知道你的服务器内核是否已经安装了IPVS模块,可以

20141121164600671.png

有输出意味着IPVS已经安装了。IPVS的管理工具是ipvsadm,它为提供了基于命令行的配置界面,可以通过它快速实现负载均衡系统。这就是大名鼎鼎的LVS(Linux Virtual Server,Linux虚拟服务器)。

 

1、打开调度器的数据包转发选项

echo 1 > /proc/sys/net/ipv4/ip_forward

2、检查实际服务器是否已经将NAT服务器作为自己的默认网关,如果不是,如添加

route add default gw xx.xx.xx.xx

3、使用ipvsadm配置

ipvsadm -A -t 111.11.11.11:80 -s rr  

添加一台虚拟服务器,-t 后面是服务器的外网ip和端口,-s rr是指采用简单轮询的RR调度策略(这属于静态调度策略,除此之外,LVS还提供了系列的动态调度策略,比如最小连接(LC)、带权重的最小连接(WLC),最短期望时间延迟(SED)等)

ipvsadm -a -t 111.11.11.11:80 -r 10.10.120.210:8000 -m  

ipvsadm -a -t 111.11.11.11:80 -r 10.10.120.211:8000 -m  

添加两台实际服务器(不需要有外网ip),-r后面是实际服务器的内网ip和端口,-m表示采用NAT方式来转发数据包

运行ipvsadm -L -n可以查看实际服务器的状态。这样就大功告成了。

 

实验证明使用基于NAT的负载均衡系统。作为调度器的NAT服务器可以将吞吐率提升到一个新的高度,几乎是反向代理服务器的两倍以上,这大多归功于在内核中进行请求转发的较低开销。但是一旦请求的内容过大时,不论是基于反向代理还是NAT,负载均衡的整体吞吐量都差距不大,这说明对于一睦开销较大的内容,使用简单的反向代理来搭建负载均衡系统是值考虑的。

 

这么强大的系统还是有它的瓶颈,那就是NAT服务器的网络带宽,包括内部网络和外部网络。当然如果你不差钱,可以去花钱去购买千兆交换机或万兆交换机,甚至负载均衡硬件设备,但如果你是个屌丝,咋办?

一个简单有效的办法就是将基于NAT的集群和前面的DNS混合使用,比如5个100Mbps出口宽带的集群,然后通过DNS来将用户请求均衡地指向这些集群,同时,你还可以利用DNS智能解析实现地域就近访问。这样的配置对于大多数业务是足够了,但是对于提供下载或视频等服务的大规模站点,NAT服务器还是不够出色。

 

五、直接路由(LVS-DR)

NAT是工作在网络分层模型的传输层(第四层),而直接路由是工作在数据链路层(第二层),貌似更屌些。它通过修改数据包的目标MAC地址(没有修改目标IP),将数据包转发到实际服务器上,不同的是,实际服务器的响应数据包将直接发送给客户羰,而不经过调度器。

1、网络设置

这里假设一台负载均衡调度器,两台实际服务器,购买三个外网ip,一台机一个,三台机的默认网关需要相同,最后再设置同样的ip别名,这里假设别名为 10.10.120.193。这样一来,将通过10.10.120.193这个IP别名来访问调度器,你可以将站点的域名指向这个IP别名。

2、将ip别名添加到回环接口lo上

这是为了让实际服务器不要去寻找其他拥有这个IP别名的服务器,在实际服务器中运行:

20141121180709578.png

另外还要防止实际服务器响应来自网络中针对IP别名的ARP广播,为此还要执行:

echo "1" > /proc/sys/net/ipv4/conf/lo/arp_ignore

echo "2" > /proc/sys/net/ipv4/conf/lo/arp_announce

echo "1" > /proc/sys/net/ipv4/conf/all/arp_ignore

echo "1" > /proc/sys/net/ipv4/conf/all/arp_announce

配置完了就可以使用ipvsadm配置LVS-DR集群了

 

ipvsadm -A -t 10.10.120.193:80 -s rr  

ipvsadm -a -t 10.10.120.193:80 -r 10.10.120.210:8000 -g  

ipvsadm -a -t 10.10.120.193:80 -r 10.10.120.211:8000 -g  

-g 就意味着使用直接路由的方式转发数据包

LVS-DR 相较于LVS-NAT的最大优势在于LVS-DR不受调度器宽带的限制,例如假设三台服务器在WAN交换机出口宽带都限制为10Mbps,只要对于连接调度器和两台实际服务器的LAN交换机没有限速,那么,使用LVS-DR理论上可以达到20Mbps的最大出口宽带,因为它的实际服务器的响应数据包可以不经过调度器而直接发往用户端啊,所以它与调度器的出口宽带没有关系,只能自身的有关系。而如果使用LVS-NAT,集群只能最大使用10Mbps的宽带。所以,越是响应数据包远远超过请求数据包的服务,就越应该降低调度器转移请求的开销,也就越能提高整体的扩展能力,最终也就越依赖于WAN出口宽带。

 

总的来说,LVS-DR适合搭建可扩展的负载均衡系统,不论是Web服务器还是文件服务器,以及视频服务器,它都拥有出色的性能。前提是你必须为实际器购买一系列的合法IP地址。

 

六、IP隧道(LVS-TUN)

基于IP隧道的请求转发机制:将调度器收到的IP数据包封装在一个新的IP数据包中,转交给实际服务器,然后实际服务器的响应数据包可以直接到达用户端。目前Linux大多支持,可以用LVS来实现,称为LVS-TUN,与LVS-DR不同的是,实际服务器可以和调度器不在同一个WANt网段,调度器通过 IP隧道技术来转发请求到实际服务器,所以实际服务器也必须拥有合法的IP地址。

 

总体来说,LVS-DR和LVS-TUN都适合响应和请求不对称的Web服务器,如何从它们中做出选择,取决于你的网络部署需要,因为LVS-TUN可以将实际服务器根据需要部署在不同的地域,并且根据就近访问的原则来转移请求,所以有类似这种需求的,就应该选择LVS-TUN。

来自:http://blog.csdn.net/asqi1/article/details/41478111

 

 如何解决负载平衡问题

一、问题的提出

随着Internet和Intranet的高速发展,基于IP的应用越来越成为网络最普遍,最有用和甚至是必不可少的部分。许多知名的站点和ISP常常要在短时间内接受大量的访问而力不从心。这给网络的升级维护带来了一些问题:

1. 如果采用单一的服务器提供服务,很明显,存在着单点脆弱性(Single Point of Failure)。这台服务器任何部件稍有闪失,都会给服务带来问题;同时这也是昂贵的、难以扩展的方案:服务器的能力需要不断的提高,扩充内存,升级 CPU,增加硬盘…在系统维护和升级的期间,服务被迫中断;而且这种升级也有极限,总有一天,无论如何调整服务器的性能都无法满足用户的要求。

2. 如果采用服务器群,主要的缺点在于访问地址的复杂化和负载不平衡。对于每台服务器都必须有相应的唯一的IP地址,给用户的访问和网络管理带来不便;这些服务器之间的流量分配是随机的,不会考虑服务器当前的负载情况,在某些情形之下反而造成连接失败。

二、目前典型的方法

1. 使用Round-Robin DNS,将服务请求分布到不同的服务器上。此种方法运行在应用层,由于简单地将域名请求分布,并不了解正在运行的服务负载及网络链路,因此,并不能提供真正的负载平衡。Internet上最著名的负载分配方法叫 Round-Robin DNS。 Round-Robin DNS运行在域名服务器上,是用来向每一台服务器乃至每一个进程分配用户申请的软件,它可以让你配置一份 IP地址名单,然后,就可以通过域名服务器 (DNS)把申请有序地分配到机器、或以不同数字代表的进程之上。然而, Round-RobinDNS被普遍公认为一种并非完美的解决方案。因为,它无法反映出不同的机器可能拥有不同的能力 (尽管在非常有限的程度上,可通过对能力更强的机器使用多个别名来进行粗略的能力估价);它不可能作为因数记入负载水平;而且它也无法检测并避开那些已经瘫痪了的服务器。

2 使用对应用或网络敏感的DNS服务,此种方案相对第一种方案提供了更好的特征,但由于DNS的Cache机制,客户仍然不能得到真正的负载平衡。

3 使用双机备份的大型服务器系统是当前许多ICP/ISP的升级选择。但是此种方案并不能避免网络上的单点故障,而且其中的一台服务器在一般情况下处于休眠状态,增加了系统成本和管理成本。

4 使用网络层(IP)的网络流量分配设备(Director)。此种方法支持真正的负载平衡,并且提供服务的系统可通过网络连接,分布在不同的地区。但是,不同的解决方案提供的特性区别较大,如是否支持分布的网络冗余、管理是否方便等。

三、IP负载平衡方案

通过IP负载平衡产品,分配网络访问流量,协同一组服务器共同工作,对用户提供完全透明的访问通道,使高性能、高承受力且只有一个简单的访问地址的站点成为可能。

IP负载平衡机制给多服务器环境带来了两个主要的好处:

1 系统可扩缩性(Scalable)

由于Web站点和服务器群拥有越来越多的用户,硬件的升级越来越频繁,这无疑是一件令人乏味和很不经济的事情。系统在安装了负载平衡产品之后,负载平衡器可以让一簇相同或不同的服务器共同来完成一台超级服务器的工作,给系统提供了无限的升级能力,减少了系统升级的开销。负载平衡器介于服务器和用户端之间,扮演了一个智能的指挥者角色。根据当前各个服务器的工作状态和能力来分配服务器负载,使整个系统能更高效的响应用户的请求。

2 系统的容错性(Fault Tolerance)

"不间断服务"、"24x7服务"(no down time)的概念越来越受业界人士重视。IP负载平衡器实时监视各个服务器的工作状态,不分配任务给那些力不从心的服务器,这种有弹性的负载分配方式充分利用了每台服务器,使用户能得到流畅、连续的透明的服务。这也正是在线服务的最终目标。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Guess you like

Origin http://10.200.1.11:23101/article/api/json?id=326807375&siteId=291194637