歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網

LVS

日期:2017/3/3 13:48:45   编辑:Linux技術
上篇記錄了keepalive的安裝和雙機熱備的實現,今天記錄下lvs負載均衡的配置搭建(DR模式--Direct Routing)
1、安裝ipvsadm
  下載ipvsadm,下載時需注意對應自己的內核版本。
  ipvsadm下載網址:http://www.linuxvirtualserver.org/software/
  本文使用的是FC8系統,內核版本2.6.23.1,對應ipvsadm版本1.24。
  安裝時需要Linux內核源碼,如果安裝系統時沒有安裝源碼,需要再下載內核源碼。本文使用的內核是linux-2.6.23.1.tar.bz2。把內核解壓到/usr/src/linux-2.6.23.1。下面開始
編譯安裝:(centos默認就已經安裝)
  建立內核快捷方式:ln -s /usr/src/linux-2.6.23.1 /usr/src/linux
  解壓ipvsadm:
  tar zxvf ipvsadm-1.24.tar.gz
  安裝ipvsadm:
  cd ipvsadm-1.24
  make
  make install
  安裝完成後,下一步我們開始配置IPVS
2、配置keepalive
主要就是修改conf,增加virtual_server模塊:
virtual_server 192.168.0.200 80
<pre name="code" class="plain">virtual_server 192.168.0.200 22
virtual_server 192.168.0.200 6379
分別是HTTP、ssh、redis的端口,都是TCP 的(UDP還沒實驗)


! Configuration File for keepalived
global_defs {
    notification_email {
        [email protected]
    }
    notification_email_from [email protected]
    smtp_server 127.0.0.1
    smtp_connect_timeout 30
    router_id LVS_DEVEL
}

