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,到此配置成功了,親自測試,祝君成功