實現LVS的1 + 2 模式 & 2 + 2 模式

lvs介紹html

libnet下載地址: http://search.cpan.org/dist/libnet/linux

ipvsadm下載地址: http://www.linuxvirtualserver.org/software/ipvs.html#kernel-2.6web

從Linux內核版本2.6起,ip_vs code已經被整合進了內核中,所以,只要在編譯內核的時候選擇了ipvs的功能,您的Linux即能支持LVS。Linux 2.4.23之後的內核版本也整合了ip_vs code,但若是是更舊的內核版本,您得本身手動將ip_vs code整合進內核原碼中,並從新編譯內核方可以使用lvs。算法

1、關於ipvsadm:vim

ipvsadm是運行於用戶空間、用來與ipvs交互的命令行工具,它的做用表如今:後端

一、定義在Director上進行dispatching的服務(service),以及哪此服務器(server)用來提供此服務;bash

二、爲每臺同時提供某一種服務的服務器定義其權重(即概據服務器性能肯定的其承擔負載的能力);服務器


注:權重用整數來表示,有時候也能夠將其設置爲atomic_t;其有效表示值範圍爲24bit整數空間,即(2^24-1);網絡


所以,ipvsadm命令的主要做用表如今如下方面:負載均衡

一、添加服務(經過設定其權重>0);

二、關閉服務(經過設定其權重>0);此應用場景中,已經鏈接的用戶將能夠繼續使用此服務,直到其退出或超時;新的鏈接請求將被拒絕;

三、保存ipvs設置,經過使用「ipvsadm-sav > ipvsadm.sav」命令實現;

四、恢復ipvs設置,經過使用「ipvsadm-sav < ipvsadm.sav」命令實現;

五、顯示ip_vs的版本號,下面的命令顯示ipvs的hash表的大小爲4k;

  # ipvsadm

    IP Virtual Server version 1.2.1 (size=4096)

六、顯示ipvsadm的版本號

  # ipvsadm --version

   ipvsadm v1.24 2003/06/07 (compiled with popt and IPVS v1.2.0)


2、ipvsadm使用中應注意的問題

默認狀況下,ipvsadm在輸出主機信息時使用其主機名而非IP地址,所以,Director須要使用名稱解析服務。若是沒有設置名稱解析服務、服務不可用或設置錯誤,ipvsadm將會一直等到名稱解析超時後才返回。固然,ipvsadm須要解析的名稱僅限於RealServer,考慮到DNS提供名稱解析服務效率不高的狀況,建議將全部RealServer的名稱解析經過/etc/hosts文件來實現;


3、調度算法

Director在接收到來自於Client的請求時,會基於"schedule"從RealServer中選擇一個響應給Client。ipvs支持如下調度算法:


一、輪詢(round robin, rr),加權輪詢(Weighted round robin, wrr)——新的鏈接請求被輪流分配至各RealServer;算法的優勢是其簡潔性,它無需記錄當前全部鏈接的狀態,因此它是一種無狀態調度。輪叫調度算法假設全部服務器處理性能均相同,無論服務器的當前鏈接數和響應速度。該算法相對簡單,不適用於服務器組中處理性能不一的狀況,並且當請求服務時間變化比較大時,輪叫調度算法容易致使服務器間的負載不平衡。

二、最少鏈接(least connected, lc), 加權最少鏈接(weighted least connection, wlc)——新的鏈接請求將被分配至當前鏈接數最少的RealServer;最小鏈接調度是一種動態調度算法,它經過服務器當前所活躍的鏈接數來估計服務器的負載狀況。調度器須要記錄各個服務器已創建鏈接的數目,當一個請求被調度到某臺服務器,其鏈接數加1;當鏈接停止或超時,其鏈接數減一。

三、基於局部性的最少連接調度(Locality-Based Least Connections Scheduling,lblc)——針對請求報文的目標IP地址的負載均衡調度,目前主要用於Cache集羣系統,由於在Cache集羣中客戶請求報文的目標IP地址是變化的。這裏假設任何後端服務器均可以處理任一請求,算法的設計目標是在服務器的負載基本平衡狀況下,將相同目標IP地址的請求調度到同一臺服務器,來提升各臺服務器的訪問局部性和主存Cache命中率,從而整個集羣系統的處理能力。LBLC調度算法先根據請求的目標IP地址找出該目標IP地址最近使用的服務器,若該服務器是可用的且沒有超載,將請求發送到該服務器;若服務器不存在,或者該服務器超載且有服務器處於其一半的工做負載,則用「最少連接」的原則選出一個可用的服務器,將請求發送到該服務器。

