存档

‘负载均衡’ 分类的存档

LVS均衡算法介绍

2010年7月19日 wenhui 没有评论

目前LVS主要有三种请求转发方式和八种调度算法。根据请求转发方式的不同,所构架集群的网络拓扑、安装方式、性能表现也各不相同。用LVS主要可以架构三种形式的集群,分别是LVS/NAT、LVS/TUN和LVS/DR,可以根据需要选择其中一种。在选定转发方式的情况下,采用哪种调度算法将决定整个负载均衡的性能表现,不同的算法适用于不同的应用场合,有时可能需要针对特殊场合,自行设计调度算法。LVS的算法是逐渐丰富起来的,最初LVS只提供4 种调度算法,后来发展到以下八种:

1.轮叫调度(Round Robin)
调度器通过“轮叫”调度算法将外部请求按顺序轮流分配到集群中的真实服务器上,它均等地对待每一台服务器,而不管服务器上实际的连接数和系统负载。

2.加权轮叫(Weighted Round Robin)
调度器通过“加权轮叫”调度算法根据真实服务器的不同处理能力来调度访问请求。这样可以保证处理能力强的服务器能处理更多的访问流量。调度器可以自动问询真实服务器的负载情况,并动态地调整其权值。

3.最少链接(Least Connections)
调度器通过“最少连接”调度算法动态地将网络请求调度到已建立的链接数最少的服务器上。如果集群系统的真实服务器具有相近的系统性能,采用“最小连接”调度算法可以较好地均衡负载。

4.加权最少链接(Weighted Least Connections)
在集群系统中的服务器性能差异较大的情况下,调度器采用“加权最少链接”调度算法优化负载均衡性能,具有较高权值的服务器将承受较大比例的活动连接负载。调度器可以自动问询真实服务器的负载情况,并动态地调整其权值。

5.基于局部性的最少链接(Locality-Based Least Connections)
“基于局部性的最少链接”调度算法是针对目标IP地址的负载均衡,目前主要用于Cache集群系统。该算法根据请求的目标IP地址找出该目标IP地址最近使用的服务器,若该服务器是可用的且没有超载,将请求发送到该服务器;若服务器不存在,或者该服务器超载且有服务器处于一半的工作负载,则用“最少链接”的原则选出一个可用的服务器,将请求发送到该服务器。

6.带复制的基于局部性最少链接(Locality-Based Least Connections with Replication)
“带复制的基于局部性最少链接”调度算法也是针对目标IP地址的负载均衡,目前主要用于Cache集群系统。它与LBLC算法的不同之处是它要维护从一个目标 IP地址到一组服务器的映射,而LBLC算法维护从一个目标IP地址到一台服务器的映射。该算法根据请求的目标IP地址找出该目标IP地址对应的服务器组,按“最小连接”原则从服务器组中选出一台服务器,若服务器没有超载,将请求发送到该服务器;若服务器超载,则按“最小连接”原则从这个集群中选出一台服务器,将该服务器加入到服务器组中,将请求发送到该服务器。同时,当该服务器组有一段时间没有被修改,将最忙的服务器从服务器组中删除,以降低复制的程度。

7.目标地址散列(Destination Hashing)
“目标地址散列”调度算法根据请求的目标IP地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。

8.源地址散列(Source Hashing)
“源地址散列”调度算法根据请求的源IP地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。
了解这些算法原理能够在特定的应用场合选择最适合的调度算法,从而尽可能地保持Real Server的最佳利用性。当然也可以自行开发算法,不过这已超出本文范围,请参考有关算法原理的资料。

分类: 负载均衡 标签: ,

2.6内核上一步一步配置LVS(Linux Virtual Server)[转]

2010年7月19日 wenhui 没有评论

来源:http://blog.csdn.net/manio/archive/2007/02/04/1502297.aspx
Linux Virtual Server(LVS)的配置方法,网上虽然是能搜到很多,但无外外乎是那几个版本。这些版本大都只是写了如何这样配置,而没有为什么这样配置,还有很多基础性的东西是默认读者已知了,就没有讲明白。
最近成功在学校机房配置了一台调度器(Director)、两台服务器(Real Server)的集群服务器,用一台客户机来访问。我的配置有比较高的可实现性,所有计算机都在同一个局域网内,不用配置网关。如果这样的LVS配置成功了,之后配置更有有实用性的集群也不难了。