vrrp_instance lnmp {
    state MASTER          #默認master,其它director機器改為<span><span> BACKUP</span></span>
    interface eth0
    virtual_router_id 100
    priority 170
    advert_int 5
    track_interface {
        eth0
    }

    authentication {
        auth_type PASS
        auth_pass 123456
    }
    virtual_ipaddress {
        192.168.0.200 eth0
    }
    virtual_server 192.168.0.200 80 {
    delay_loop 6  //隔6秒查詢
    lb_algo wrr   //lvs算法
    lb_kind DR    //(Direct Route)
    persistence_timeout 60  //同一IP的連接60秒內被分配到同一台realserver
    inhibit_on_failure  //當web掛掉的時候,前面請求的用戶,可以繼續打開網頁,但是後面的請求不會調度到掛掉的web上面。
    protocol TCP   //用TCP協議檢查realserver狀態
    real_server 192.168.0.157 80 {
    weight 3    //權重
    TCP_CHECK {
    connect_timeout 10   //10秒無響應超時
    nb_get_retry 3
    delay_before_retry 3
    }
    }
    real_server 192.168.0.162 80 {
    weight 1
    TCP_CHECK {
    connect_timeout 10
    nb_get_retry 3
    delay_before_retry 3
    }
    }

    virtual_server 192.168.0.200 22 {
    delay_loop 6  //隔6秒查詢
    lb_algo wrr   //lvs算法
    lb_kind DR    //(Direct Route)
    persistence_timeout 60  //同一IP的連接60秒內被分配到同一台realserver
    inhibit_on_failure  //當web掛掉的時候,前面請求的用戶,可以繼續打開網頁,但是後面的請求不會調度到掛掉的web上面。
    protocol TCP   //用TCP協議檢查realserver狀態
    real_server 192.168.0.157 22 {
    weight 3    //權重
    TCP_CHECK {
    connect_timeout 10   //10秒無響應超時
    nb_get_retry 3
    delay_before_retry 3
    }
    }
    real_server 192.168.0.162 22 {
    weight 1
    TCP_CHECK {
    connect_timeout 10
    nb_get_retry 3
    delay_before_retry 3
    }
    }

    virtual_server 192.168.0.200 6379 {
    delay_loop 6  //隔6秒查詢
    lb_algo wrr   //lvs算法
    lb_kind DR    //(Direct Route)
    persistence_timeout 60  //同一IP的連接60秒內被分配到同一台realserver
    inhibit_on_failure  //當web掛掉的時候,前面請求的用戶,可以繼續打開網頁,但是後面的請求不會調度到掛掉的web上面。
    protocol TCP   //用TCP協議檢查realserver狀態
    real_server 192.168.0.157 6379 {
    weight 3    //權重
    TCP_CHECK {
    connect_timeout 10   //10秒無響應超時
    nb_get_retry 3
    delay_before_retry 3
    }
    }
    real_server 192.168.0.162 6379 {
    weight 1
    TCP_CHECK {
    connect_timeout 10
    nb_get_retry 3
    delay_before_retry 3
    }
    }
}

有幾個地方解釋一下:
state MASTER :表示是主服務器
priority 101 : 主的權重要高於從
virtual_ipaddress :對外提供的虛擬IP
lb_algo rr :    LVS有8種調度算法:
輪叫(Round Robin)
調度器通過"輪叫"調度算法將外部請求按順序輪流分配到集群中的真實服務器上,它均等地對待每一台服務器,而不管服務器上實際的連接數和系統負載。
加權輪叫(Weighted Round Robin)
調度器通過"加權輪叫"調度算法根據真實服務器的不同處理能力來調度訪問請求。這樣可以保證處理能力強的服務器處理更多的訪問流量。調度器可以自動問詢真實服務器的負載情況,並動態地調整其權值。
最少鏈接(Least Connections)
調度器通過"最少連接"調度算法動態地將網絡請求調度到已建立的鏈接數最少的服務器上。如果集群系統的真實服務器具有相近的系統性能,采用"最小連接"調度算法可以較好地均衡負載。
加權最少鏈接(Weighted Least Connections)
在集群系統中的服務器性能差異較大的情況下,調度器采用"加權最少鏈接"調度算法優化負載均衡性能,具有較高權值的服務器將承受較大比例的活動連接負載。調度器可以自動問詢真實服務器的負載情況,並動態地調整其權值。
基於局部性的最少鏈接(Locality-Based Least Connections)
"基於局部性的最少鏈接" 調度算法是針對目標IP地址的負載均衡,目前主要用於Cache集群系統。該算法根據請求的目標IP地址找出該目標IP地址最近使用的服務器,若該服務器 是可用的且沒有超載,將請求發送到該服務器;若服務器不存在,或者該服務器超載且有服務器處於一半的工作負載,則用"最少鏈接"的原則選出一個可用的服務 器,將請求發送到該服務器。
帶復制的基於局部性最少鏈接(Locality-Based Least Connections with Replication)
"帶復制的基於局部性最少鏈接"調度算法也是針對目標IP地址的負載均衡,目前主要用於Cache集群系統。它與LBLC算法的不同之處是它要維護從一個 目標IP地址到一組服務器的映射,而LBLC算法維護從一個目標IP地址到一台服務器的映射。該算法根據請求的目標IP地址找出該目標IP地址對應的服務 器組,按"最小連接"原則從服務器組中選出一台服務器,若服務器沒有超載,將請求發送到該服務器,若服務器超載;則按"最小連接"原則從這個集群中選出一 台服務器,將該服務器加入到服務器組中,將請求發送到該服務器。同時,當該服務器組有一段時間沒有被修改,將最忙的服務器從服務器組中刪除,以降低復制的
程度。
目標地址散列(Destination Hashing)
"目標地址散列"調度算法根據請求的目標IP地址,作為散列鍵(Hash Key)從靜態分配的散列表找出對應的服務器,若該服務器是可用的且未超載,將請求發送到該服務器,否則返回空。
源地址散列(Source Hashing)
"源地址散列"調度算法根據請求的源IP地址,作為散列鍵(Hash Key)從靜態分配的散列表找出對應的服務器,若該服務器是可用的且未超載,將請求發送到該服務器,否則返回空
lb_kind :LVS的3種包轉發模式:
NAT(網絡地址映射)、IP Tunneling(IP隧道)、Direct Routing(直接路由)
NAT: Net Address Translation
原理:通過網絡地址轉換,調度器(Load Balancer)重寫請求報文的目標地址,根據預設的算法,將請求分配給後端的真是服務器;真實服務器響應給Load Balancer;在返回給客戶端;(由於請求和響應都要經過LoadBalance,所以Load Balance有性能瓶頸)
IP Tunneling:
原理:Load Balance 把請求報文通過IP隧道 轉發給真實服務器,真實服務器直接返回給客戶端。
Direct Routing:
DR通過改寫報文的MAC地址,將請求發送給真實服務器,真實服務器直接返回給客戶端。要求Load Balance和真實服務器在同一個網段上。
protocol TCP: 采用TCP/UDP協議
real_server: 物理服務器
權重問題:當lvs配置文件lvs-dr.sh改變權重以及keepalived配置文件keepalived.conf修改權重後,哪個文件重新啟動,哪個文件的權重生效。同時權重在master和backup上面可以設置不同。
當 算法是rr的時候,權重沒有作用,但是當算法是wlc和wrr的時候,必須設置權重,可以根據服務器的性能和配置,來確定權重的大小,當權重大的時 候,lvs調度的服務也就多,同時權重高的服務器先收到鏈接。當小的時候,lvs調度的比較少。當權重為0的時候,表示服務器不可用
3、配置lvs
1)開啟路由轉發
# vi /etc/sysctl.conf
net.ipv4.ip_forward = 1
# sysctl -p
2)在Director上新增一個IP(192.168.0.200),命名為eth0:1(用lo也行),作為Virtual IP,否則會丟棄數據包。
ifconfig eth0:1 192.168.0.200 broadcast 192.168.0.200 netmask 255.255.255.255 up
或者更完善一點用腳本
VIP = 192.168.0.200   
/etc/rc.d/init.d/functions  
case $1 in  
start)
 echo "Start Realserver"
 /sbin/ifconfig eth0:1 $vip broadcast $vip netmask 255.255.255.255 up
 echo "1" > /proc/sys/net/ipv4/conf/eth0/arp_ignore
 echo "2" > /proc/sys/net/ipv4/conf/eth0/arp_announce
 echo "1" > /proc/sys/net/ipv4/conf/all/arp_ignore
 echo "2" > /proc/sys/net/ipv4/conf/all/arp_announce  