四、帶複製的基於局部性最少連接調度(Locality-Based Least Connections with Replication Scheduling,lblcr)——也是針對目標IP地址的負載均衡,目前主要用於Cache集羣系統。它與LBLC算法的不一樣之處是它要維護從一個目標IP地址到一組服務器的映射,而 LBLC算法維護從一個目標IP地址到一臺服務器的映射。對於一個「熱門」站點的服務請求,一臺Cache 服務器可能會忙不過來處理這些請求。這時,LBLC調度算法會從全部的Cache服務器中按「最小鏈接」原則選出一臺Cache服務器,映射該「熱門」站點到這臺Cache服務器,很快這臺Cache服務器也會超載,就會重複上述過程選出新的Cache服務器。這樣,可能會致使該「熱門」站點的映像會出如今全部的Cache服務器上,下降了Cache服務器的使用效率。LBLCR調度算法將「熱門」站點映射到一組Cache服務器(服務器集合),當該「熱門」站點的請求負載增長時,會增長集合裏的Cache服務器,來處理不斷增加的負載;當該「熱門」站點的請求負載下降時,會減小集合裏的Cache服務器數目。這樣,該「熱門」站點的映像不太可能出如今全部的Cache服務器上,從而提供Cache集羣系統的使用效率。LBLCR算法先根據請求的目標IP地址找出該目標IP地址對應的服務器組;按「最小鏈接」原則從該服務器組中選出一臺服務器,若服務器沒有超載,將請求發送到該服務器;若服務器超載;則按「最小鏈接」原則從整個集羣中選出一臺服務器,將該服務器加入到服務器組中,將請求發送到該服務器。同時,當該服務器組有一段時間沒有被修改,將最忙的服務器從服務器組中刪除,以下降複製的程度。

五、目標地址散列調度(Destination Hashing,dh)算法也是針對目標IP地址的負載均衡,但它是一種靜態映射算法,經過一個散列(Hash)函數將一個目標IP地址映射到一臺服務器。目標地址散列調度算法先根據請求的目標IP地址,做爲散列鍵(Hash Key)從靜態分配的散列表找出對應的服務器,若該服務器是可用的且未超載,將請求發送到該服務器,不然返回空。

六、源地址散列調度(Source Hashing,sh)算法正好與目標地址散列調度算法相反,它根據請求的源IP地址,做爲散列鍵(Hash Key)從靜態分配的散列表找出對應的服務器,若該服務器是可用的且未超載,將請求發送到該服務器,不然返回空。它採用的散列函數與目標地址散列調度算法的相同。除了將請求的目標IP地址換成請求的源IP地址外,它的算法流程與目標地址散列調度算法的基本類似。在實際應用中,源地址散列調度和目標地址散列調度能夠結合使用在防火牆集羣中,它們能夠保證整個系統的惟一出入口。

4、關於LVS追蹤標記fwmark:

若是LVS放置於多防火牆的網絡中,而且每一個防火牆都用到了狀態追蹤的機制,那麼在迴應一個針對於LVS的鏈接請求時必須通過此請求鏈接進來時的防火牆,不然,這個響應的數據包將會被丟棄。

以上來源於網絡

5、生產中使用最多的模式DR

第一種:1 + 2 模式


LVS-DR:直接路由

        各集羣節點,必需要跟directory在同一物理網絡中

        RIP可使用公網地址,實現遠程管理(也可使用私有地址)

        directory僅負責處理入展請求,響應報文則有realserver 直接發往客戶端

        集羣節點不能將網關指向DIP

        directory不支持端口映射

實施規劃:

        同一物理網段的三個共有地址

        使用私有ip,映射VIP地址到外網,

實驗信息和拓撲:
備註:Centos 6.5 selinux –disabled iptables off


wKioL1XNjHXALxjoAACj8Rd9H6I678.jpg

wKioL1XNjHbCWqm3AAE7BlamAkw456.jpg

檢查內核是否已經支持LVS

