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 地址和端口的數字形式
使用VS/TUN方法:
VS/TUN的連接調度和管理與VS/NAT中的一樣,只是它的報文轉發方法不同。調度器根據各個服務器的負載情況,動態地選擇一臺服務器,將請求報文封裝在另一個IP報文中,再將封裝後的IP報文轉發給選出的服務器;服務器收到報文後,先將報文解封獲得原來目標地址爲VIP的報文,服務器發現VIP地址被配置在本地的IP隧道設備上,所以就處理這個請求,然後根據路由表將響應報文直接返回給客戶。
使用VS/DR方法:
調度器和服務器組都必須在物理上有一個網卡通過不分斷的局域網相連,如通過交換機或者高速的HUB相連。VIP地址爲調度器和服務器組共享,調度器配置的VIP地址是對外可見的,用於接收虛擬服務的請求報文;所有的服務器把VIP地址配置在各自的Non-ARP網絡設備上,它對外面是不可見的,只是用於處理目標地址爲VIP的網絡請求。在VS/DR中,調度器根據各個服務器的負載情況,動態地選擇一臺服務器,不修改也不封裝IP報文,而是將數據幀的MAC地址改爲選出服務器的MAC地址,再將修改後的數據幀在與服務器組的局域網上發送。因爲數據幀的MAC地址是選出的服務器,所以服務器肯定可以收到這個數據幀,從中可以獲得該IP報文。當服務器發現報文的目標地址VIP是在本地的網絡設備上,服務器處理這個報文,然後根據路由表將響應報文直接返回給客戶。
LVS-DR模型:
Director兩個地址:VIP, DIP
RS有兩個地址:VIP, RIP(RIP可是用來和DIP通信的,由Directory挑選出RealServer時將報文所對的目標MAC改 爲RIP所對應的MAC地址)
禁止RS響應對VIP的ARP廣播請求:
1、在前端路由上實現靜態MAC地址VIP的綁定;
前提:得有路由器的配置權限;
缺點:Directory故障轉時,無法更新此綁定;
2、arptables
前提:在各RS在安裝arptables程序,並編寫arptables規則
缺點:依賴於獨特功能的應用程序
3、修改Linux內核參數
前提:RS必須是Linux;
缺點:適用性差;
兩個參數:
arp_announce:定義通告模式
arp_ignore:定義收到arp請求的時響應模式
配置專用路由,以使得響應報文首先通過vip所配置的lo上的別名接口
arp_ignore:定義對目標地址爲本地IP的ARP詢問不同的應答模式0
0 - (默認值): 迴應任何網絡接口上對任何本地IP地址的arp查詢請求
1 - 只回答目標IP地址是來訪網絡接口本地地址的ARP查詢請求
2 -只回答目標IP地址是來訪網絡接口本地地址的ARP查詢請求,且來訪IP必須在該網絡接口的子網段內
3 - 不迴應該網絡界面的arp請求,而只對設置的唯一和連接地址做出迴應
4-7 - 保留未使用
8 -不迴應所有(本地地址)的arp查詢
有關arp_announce的相關介紹:
arp_announce:對網絡接口上,本地IP地址的發出的,ARP迴應,作出相應級別的限制: 確定不同程度的限制,宣佈對來自本地源IP地址發出Arp請求的接口
0 - (默認) 在任意網絡接口(eth0,eth1,lo)上的任何本地地址
1 -儘量避免不在該網絡接口子網段的本地地址做出arp迴應. 當發起ARP請求的源IP地址是被設置應該經由路由達到此網絡接口的時候很有用.此時會檢查來訪IP是否爲所有接口上的子網段內ip之一.如果改來訪IP不屬於各個網絡接口上的子網段內,那麼將採用級別2的方式來進行處理.
2 - 對查詢目標使用最適當的本地地址.在此模式下將忽略這個IP數據包的源地址並嘗試選擇與能與該地址通信的本地地址.首要是選擇所有的網絡接口的子網中外出訪問子網中包含該目標IP地址的本地地址. 如果沒有合適的地址被發現,將選擇當前的發送網絡接口或其他的有可能接受到該ARP迴應的網絡接口來進行發送.
關於對arp_announce 理解的一點補充
其實就是路由器的問題,因爲路由器一般是動態學習ARP包的(一般動態配置DHCP的話),當內網的機器要發送一個到外部的ip包,那麼它就會請求 路由器的Mac地址,發送一個arp請求,這個arp請求裏面包括了自己的ip地址和Mac地址,而linux默認是使用ip的源ip地址作爲arp裏面 的源ip地址,而不是使用發送設備上面的 ,這樣在lvs這樣的架構下,所有發送包都是同一個VIP地址,那麼arp請求就會包括VIP地址和設備 Mac,而路由器收到這個arp請求就會更新自己的arp緩存,這樣就會造成ip欺騙了,VIP被搶奪,所以就會有問題。
arp緩存爲什麼會更新了,什麼時候會更新呢,爲了減少arp請求的次數,當主機接收到詢問自己的arp請求的時候,就會把源ip和源Mac放入自 己的arp表裏面,方便接下來的通訊。如果收到不是詢問自己的包(arp是廣播的,所有人都收到),就會丟掉,這樣不會造成arp表裏面無用數據太多導致 有用的記錄被刪除。
在設置參數的時候將arp_ignore 設置爲1,意味着當別人的arp請求過來的時候,如果接收的設備上面沒有這個ip,就不做出響應,默認是0,只要這臺機器上面任何一個設備上面有這個ip,就響應arp請求,併發送mac地址
1)vip(virtual ip)。直接路由模式的vip必須跟服務器對外提供服務的ip地址在同一個網段,並且lvs 負載均衡器和其他所有提供相同功能的服務器都使用這個vip;
2)vip被綁定在環回接口lo0:0上,其廣播地址是其本身,子網掩碼是255.255.255.255。這與標準的網絡地址設置有很大的不同。採用這種可變長掩碼方式把網段劃分成只含一個主機地址的目的是避免ip地址衝突;
3)echo這段的作用是抑制arp廣播。如果不做arp抑制,將會有衆多的機器向其他宣稱:“嗨!我是奧巴馬,我在這裏呢!”,這樣就亂套了。
LVS-DR模型的實現過程:
1.首先規劃集羣和網路環境,需要三臺虛擬機,如下圖所示:
此時Director可以只有一個網卡Eth0,連接類型爲橋接(Birdged),RealServer1和RealServer2 的網卡連接類型也都爲橋接(Birdged):
在realserve1服務器上進行配置:
# echo 1 > /proc/sys/net/ipv4/conf/eth0/arp_ignore
# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
# echo 2 > /proc/sys/net/ipv4/conf/eth0/arp_announce
# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
#ifconfig lo:0 172.16.24.7 broadcast 172.16.24.7 netmask 255.255.255.255 up
#route add -host 172.16.24.7 dev lo:0
在realserve2服務器上進行配置:
# echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
# echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
#ifconfig lo:0 172.16.24.7 broadcast 172.16.24.7 netmask 255.255.255.255 up
#route add -host 172.16.24.7 dev lo:0
在Director服務器上配置:
#ifconfig eth0:0 172.16.24.7 broadcast 172.16.24.7 netmask 255.255.255.255 up
#route add -host 172.16.24.7 dev eth0:0
#echo 1 > /proc/sys/net/ipv4/ip_forward --開啓IP轉發功能
讓兩個RealServer的WEB服務啓動起來
[root@node1 ~]# rpm -q httpd
httpd-2.2.15-29.el6.centos.x86_64
如果沒有安裝則使用yum install httpd安裝即可
[root@node2 ~]# vim /var/www/html/index.html
<h1>Web1</h1>
[root@node2 ~]# service httpd start
[root@node3 ~]# vim /var/www/html/index.html
<h1>Web2</h1>
[root@node3 ~]# service httpd start
安裝ipvsadm(如果已安裝可忽略)
[root@node1 ~]#yum install ipvsadm
在Director上配置ipvsadm規則
#ipvsadm -A -t 172.16.24.7:80 -s rr -g
#ipvsadm -a -t 172.16.24.7:80 -r 172.16.24.8
#ipvsadm -a -t 172.16.24.7:80 -r 172.16.24.9
爲了保證其時效性,Hash table中“連接追蹤”信息被定義了“生存時間”。LVS爲記錄“連接超時”定義了三個計時器:
1、空閒TCP會話;
2、客戶端正常斷開連接後的TCP會話;
3、無連接的UDP數據包(記錄其兩次發送數據包的時間間隔);
上面三個計時器的默認值可以由類似下面的命令修改,其後面的值依次對應於上述的三個計時器:
# ipvsadm --set 28800 30 600
數據包在由Direcotr發往Realserver時,只有目標MAC地址發生了改變(變成了Realserver的MAC地址)。Realserver在接收到數據包後會根據本地路由表將數據包路由至本地迴環設備,接着,監聽於本地迴環設備VIP上的服務則對進來的數據庫進行相應的處理,而後將處理結果迴應至RIP,但數據包的原地址依然是VIP。
ipvs的持久連接:
無論基於什麼樣的算法,只要期望源於同一個客戶端的請求都由同一臺Realserver響應時,就需要用到持久連接。比如,某一用戶連續打開了三個telnet連接請求時,根據RR算法,其請求很可能會被分配至不同的Realserver,這通常不符合使用要求。
Persistent Client Connections(PCC),將來自於同一個客戶端發往VIP的所有請求統統定向至同一個RS,持久客戶端連接:就是不管客戶端發起什麼樣的服務(如80端口的web服務,3306端口的mysql服務)請求,都將經過Director被定位到同一個特定的real server上,只要此real server 提供了這種服務,並且會持續連接,如果客戶端連接超時,real server允許一定範圍內的
前面的配置步驟都一樣,只是在Director上配置ipvsadm規則有些不同
ipvsadm -A -t 172.16.24.7:0 -s rr -p 120
ipvsadm -a -t 172.16.24.7:0 -r 172.16.24.8 -g
ipvsadm -a -t 172.16.24.7:0 -r 172.16.24.9 -g
Persistent Port Connections(PPC),將來自於一個客戶端發往某VIP的某端口的所有請求統統定向至同一個RS,持續端口連接:就是不管客戶端發起什麼樣的端口請求(如80端口,是提供web服務的,23端口,是提供telnet服務), 都會經過 Director 將請求轉發到同一個 real server 上 , 並持續連接。假如一個客戶端請求的是 web 服務,相應的是 realserver1 ,當此用戶退出後再次發起請求 web 服務的時候, 依然是 realserver1 提供的 web 服務。
持久連接ppc的效果
前面的配置步驟都一樣,只是在Director上配置ipvsadm規則有些不同
ipvsadm -A -t 172.16.24.7:80 -s rr
ipvsadm -a -t 172.16.24.7:80 -r 172.16.24.8 -g
ipvsadm -a -t 172.16.24.7:80 -r 172.16.24.9 -g
ipvsadm -E -t 172.16.24.7:80 -s rr -p 120
PFMC: 端口綁定,port affinity基於防火牆標記,將兩個或以上的端口綁定爲同一個服務把80端口和443 端口做成一個持久防火牆標記,同時定向到同一個realserver上,即在訪問80服務的時候是realserver1,然後改爲訪問443服務的時候依然定向到realserver1上。
前面的配置步驟都一樣,只是在Director上配置ipvsadm規則有些不同
iptables -t mangle -A PREROUTING -d 172.16.24.7 -p tcp --dport 80 -j MASK --set-make 10
iptables -t mangle -A PREROUTING -d 172.16.24.7 -p tcp --dport 443 -j MASK --set-make 10
ipvsadm -A -f 10 -s rr
ipvsadm -a -f 10 -r 172.16.24.8 -g
ipvsadm -a -f 10 -r 172.16.24.9 -g
可以通過瀏覽器輸入自己定義的地址檢測一下。看看是什麼效果。