負載均衡集羣解決方案 (一)LVS-DR

LVS的工作機制以及其調度算法等一些初步瞭解在我之前的文章裏面已有記錄。請看這裏

LVS其工作機制類似iptabls,一部分工作在用戶空間(ipvsadmin),一部分工作在內核空間;用戶空間:用於定義一些負載均衡的對象與策略,例如對TCP協議的80端口進行持久連接的負載,又或者對TCP協議的3306端口的連接進行負載等一些符合個人需求的一些規則定義
內核空間:用於針對用戶空間中所定義的規則對符合要求的數據包進行轉發
 
在整個負載均衡的架構中,所有的角色都使用了一個額外的IP地址---VIP,當一個客戶端向VIP發起請求時,此請求必須直接連接至Directory,而不能是後端的realserver。否則的話此負載均衡的架構就毫無任何意義了。
因此,在客戶端發出至VIP的連接請求後,只能由Directory將其MAC地址響應給客戶端或網絡中的路由設備。而Directory將會根據用戶所定義的負載規則將該請求按照所定義的某種調度算法轉發至後端的realserver了。
如果客戶端在請求建立至VIP的連接時由後端的realserver響應了其請求,那麼客戶端會在其MAC地址表中建立起一個VIP與響應其請求的realserver的MAC的對應關係,用以以後的通信,而此刻在客戶端看來只有一個realserver而無法意識到其他服務器的存在,爲了避免這種情況的發生,結合實際情況解決方案有四:

1、禁止RealServer響應對VIP的ARP請求;
2、在RealServer上隱藏VIP,以使得它們無法獲知網絡上的ARP請求;
3、基於“透明代理(Transparent Proxy)”或者“fwmark (firewall mark)”;
4、禁止ARP請求發往RealServers;

在Linux內核2.4.26以後引入了兩個新的調整ARP棧的標誌:
arp_announce:當向別人通告自己的MAC時所採取的限制級別
arp_ignore:在響應別人的ARP廣播請求時,所使用的不同的模型
 
arp_announce類型:
0--default,使用本地的任何地址,向外通告
1--當本機具有多個IP地址時,試圖向同一網段的通告
2--一定使用同一網段的IP進行通告
 
arp_ignore類型:
0--default,無論是本機的IP地址,就會用任意接口進行響應
1--只響應直接請求的網卡的地址是目標地址


初步瞭解了以上,就可以動手LVS-DR模型的搭建了:
 
環境介紹:
系統:RHEL5
DIP:172.23.136.139
RS1:172.23.136.149
RS2:172.23.136.148
VIP:172.23.136.150



(一)、Directory的配置
1、使用ipvsadm進行負載均衡的實現,早期需要重新編譯內核,不過現在版本的redhat默認已經直接做進內核。
##查看內核是否已經支持ipvs
modprobe ip_vs
cat /proc/net/ip_vs
 
2、安裝ipvsadm
yum install ipvsadm -y
並啓動ipvsadm
service ipvsadm start
第一次啓動會報一個No such file or directory的錯誤,因爲lvs和iptables都是可以講用戶所配置的規則保存在一個文件中,當系統重啓或者服務重啓後都會重讀這個規則文件,已達到規則永久有效的目的。由於是第一次啓動並未定義規則,所以這個規則文件是不存在的,在服務啓動時重讀這個文件時就報錯了。
 
