前言:
在做這個實驗之前,總覺得高可用負載均衡很高大上,很難理解。隨性我自己也去試試,後來發現真的是這樣!或許因爲我是新手,所以實驗多以失敗告終。加上自己的虛擬機環境很噁心,經常故障,不過最後還是簡單地搭建了一個LVS。以下內容是我總結了大多個博文而來,文後注有博文來源。
LVS是Linux Virtual Server的簡稱,也就是Linux虛擬服務器, 是一個由章文嵩博士發起的自由軟件項目,它的官方站點是www.linuxvirtualserver.org。現在LVS已經是 Linux標準內核的一部分,在Linux2.4內核以前,使用LVS時必須要重新編譯內核以支持LVS功能模塊,但是從Linux2.4內核以後,已經完全內置了LVS的各個功能模塊,無需給內核打任何補丁,可以直接使用LVS提供的各種功能。
LVS的作用
LVS主要用於服務器集羣的負載均衡。它工作在網絡層,可以實現高性能,高可用的服務器集羣技術。它廉價,可把許多低性能的服務器組合在一起形成一個超級服務器。它易用,配置非常簡單,且有多種負載均衡的方法。它穩定可靠,即使在集羣的服務器中某臺服務器無法正常工作,也不影響整體效果。另外可擴展性也非常好。
LVS自從1998年開始,發展到現在已經是一個比較成熟的技術項目了。可以利用LVS技術實現高可伸縮的、高可用的網絡服務,例如WWW服務、Cache服務、DNS服務、FTP服務、MAIL服務、視頻/音頻點播服務等等,有許多比較著名網站和組織都在使用LVS架設的集羣系統,例如:Linux的門戶網站(www.linux.com)、向RealPlayer提供音頻視頻服務而聞名的Real公司(www.real.com)、全球最大的開源網站(sourceforge.net)等。
2.3LVS的體系結構
使用LVS架設的服務器集羣系統有三個部分組成:
(1)最前端的負載均衡層,用Load Balancer表示;
(2)中間的服務器集羣層,用Server Array表示;
(3)最底端的數據共享存儲層,用Shared Storage表示;
在用戶看來,所有的內部應用都是透明的,用戶只是在使用一個虛擬服務器提供的高性能服務。
IPVS實現負載均衡機制有三種,分別是NAT、TUN和DR,詳述如下:
VS/NAT:即(Virtual Server viaNetwork Address Translation)
也就是網絡地址翻譯技術實現虛擬服務器,當用戶請求到達調度器時,調度器將請求報文的目標地址(即虛擬IP地址)改寫成選定的Real Server地址,同時報文的目標端口也改成選定的Real Server的相應端口,最後將報文請求發送到選定的Real Server。在服務器端得到數據後,Real Server返回數據給用戶時,需要再次經過負載調度器將報文的源地址和源端口改成虛擬IP地址和相應端口,然後把數據發送給用戶,完成整個負載調度過程。
可以看出,在NAT方式下,用戶請求和響應報文都必須經過DirectorServer地址重寫,當用戶請求越來越多時,調度器的處理能力將稱爲瓶頸。
VS/TUN :即(Virtual Server via IP Tunneling)
也就是IP隧道技術實現虛擬服務器。它的連接調度和管理與VS/NAT方式一樣,只是它的報文轉發方法不同,VS/TUN方式中,調度器採用IP隧道技術將用戶請求轉發到某個Real Server,而這個Real Server將直接響應用戶的請求,不再經過前端調度器,此外,對Real Server的地域位置沒有要求,可以和DirectorServer位於同一個網段,也可以是獨立的一個網絡。因此,在TUN方式中,調度器將只處理用戶的報文請求,集羣系統的吞吐量大大提高。
VS/DR:即(Virtual Server viaDirect Routing)
也就是用直接路由技術實現虛擬服務器。它的連接調度和管理與VS/NAT和VS/TUN中的一樣,但它的報文轉發方法又有不同,VS/DR通過改寫請求報文的MAC地址,將請求發送到Real Server,而Real Server將響應直接返回給客戶,免去了VS/TUN中的IP隧道開銷。這種方式是三種負載調度機制中性能最高最好的,但是必須要求DirectorServer與Real Server都有一塊網卡連在同一物理網段上。
配置實例:LVS DR模型詳解
DR模型的特點:
1.director必須與realserver位於同一個網絡。
2.realserver可以使用公網ip地址,便於遠程管理與配置。
3.director只負責處理入站請求。而響應報文則由realserver直接返回給client端。大大節省director的資源
4.不能做端口映射
整個工作原理如下:
客戶端通過路由器將請求交給director的VIP。director接收請求,將通過相應的算法將請求轉發給相應的realserver。在轉發的過程中,會修改請求包的目的mac地址,目的ip地址不變。realserver接收請求,並直接響應客戶端。這時,便出現一個問題:director此時與 realserver位於同一個網絡中,當director直接將請求轉發給realserver時,realserver檢測到該請求包的目的ip是 vip而並非自己,便會丟棄,而不會響應。。爲了解決這個問題,我們需要在所有realserver上都配上VIP。這時會出現第二個問題:director與realserver位於同一個網絡中,當出現多個vip時,通過arp廣播,整個網絡必然混亂,我們無法保證客戶端的請求一定會發往director。爲保證當客戶端請求抵達網絡時,只有director來響應請求。我們需要realserver忽略對vip的arp請求,並且在 arp通告時,不通告vip地址。我們需要配置如下兩個內核參數:
arp_ignore :
當一臺主機某個接口接收到arp請求時,這臺機上的ip地址是否通過該接口響應給對應請求的限制級別。簡單來說,當這臺主機有多塊網卡,或者有多個ip地址時,是否通過該接口將所有ip地址響應給對應的請求。
0:不作任何限制。將所有本機的ip地址都響應給對應請求。
1:當請求的ip就配置在本接口上時,才予以響應。換句話說,就是隻響應當前接口的ip地址。
arp_announce:
當一臺主機加入到一個新的網絡。會發出ARP通告,向網絡中其他主機通告自己的ip地址及mac等信息。arp_anounce就用來限制通告的級別。當這臺主機有多塊網卡或者多個ip地址時,是否通過某一個接口將所有ip地址通告給該網絡中的主機。
0:不作任何限制。從任意接口通告所有ip地址。
1:儘可能避免通告非本接口上的ip。
2:只通知本接口的ip。非本接口的ip不予通告。
由此我們亦可知,在realserver上配置vip時顯然也不能配置的物理接口的虛接口上,而應該配置在loopback上。
在做實驗之前先連接ipvsadm的用法
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 persistentgranularity 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 指定組%B
配置示例:
1)實驗環境
lvs負載調度器:eth0:172.16.16.173/24,VIP eth0:0172.16.16.172
web服務器池:節點1-節點2:172.16.16.177-178/24
2)配置負載調度器
a.配置虛擬IP地址(VIP)
ifconfig eth0:0 172.16.16.172 broadcast 172.16.16.172 netmask 255.255.255.0 up #在eth0上配置並啓動VIP
route add -host 172.16.16.172 dev eth0:0 #特殊路由,當客戶端請求的ip爲vip時,則由eth0:0響應。
b.調整/proc響應參數
echo 1 > /proc/sys/net/ipv4/ip_forward #開啓路由轉發
echo 0 >/proc/sys/net/ipv4/conf/all/send_redirects
echo 0 >/proc/sys/net/ipv4/conf/default/send_redirects
echo 0 >/proc/sys/net/ipv4/conf/eth0/send_redirects
send_redirects:icmp發送重定向。經查閱相關資料,開啓此選項有一定的危險性,容易被人僞造icmp重定向包發起***。若當前director並非充當路由或網關,建議關閉。默認爲開啓,0爲關閉。
c.配置負載分配策略
service ipvsadm stop
ipvsadm -A -t 172.16.16.172:80 -s wlc
ipvsadm -a -t 172.16.16.172:80 -r 172.16.16.177 -g -w 1
ipvsadm -a -t 172.16.16.172:80 -r 172.16.16.178 -g -w 1
# -g DR模式 -m NAT模式 -i IPtun模式
service ipvsadm save
chkconfig ipvsadm on
3)配置節點服務器
a.配置虛擬IP地址
ifconfig lo:0 172.16.16.172 broadcast 172.16.16.172 netmask 255.255.255.255 up
/sbin/route add -host 172.16.16.172 dev lo:0
b.調整/proc響應參數
echo 1 >/proc/sys/net/ipv4/conf/all/arp_ignore
echo 2 >/proc/sys/net/ipv4/conf/all/arp_announce
echo 1 >/proc/sys/net/ipv4/conf/default/arp_ignore
echo 2 >/proc/sys/net/ipv4/conf/default/arp_announce
echo 1 >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo 2 >/proc/sys/net/ipv4/conf/lo/arp_announce
此幾項配置即是用於限制arp請求及arp通告
c.安裝httpd,進行測試。
用客戶端訪問VIP:172.16.16.172,就會看到真實服務器172.16.16.178提供的web服務,刷新以下就看到另一個服務器的web服務了,調度算法默認是輪循。
參考博文:
王晨純,《Web基礎架構:負載均衡和LVS》:http://www.importnew.com/11229.html
http://dengaosky.blog.51cto.com/9215128/1852537
http://ixdba.blog.51cto.com/2895551/552947