# grep -i 'CONFIG_IP_VS'/boot/config-2.6.32-431.el6.x86_64
CONFIG_IP_VS=m
CONFIG_IP_VS_IPV6=y
# CONFIG_IP_VS_DEBUG is not set
CONFIG_IP_VS_TAB_BITS=12
CONFIG_IP_VS_PROTO_TCP=y
CONFIG_IP_VS_PROTO_UDP=y
CONFIG_IP_VS_PROTO_AH_ESP=y
CONFIG_IP_VS_PROTO_ESP=y
CONFIG_IP_VS_PROTO_AH=y
CONFIG_IP_VS_PROTO_SCTP=y
CONFIG_IP_VS_RR=m
CONFIG_IP_VS_WRR=m
CONFIG_IP_VS_LC=m
CONFIG_IP_VS_WLC=m
CONFIG_IP_VS_LBLC=m
CONFIG_IP_VS_LBLCR=m
CONFIG_IP_VS_DH=m
CONFIG_IP_VS_SH=m
CONFIG_IP_VS_SED=m
CONFIG_IP_VS_NQ=m
CONFIG_IP_VS_FTP=m
CONFIG_IP_VS_PE_SIP=m
[root@localhost ~]#

出現以上說明內核已經支持LVS模塊

Directory的配置以下:
安裝ipvsadm管理工具:

 yum install ipvsadm –y

使用ipvsadm配置lvs

vim dirctory.sh
#!/bin/bash
#
# LVS script for VS/DR
#
. /etc/rc.d/init.d/functions
#
VIP=172.16.100.200
RIP1=172.16.100.100
RIP2=172.16.100.101
PORT=80
 
#
case "$1" in
start)         
 
 /sbin/ifconfig eth0:1 $VIP broadcast $VIPnetmask 255.255.255.255 up
 /sbin/route add -host $VIP dev eth0:1
 
# Since this is the Director we must beableto forward packets
 echo1 > /proc/sys/net/ipv4/ip_forward
 
# Clear all iptables rules.
 /sbin/iptables -F
 
# Reset iptables counters.
 /sbin/iptables -Z
 
# Clear all ipvsadm rules/services.
 /sbin/ipvsadm -C
 
# Add an IP virtual service forVIP192.168.0.219 port 80
# In this recipe, we will usetheround-robin scheduling method.
# In production, however, you should useaweighted, dynamic scheduling method.
 /sbin/ipvsadm -A -t $VIP:80 -s wlc
 
# Now direct packets for this VIP to
# the real server IP (RIP) insidethecluster
 /sbin/ipvsadm -a -t $VIP:80 -r $RIP1 -g -w 1
 /sbin/ipvsadm -a -t $VIP:80 -r $RIP2 -g -w 2
 
 /bin/touch /var/lock/subsys/ipvsadm &>/dev/null
;;
 
stop)
# Stop forwarding packets
 echo0 > /proc/sys/net/ipv4/ip_forward
 
# Reset ipvsadm
 /sbin/ipvsadm -C
 
# Bring down the VIP interface
 /sbin/ifconfig eth0:1 down
 /sbin/route del $VIP
 
 /bin/rm -f /var/lock/subsys/ipvsadm
 
 echo"ipvs is stopped..."
;;
 
status)
  if[ ! -e /var/lock/subsys/ipvsadm ]; then
  echo "ipvsadm is stopped ..."
 else
   echo"ipvs is running ..."
  ipvsadm -L -n
  fi
;;
*)
 echo"Usage: $0 {start|stop|status}"
;;
esac
#sh dirctory.sh  start

兩臺R而阿里Server配置以下:
保證正常的WEB訪問便可

vim realserver.sh
#!/bin/bash
#
# Script to start LVS DR real server.
# description: LVS DR real server
#
. /etc/rc.d/init.d/functions
 
VIP=172.16.100.200
host=`/bin/hostname`
 
case "$1" in
start)
     # Start LVS-DR real server on this machine.
      /sbin/ifconfig lo down
      /sbin/ifconfig lo up
      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
 
      /sbin/ifconfig lo:0 $VIP broadcast $VIP netmask 255.255.255.255 up
      /sbin/route add -host $VIP dev lo:0
 
