lvs+keepalived 負載均衡

LVS是一個開源的軟件,可以實現LINUX平臺下的簡單負載均衡。LVS是Linux Virtual Server的縮寫,意思是Linux虛擬服務器。目前有三種IP負 載均衡技術(VS/NAT、VS/TUN和VS/DR);八種調度算法(rr,wrr,lc,wlc,lblc,lblcr,dh,sh)。

LVS+keepalived能很好的實現以上的要求,LVS提 供負載均衡,keepalived提供健康檢查,故障轉移,提高系統的可用性!採用這樣的架構以後 很容易對現有系統進行擴展,只要在後端添加或者減少realserver,只要更改lvs的 配置文件,並能實現無縫配置變更!

軟件負載均衡一般通過兩種方式來實現:基於操作系統的軟負載實現和基於第三方應用的軟負載實現。LVS就是基於Linux操作系統實現的一種軟負載,HAProxy就是開源的並且基於第三應用實現的軟負載。還可以使用nginx來實現,不過nginx只工作在7層網絡之上。詳細請參考撫琴煮酒寫的“軟件級負載均衡器(LVS/HAProxy/Nginx)的特點簡介和對比”這篇文章,簡單很詳細,很好。

1.實驗環境

系統版本:CentOS release 5.9 (Final) x86 32位  
ipvsadm版本:1.24 
Keepalived版本:1.1.15  
   
  
MASTER_IP:192.168.207.130    
BACKUP_IP:192.168.207.131   
   
VIP:192.168.207.140    
WEB_1:192.168.207.129 80端口    
WEB_2:192.168.207.130 80端口  

2.安裝lvs軟件

安裝在192.168.207.130和192.168.207.131

mkdir /usr/local/src/lvs  
cd /usr/local/src/lvs  
wget http://www.linuxvirtualserver.org/software/kernel-2.6/ipvsadm-1.24.tar.gz  
ln -s /usr/src/kernels/2.6.18-53.el5PAE-i686/ /usr/src/linux  
tar zxvf ipvsadm-1.24.tar.gz  
cd ipvsadm-1.24  
make   
make install 

3.安裝keepalived軟件

安裝在192.168.207.130和192.168.207.131

wget http://www.keepalived.org/software/keepalived-1.1.15.tar.gz  
tar -zxvf keepalived-1.1.15.tar.gz  
cd keepalived-1.1.15  
./configure --prefix=/usr/local/keepalived  
make && make install  
  
cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/keepalived  
cp /usr/local/keepalived/sbin/keepalived /usr/sbin/  
cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/  
mkdir -p /etc/keepalived/  
cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf   
chmod +x /etc/init.d/keepalived  

寫keepalived的配置文件

vi /etc/keepalived/keepalived.conf 

內容如下:

! Configuration File for keepalived
global_defs {
   notification_email {
         [email protected]
   }
   notification_email_from [email protected]
   smtp_server 127.0.0.1
   router_id LVS_DEVEL
}
vrrp_instance VI_1 {
    state MASTER                      #從keepalived要寫成BACKUP
    interface eth0
    virtual_router_id 51
    priority 100                      #從keepalived要寫成小於100的數,就寫成99就可以了,範圍是0~255,但是主要比從大,這樣權重纔會大
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.207.140
    }
}
virtual_server 192.168.207.140 80 {
    delay_loop 6
    lb_algo wrr
    lb_kind DR
#    persistence_timeout 60             #這裏就不要開啓持久連接了,爲了更方便的查看負載均和的效果
    protocol TCP
    real_server 192.168.207.129 80 {
        weight 3
        TCP_CHECK {
        connect_timeout 10
        nb_get_retry 3
        delay_before_retry 3
        connect_port 80
         }
    }
    real_server 192.168.207.130 80 {
        weight 3
        TCP_CHECK {
        connect_timeout 10
        nb_get_retry 3
        delay_before_retry 3
        connect_port 80
        }
     }
}

注:這裏我想說一下lvs的session問題的處理功能,因爲他不像haproxy和nginx可以工作在7層,所以lvs只提供簡單的維持session功能的參數,就是persistence_timeout,哇,這個只是說你同一個source只能大概給你個session維持時間,不像haproxy的source算法和nginx的ip_hash功能,所以啊,這方面lvs做的不是太好。


keepalived.conf內容說明如下:


全局定義塊


1、email通知。作用:有故障,發郵件報警。

2、Lvs負載均衡器標識(lvs_id)。在一個網絡內,它應該是唯一的。

