相比於nginx只能用於7層負載均衡,lvs就比較強大了,能在4層做負載均衡。而且效能和穩定性上lvs也比較佔優,畢竟是合入核心模組,不穩定肯定不行。
lvs通過工作於核心的ipvs模組來實現功能,其主要工作於netfilter的input鏈上。除此之外,還需要乙個使用者態工具,ipvdadm,用於使用者負載集群定義和集群服務管理。
lvs dr模式的流程大概如下:
1、客戶端傳送請求至vip,也就是訪問服務,請求報文源位址是cip,目標位址為vip;
2、lvs排程器接收到請求,報文在prerouting鏈檢查,確定目的ip是本機,於是將報文傳送至input鏈,ipvs核心模組確定請求的服務是我們配置的lvs集群服務,然後根據使用者設定的均衡策略選擇某台後端rs,並將目標mac位址修改rip的mac位址。因為排程器和後端伺服器rs在同個網段,因此直接二層互通,將請求發給選擇的rs處理;
3、因為報文目的mac是本機,且rs上有配置vip,因此rs能接收該報文。後端服務處理完請求後,將響應直接發往客戶端,此時源ip位址為vip,目標ip為cip。
如下,準備三颱伺服器,
機器 作用
192.168.0.100 vip,lvs排程器對外服務ip
192.168.0.200 rip,後端web伺服器之一
192.168.0.300 rip,後端web伺服器之二
上面我們說過lvs依賴於ipvs核心模組,和ipvsadm使用者態工具。因為centos 7已經預設載入ipvs模組,因此這一步我們不需要配置。我們只需要安裝ipvsadm工具即可,
yum install -y ipvsadm
然後在lvs排程器上配置vip,這裡我們採用虛擬網絡卡,當然也可以使用獨立網絡卡配置,
ifconfig eth0:0 192.168.0.100/24 up
接著配置lvs集群服務,
[root@centos-7-2 ~]# ipvsadm -c
[root@centos-7-2 ~]# ipvsadm -a -t 192.168.0.100:80 -s rr
[root@centos-7-2 ~]# ipvsadm -a -t 192.168.0.100:80 -r 192.168.0.200:80 -g
[root@centos-7-2 ~]# ipvsadm -a -t 192.168.0.100:80 -r 192.168.0.300:80 -g
其中,第一條命令是清空所有規則;
第二條命令是定義lvs服務,並指定負責均衡策略為rr,即輪詢;
第三、四條命令各新增一台後端web伺服器,作為負載均衡節點,並指定為dr模式。
ipvsadm基本命令引數如下:
-a 指定新增的lvs負載均衡虛擬服務
-t 指定虛擬伺服器的ip位址和埠
-a 在對應的vip下新增rs節點
-g 指定lvs的工作模式為dr模式
-l 指定lvs的工作模式為tunnel模式
-m 指定lvs的工作模式為nat模式
新增完後端rs,我們可以檢視此lvs對應的均衡規則,
[root@centos-7-2 ~]# ipvsadm -ln
ip virtual server version 1.2.1 (size=4096)
prot localaddress:port scheduler flags
-> remoteaddress:port forward weight activeconn inactconn
tcp 192.168.0.100:80 rr
-> 192.168.0.200:80 route 1 0 0
-> 192.168.0.300:80 route 1 0 0
這裡web伺服器使用nginx搭建,因此在兩台rs上安裝nginx,
yum install -y nginx
同時為了後面測試,我們修改web伺服器的index.html內容,
[root@192_168_0_200 ~]# cat /usr/share/nginx/html/index.html
this is 192.168.0.200
[root@192_168_0_300 ~]# cat /usr/share/nginx/html/index.html
this is 192.168.0.300
接著開始進行lvs相關配置,
首先將vip配置在lo介面上,(注意掩碼要配置成32位,不然rs通訊會出問題)
ifconfig lo:0 192.168.0.100/32 up
接著配置對應路由,
route add -host 192.168.0.100 dev lo
然後設定相關系統引數,
echo 1 > /proc/sys/net/ipv4/conf/eth0/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/eth0/arp_announce
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
其實嚴格意義上只要配置出口網絡卡的對應引數就可以了,配置all也只是為了保險而已,文章最後面會有說明。
使用curl命令對vip進行訪問,
[root@centos-7-3 /home]# curl
this is 192.168.0.200
[root@centos-7-3 /home]# curl
this is 192.168.0.300
[root@centos-7-3 /home]# curl
this is 192.168.0.200
[root@centos-7-3 /home]# curl
this is 192.168.0.300
可見結果符合我們設定的輪詢策略。
因為當排程器把請求**給對應rs時,並沒有修改報文目的ip,因此請求報文目的ip仍為vip,所以如果rs沒有配置vip,那麼報文到達rs後就會被丟棄。
arp_ignore=1:只響應目的ip位址為接收網絡卡上的本地位址的arp請求
因為我們在rs上都配置了vip,因此此時是存在ip衝突的,當外部客戶端向vip發起請求時,會先傳送arp請求,此時排程器和rs都會響應這個請求。如果某個rs響應了這個請求,則之後該客戶端的請求就都發往該rs,並沒有經過lvs,因此也就沒有真正的負載均衡,lvs也就沒有存在的意義。因此我們需要設定rs不響應對vip的arp請求,這樣外部客戶端的所有對vip的arp請求才會都解析到排程器上,然後經由lvs的排程器發往各個rs。
系統預設arp_ignore=0,表示響應任意網絡卡上接收到的對本機ip位址的arp請求(包括環迴網絡卡上的位址),而不管該目的ip是否在接收網絡卡上。也就是說,如果機器上有兩個網絡卡裝置a和b,即使在a網絡卡上收到對b ip的arp請求,也會回應。而arp_ignore設定成1,則不會對b ip的arp請求進行回應。由於lo肯定不會對外通訊,所以如果只有乙個對外網口,其實只要設定這個對外網口即可,不過為了保險,很多時候都對all也進行設定。
arp_announce=2:網絡卡在傳送arp請求時使用出口網絡卡ip作為源ip
當rs處理完請求,想要將響應發回給客戶端,此時想要獲取目的ip對應的目的mac位址,那麼就要傳送arp請求。arp請求的目的ip就是想要獲取mac位址的ip,那arp請求的源ip呢?自然而然想到的是響應報文的源ip位址,但也不是一定是這樣,arp請求的源ip是可以選擇的,而arp_announce的作用正是控制這個位址如何選擇。系統預設arp_announce=0,也就是源ip可以隨意選擇。這就會導致乙個問題,如果傳送arp請求時使用的是其他網口的ip,達到網路後,其他機器接收到這個請求就會更新這個ip的mac位址,而實際上並不該更新,因此為了避免arp表的混亂,我們需要將arp請求的源ip限制為出口網絡卡ip,因此需要設定arp_announce=2。
由上可知,只要rs上的vip不響應arp請求就可以了,因此不一定要配置在lo上,也可以配置在其他網口。由於lo裝置不會直接接收外部請求,因此只要設定機器上的出口網絡卡不響應非本網絡卡上的arp請求介面。但是如果vip配置在其他網口上,除了上面的配置,還需要配置該網口不響應任何arp請求,也就是arp_ignore要設定為8。
這是由於lo裝置的特殊性導致, 如果lo繫結192.168.0.200/24,則該裝置會響應該網段所有ip(192.168.0.1~192.168.0.254) 的請求,而不是只響應192.168.0.200這乙個位址。
根據dr模式的原理,排程器只修改請求報文的目的mac,也就是**是在二層進行,因此排程器和rs需要在同乙個網段,從而ip_forward也不需要開啟。
LVS DR負載均衡 02
lb及其rs配置 3.1 負載均衡器配置配置 停止路由 功能 root lvs01 linux sysctl w net.ipv4.ip forward 0 net.ipv4.ip forward 0 root lvs01 linux sysctl w net.ipv4.conf.all.send ...
lvs dr模型負載均衡
下面再說lvs dr,後端的服務php和資料庫服務完全不用改變,只需改變網路模型即可 搭建網路環境 director eno16777736 0網絡卡別名 vip 172.18.11.7 ifconfig eno16777736 0 172.18.11.7 netmask 255.255.255.2...
Linux負載均衡軟體LVS DR模式的簡單示例
本文乙個簡單的示例演示lvs的配置 dr模式 和測試。使用的配置環境如下 director server 192.168.8.4 real server1 192.168.8.5 real server2 192.168.8.6 vip 192.168.8.200 網路topology圖如下 圖2中...