;;
stop)
 
      # Stop LVS-DR real server loopback device(s).
      /sbin/ifconfig lo:0 down
      echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore
      echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce
      echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore
       echo 0 >/proc/sys/net/ipv4/conf/all/arp_announce
 
;;
status)
 
      # Status of LVS-DR real server.
      islothere=`/sbin/ifconfig lo:0 | grep $VIP`
      isrothere=`netstat -rn | grep "lo:0" | grep $VIP`
       if [ ! "$islothere" -o !"isrothere" ];then
          # Either the route or the lo:0 device
          # not found.
          echo "LVS-DR real server Stopped."
      else
          echo "LVS-DR real server Running."
      fi
;;
*)
          # Invalid entry.
          echo "$0: Usage: $0 {start|status|stop}"
          exit 1
;;
esac
 
# sh realserver.sh  start

訪問WEB服務器:

wKiom1XNixjx-w1-AACDfPiy6LI163.jpg

# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu16436 qdisc noqueue state UNKNOWN
    link/loopback00:00:00:00:00:00 brd 00:00:00:00:00:00
   inet 127.0.0.1/8 scope host lo
   inet6 ::1/128 scope host
      valid_lft forever preferred_lft forever
2: eth0:<BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen1000
    link/ether 00:0c:29:63:2b:5c brdff:ff:ff:ff:ff:ff
   inet 172.16.100.10/24 brd 172.16.100.255 scope global eth0
   inet 172.16.100.200/32 brd 172.16.100.200 scope global eth0:1
   inet6 fe80::20c:29ff:fe63:2b5c/64 scope link
      valid_lft forever preferred_lft forever
[root@localhost ~]#

備註:

目前纔在一個問題,就是若是後端的realserver宕機,若是將其從從lvs集羣中剔除此服務器,而且當realserver恢復又是如何將其加入LVS集羣中呢,這就是健康檢查的功能,這裏使用以下的腳本實現。

# vim check_health.sh
#!/bin/bash
#
VIP=172.16.100.200
CPORT=80
FAIL_BACK=127.0.0.1
RS=("172.16.100.100" "172.16.100.101")
declare -a RSSTATUS
RW=("2" "1")
RPORT=80
TYPE=g
CHKLOOP=3
LOG=/var/log/ipvsmonitor.log
 
addrs(){
 ipvsadm -a -t $VIP:$CPORT -r $1:$RPORT -$TYPE-w $2
  [$? -eq 0 ] && return 0 || return 1
}
 
delrs(){
 ipvsadm -d -t $VIP:$CPORT -r $1:$RPORT
  [$? -eq 0 ] && return 0 || return 1
}
 
checkrs(){
 local I=1
 while [ $I -le $CHKLOOP ]; do
   if curl --connect-timeout 1 http://$1&> /dev/null; then
     return 0
   fi
   let I++
 done
 return 1
}
 
initstatus(){
 local I
 local COUNT=0;
  forI in ${RS[*]}; do
   if ipvsadm -L -n | grep "$I:$RPORT" && > /dev/null; then
     RSSTATUS[$COUNT]=1
   else
     RSSTATUS[$COUNT]=0
   fi
  letCOUNT++
 done
}
 
initstatus
while :; do
  letCOUNT=0
  forI in ${RS[*]}; do
   if checkrs $I; then
     if [ ${RSSTATUS[$COUNT]} -eq 0 ]; then
        addrs $I ${RW[$COUNT]}
        [ $? -eq 0 ] &&RSSTATUS[$COUNT]=1 && echo "`date+'%F %H:%M:%S'`, $I isback." >> $LOG
     fi
   else
     if [ ${RSSTATUS[$COUNT]} -eq 1 ]; then
        delrs $I
        [ $? -eq 0 ] &&RSSTATUS[$COUNT]=0 && echo "`date+'%F %H:%M:%S'`, $I isgone." >> $LOG
     fi
   fi
   let COUNT++
 done
 sleep 5
done

執行腳本:

# touch /var/log/ipvsmonitor.log
# chmod +x check_health.sh
# nohup ./check_health.sh  &
# tail -f /var/log/ipvsmonitor.log
2014-10-25 18:11:59, 172.16.100.100 isgone.
2014-10-25 18:11:59, 172.16.100.101 isgone.
2014-10-25 18:18:08, 172.16.100.100 isback.
2014-10-25 18:23:26, 172.16.100.101 isback.
2014-10-25 18:23:56, 172.16.100.101 isgone.
2014-10-25 18:24:12, 172.16.100.101 isback.