3、啓動ipvs腳本:
service ipvs start
  1. #!/bin/bash 
  2. # 
  3. # LVS script for VS/DR 
  4. # 
  5. . /etc/rc.d/init.d/functions 
  6. # 
  7. VIP=172.23.136.150 
  8. RIP1=172.23.136.149 
  9. RIP2=172.23.136.148 
  10. PORT=80 
  11.  
  12. # 
  13. case "$1" in 
  14. start)            
  15.  
  16.   /sbin/ifconfig eth0:1 $VIP broadcast $VIP netmask 255.255.255.255 up 
  17.   /sbin/route add -host $VIP dev eth0:1 
  18.  
  19. # Since this is the Director we must be able to forward packets 
  20.   echo 1 > /proc/sys/net/ipv4/ip_forward 
  21.  
  22. # Clear all iptables rules. 
  23.   /sbin/iptables -F 
  24.  
  25. # Reset iptables counters. 
  26.   /sbin/iptables -Z 
  27.  
  28. # Clear all ipvsadm rules/services. 
  29.   /sbin/ipvsadm -C 
  30.  
  31. # Add an IP virtual service for VIP 172.23.136.150 port 80 
  32. # In this recipe, we will use the round-robin scheduling method.  
  33. # In production, however, you should use a weighted, dynamic scheduling method.  
  34.   /sbin/ipvsadm -A -t $VIP:80 -s wlc 
  35.  
  36. # Now direct packets for this VIP to 
  37. # the real server IP (RIP) inside the cluster 
  38.   /sbin/ipvsadm -a -t $VIP:80 -r $RIP1 -g -w 1 
  39.   /sbin/ipvsadm -a -t $VIP:80 -r $RIP2 -g -w 2 
  40.  
  41.   /bin/touch /var/lock/subsys/ipvsadm &> /dev/null 
  42. ;;  
  43.  
  44. stop) 
  45. # Stop forwarding packets 
  46.   echo 0 > /proc/sys/net/ipv4/ip_forward 
  47.  
  48. # Reset ipvsadm 
  49.   /sbin/ipvsadm -C 
  50.  
  51. # Bring down the VIP interface 
  52.   /sbin/ifconfig eth0:1 down 
  53.   /sbin/route del $VIP 
  54.    
  55.   /bin/rm -f /var/lock/subsys/ipvsadm 
  56.    
  57.   echo "ipvs is stopped..." 
  58. ;; 
  59.  
  60. status) 
  61.   if [ ! -e /var/lock/subsys/ipvsadm ]; then 
  62.     echo "ipvsadm is stopped ..." 
  63.   else 
  64.     echo "ipvs is running ..." 
  65.     ipvsadm -L -n 
  66.   fi 
  67. ;; 
  68. *) 
  69.   echo "Usage: $0 {start|stop|status}" 
  70. ;; 
  71. esac 


(二)、RealServer端配置
在各個realserver端分別運行ipvsclient腳本,腳本內容如下:

  1. #!/bin/bash 
  2. # 
  3. # Script to start LVS DR real server. 
  4. # description: LVS DR real server 
  5. # 
  6. .  /etc/rc.d/init.d/functions 
  7.  
  8. VIP=172.23.136.150 
  9. host=`/bin/hostname` 
  10.  
  11. case "$1" in 
  12. start) 
  13.        # Start LVS-DR real server on this machine. 
  14.         /sbin/ifconfig lo down 
  15.         /sbin/ifconfig lo up 
  16.         echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore 
  17.         echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce 
  18.         echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore 
  19.         echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce 
  20.  
  21.         /sbin/ifconfig lo:0 $VIP broadcast $VIP netmask 255.255.255.255 up 
  22.         /sbin/route add -host $VIP dev lo:0 
  23.  
  24. ;; 
  25. stop) 
  26.  
  27.         # Stop LVS-DR real server loopback device(s). 
  28.         /sbin/ifconfig lo:0 down 
  29.         echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore 
  30.         echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce 
  31.         echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore 
  32.         echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce 
  33.  
  34. ;; 
  35. status) 
  36.  
  37.         # Status of LVS-DR real server. 
  38.         islothere=`/sbin/ifconfig lo:0 | grep $VIP` 
  39.         isrothere=`netstat -rn | grep "lo:0" | grep $VIP` 
  40.         if [ ! "$islothere" -o ! "isrothere" ];then 
  41.             # Either the route or the lo:0 device 
  42.             # not found. 
  43.             echo "LVS-DR real server Stopped." 
  44.         else 
  45.             echo "LVS-DR real server Running." 
  46.         fi 
  47. ;; 
  48. *) 
  49.             # Invalid entry. 
  50.             echo "$0: Usage: $0 {start|status|stop}" 
  51.             exit 1 
  52. ;; 
  53. esac 

 

 
(三)、測試

訪問172.23.136.150,可以發現負載均衡已正常工作

 

現在我在後端兩臺realserver上都配置了phpmyadmin,並且兩數據庫的賬號密碼均相同。現在訪問172.23.136.150/phpmyadmin 你會發現一個很有意思的現象就是始終無法登陸上(在使用ipvsadm定義規則時沒有定義權重)
因此Directory還需要基於“連接追蹤”實現將同一個客戶端的請求始終發往其第一次被分配到的realserver,ipvs會在自己的內部維護一個hash表,表中保存着不同的客戶端第一次請求時所分發的後端realserver,以及保存該條目的時間,當該段時間消耗完之後,連接還未斷開,那麼這段時間會自動延遲你所定義的持久連接時間。當下一個請求達到時,就會去這個表中對比,將請求分發給條目中所對應的realserver用來保證整個請求的完整性。