3、花括號“{}”。用來分隔定義塊,因此必須成對出現。如果寫漏了,keepalived運行時,不會得到預期的結果。由於定義塊內存在嵌套關係,因此很容易遺漏結尾處的花括號,這點要特別注意。

VRRP定義塊


1、同步vrrp組vrrp_sync_group。作用:確定失敗切換(FailOver)包含的路由實例個數。即在有2個負載均衡器的場景,一旦某個負載均衡器失效,需要自動切換到另外一個負載均衡器的實例是哪些?
2、實例組group。至少包含一個vrrp實例。
3、Vrrp實例vrrp_instance。實例名出自實例組group所包含的那些名字。

(1)實例狀態state。只有MASTER和BACKUP兩種狀態,並且需要大寫這些單詞。其中MASTER爲工作狀態,BACKUP爲備用狀態。當MASTER所在的服務器失效時,BACKUP所在的系統會自動把它的狀態有BACKUP變換成MASTER;當失效的MASTER所在的系統恢復時,BACKUP從MASTER恢復到BACKUP狀態。

(2)通信接口interface。對外提供服務的網絡接口,如eth0,eth1.當前主流的服務器都有2個或2個以上的接口,在選擇服務接口時,一定要覈實清楚。

(3)lvs_sync_daemon_inteface。負載均衡器之間的監控接口,類似於HA HeartBeat的心跳線。但它的機制優於Heartbeat,因爲它沒有“裂腦”這個問題,它是以優先級這個機制來規避這個麻煩的。在DR模式中,lvs_sync_daemon_inteface 與服務接口interface 使用同一個網絡接口。

(4)虛擬路由標識virtual_router_id。這個標識是一個數字,並且同一個vrrp實例使用唯一的標識。即同一個vrrp_stance,MASTER和BACKUP的virtual_router_id是一致的,同時在整個vrrp內是唯一的。

(5)優先級priority。這是一個數字,數值愈大,優先級越高。在同一個vrrp_instance裏,MASTER 的優先級高於BACKUP。若MASTER的priority值爲150,那麼BACKUP的priority只能是140或更小的數值。

(6)同步通知間隔advert_int。MASTER與BACKUP負載均衡器之間同步檢查的時間間隔,單位爲秒。

(7)驗證authentication。包含驗證類型和驗證密碼。類型主要有PASS、AH兩種,通常使用的類型爲PASS,據說AH使用時有問題。驗證密碼爲明文,同一vrrp實例MASTER與BACKUP 使用相同的密碼才能正常通信。

4、 虛擬ip地址virtual_ipaddress。可以有多個地址,每個地址佔一行,不需要指定子網掩碼。注意:這個ip必須與我們在lvs客戶端設定的vip相一致!

虛擬服務器virtual_server定義塊


虛擬服務器定義是keepalived框架最重要的項目了,是keepalived.conf必不可少的部分。

1、虛擬服務器virtual_server。這個ip來自於vrrp定義塊的第“4”步,後面一個空格,然後加上端口號。定義一個vip,可以實現多個tcp端口的負載均衡功能。

(1)delay_loop。健康檢查時間間隔,單位是秒。

(2)lb_algo。負載均衡調度算法,互聯網應用常使用wlc或rr。

(3)lb_kind。負載均衡轉發規則。一般包括DR、NAT、TUN3種,在我的方案中,都使用DR的方式。

(4)persistence_timeout。會話保持時間,單位是秒。這個選項對動態網站很有用處:當用戶從遠程用帳號進行登陸網站時,有了這個會話保持功能,就能把用戶的請求轉發給同一個應用服務器。在這裏,我們來做一個假設,假定現在有一個lvs 環境,使用DR轉發模式,真實服務器有3個,負載均衡器不啓用會話保持功能。當用戶第一次訪問的時候,他的訪問請求被負載均衡器轉給某個真實服務器,這樣他看到一個登陸頁面,第一次訪問完畢;接着他在登陸框填寫用戶名和密碼,然後提交;這時候,問題就可能出現了---登陸不能成功。因爲沒有會話保持,負載均衡器可能會把第2次的請求轉發到其他的服務器。

(5)轉發協議protocol。一般有tcp和udp兩種。實話說,我還沒嘗試過udp協議類的轉發。

2、真實服務器real_server,也即服務器池。Real_server的值包括ip地址和端口號,多個連續的真實ip。

(1)權重weight,權重值是一個數字,數值越大,權重越高。使用不同的權重值的目的在於爲不同性能的機器分配不同的負載,性能較好的機器,負載分擔大些;反之,性能差的機器,則分擔較少的負載,這樣就可以合理的利用不同性能的機器資源。


(2)Tcp檢查tcp_check。

4.在2臺web機上設置VIP

