LVS 是四层负载均衡,也就是说建立在 OSI 模型的第四层——传输层之上,传输层上有我们熟悉的 TCP/UDP,LVS 支持 TCP/UDP 的负载均衡。
LVS 的转发主要通过修改 IP 地址(NAT 模式,分为源地址修改 SNAT 和目标地址修改 DNAT)、修改目标 MAC(DR 模式)来实现。
那么为什么 LVS 是在第四层做负载均衡?
首先 LVS 不像 HAProxy 等七层软负载面向的是 HTTP 包,所以七层负载可以做的 URL 解析等工作,LVS 无法完成。其次,某次用户访问是与服务端建立连接后交换数据包实现的,如果在第三层网络层做负载均衡,那么将失去「连接」的语义。软负载面向的对象应该是一个已经建立连接的用户,而不是一个孤零零的 IP 包。后面会看到,实际上 LVS 的机器代替真实的服务器与用户通过 TCP 三次握手建立了连接,所以 LVS 是需要关心「连接」级别的状态的。
LVS 的工作模式主要有 4 种:
DR
NAT
TUNNEL
Full-NAT
1.DR模式
请求由 LVS 接受,由真实提供服务的服务器(RealServer, RS)直接返回给用户,返回的时候不经过 LVS。
DR 模式下需要 LVS 和绑定同一个 VIP(RS 通过将 VIP 绑定在 loopback 实现)。
一个请求过来时,LVS 只需要将网络帧的 MAC 地址修改为某一台 RS 的 MAC,该包就会被转发到相应的 RS 处理,注意此时的源 IP 和目标 IP 都没变,LVS 只是做了一下移花接木。
RS 收到 LVS 转发来的包,链路层发现 MAC 是自己的,到上面的网络层,发现 IP 也是自己的,于是这个包被合法地接受,RS 感知不到前面有 LVS 的存在。
而当 RS 返回响应时,只要直接向源 IP(即用户的 IP)返回即可,不再经过 LVS。
DR 模式是性能最好的一种模式。
DR工作模式:
client => VS=> RS => client
VS 和 RS属于同一个V/An
server1作为LVS:
IP(eth0) 172.25.24.1/24
VIP(eth0)172.25.24.100/24
server2和server3 作为RS:
IP(eth0) 172.25.24.2 /24 和 172.25.24.3/24
VIP(eth0)172.25.24.100/24
通信原理:
请求由 LVS 接受,由真实提供服务的服务器(RealServer, RS)直接返回给用户,返回的时候不经过 LVS。
DR 模式下需要 LVS 和绑定同一个 VIP(RS 通过将 VIP 绑定在 loopback 实现)。
一个请求过来时,LVS 只需要将网络帧的 MAC 地址修改为某一台 RS 的 MAC,该包就会被转发到相应的 RS 处理,注意此时的源 IP 和目标 IP 都没变,LVS 只是做了一下移花接木。
RS 收到 LVS 转发来的包,链路层发现 MAC 是自己的,到上面的网络层,发现 IP 也是自己的,于是这个包被合法地接受,RS 感知不到前面有 LVS 的存在。
而当 RS 返回响应时,只要直接向源 IP(即用户的 IP)返回即可,不再经过 LVS。
DR 模式是性能最好的一种模式。
LVS:
[root@server1 ~]# vim /etc/yum.repos.d/rhel-source.repo
[root@server1 ~]# yum repolist
Loaded plugins: product-id, subscription-manager
This system is not registered to Red Hat Subscription Management. You can use subscription-manager to register.
LoadBalancer | 3.9 kB 00:00
LoadBalancer/primary_db | 7.0 kB 00:00
ResilientStorage | 3.9 kB 00:00
ResilientStorage/primary_db | 47 kB 00:00
ScalableFileSystem | 3.9 kB 00:00
ScalableFileSystem/primary_db | 6.8 kB 00:00
ghAvailability | 3.9 kB 00:00
ghAvailability/primary_db | 43 kB 00:00
rhel-source | 3.9 kB 00:00
repo id repo name status
LoadBalancer LoadBalancer 4
ResilientStorage ResilientStorage 62
ScalableFileSystem ScalableFileSystem 7
ghAvailability HighAvailability 56
rhel-source Red Hat Enterprise Linux 6Server - x86_64 - Source 3,690
repolist: 3,819
yum install ipvsadm -y ##下载调度器软件 ,只有打开yum源头的高可用性才可以下载
[root@server1 ~]# ipvsadm -A -t 172.25.24.100:80 -s rr ## # -t是表示指定虚拟服务为tcp服务,形式为host[:port], rr表示轮询
[root@server1 ~]# ipvsadm -l ##显示连接并刷新
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 172.25.24.100:http rr
[root@server1 ~]# ipvsadm -a -t 172.25.24.100:80 -r 172.25.24.2:80 -g ### -a是添加一个real server
[root@server1 ~]# ipvsadm -a -t 172.25.24.100:80 -r 172.25.24.3:80 -g
[root@server1 ~]# ipvsadm -l
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 172.25.24.100:http rr
-> server2:http Route 1 0 0
-> server3:http Route 1 0 0
[root@server1 ~]# ip addr 172.25.24.100/24 dev eth0
Command "172.25.24.100/24" is unknown, try "ip addr help".
[root@server1 ~]# ip addr add 172.25.24.100/24 dev eth0
[root@server1 ~]# ipvsadm -ln ##查看当前策略
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 172.25.24.100:80 rr
-> 172.25.24.2:80 Route 1 0 0
-> 172.25.24.3:80 Route 1 0 0
[root@server1 ~]# /etc/init.d/ipvsadm save ##保存策略使它生效
ipvsadm: Saving IPVS table to /etc/sysconfig/ipvsadm: [ OK ]
RS:
两个RS上作同样的操作
[root@server2 html]# ip addr add 172.25.24.100/24 dev eth0 ##添加一个ip为100的网卡
[root@server2 html]# yum install -y arptables_jf
[root@server2 html]# arptables -A IN -d 172.25.24.100 -j DROP ##进来的时候不抓取100IP
[root@server2 html]# arptables -A OUT -s 172.25.24.100 -j mangle --mangle-ip-s 172.25.24.2 ##出去的时候,是真实的IP
[root@server2 html]# /etc/init.d/arptables_jf save ##保存策略
Saving current rules to /etc/sysconfig/arptables: [ OK ]
root@server2 html]# /etc/init.d/httpd start ##打开http
Stopping httpd: [ OK ]
物理服务器(作为客户端使用):
vim /etc/hosts
172.25.24.100 www.westos.org bbs.westos.org westos.org ##添加可以访问的域名
[root@foundation24 ~]# curl www.westos.org
www.westos.org - server3
[root@foundation24 ~]# curl www.westos.org
www.westos.ogr -server2
[root@foundation24 ~]# curl www.westos.org
www.westos.org - server3
[root@foundation24 ~]# curl www.westos.org
www.westos.ogr -server2
[root@foundation24 ~]# curl www.westos.org
www.westos.org - server3
[root@foundation24 ~]# curl www.westos.org
www.westos.ogr -server2
[root@foundation24 ~]# curl www.westos.org
www.westos.org - server3
[root@foundation24 ~]# curl www.westos.org
www.westos.ogr -server2
3.提示模式
[root@server1 ~]# rpm -ivh ldirectord-3.9.5-3.1.x86_64.rpm
warning: ldirectord-3.9.5-3.1.x86_64.rpm: Header V3 DSA/SHA1 Signature, key ID 7b709911: NOKEY
error: Failed dependencies:
perl(IO::Socket::INET6) is needed by ldirectord-3.9.5-3.1.x86_64
perl(LWP::Debug) is needed by ldirectord-3.9.5-3.1.x86_64
perl(LWP::UserAgent) is needed by ldirectord-3.9.5-3.1.x86_64
perl(Mail::Send) is needed by ldirectord-3.9.5-3.1.x86_64
perl(Socket6) is needed by ldirectord-3.9.5-3.1.x86_64
perl-MailTools is needed by ldirectord-3.9.5-3.1.x86_64
perl-Net-SSLeay is needed by ldirectord-3.9.5-3.1.x86_64
perl-libwww-perl is needed by ldirectord-3.9.5-3.1.x86_64
resource-agents is needed by ldirectord-3.9.5-3.1.x86_64
[root@server1 ~]# ls
anaconda-ks.cfg nginx-1.10.1.tar.gz
install.log nginx-1.14.0
install.log.syslog nginx-1.14.0.tar.gz
ldirectord-3.9.5-3.1.x86_64.rpm nginx-sticky-module-ng
nginx-1.10.1 nginx-sticky-module-ng.tar.gz
[root@server1 ~]# yum install ldirectord-3.9.5-3.1.x86_64.rpm -y
root@server1 ~]# cp /usr/share/doc/ldirectord-3.9.5/ldirectord.cf /etc/ha.d/
[root@server1 ~]# cd /etc/ha.d/
[root@server1 ha.d]# ls
ldirectord.cf resource.d shellfuncs
[root@server1 ha.d]# vim ldirectord.cf
[root@server1 ha.d]# ipvsadm -C
[root@server1 ha.d]# ipvsadm -l
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
[root@server1 ha.d]# vim ldirectord.cf
[root@server1 ha.d]# cd /var/www/html/
[root@server1 html]# ls
[root@server1 html]# vim index.html
virtual=172.25.24.100:80 #虚拟IP
real=172.25.24.2:80 gate #提供服务的real-serverlp
real=172.25.24.3:80 gate
fallback=127.0.0.1:80 gate #如果两台real-server都坏了,则只能自己提供该服务。前提是的有该服务哦。
service=http ##用http服务
scheduler=rr #调用轮叫算法
#persistent=600
#netmask=255.255.255.255
protocol=tcp
checktype=negotiate
checkport=80
request=”index.html” ##查询内容
#receive=”Test Page”
#virtualhost=www.x.y.z
[root@server1 ha.d]# ipvsadm -C ##清空规则
[root@server1 ha.d]# ipvsadm -l
[root@server1 html]# /etc/init.d/ldirectord start ##打开服务
Starting ldirectord... success
测试:
关闭Realserver的http会提示:
[root@foundation24 ~]# curl 172.25.24.100
gogogo~
[root@foundation24 ~]# curl 172.25.24.100
gogogo~
[root@foundation24 ~]# curl 172.25.24.100
gogogo~
[root@foundation24 ~]# curl 172.25.24.100
gogogo~
[root@foundation24 ~]# curl 172.25.24.100
gogogo~
2.NAT模式
在一组服务器前有一个调度器,它们是通过 Switch/HUB 相连接的。这些服务器提供相同的网络服
务、相同的内容,即不管请求被发送到哪一台服务器,执 行结果是一样的。服务的内容可以复制到
每台服务器的本地硬盘上,可以通过网络文件系统(如 NFS)共享,也可以通过一个分布式文件系统
来提供。
VS/NAT 的优点是服务器可以运行任何支持 TCP/IP 的操作系统,它只需要一个 IP 地址配置在调度器
上,服务器组可以用私有的 IP 地址。缺点是它的伸缩能力有限, 当服务器结点数目升到 20 时,调度
器本身有可能成为系统的新瓶颈,因为在 VS/NAT 中请求和响应报文都需要通过负载调度器。
Load Balance 双网卡 eth0: 192.168.0.254 (对内) eth1: 192.168.1.254 (对外)
NAT模式就是通过网络地址转换来实现负载均衡的
准备工作:
关闭所有节点的iptables和selinux服务
LVS服务机:
公网地址:172.25.24.100
主机名:server1
子网掩码:255.255.255.0
网关:无
私网地址:172.25.24.1
RealServer:
主机名:server2 和 server3
子网掩码:255.255.255.0
网关:172.25.24.1
私网地址:172.25.24.2 和 172.25.24.3
21.RealServer上部署http服务
[root@server2 ~]# /etc/init.d/httpd start
Starting httpd: httpd: Could not reliably determine the server's fully qualified domain name, using 172.25.24.2 for ServerName
[ OK ]
[root@server3 ~]# /etc/init.d/httpd start
Starting httpd: httpd: Could not reliably determine the server's fully qualified domain name, using 172.25.24.3 for ServerName
[root@server2 ~]# cat /var/www/html/index.html
server2
[root@server3 ~]# cat /var/www/html/index.html
server3
2.2测试http服务是否完好
[root@server2 ~]# curl 172.25.24.3
server3
[root@server2 ~]# curl 127.0.0.1
server2
2.3LVS主机的部署
[root@server1 ~]# yum install ipvsadm -y
[root@server1 ~]# ipvsadm -A -t 172.25.24.100:80 -s rr ##定义一个集群服务
[root@server1 ~]# ipvsadm -a -t 172.25.24.100:80 -r 172.25.24.2 -m ##添加RealServer并指派算法为NAT
[root@server1 ~]# ipvsadm -a -t 172.25.24.100:80 -r 172.25.24.3 -m
[root@server1 ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 172.25.24.100:80 rr
-> 172.25.24.2:80 Masq 1 0 0
-> 172.25.24.3:80 Masq 1 0 0
[root@server1 ~]# cat /proc/sys/net/ipv4/ip_forward #查看linux是否由路由转发功能
0
[root@server1 ~]# echo 1 > /proc/sys/net/ipv4/ip_forward ##开启linux路由转发功能
[root@server1 ~]# cat /proc/sys/net/ipv4/ip_forward
1
测试:
[root@server1 ~]# curl 172.25.24.100
server3
[root@server1 ~]# curl 172.25.24.100
server2
[root@server1 ~]# curl 172.25.24.100
server3
[root@server1 ~]# curl 172.25.24.100
server2
[root@server1 ~]# curl 172.25.24.100
server3
[root@server1 ~]# curl 172.25.24.100
server2
为均衡的
2.4修改LVS的调度算法并压力测试
[root@server1 ~]# ipvsadm -E -t 172.25.24.100:80 -s wrr
[root@server1 ~]# ipvsadm -e -t 172.25.24.100:80 -r 172.25.24.3 -m -w 1
[root@server1 ~]# ipvsadm -e -t 172.25.24.100:80 -r 172.25.24.2 -m -w 3
[root@server1 ~]# curl 172.25.24.100
server2
[root@server1 ~]# curl 172.25.24.100
server2
[root@server1 ~]# curl 172.25.24.100
server2
[root@server1 ~]# curl 172.25.24.100
server3
[root@server1 ~]# curl 172.25.24.100
server2
[root@server1 ~]# curl 172.25.24.100
server2
[root@server1 ~]# curl 172.25.24.100
server2
[root@server1 ~]# curl 172.25.24.100
server3
2.5保存:
[root@server1 ~]# service ipvsadm save
ipvsadm: Saving IPVS table to /etc/sysconfig/ipvsadm: [ OK ]
[root@server1 ~]#
3.TUN模式
它的连接调度和管理与 VS/NAT 中的一样,只是它的报文转发方法不同。调度器根据各个服务器的负
载情况,动态地选择一台服务器,将请求报文封装在另一个 IP 报文中,再将封装后的 IP 报文转发给
选出的服务器;服务器收到报文后,先将报文解封获得原来目标地址为 VIP 的报文,服务器发现 VIP
地址被配置在本 地的 IP 隧道设备上,所以就处理这个请求,然后根据路由表将响应报文直接返回给
客户。
在 VS/TUN 的集群系统中,负载调度器只将请求调度到不同的后端服务器,后端服务器将应
答的数据直接返回给用户。这样,负载调度器就可以处理大量的请求,它甚至可以调 度百台
以上的服务器(同等规模的服务器),而它不会成为系统的瓶颈。即使负载调度器只有
100Mbps 的全双工网卡,整个系统的最大吞吐量可超过 1Gbps。所以,VS/TUN 可以极大地增加负载调度器调度的服务器数量。VS/TUN 调度器可以调度上百台服务器,而它本身不会成
为系统的瓶颈,可以 用来构建高性能的超级服务器。
还是以三台机器为例子
LVS服务机器
server1:
DIP 172.25.24.1 VIP 172.25.24.100
[root@server1 ~]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 52:54:00:68:c4:4b brd ff:ff:ff:ff:ff:ff
inet 172.25.24.1/24 brd 172.25.24.255 scope global eth0
inet 172.25.24.100/24 scope global secondary eth0
inet6 fe80::5054:ff:fe68:c44b/64 scope link
valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN qlen 1000
link/ether 52:54:00:18:6c:bb brd ff:ff:ff:ff:ff:ff
[root@server1 ~]# iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
[root@server1 ~]# ipvsadm -C ##清除规则
[root@server1 ~]# ipvsadm -A -t 172.25.24.100:80 -s rr ##添加算法
[root@server1 ~]# ipvsadm -a -t 172.25.24.100:80 -r 172.25.24.2 -i ##添加隧道模式
[root@server1 ~]# ipvsadm -a -t 172.25.24.100:80 -r 172.25.24.3 -i
[root@server1 ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 172.25.24.100:80 rr
-> 172.25.24.2:80 Tunnel 1 0 0
-> 172.25.24.3:80 Tunnel 1 0 0
[root@server1 ~]#
Realserver : server2
3.1.配置DIP
[root@server2 ~]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 52:54:00:21:e0:06 brd ff:ff:ff:ff:ff:ff
inet 172.25.24.2/24 brd 172.25.24.255 scope global eth0
inet6 fe80::5054:ff:fe21:e006/64 scope link
valid_lft forever preferred_lft forever
3: tunl0: <NOARP,UP,LOWER_UP> mtu 1480 qdisc noqueue state UNKNOWN
link/ipip 0.0.0.0 brd 0.0.0.0
inet 172.25.24.100/24 brd 172.25.24.255 scope global tunl0
3.2.生成ifcfg-tunl0配置文件
[root@server2 ~]# modprobe ipip ## 在家在ipip模块之后就会有默认隧道tunl0
[root@server2 ~]# lsmod |grep ipip ##查看
ipip 8371 0
tunnel4 2943 1 ipip
[root@server2 network-scripts]# cp ifcfg-lo ifcfg-tunl0
[root@server2 network-scripts]# vim ifcfg-tunl0 添加以下内容
[root@server2 ~]# cat /etc/sysconfig/network-scripts/ifcfg-tunl0
DEVICE=tunl0
IPADDR=172.25.24.100
NETMASK=255.255.255.0
ONBOOT=yes
NAME=tunl0
[root@server2 network-scripts]# /etc/init.d/network restart
Shutting down interface eth0: [ OK ]
Shutting down loopback interface: [ OK ]
Bringing up loopback interface: [ OK ]
Bringing up interface eth0: Determining if ip address 172.25.24.2 is already in use for device eth0...
[ OK ]
Bringing up interface tunl0: Determining if ip address 172.25.24.100 is already in use for device tunl0...
3.3关闭APR转发
[root@server2 network-scripts]# vim /etc/sysctl.conf 添加以下内容
net.ipv4.conf.tunl0.arp_ignore = 1
net.ipv4.conf.tunl0.arp_announce = 2
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.tunl0.rp_filter = 0
net.ipv4.conf.all.rp_filter = 0
[root@server2 network-scripts]# echo 0 >/proc/sys/net/ipv4/ip_forward ##关闭APR转发
[root@server2 network-scripts]# cat /proc/sys/net/ipv4/ip_forward
0
[root@server2 network-scripts]# sysctl -p ## 永久生效
net.ipv4.ip_forward = 0
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.default.accept_source_route = 0
kernel.sysrq = 0
kernel.core_uses_pid = 1
net.ipv4.tcp_syncookies = 1
error: "net.bridge.bridge-nf-call-ip6tables" is an unknown key
error: "net.bridge.bridge-nf-call-iptables" is an unknown key
error: "net.bridge.bridge-nf-call-arptables" is an unknown key
kernel.msgmnb = 65536
kernel.msgmax = 65536
kernel.shmmax = 68719476736
kernel.shmall = 4294967296
net.ipv4.conf.tunl0.arp_ignore = 1
net.ipv4.conf.tunl0.arp_announce = 2
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.tunl0.rp_filter = 0
net.ipv4.conf.all.rp_filter = 0
[root@server2 network-scripts]# cd
[root@server2 ~]# echo 1 > /proc/sys/net/ipv4/conf/tunl0/arp_ignore
[root@server2 ~]# echo 2 > /proc/sys/net/ipv4/conf/tunl0/arp_announce
[root@server2 ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@server2 ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
[root@server2 ~]# echo 0 > /proc/sys/net/ipv4/conf/tunl0/rp_filter
[root@server2 ~]# echo 0 > /proc/sys/net/ipv4/conf/all/rp_filter
3.4.配置web服务
[root@server2 ~]# cat /var/www/html/index.html
server2
RealServer: server3
server3的配置与2相同,
测试: 需要在客户端上进行
root@xiaoqin ~]# curl 172.25.24.100
server2
[root@xiaoqin ~]# curl 172.25.24.100
server3
[root@xiaoqin ~]# curl 172.25.24.100
server2
[root@xiaoqin ~]# curl 172.25.24.100
server3
[root@xiaoqin ~]# curl 172.25.24.100
server2
[root@xiaoqin ~]# curl 172.25.24.100
server3
[root@xiaoqin ~]# curl 172.25.24.100
server2
[root@xiaoqin ~]# curl 172.25.24.100
server3
LVS 的负载调度算法 在内核中的连接调度算法上,IPVS 已实现了以下八种调度算法:
一
轮叫调度(RoundRobin Scheduling )
轮叫调度(Round Robin Scheduling)算法就是以轮叫的方式依次将请求调度不同的服务器,
即每次调度执行 i = (i + 1) mod n,并选出第 i 台服务器。算法的优点是其简洁性,它无需记录
当前所有连接的状态,所以它是一种无状态调度。
二
加权轮叫调度(Weighted RoundRobin Scheduling )
加权轮叫调度 (Weighted RoundRobin Scheduling)算法可以解决服务器间性能不一的情况,
它用相应的权值表示服务器的处理性能,服务器的缺省权值为 1。假设服务器 A 的权值为
1,B 的 权值为 2,则表示服务器 B 的处理性能是 A 的两倍。加权轮叫调度算法是按权值的高
低和轮叫方式分配请求到各服务器。权值高的服务器先收到的连接,权值高的服 务器比权值低的服务器处理更多的连接,相同权值的服务器处理相同数目的连接数。
三
最小连接调度(LeastConnection Scheduling )
最小连接调度(Least Connection Scheduling)算法是把新的连接请求分配到当前连接数最小
的服务器。最小连接调度是一种动态调度算法,它通过服务器当前所活跃的连接数来估计服
务 器的负载情况。调度器需要记录各个服务器已建立连接的数目,当一个请求被调度到某台
服务器,其连接数加 1;当连接中止或超时,其连接数减一。
四
加权最小连接调度(Weighted LeastConnection Scheduling)
加权最小连接调 度(Weighted LeastConnection Scheduling)算法是最小连接调度的超集,各
个服务器用相应的权值表示其处理性能。服务器的缺省权值为 1,系统管理员可以动态地设
置服务器的权 值。加权最小连接调度在调度新连接时尽可能使服务器的已建立连接数和其权
值成比例。
五
基于局部性的最少链接(LocalityBased Least Connections Scheduling )
基 于局部性的最少链接调度(LocalityBased Least Connections Scheduling,以下简称为
LBLC)算法是针对请求报文的目标 IP 地址的负载均衡调度,目前主要用于 Cache 集群系统,
因为在 Cache 集群中 客户请求报文的目标 IP 地址是变化的。这里假设任何后端服务器都可以
处理任一请求,算法的设计目标是在服务器的负载基本平衡情况下,将相同目标 IP 地址的 请
求调度到同一台服务器,来提高各台服务器的访问局部性和主存 Cache 命中率,从而整个集
群系统的处理能力。LBLC 调度算法先根据请求的目标 IP 地址 找出该目标 IP 地址最近使用的
服务器,若该服务器是可用的且没有超载,将请求发送到该服务器;若服务器不存在,或者
该服务器超载且有服务器处于其一半的工 作负载,则用 “ 最少链接 ” 的原则选出一个可用的服
务器,将请求发送到该服务器。
六
带复制的基于局部性最少链接(LocalityBased Least Connections with Replication
Scheduling)
带 复制的基于局部性最少链接调度(LocalityBased Least Connections with Replication
Scheduling,以下简称为 LBLCR)算法也是针对目标 IP 地址的负载均衡,目前主要用于 Cache
集群系统。它与 LBLC 算法的不同之处是它要 维护从一个目标 IP 地址到一组服务器的映射,
而 LBLC 算法维护从一个目标 IP 地址到一台服务器的映射。对于一个 “ 热门 ” 站点的服务请
求,一台 Cache 服务器可能会忙不过来处理这些请求。这时,LBLC 调度算法会从所有的
Cache 服务器中按 “ 最小连接 ” 原则选出一台 Cache 服务器,映射该 “ 热门 ” 站 点到这台 Cache 服
务器,很快这台 Cache 服务器也会超载,就会重复上述过程选出新的 Cache 服务器。这样,可
能会导致该 “ 热门 ” 站点的映像会出现 在所有的 Cache 服务器上,降低了 Cache 服务器的使用
效率。LBLCR 调度算法将 “ 热门 ” 站点映射到一组 Cache 服务器(服务器集合),当该 “ 热
门 ” 站点的请求负载增加时,会增加集合里的 Cache 服务器,来处理不断增长的负载;当
该 “ 热门 ” 站点的请求负载降低时,会减少集合里的 Cache 服务器 数目。这样,该 “ 热门 ” 站点
的映像不太可能出现在所有的 Cache 服务器上,从而提供 Cache 集群系统的使用效率。
LBLCR 算法先根据请求的目标 IP 地址找出该目标 IP 地址对应的服务器组;按 “ 最小连接 ” 原
则从该服务器组中选出一台服务器,若服务器没有超载,将请求发送到该服务器;若服务器
超载;则按 “ 最小连接 ” 原则从整个集群中选出一台服务器,将该服务器加入到服务器组中,
将请求发送到该服务器。同时,当该服务器组有一段时间没有被修改,将最忙的服 务器从服
务器组中删除,以降低复制的程度。
七
目标地址散列调度(Destination Hashing Scheduling )
目标地址散列调度 (Destination Hashing Scheduling)算法也是针对目标 IP 地址的负载均衡,但它是一种静态映射算法,通过一个散列(Hash)函数将一个目标 IP 地址映射到一台服务
器。目标地址散列调度算法先根据请求的目标 IP 地址,作为散列键(Hash Key)从静态分配
的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则
返回空。
八
源地址散列调度(Source Hashing Scheduling)
源地址散列调度(Source Hashing Scheduling)算法正好与目标地址散列调度算法相反,它根
据请求的源 IP 地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该
服务器是可用的且未超载,将请求发送到该服务器,否则返回空。它采用的散列函数与目标
地址散列调度算法 的相同。它的算法流程与目标地址散列调度算法的基本相似,除了将请求
的目标 IP 地址换成请求的源 IP 地址,所以这里不一一叙述。在实际应用中,源地址散列 调
度和目标地址