LVS是Linux Virtual Server的簡寫,意思是Linux虛擬服務器,它工作在input鏈上,當客戶端發送的請求到達input鏈上以後,通過LVS的驗證若是關於lvs的請求就會在此鏈上直接修改目標地址,而後通過postrouting鏈傳送給其定義的服務器,LVS和iptables不能同時使用。
一、LVS的原理
1、NET的基本原理
把從客戶端發來的IP包的IP頭目的地址在DR上換成其中一臺RS(real server)的IP地址併發至此RS,而RS則在處理完成後把數據經過DR主機發回給客戶端,DR在這個時候再把數據包的源IP地址轉換爲DR接口上的IP地址即可,期間,無論是進來的數據還是出去的數據都必須經過DR。如下圖所示:
LVS/NET 模型
2、DR的基本原理:
1)LVS調度器收到目標地址爲VIP的請求包後,將MAC地址改成RS的MAC地址,並通過交換機(鏈路層)發給RS
2)RS的鏈路層收到請求後,往上傳給IP層。IP層需要驗證請求的目標IP地址。所以RS需要配置一個VIP的loopback(以下簡稱爲lo,意爲環回接口)device。這樣RS的IP層收到報文後,會往上遞交給傳輸層,之所以配置成lo,是因爲lo對外不可見,不會跟LVS的VIP起衝突。
3)RS處理完成後,將應答包直接返回給客戶端。若是公網服務器,則RS需要連接在互聯網(公網IP或網關)才能將應答包返回。如下圖所示:
LVS/DR 模型
3、TUN的基本原理
TUN模式使用網絡分層的原理,把從客戶端發來的數據包基礎上,封裝一個新的IP頭標記(不完整的IP頭,只有目的IP部)發給RS,RS收到後先把DR發過來的數據包頭給解開,還原其數據包原樣,處理後,直接返回給客戶端,而不需要再經過DR。需要注意的是由於RS需要對DR發過來的數據包進行還原,也就是說必須支持IP TUNNEL協議,所以在RS的內核中,必須編譯支持IP TUNNEL這個選項。
二、LVS的類型有哪些?它們各有什麼特點?
1)NAT:地址轉換(類似DNAT)
集羣節點跟director必須在同一個網絡IP
RIP通常是私有地址,僅用於各集羣節點間的通信
director位於client和realserver之間,並負責處理進出的所有通信
realserver必須將網關指向DIP
支持端口映射
realserver可以使用任意OS
較大規模應用場景中,director易成爲系統瓶頸
2)DR:直接路由(只處理請求報文)
集羣節點跟director必須在同一個物理網絡中
RIP可以使用公網地址,實現便捷的遠程管理和監控
director僅負責處理入站請求,響應報文則由realserver直接發往客戶端;
realserver不能將網關指向DIR
不支持端口映射;
3)TUN:(隧道)
集羣節點可以跨越互聯網(Internet);
RIP必須是公網地址;
director僅負責入站請求,響應報文則由realserver直接發往客戶端;
只有支持隧道功能的OS才能用於realserver;
不支持端口映射;
三、LVS調度算法
1、固定調度
四種靜態的調度方法
rr:Round Robin,輪叫,輪詢
wrr:Weight Round Robin,加權,考慮服務器本身權重的意義
sh:source hash,源地址hash,只要是來自於同一個客戶
dh(Destination Hashing):目標地址散列,將相同的的請求發送給同一個IP
2、動態調度
六種動態調度方法:
1)lc:Least Connections,最少連接
active*256+inactive (誰的小,挑誰)
2)wlc:Weighted Least Connections,加權最少連接
(active*256+inactive)/weight
3)sed:最短期望延遲
(active+1)*256/weight
4)nq:never queue 永不排隊
5)lblc:Locality-Based Least Connections,基於本地的最少連接
6(lblcr:Locality-Based Least Connections with Replication,基於本地的帶複製功能的最少連接
默認方法(最理想的方法):wlc
四、管理集羣服務的命令行工具ipvsadm
1、ipvsadm的幾個重要功能:
1)管理集羣服務
添加:-A -t|u|f service-address [-s scheduler]
-t:TCP協議的集羣
-u:UDP協議的集羣
service-address: IP:PORT
-f:FWM,防火牆標記
service-address: Mark Number
修改:-E
刪除:-D -t|u|f service-address
eg:#ipvsadm -A -t 172.16.66.1:80 -s rr
2)管理集羣服務中的RS
添加:-a -t|u|f service-address -r server-address [-g|i|m] [-w weight]
-t|u|f service-address:事先定義好的某集羣服務
-r server-address:某RS的地址,在NAT模型中,可使用IP:PORT實現端口映射
[-g|i|m]:LVS類型(若不指定則默認爲DR)
-g:DR 表示DR模型
-i:TUN 能夠跨越互聯網的
-m:NAT 地址僞裝
[-w weight]:定義服務器權重
修改:-e
刪除:-d -t|u|f service-address -r server-address 指定從哪個集羣服務中刪除那個用戶
eg:# ipvsadm -a -t 172.16.100.1:80 -r 192.168.10.8 -m
eg:# ipvsadm -a -t 172.16.100.1:80 -r 192.168.10.9 -m
3)查看
-L|l
-n: 數字格式顯示主機地址和端口
--stats: 統計數據
--rate: 速率
--timeout: 顯示tcp、tcpfin和udp的會話超時時長
--sort: 對查看的內容進行排序,默認是升序
--daemon:
-c: 顯示當前的ipvs連接狀況
4)刪除所有集羣服務
-C:清空ipvs規則
5)保存規則
-S
#ipvsadm -s > /path/to/somefile
6)載入此前的規則
-R
#ipvsadm -R < /path/form/somefile
五、LVS-NET的實現過程
1、首先規劃好IP
Director Server(以下簡稱DR)DIP:192.168.66.1 VIP:172.16.66.2
Real Server 1 (以下簡稱RS1) DIP:192.168.66.2
Real Server 2 (以下簡稱RS2) DIP:192.168.66.3
2、配置RS1、RS2服務器
1)RS1服務器的配置過程:
RS1的IP配置爲:192.168.66.2 網關是:192.168.66.1
wget ftp://172.16.0.1/pub/gls/server.repo -O /etc/yum.repos.d/server.repo
yum install httpd –y 安裝web服務
提供相應的網頁頁面並啓動web服務:
RS1的IP配置爲:192.168.66.3 網關是:192.168.66.1
wget ftp://172.16.0.1/pub/gls/server.repo -O /etc/yum.repos.d/server.repo
yum install httpd –y 安裝web服務
提供相應的網頁頁面並啓動web服務:
3、配置Director服務器
1)在Director服務器上再要添加一塊網卡eth1,其IP爲DIP:192.168.66.1 則eth0爲VIP,其IP爲172.16.66.2(提醒:eth1網卡的連接方式是Host-only,RS1、RS2的網卡連接方式也是Host-only)
wget ftp://172.16.0.1/pub/gls/server.repo -O /etc/yum.repos.d/server.repo
2)同步時間
3)安裝、啓動ipvsadm並測試web服務是否能訪問
yum install ipvsadm –y 安裝ipvsadm
service ipvsadm start 啓動ipvsadm
4)添加集羣服務
(-m以nat模式運作)
5)ipvsadm –L –n ipvsadm規則查看
在物理主機上 訪問172.16.66.2 刷新幾次再執行ipvsadm –L –n命令就會發現InActConn比例接近1:1
六、LVS-DR的實現過程
1、首先劃分好IP
Director:eth0,DIP:172.16.66.2 eth0:0,VIP:172.16.66.1
RS1: Eth0,RIP:172.16.66.7 lo:0,VIP:172.16.66.1
RS2: Eth0,RIP:172.16.66.8 lo:0,VIP:172.16.66.1
2、Director的IP、網卡配置過程
ifdown eth1 down Director的eth1斷開連接
vim /etc/sysconfig/network-scrips/ifcfg-eth1 編輯文件內容修改如下:
service network restart 重啓網絡服務器
ifconfig eth0:0 172.16.66.1/16 爲eth0配置一個別名
ifconfig 查看別名是否設置成功
把網卡的連接方式改爲橋接,以下RS1、RS2的網卡也改成橋接,因爲服務器間要在同一臺交換機上
3、RS1、RS2的配置過程
1)RS1服務器的IP配置
vim /etc/sysconfig/network-scripts/ifcfg-eth0 設置IP和網關
service network restart 重啓網絡服務器
2)RS2服務器的IP配置
vim /etc/sysconfig/network-scripts/ifcfg-eth0 設置IP和網關
service network restart 重啓網絡服務器
測試能否ping通RS1和Director服務器
3)RS1服務的配置
cd /proc/sys/net/ipv4/conf/
(小知識補充:還可以用另外一種命令實現上述命令的執行過程
sysctl -w net.ipv4.conf.eth0.arp_announce=2
sysctl -w net.ipv4.conf.all.arp_announce=2 )
ifconfig lo:0 172.16.66.1/16 配置VIP
在物理主機上ping 172.16.66.1看看是否能ping通
Ping通後 可執行 arp -a 命令查看哪一個IP響應了
ifconfig lo:0 down 關閉VIP
ifconfig lo:0 172.16.66.1 broadcast 172.16.66.1 netmask 255.255.255.255 up (broadcast爲廣播地址,255.255.255.255意味着只跟自己在同一個網段內,全是網絡地址)
route add -host 172.16.66.1 dev lo:0 添加路由
4)RS2服務的配置
配置RS2的VIP並啓用
在物理主機上ping172.16.66.1 查看是否能ping通, 然後執行arp –a查看響應狀態
ifconfig lo:0 down 關閉VIP
ifconfig lo:0 172.16.66.1 netmask 255.255.255.255 broadcast 172.16.66.1 up
(broadcast爲廣播地址,255.255.255.255意味着只跟自己在同一個網段內,全是網絡地址)
ifconfig
route add -host 172.16.66.1 dev lo:0 添加路由
4、Directory服務的配置過程
1)添加路由並訪問web服務
2)設置ipvsadm
3)打開瀏覽器訪問一下 172.16.66.1 刷新出現兩次RS1,一次RS2
ipvsadm -L -n (刷新查看一下權重比例爲1:2)
這就是DR模型的LVS
小知識點:
arp_ignore:定義接收到ARP請求時的響應級別;
0:只要本地配置有相應的地址,就給予響應
1:僅在請求的目標地址配置請求到達的接口上的時候,纔給予響應
arp_announce:定義將自己地址向外通告時的通告級別
0:將本地任何接口上的任何地址向外通告
1:試圖僅向目標網絡通告與其網絡匹配的地址;
2:僅向與本地接口上的地址匹配的網絡進行通告