在192.168.207.129和192.168.207.130上做

vi /root/VIP.sh

內容如下:

#!/bin/bash  
SNS_VIP=192.168.207.140  
. /etc/rc.d/init.d/functions  
case "$1" in  
start)  
       ifconfig lo:0 $SNS_VIP netmask 255.255.255.255 broadcast $SNS_VIP  
       /sbin/route add -host $SNS_VIP dev lo:0  
       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  
       sysctl -p >/dev/null 2>&1  
       echo "RealServer Start OK"   
       ;;  
stop)  
       ifconfig lo:0 down  
       route del $SNS_VIP >/dev/null 2>&1  
       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  
       echo "RealServer Stoped"  
       ;;  
*)  
       echo "Usage: $0 {start|stop}"  
       exit 1  
esac  
exit 0 

爲什麼要做這一步,我思考了一下,因爲在這裏lvs只做分發數據包使用,不像haproxy工作在七層,所以lvs必須知道要把數據包分發到哪些後臺機器上,做了這步後,通過數據鏈路層的組播功能,直接把包按照lvs的算法分發到後臺服務器上。

在兩天機器上風別運行這個腳本

bash VIP.sh start
查看VIP

ifconfig

可以看到多了一條記錄,這就是VIP

lo:0      Link encap:Local Loopback  
          inet addr:192.168.207.140  Mask:255.255.255.255
          UP LOOPBACK RUNNING  MTU:16436  Metric:1


5.啓動keepalived

在192.168.207.130和192.168.207.131操作

/etc/init.d/keepalived start

在主keepalived上運行

ip addr

會看到

 eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000
    link/ether 00:0c:29:ed:4c:08 brd ff:ff:ff:ff:ff:ff
    inet 192.168.207.130/24 brd 192.168.207.255 scope global eth0
    inet 192.168.207.140/32 scope global eth0
    inet6 fe80::20c:29ff:feed:4c08/64 scope link 
       valid_lft forever preferred_lft forever
這個是keepalived自動在eth0添加了個VIP,這個是根據配置文件
virtual_ipaddress {
        192.168.207.140
    }

來定義的,不過呢只有主keepalived的服務器上纔會這麼做,從keepalived服務器不會設置VIP的,除非從服務器轉成了主服務器。

在瀏覽器查看http://192.168.207.140來查看lvs的調度後臺的web服務器的數據

在主keepalived服務器上運行

watch ipvsadm -ln

來查看lvs的調度情況

IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.207.140:80 wrr
  -> 192.168.207.130:80           Local   3      0          7
  -> 192.168.207.129:80           Route   3      0          8

6.模擬主服務器down掉

只要把主keepalived關掉就好了

可以看到從keepalived的/var/log/messages日誌

Apr 18 16:00:29 localhost Keepalived_vrrp: VRRP_Instance(VI_1) Transition to MASTER STATE
Apr 18 16:00:30 localhost Keepalived_vrrp: VRRP_Instance(VI_1) Entering MASTER STATE
Apr 18 16:00:30 localhost Keepalived_vrrp: VRRP_Instance(VI_1) setting protocol VIPs.
Apr 18 16:00:30 localhost Keepalived_vrrp: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth0 for 192.168.207.140
Apr 18 16:00:30 localhost Keepalived_vrrp: Netlink reflector reports IP 192.168.207.140 added
Apr 18 16:00:30 localhost Keepalived_healthcheckers: Netlink reflector reports IP 192.168.207.140 added
Apr 18 16:00:30 localhost avahi-daemon[4204]: Registering new address record for 192.168.207.140 on eth0.

立即變成了keepalived,訪問url還是依舊正常


在把原主keepalived服務打開,可以在原從keepalived看到日誌

Apr 18 16:03:17 localhost Keepalived_vrrp: VRRP_Instance(VI_1) Received higher prio advert
Apr 18 16:03:17 localhost Keepalived_vrrp: VRRP_Instance(VI_1) Entering BACKUP STATE
Apr 18 16:03:17 localhost Keepalived_vrrp: VRRP_Instance(VI_1) removing protocol VIPs.
Apr 18 16:03:17 localhost Keepalived_vrrp: Netlink reflector reports IP 192.168.207.140 removed
Apr 18 16:03:17 localhost Keepalived_healthcheckers: Netlink reflector reports IP 192.168.207.140 removed
Apr 18 16:03:17 localhost avahi-daemon[4204]: Withdrawing address record for 192.168.207.140 on eth0.

ok,到此配置成功了,親自測試,祝君成功



發佈了38 篇原創文章 · 獲贊 20 · 訪問量 17萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章