本文参考了LVS中文站点上的《LVS在Fedora Core5上的配置指南(以Linux、FreeBSD、Solaris系统为RealServer)》(http://zh.linuxvirtualserver.org/node/272),原文是一篇HOW TO性质的文章,并没有对一些原理进行阐述。本文在此基础上对一些细节的部分进行了说明(甚至是很基础的地方,这些地方对于理解整个LVS系统有着重要的作用),并进行了一些改动,使得更具可实现性(所有机器都在同一网段),文中亦会说明要如何将其改为可真正派上用场的集群服务。
我假设你在此之前已经读过了LVS的基本介绍,知道其用途和基本原理。如果你还没有看过,请看一下LVS的官方站点(http://www.linuxvirtualserver.org,http://zh.linuxvirtualserver.org)。本文所述采用的是通过直接路由实现虚拟服务器(VS/DR)的方法,这里先引述官方站点对此的介绍,并标出重点、加上注释。

跟VS/TUN方法相同,VS/DR利用大多数Internet服务的非对称特点,负载调度器中只负责调度请求,而服务器直接将响应返回给客户,可以极大地提高整个集群系统的吞吐量。该方法与IBM的NetDispatcher产品中使用的方法类似,但IBM的NetDispatcher是非常昂贵的商品化产品,我们也不知道它内部所使用的机制,其中有些是IBM的专利。
VS/DR的体系结构如图3.6所示:调度器和服务器组都必须在物理上有一个网卡通过不分断的局域网相连,如通过交换机或者高速的HUB相连。VIP地址为调度器和服务器组共享,调度器配置的VIP地址是对外可见的,用于接收虚拟服务的请求报文;所有的服务器把VIP地址配置在各自的Non-ARP网络设备上,它对外面是不可见的,只是用于处理目标地址为VIP的网络请求。(请看注释1)


图3.6:VS/DR的体系结构
VS/DR的工作流程如图3.7所示:它的连接调度和管理与VS/NAT和VS/TUN中的一样,它的报文转发方法又有不同,将报文直接路由给目标服务器。在VS/DR中,调度器根据各个服务器的负载情况,动态地选择一台服务器,不修改也不封装IP报文,而是将数据帧的MAC地址改为选出服务器的MAC地址,再将修改后的数据帧在与服务器组的局域网上发送。(请看注释2)因为数据帧的MAC地址是选出的服务器,所以服务器肯定可以收到这个数据帧,从中可以获得该IP报文。当服务器发现报文的目标地址VIP是在本地的网络设备上,服务器处理这个报文,然后根据路由表将响应报文直接返回给客户。

图3.7:VS/DR的工作流程
在VS/DR中,请求报文的目标地址为VIP,响应报文的源地址也为VIP,所以响应报文不需要作任何修改,可以直接返回给客户,客户认为得到正常的服务,而不会知道是哪一台服务器处理的。
VS/DR负载调度器也只处于从客户到服务器的半连接中,按照半连接的TCP有限状态机进行状态迁移。

注释1:VIP地址为调度器和服务器(RealServer)把共享,那会不会引起IP冲突?答案是:不会。正因为后面所说的,“调度器配置的VIP地址是对外可见的,用于接收虚拟服务的请求报文;所有的服务器把VIP地址配置在各自的Non-ARP网络设备上,它对外面是不可见的”。在调度器上,VIP与其局域网内IP对外都是可见的;在服务器上,对外可见的是其在局域网上的IP(调度器调度的时候使用的IP),而在服务器上,VIP的性质就像是平常我们所熟知的127.0.0.1的性质一样,它是一个loopback device,他只在网络层之上可见(包括网络层),这样的loopback device用来模拟网络适配器的行为。就算没有装网卡,127.0.0.1与VIP的这样IP都是可用的。
那为什么要在服务器上还放上一个VIP呢?
因为当只修改了MAC地址的链路层帧发到服务器的链路层时(详情请见注释2),要想再向上提交到应用层去让HTTP等服务器程序处理,必须再经过网络层、传输层等,而要通过这些层是要经过目标IP的检测的。
就像你要去参加一个婚礼,到门口,接待人员问你要参加谁的婚礼,人家这里明明举行的是李湘跟王老五的婚礼,你说你要参加谢霆锋跟张柏芝的婚礼,接待人员一定是不让你进去的。
那我就是又要说我要参加谢霆锋跟张柏芝的婚礼,以要进入李湘跟王老五的婚礼现场,怎么办?那就在李湘跟王老五的婚礼现场里安排一个自己人,你到时候对他说:“我要参加谢霆锋跟张柏芝的婚礼”,他会意地笑一声,就会帮你在李湘跟王老五的婚礼现场安排座位,让你在里面享受各种服务。
服务器里的VIP就有这个自己人的性质,他对外不可见,当请求包到达网络层以上的部分里,就可以看到VIP,从而一路上去,到达应用层,享用HTTP等服务。
原理如图(IPVS有没有到网络层?)

注释2:在这里可能有人会产生疑问,修改MAC地址就能让请求包发往Real Server上吗,不用改目标IP地址?答案是:是的。因为交换机是一个链路层的设备,链路层的传送单位是帧,他可不管网络层的包里放的是什么IP地址(网络层的ipv4包已经被封装在帧里)。当Direcotr把存有客户机的请求包的那帧的MAC地址改成某台Real Server的之后,就发出去,到交换机之后,交换机查找MAC地址与端口的对应表(端口MAC地址对应拥有些MAC地址的计算机),将这一帧发往与帧上MAC地址对应的端口,之后就发到计算机的链路层,如果MAC地址与网卡上的匹配,再向上层发送,直至应用层。

现在俺们来一步一步地在局域网内配置LVS。

四台计算机按如上方式插在交换机上,分别按如下的方式配置四台计算机。

Client

代码:

ifconfig eth0 192.168.11.1 netmask 255.255.255.0 broadcast 192.168.11.255

当重启时,上面的配置将会失效。如果要长期保留这个配置,请更改/etc/sysconfig/network-scripts/ifcfg-eth0文件。具体步骤请参考DIRECTOR的配置。

Director
首先安装IPVSADM,就是LVS的管理工具。REDHAT的用户可以到rpm.pbone.net上搜索ipvsadm,找到和自己系统对应的安装包,在安装文件夹里执行如下命令:
代码:
rpm ivh *.rpm
*.rpm代表rpm安装包的文件名。
当IPVSADM安装完成后,就可以配置DIRECTOR了,使用如下命令:

代码:
ipvsadm –C
ipvsadm -A -t 192.168.11.200:80 -s wlc
ipvsadm -a -t 192.168.11.200:80 -r 192.168.11.21 -g
ipvsadm -a -t 192.168.11.200:80 -r 192.168.11.22 -g
ipvsadm -Ln

每一行的命令信息可以查看IPVSADM的MAN。如果是要配置流媒体的服务器的话,应该打开UDP的包转发。
下面配置网卡:
首先新建配置文件/etc/sysconfig/network-scripts/ifcfg-eth0:0如下:

代码:
DEVICE=e th 0 : 0
ONBOOT=y e s
BOOTPROTO= s t a t i c
IPADDR= 1 9 2 . 1 6 8 . 11 . 2 0 0
NETMASK= 2 5 5 . 2 5 5 . 2 5 5 . 2 5 5
BROADCAST= 1 9 2 . 1 6 8 . 11 . 255

上面配置的是DIRECTOR的虚拟IP。

配置文件/etc/sysconfig/network-scripts/ifcfg-eth0如下:

代码:
DEVICE=e th 0
ONBOOT=y e s
BOOTPROTO= s t a t i c
IPADDR= 1 9 2 . 1 6 8 . 11 .10
NETMASK= 2 5 5 . 2 5 5 . 2 5 5 . 2 5 5
BROADCAST= 1 9 2 . 1 6 8 . 11 . 255

上面配置的是DIRECTOR的真实IP。

再执行下面的命令以使上面对网络的配置生效
代码:

/etc/rc.d/init.d/network restart

RS1(RealServer1)的配置
Linux Realserver 配置的关键之一在于关闭 arp,这要配置/etc/sysctl.conf如下

代码:

#f o r i p v s
n e t . ip v 4 . c o n f . l o . a r p i g n o r e = 1
n e t . ip v 4 . c o n f . l o . a rp announ c e = 2
n e t . ip v 4 . c o n f . a l l . a r p i g n o r e = 1
n e t . ip v 4 . c o n f . a l l . a rp announ c e = 2
n e t . ip v 4 . c o n f . d e f a u l t . r p f i l t e r = 1
#end o f i p v s

在/etc/sysconfig/network-scripts/ifcfg-eth0 中配置 ip 地址和网关。

代码:
DEVICE=e th 0
ONBOOT=y e s
BOOTPROTO= s t a t i c
IPADDR= 1 9 2 . 1 6 8 . 11 . 21
NETMASK= 2 5 5 . 2 5 5 . 2 5 5 . 0
BROADCAST= 1 9 2 . 1 6 8 . 11. 2 5 5

新建VIP 的网卡配置文件为/etc/sysconfig/network-scripts/ifcfg-lo:0。

代码:
DEVICE=l o : 0
ONBOOT=y e s
IPADDR= 1 9 2 . 1 6 8 . 11 . 2 0 0
NETMASK= 2 5 5 . 2 5 5 . 2 5 5 . 2 5 5

再执行下面的命令以使上面对网络的配置生效
代码:
/etc/rc.d/init.d/network restart

RS2(RealServer2)的配置
Linux Realserver 配置的关键之一在于关闭 arp,这要配置/etc/sysctl.conf如下

代码:

#f o r i p v s
n e t . ip v 4 . c o n f . l o . a r p i g n o r e = 1
n e t . ip v 4 . c o n f . l o . a rp announ c e = 2
n e t . ip v 4 . c o n f . a l l . a r p i g n o r e = 1
n e t . ip v 4 . c o n f . a l l . a rp announ c e = 2
n e t . ip v 4 . c o n f . d e f a u l t . r p f i l t e r = 1
#end o f i p v s

在/etc/sysconfig/network-scripts/ifcfg-eth0 中配置 ip 地址和网关。

代码:
DEVICE=e th 0
ONBOOT=y e s
BOOTPROTO= s t a t i c
IPADDR= 1 9 2 . 1 6 8 . 11 . 22
NETMASK= 2 5 5 . 2 5 5 . 2 5 5 . 0
BROADCAST= 1 9 2 . 1 6 8 . 11. 2 5 5

新建VIP 的网卡配置文件为/etc/sysconfig/network-scripts/ifcfg-lo:0。

代码:
DEVICE=l o : 0
ONBOOT=y e s
IPADDR= 1 9 2 . 1 6 8 . 11 . 2 0 0
NETMASK= 2 5 5 . 2 5 5 . 2 5 5 . 2 5 5

再执行下面的命令以使上面对网络的配置生效

代码:
/etc/rc.d/init.d/network restart

至此,一个LVS就配置好了,我们只要分别在Director,RS1,RS2的/var/www/html/文件夹下分别放入三个内容不同的名为index.htm的文件,然后在Client的浏览器中输入http://192.168.11.200,回车,不停的刷新,就会发现,有时看到的是放在RS1上的index.htm,有时看到的是RS2上的index.htm,而不会看到director上的index.html。因为发现198.168.11.200的80端口的http请求报文都被转发到到rs1或rs2上。
大功告成!

分类: 负载均衡 标签:

ipvsadm命令参考[转]

2010年7月19日 wenhui 没有评论

来源:http://zh.linuxvirtualserver.org/node/5

对ipvsadm 的命令参考,并根据自己使用的经验,进行了一个简单的翻译,希望
对ipvsadm 的使用者有一定的帮助。

为了更好的让大家理解这份命令手册,将手册里面用到的几个术语先简单的介绍一下:

1,virtual-service-address:是指虚拟服务器的ip 地址
2,real-service-address:是指真实服务器的ip 地址
3,scheduler:调度方法

(lna@networksbase.com 翻译 ipvsadm v1.21 2004 年4 月)
ipvsadm 的用法和格式如下:

ipvsadm -A|E -t|u|f virutal-service-address:port [-s scheduler] [-p
[timeout]] [-M netmask]
ipvsadm -D -t|u|f virtual-service-address
ipvsadm -C
ipvsadm -R
ipvsadm -S [-n]
ipvsadm -a|e -t|u|f service-address:port -r real-server-address:port
[-g|i|m] [-w weight]
ipvsadm -d -t|u|f service-address -r server-address
ipvsadm -L|l [options]
ipvsadm -Z [-t|u|f service-address]
ipvsadm –set tcp tcpfin udp
ipvsadm –start-daemon state [--mcast-interface interface]
ipvsadm –stop-daemon
ipvsadm -h

命令选项解释:

有两种命令选项格式,长的和短的,具有相同的意思。在实际使用时,两种都可
以。
-A –add-service 在内核的虚拟服务器表中添加一条新的虚拟服务器记录。也
就是增加一台新的虚拟服务器。
-E –edit-service 编辑内核虚拟服务器表中的一条虚拟服务器记录。
-D –delete-service 删除内核虚拟服务器表中的一条虚拟服务器记录。
-C –clear 清除内核虚拟服务器表中的所有记录。
-R –restore 恢复虚拟服务器规则
-S –save 保存虚拟服务器规则,输出为-R 选项可读的格式
-a –add-server 在内核虚拟服务器表的一条记录里添加一条新的真实服务器
记录。也就是在一个虚拟服务器中增加一台新的真实服务器
-e –edit-server 编辑一条虚拟服务器记录中的某条真实服务器记录
-d –delete-server 删除一条虚拟服务器记录中的某条真实服务器记录
-L|-l –list 显示内核虚拟服务器表
-Z –zero 虚拟服务表计数器清零(清空当前的连接数量等)
–set tcp tcpfin udp 设置连接超时值
–start-daemon 启动同步守护进程。他后面可以是master 或backup,用来说
明LVS Router 是master 或是backup。在这个功能上也可以采用keepalived 的
VRRP 功能。
–stop-daemon 停止同步守护进程
-h –help 显示帮助信息

其他的选项:

-t –tcp-service service-address 说明虚拟服务器提供的是tcp 的服务
[vip:port] or [real-server-ip:port]
-u –udp-service service-address 说明虚拟服务器提供的是udp 的服务
[vip:port] or [real-server-ip:port]
-f –fwmark-service fwmark 说明是经过iptables 标记过的服务类型。
-s –scheduler scheduler 使用的调度算法,有这样几个选项
rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq,
默认的调度算法是: wlc.
-p –persistent [timeout] 持久稳固的服务。这个选项的意思是来自同一个客
户的多次请求,将被同一台真实的服务器处理。timeout 的默认值为300 秒。
-M –netmask netmask persistent granularity mask
-r –real-server server-address 真实的服务器[Real-Server:port]
-g –gatewaying 指定LVS 的工作模式为直接路由模式(也是LVS 默认的模式)
-i –ipip 指定LVS 的工作模式为隧道模式
-m –masquerading 指定LVS 的工作模式为NAT 模式
-w –weight weight 真实服务器的权值
–mcast-interface interface 指定组播的同步接口
-c –connection 显示LVS 目前的连接 如:ipvsadm -L -c
–timeout 显示tcp tcpfin udp 的timeout 值 如:ipvsadm -L –timeout
–daemon 显示同步守护进程状态
–stats 显示统计信息
–rate 显示速率信息
–sort 对虚拟服务器和真实服务器排序输出
–numeric -n 输出IP 地址和端口的数字形式

分类: 负载均衡 标签: ,

如何关闭LVS服务器?

2010年7月18日 wenhui 没有评论

ipvsadm -C
ipvsadm -Z

即可

分类: 挨踢, 负载均衡 标签:

Debian Linux下基于LVS配置负载均衡的web服务集群[转]

2010年7月18日 wenhui 没有评论

来源:http://hi.baidu.com/arrowapex/blog/item/8fc0e5119f14287cca80c458.html/cmtid/ea1d500834e9233de8248875

LVS(Linux Virtual Server)是Linux下一个很好的开源项目,用于搭建负载均衡的高效的服务集群,可参见http://www.linuxvirtualserver.org/

1.配置Load Balancer
对于linux2.6内核已经集成了对ipvs的支持,只要启用管理它就行,所以只要安装ipvsadm

#apt-get install ipvsadm

编写一个shell脚本:

#!/bin/bash
#define const
VIP=192.168.0.200
PORT=80
RS1=192.168.0.105
RS2=192.168.0.180
ifconfig eth0:0 $VIP broadcast 192.168.0.255 netmask 255.255.255.0
route add -host $VIP dev eth0:0
echo 1 >/proc/sys/net/ipv4/ip_forward
ipvsadm -C
ipvsadm -A -t $VIP:$PORT -s wlc
ipvsadm -a -t $VIP:$PORT -r $RS1 -g -w 3
ipvsadm -a -t $VIP:$PORT -r $RS2 -g -w 3

这主要是为了开机启动配置的LVS比较方便,当然也可以一个一个命令执行,在运行完这个脚本,还可以动态的添加或删除节点,格式类似于脚本最后几行

2.配置Real Server:
对于real server,运行什么样的OS都无所谓,可以是linux, solaris, freebsd, window,只要能配置VIP就行,我这里还是用了Debian,也写了一个启动脚本:

#!/bin/bash
#define
VIP=192.168.0.200
ifconfig lo:0 $VIP broadcast 192.168.0.255 netmask 255.255.255.255
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 2 >/proc/sys/net/ipv4/conf/all/arp_announce

分类: 挨踢, 负载均衡 标签: ,