lvs的持久連接類型分以下幾種:

1.pcc:持久客戶端連接,在指定規則時,使用0端口代表所有的端口,即所有到達VIP的請求全部按照調度算法負載至後端的realserver
2.ppc:持久端口連接,明確指定請求VIP的哪個端口的請求分發至後端的realserver
3.Netfilter  marked packets:防火牆標記的持久連接,主要用於多端口協議間的關聯,例如在電子商務網站上,在80端口挑選了商品後,當付款的時候就會跳轉至443端口。
4.FTP持久連接,用於主動連接和被動連接,很少用到。

 

(一)、pcc
任何類型的持久連接均只需要在Directory上配置,realserver則不需要進行額外配置,因爲這些只涉及到Directory的請求分發方法。

ipvsadm -C
ipvsadm -A -t 172.23.136.150:0 -p 360
ipvsadm -a -t 172.23.136.150:0 -r 172.23.136.148
ipvsadm -a -t 172.23.136.150:0 -r 172.23.136.149

在之前的配置基礎上執行以上配置即可。

(二)、ppc
ipvsadm -C
ipvsadm -A -t 172.23.136.150:80 -p 360
ipvsadm -a -t 172.23.136.150:80 -r 172.23.136.148
ipvsadm -a -t 172.23.136.150:80 -r 172.23.136.149

(三)、持久防火牆標記
持久防火牆標記需要結合iptables來使用
iptables -t mangle -A PREROUTING -i eth0 -p tcp -d 172.23.136.150 -m multiport --dport 80,443 -j MARK --set-mark 1

###把來自eth0所有目的地址爲172.23.136.150的80和443端口的請求綁定在一起,標籤爲1
ipvsadm -C
ipvsadm -A -f 1 -p 360
ipvsadm -a -f 1 -r 172.23.136.148
ipvsadm -a -f 1 -r 172.23.136.149

(四)、FTP持久連接
首先要了解FTP的工作模式:21控制端口   20數據端口
被動連接 是隨機從1024---65000內選出一個 作爲迴應端口號,所以我們要限制被動連接回應端口的範圍。
編輯你所用的FTP軟件,vsftpd或者pure-ftpd,設置其端口範圍結合iptables打標籤
iptables -t mangle -A PREROUTING -i eth0 -p tcp -d 192.168.2.100 --dport 21 -j MARK --set-mark 1
iptables -t mangle -A PREROUTING -i eth0 -p tcp -d 192.168.2.100 --dport 10000:12000  -j MARK --set-mark 1
ipvsadm -C
ipvsadm -A -f 1 -p 360
ipvsadm -a -f 1 -r 172.23.136.148
ipvsadm -a -f 1 -r 172.23.136.149

小結:
訪問172.23.136.150/phpmyadmin,現在已經可以正常登錄進去,因爲此次的連接被持久分發到後端的同一臺realserver上。整個請求是完整的。

 

查看其連接分配狀態,可以發現同一個客戶端的請求都被定向至後端的同一個realserver。

ipvsadm -lcn
IPVS connection entries
pro expire state       source             virtual            destination
TCP 01:55  FIN_WAIT    172.23.136.93:56944 172.23.136.150:80  172.23.136.149:80
TCP 01:56  FIN_WAIT    172.23.136.93:56947 172.23.136.150:80  172.23.136.149:80
TCP 01:39  FIN_WAIT    172.23.136.93:56928 172.23.136.150:80  172.23.136.149:80
TCP 01:56  FIN_WAIT    172.23.136.93:56946 172.23.136.150:80  172.23.136.149:80
TCP 01:39  FIN_WAIT    172.23.136.93:56930 172.23.136.150:80  172.23.136.149:80
TCP 01:55  FIN_WAIT    172.23.136.93:56943 172.23.136.150:80  172.23.136.149:80
TCP 01:55  FIN_WAIT    172.23.136.93:56945 172.23.136.150:80  172.23.136.149:80
TCP 01:47  FIN_WAIT    172.23.136.93:56933 172.23.136.150:80  172.23.136.149:80
TCP 01:39  FIN_WAIT    172.23.136.93:56931 172.23.136.150:80  172.23.136.149:80
TCP 14:57  ESTABLISHED 172.23.136.93:56948 172.23.136.150:80  172.23.136.149:80
TCP 05:50  NONE        172.23.136.93:0    172.23.136.150:80  172.23.136.149:80
TCP 01:39  FIN_WAIT    172.23.136.93:56932 172.23.136.150:80  172.23.136.149:80

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章