關於lvs的更詳細的信息請參考博文“LVS集羣系統詳解”http://wangziyin.blog.51cto.com/blog/6948950/1297354
或參考lvs中文網站:http://www.linuxvirtualserver.org/zh/lvs4.html
系統環境: rhel6 x86_64 iptables and selinux disabled
yum 倉庫配置:
[rhel-source]
name=Red Hat Enterprise Linux $releasever - $basearch - Source
baseurl=ftp://192.168.122.1/pub/yum
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release
[HighAvailability]
name=Instructor Server Repository
baseurl=ftp://192.168.122.1/pub/yum/HighAvailability
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release
enabled=1
[LoadBalancer]
name=Instructor Server Repository
baseurl=ftp://192.168.122.1/pub/yum/LoadBalancer
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release
enabled=1
[ResilientStorage]
name=Instructor Server Repository
baseurl=ftp://192.168.122.1/pub/yum/ResilientStorage
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release
enabled=1
[ScalableFileSystem]
name=Instructor Server Repository
baseurl=ftp://192.168.122.1/pub/yum/ScalableFileSystem
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release
enabled=1
Load Balancer:
kernel 2.6.x 已內建 LVS 模組
kernel 2.4.x 或之前的內核版本需打補丁
rhel5 /rhel6 自帶 LVS 軟件包 安裝 ipvsadm 軟件包即可使用
VS/NAT
Load Balance 雙網卡 192.168.122.82(外網) 192.168.1.82(內網)
Gateway 192.168.1.82 (注:Realserver 的網關應設爲 Load Balance 的內網IP)
Realserver1 192.168.1.33 desk33.example.com
Realserver2 192.168.1.34 desk34.example.com
Virtual IP 192.168.122.122
以下步驟在 desk82 上實施:
#開啓路由機制
# vim /etc/sysctl.conf net.ipv4.ip_forward = 1 # sysctl -p
#加載 nat 模塊
# modprobe iptable_nat
注:如果不加載此模塊,也可以在第一次訪問時成功,但是會在再次訪問時出現延遲過長,或訪問超時 現象
yum install ipvsadm -y ipvsadm -C ipvsadm -A -t 192.168.122.82:80 -s rr ipvsadm -a -t 192.168.122.82:80 -r 192.168.1.33:80 -m ipvsadm -a -t 192.168.122.82:80 -r 192.168.1.34:80 -m #保存 rule /etc/init.d/ipvsadm save #綁定 vip # ifconfig eth0:0 192.168.122.122 netmask 255.255.255.0
以下步驟在 desk33 和 desk34上實施:
# yum install httpd -y # echo `hostname` > /var/www/html/index.html # /etc/init.d/httpd start
測試:
選擇一臺 192.168.122.0/24 網段主機訪問 http:// 192.168.122.122 反覆刷新網頁,每次出現的網頁不同 則表示成功。
VS/DR
以下是 LVS-DR 的工作原理,包括數據包、數據幀的走向和轉換過程:
官方的原理說明:Director 接收用戶的請求,然後根據負載均衡算法選取一臺realserver,將包轉發 過去,最後由 realserver 直接回復給用戶。
實例場景設備清單:
說明:我這裏爲了方便,client 是與 vip 同一網段的機器。如果是外部的用戶訪問,將 client 替換成 gateway 即可,因爲 IP 包頭是不變的,變的只是源 mac 地址。
1.client 向目標 vip 發出請求,Director 接收。此時 IP 包頭及數據幀頭信息如下:
2.VS 根據負載均衡算法選擇一臺 active 的 realserver(假設 192.168.57.122),將此 RIP 所在網 卡的 mac 地址作爲目標 mac 地址,發送到局域網裏.此時 IP 包頭及數據幀頭信息如下:
3.realserver(192.168.57.122)在局域網中收到這個幀,拆開後發現目標 IP(VIP)與本地匹配,於是 處理這個報文.隨後重新封裝報文,發送到局域網.此時 IP 包頭及數據幀頭信息如下:
4 如果 client 與 VS 同一網段,那麼 client(192.168.57.135)將收到這個回覆報文.如果跨了網段, 那麼報文通過 gateway/路由器經由 Internet 返回給用戶.
Realserver 192.168.122.33 desk33.example.com
Realserver 192.168.122.34 desk34.example.com
Load Balance 192.168.122.82 desk82.example.com
Virtual IP 192.168.122.122
以下步驟在 desk82 上實施:
# yum install ipvsadm -y #加載 rule # ipvsadm -C (清空 ipvs 轉發表 ) # ipvsadm -A -t 192.168.122.122:80 -s rr (-A:添加一個虛擬服務; -t:tcp 服務;-s 調度算法) # ipvsadm -a -t 192.168.122.122:80 -r 192.168.122.33:80 -g # ipvsadm -a -t 192.168.122.122:80 -r 192.168.122.34:80 -g #保存 rule # /etc/init.d/ipvsadm save #綁定 vip # ifconfig eth0:0 192.168.122.122 netmask 255.255.255.0
Realserver必須 屏蔽 arp緩存:
以下步驟在 desk33 上實施:
#關閉 arp 方法一 # yum install arptables_jf -y # arptables -A IN -d 192.168.122.122 -j DROP # arptables -A OUT -s 192.168.122.122 -j mangle --mangle-ip-s 192.168.122.33 # /etc/init.d/arptables_jf save 方法二 # vim /etc/sysctl.conf net.ipv4.conf.lo.arp_ignore = 1 net.ipv4.conf.lo.arp_announce = 2 net.ipv4.conf.all.arp_ignore = 1 net.ipv4.conf.all.arp_announce = 2 # sysctl -p #ifconfig eth0:0 192.168.122.122 netmask 255.255.255.255 #yum install httpd -y #echo `hostname` > /var/www/html/index.html #/etc/init.d/httpd start
以下步驟在 desk34 上實施:
#關閉 arp 方法一 # yum install arptables_jf -y # arptables -A IN -d 192.168.122.122 -j DROP # arptables -A OUT -s 192.168.122.122 -j mangle --mangle-ip-s 192.168.122.34 # /etc/init.d/arptables_jf save 方法二 # vim /etc/sysctl.conf net.ipv4.conf.lo.arp_ignore = 1 net.ipv4.conf.lo.arp_announce = 2 net.ipv4.conf.all.arp_ignore = 1 net.ipv4.conf.all.arp_announce = 2 # sysctl -p #ifconfig eth0:0 192.168.122.122 netmask 255.255.255.255 #yum install httpd -y #echo `hostname` > /var/www/html/index.html #/etc/init.d/httpd start
測試:
訪問 192.168.122.122 反覆刷新網頁,每次出現的網頁不同則表示配置成功。
VS/TUN
VS/TUN 技術對服務器有要求,即所有的服務器必須支持“IP Tunneling”或者“IPEncapsulation”協議。目前,VS/TUN 的後端服務器主要運行 Linux 操作系統。在 VS/TUN 的集羣系統中,負載調度器只將請求調度到不同的後端服務器,後端服務器將應答的數據直接返回給用戶。這樣,負載調度器就可以處理大量的請求,它甚至可以調 度百臺以上的服務器(同等規模的服務器),而它不會成爲系統的瓶頸。即使負載調度器只有 100Mbps的全雙工網卡,整個系統的最大吞吐量可超過 1Gbps。所以,VS/TUN 可以極大地增加負載調度器調度的服務器數量。VS/TUN 調度器可以調度上百臺服務器,而它本身不會成爲系統的瓶頸,可以 用來構建高性能的超級服務器。
Realserver 192.168.122.33 desk33.example.com
Realserver 192.168.122.34 desk34.example.com
Load Balance 192.168.122.82 desk82.example.com
Virtual IP 192.168.122.122
desk82上進行:
#vi /etc/sysctl.conf net.ipv4.ip_forward = 1 #sysctl -p 加載 rule #ipvsadm -C #清除以前的 rules #ipvsadm -A -t 192.168.122.122:80 -s rr #ipvsadm -a -t 192.168.122.122:80 -r 192.168.122.33:80 -i #ipvsadm -a -t 192.168.122.122:80 -r 192.168.122.34:80 -i 保存 rule #service ipvsadm save 邦定 vip ifconfig eth0:0 192.168.122.122 netmask 255.255.255.255 up
RealServer 設置
Default Gateway 指向 Director 的 LAN IP 即 192.168.122.82
#vi /etc/sysctl.conf net.ipv4.ip_forward = 1 net.ipv4.conf.all.arp_ignore = 1 net.ipv4.conf.all.arp_announce = 2 #sysctl -p #ifconfig tunl0 192.168.122.122 netmask 255.255.255.255 up #route add -host 192.168.122.122 dev tunl0 #echo `hostname` > /var/www/html/index.html #service httpd start
測試
選擇一臺主機訪問 http:// 192.168.122.122 反覆刷新網頁,每次出現的網頁不同則表示成功。
LVS 常見問題:
1.LVS/DR 如何處理請求報文的,會修改 IP 包內容嗎?
1.1vs/dr 本身不會關心 IP 層以上的信息,即使是端口號也是 tcp/ip 協議棧去判斷是否正確,vs/dr 本 身主要做這麼幾個事:
1)接收 client 的請求,根據你設定的負載均衡算法選取一臺 realserver的 ip;
2)以選取的這個 ip 對應的 mac 地址作爲目標 mac,然後重新將 IP 包封裝成幀轉發給這臺 RS;
3)在 hashtable 中記錄連接信息。vs/dr 做的事情很少,也很簡單,所以它的效率很高,不比硬件負載均衡設備差多少。
數據包、數據幀的大致流向是這樣的:client --> VS --> RS --> client
2. RealServer 爲什麼要在 lo 接口上配置 VIP,在出口網卡上配置 VIP可以嗎?
2.1 既然要讓 RS 能夠處理目標地址爲 vip 的 IP 包,首先必須要讓 RS能接收到這個包。在 lo 上配置 vip 能夠完成接收包並將結果返回 client。
2.2 答案是不可以將 VIP 設置在出口網卡上,否則會響應客戶端的 arprequest,造成 client/gateway/arp table 紊亂,以至於整個 loadbalance 都不能正常工作
3. RealServer 爲什麼要抑制 arp 幀?
這個問題在上一問題中已經作了說明,這裏結合實施命令進一步闡述。我們在具體實施部署的時候都會 作如下調整:
echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "2">/proc/sys/net/ipv4/conf/lo/arp_announce
echo "1">/proc/sys/net/ipv4/conf/all/arp_ignore
echo "2">/proc/sys/net/ipv4/conf/all/arp_announce
我相信很多人都不會弄懂它們的作用是什麼,只知道一定得有。我這裏也不打算拿出來詳細討論,只是 作幾點說明,就當是補充吧。
3.1
echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
這兩條是可以不用的,因爲 arp 對邏輯接口沒有意義。
3.2 如果你的 RS 的外部網絡接口是 eth0,那麼
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/eth0/arp_ignore
echo "2">/proc/sys/net/ipv4/conf/eth0/arp_announce
所以我個人建議把上面兩條也加到你的腳本里去,因爲萬一系統裏上面兩條默認的值不是 0,那有可能 是會出問題滴。
4. LVS/DR loadbalancer(director)與 RS 爲什麼要在同一網段中?
從第一個問題中大家應該明白 vs/dr 是如何將請求轉發給 RS 的了吧?它是在數據鏈路層來實現的,所 以 director 必須和 RS 在同一網段裏面。
5. 爲什麼 director 上 eth0 接口除了 VIP 另外還要配一個 ip(即DIP)?
5.1 如果是用了 keepalived 等工具做 HA 或者 LoadBalance,則在健康檢查時需要用到 DIP
5.2 沒有健康檢查機制的 HA 或者 Load Balance 則沒有存在的實際意義.
6. LVS/DRip_forward 需要開啓嗎?
不需要。因爲 director 跟 realserver 是同一個網段,無需開啓轉發。
7. lvs/dr 裏,director 的 vip 的 netmask 沒必要設置爲255.255.255.255, 也不需要去
route add -host $VIP dev eth0:0
director 的 vip 本來就是要像正常的 ip 地址一樣對外通告的,不要搞得這麼特殊.
如有問題歡迎指正!!!!!!!!!!!!!!
西安石油大學計算機學院
王茲銀