啓動和中止realserver上的服務,能夠看到日誌記錄,LVS集羣會對其進行剔除和添加功能。

End

第二種:2 + 2 模式

wKioL1XNjd2Qu8QvAAC6md0rs-M981.jpg

wKiom1XNi9nzHskgAAFvI0MNi8U043.jpg

  1. 配置lvs Master & lvs Backup

yum install poptpopt-devel popt-static libnl-devel libnl –y
mkdir -p mkdir /usr/local/src/lvs
cd /usr/local/src/lvs/

安裝ipvsadm

wget http://www.linuxvirtualserver.org/software/kernel-2.6/ipvsadm-1.26.tar.gz
tar zxvf ipvsadm-1.26.tar.gz
make && make install && echo"install LVS ok"

安裝keepalived

wget http://www.keepalived.org/software/keepalived-1.2.13.tar.gz
tar zxvf keepalived-1.2.13.tar.gz
cd keepalived-1.2.13
./configure && make && make install && echo "install keepalivedok" || echo "install keepalived is failed"

配置keepalived爲啓動腳本

cp /usr/local/etc/rc.d/init.d/keepalived  /etc/init.d/
cp /usr/local/etc/sysconfig/keepalived  /etc/sysconfig/
mkdir /etc/keepalived
cp /usr/local/etc/keepalived/keepalived.conf  /etc/keepalived/
cp /usr/local/sbin/keepalived  /usr/sbin/

LVS Backup 配置同上

Master keepalived.conf配置文件:

!Configuration File for keepalived 
global_defs{ 
   notification_email { 
         mengtao10@163.com 
   } 
   notification_email_from mengtao10@163.com
   smtp_server 127.0.0.1 
   router_id LVS_DEVEL 
} 
vrrp_instanceVI_1 { 
    state MASTER              
    interface eth0 
    virtual_router_id 51 
    priority 100     
    advert_int 1 
    authentication { 
        auth_type PASS 
        auth_pass 1q2w3e4r5t6y 
    } 
    virtual_ipaddress { 
        172.16.100.200  
    } 
} 
virtual_server172.16.100.200 80 { 
    delay_loop 6                   
    lb_algo wrr                   
    lb_kind DR                    
    persistence_timeout 60         
    protocol TCP                 
    real_server 172.16.100.100 80 { 
        weight 3                
        TCP_CHECK { 
        connect_timeout 10        
        nb_get_retry 3 
        delay_before_retry 3 
        connect_port 80 
        } 
    } 
    real_server 172.16.100.101 80 { 
        weight 3 
        TCP_CHECK { 
        connect_timeout 10 
        nb_get_retry 3 
        delay_before_retry 3 
        connect_port 80 
        } 
     } 
}

LvsBackup配置文件:

!Configuration File for keepalived 
global_defs{ 
   notification_email { 
         mengtao10@163.com 
   } 
   notification_email_from mengtao10@163.com
   smtp_server 127.0.0.1 
   router_id LVS_DEVEL 
} 
vrrp_instanceVI_1 { 
    state BACKUP              
    interface eth0 
    virtual_router_id 51 
    priority 99     
    advert_int 1 
    authentication { 
        auth_type PASS 
        auth_pass 1q2w3e4r5t6y 
    } 
    virtual_ipaddress { 
        172.16.100.200  
    } 
} 
virtual_server172.16.100.200 80 { 
    delay_loop 6                   
    lb_algo wrr                   
    lb_kind DR                   
    persistence_timeout 60         
    protocol TCP                  
    real_server 172.16.100.100 80 { 
        weight 3                
        TCP_CHECK { 
        connect_timeout 10        
        nb_get_retry 3 
        delay_before_retry 3 
        connect_port 80 
        } 
    } 
    real_server 172.16.100.101 80 { 
        weight 3 
        TCP_CHECK { 
        connect_timeout 10 
        nb_get_retry 3 
        delay_before_retry 3 
        connect_port 80 
        } 
     } 
}

訪問驗證:

任意關閉一臺web服務器,服務均可以正常訪問任意關閉一臺lvs,服務均可以正常訪問

相關文章
相關標籤/搜索