;;  
stop)
 echo "Stop Realserver"
 /sbin/ifconfig eth0:1 down
 echo "0" > /proc/sys/net/ipv4/conf/eth0/arp_ignore
 echo "0" > /proc/sys/net/ipv4/conf/eth0/arp_announce
 echo "0" > /proc/sys/net/ipv4/conf/all/arp_ignore
 echo "0" > /proc/sys/net/ipv4/conf/all/arp_announce  
;;  
*)
 echo "Usage: $0 (start | stop)"  
exit 1  
esac

ifconfig 看看是否有設備eth0:1了
3)在ipvsadm配置
創建一個配置腳本,方便在多台Director機器(安裝有keepalive)上進行配置,
#vi lvsdr.sh
#!/bin/bash
VIP=192.168.0.200             #虛擬IP ,對外提供,所有director使用統一的
RIP1=192.168.0.157
RIP2=192.168.0.162            #realserver有幾個,這裡配幾個
/sbin/rc.d/init.d/functions   #報不存在,不知道原因
case "$1" in
start)
       echo "start LVS of DirectorServer"
       #Set the Virtual IP Address
       /sbin/ifconfig eth0:1 $VIP broadcast $VIP netmask 255.255.255.0 up
       /sbin/route add -host $VIP dev eth0:1
       #Clear IPVS Table
       /sbin/ipvsadm -C
       #Set Lvs
       /sbin/ipvsadm -A -t $VIP:80 -s wrr               #增加服務 HTTP
       /sbin/ipvsadm -a -t $VIP:80 -r $RIP1:80 -g       #增加服務的真實服務器記錄
       /sbin/ipvsadm -a -t $VIP:80 -r $RIP2:80 -g
        /sbin/ipvsadm -A -t $VIP:22 -s wrr              #增加服務 SSH
        /sbin/ipvsadm -a -t $VIP:22 -r $RIP1:22 -g
        /sbin/ipvsadm -a -t $VIP:22 -r $RIP2:22 -g
        /sbin/ipvsadm -A -t $VIP:6379 -s wrr            #增加服務 Redis
        /sbin/ipvsadm -a -t $VIP:6379 -r $RIP1:6379 -g
        /sbin/ipvsadm -a -t $VIP:6379 -r $RIP2:6379 -g

         #Run Lvs
       /sbin/ipvsadm
;;
stop)
echo "Close LVS Directorserver"
/sbin/ifconfig eth0:1 down
/sbin/ipvsadm -C
;;
*)
echo "Usage0{start|stop}"
exit 1
esac

查看調用情況:
ipvsadm -L --stats 或 ipvsadm -ln
幾點說明一下:
  -C:清除虛擬內核服務器表中記錄
  -A: 添加虛擬服務器
  -s:使用的調度算法,有這樣幾個選項rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq,默認的調度算法是:wlc
  -a:-add-server 在內核虛擬服務器表的一條記錄裡添加一條新的真實服務器記錄。也就是在一個虛擬服務器中增加一台新的真實服務器
  -r: 真實的服務器
  -g:--gatewaying 指定LVS 的工作模式為直接路由模式(也是LVS 默認的模式)
4、配置HTTP服務業面
#vi /var/www/html/index.html
內容:<h1>WEB1 / 192.168.0.157</h1>
備注:不同的realServer把內容中的IP對應改一下
5、啟動服務
service keepalived restart
./lvsdr.sh start
因為配置裡有時間設置,以及網絡協商, 有時可能需要等一會才能生效
然後就測試吧!!!
如果連不通,請查看iptables、selinx
//參考:
http://jingpin.jikexueyuan.com/article/27180.html http://www.myexception.cn/vsts/440810.html http://blog.csdn.net/beyondlpf/article/details/17963907 http://www.it165.net/admin/html/201305/1274.html http://www.tuicool.com/articles/jaeY7nA http://blog.chinaunix.net/uid-26893610-id-3196774.html http://www.cnblogs.com/mchina/archive/2012/08/27/2644391.html

				
			
			
			
Copyright © Linux教程網 All Rights Reserved