企業---LVS的工作模式之DR、ANT、TUN

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 已實現了以下八種調度算法:

輪叫調度(Round­Robin Scheduling )
輪叫調度(Round Robin Scheduling)算法就是以輪叫的方式依次將請求調度不同的服務器,
即每次調度執行 i = (i + 1) mod n,並選出第 i 臺服務器。算法的優點是其簡潔性,它無需記錄
當前所有連接的狀態,所以它是一種無狀態調度。

加權輪叫調度(Weighted Round­Robin Scheduling )
加權輪叫調度 (Weighted Round­Robin Scheduling)算法可以解決服務器間性能不一的情況,
它用相應的權值表示服務器的處理性能,服務器的缺省權值爲 1。假設服務器 A 的權值爲
1,B 的 權值爲 2,則表示服務器 B 的處理性能是 A 的兩倍。加權輪叫調度算法是按權值的高
低和輪叫方式分配請求到各服務器。權值高的服務器先收到的連接,權值高的服 務器比權值低的服務器處理更多的連接,相同權值的服務器處理相同數目的連接數。

最小連接調度(Least­Connection Scheduling )
最小連接調度(Least­ Connection Scheduling)算法是把新的連接請求分配到當前連接數最小
的服務器。最小連接調度是一種動態調度算法,它通過服務器當前所活躍的連接數來估計服
務 器的負載情況。調度器需要記錄各個服務器已建立連接的數目,當一個請求被調度到某臺
服務器,其連接數加 1;當連接中止或超時,其連接數減一。

加權最小連接調度(Weighted Least­Connection Scheduling)
加權最小連接調 度(Weighted Least­Connection Scheduling)算法是最小連接調度的超集,各
個服務器用相應的權值表示其處理性能。服務器的缺省權值爲 1,系統管理員可以動態地設
置服務器的權 值。加權最小連接調度在調度新連接時儘可能使服務器的已建立連接數和其權
值成比例。

基於局部性的最少鏈接(Locality­Based Least Connections Scheduling )
基 於局部性的最少鏈接調度(Locality­Based Least Connections Scheduling,以下簡稱爲
LBLC)算法是針對請求報文的目標 IP 地址的負載均衡調度,目前主要用於 Cache 集羣系統,
因爲在 Cache 集羣中 客戶請求報文的目標 IP 地址是變化的。這裏假設任何後端服務器都可以
處理任一請求,算法的設計目標是在服務器的負載基本平衡情況下,將相同目標 IP 地址的 請
求調度到同一臺服務器,來提高各臺服務器的訪問局部性和主存 Cache 命中率,從而整個集
羣系統的處理能力。LBLC 調度算法先根據請求的目標 IP 地址 找出該目標 IP 地址最近使用的
服務器,若該服務器是可用的且沒有超載,將請求發送到該服務器;若服務器不存在,或者
該服務器超載且有服務器處於其一半的工 作負載,則用 “ 最少鏈接 ” 的原則選出一個可用的服
務器,將請求發送到該服務器。

帶複製的基於局部性最少鏈接(Locality­Based Least Connections with Replication
Scheduling)
帶 複製的基於局部性最少鏈接調度(Locality­Based 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 地址,所以這裏不一一敘述。在實際應用中,源地址散列 調
度和目標地址

發佈了70 篇原創文章 · 獲贊 3 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章