LVS+keepalived 實作高可用、高性能、高伸縮性叢集架構,拜托當機,迎接流量洪峰,減少營運成本
本章筆者親自動手,使用LVS技術實作實作一個可以支援龐大通路量、高可用性、高伸縮性的伺服器叢集
在讀本章之前,可能有不少讀者尚未使用該技術,或者部分讀者使用Nginx實作應用層的負載均衡。這裡大家都可以閱讀本章,即使部分讀者使用Nginx負載均衡,但是在大流量下性能相對于工作在鍊路層的LVS真是不能同日而語,并且LVS不僅可以實作WEB方面的負載均衡,其他諸如資料庫、FTP、Mail等都可以實作。
通常對于小型網站,很多都使用單台伺服器,頂多在弄個緩存伺服器、資料庫伺服器。但是一旦流量上來,單台伺服器在再害也無法應對流量洪峰,況且如果這台伺服器挂了整個網站就算是挂了。而且大家會發現,一般都是在節假日或者做活動時流量突增,如果使用單台性能十分高的伺服器,很多時候資源都在閑置着,那麼我們是否能在流量高峰之前加幾台等流量過去了再減幾台,這樣是不是省了很多money了。
高性能、搞可用性、高伸縮性,這些我想都是大部分IT人員日夜追尋的,筆者不才,親自手動搭建一個LVS負載均衡叢集來實作讀者的夢想。
首先介紹下雙機熱備,負載均衡的架構

"主director server"和"備用director server"是路由排程層,平時由"住director server"進行路由分發,"備用director server"平時作為"主director server" 的備份,當"主director server"出現故障的時候自動切換到"備用director server"上面,當其恢複後再次切換回來,這樣主備一起就實作了雙機熱備避免單點故障。
當使用者通路時,包被發送到"主director server","主director server"根據相應規則以及伺服器叢集各個節點的負載情況将流量均衡配置設定給相應伺服器節點。當伺服器叢集中有節點出現故障時,自動将該節點踢出,待修複後再自動加入該節點。以此實作分流,降低單台伺服器壓力,同時保證整個伺服器叢集的高可用性。
LVS是通過IP負載均衡技術實作負載均衡的,具體到本章的Centos環境,就是通過IPVS子產品來實作的。IPVS的主要作用是:它安裝在director server 上面,同時在director server上面虛拟出一個IP,使用者必須通過虛拟的IP位址通路伺服器,這個虛拟的IP一般稱為LVS的虛拟IP,通路者的請求先經過VIP到達負載均衡排程器,然後由負載均衡排程器容從Real Server 清單中選擇一個節點響應使用者的請求。在使用者的請求到達director server 後,director server如何提供伺服器到real server, real server 節點如何傳回資料給使用者是IPVS技術的重點
IPVS實作負載均衡的技術有三種:
VS/NAT : 即網絡位址翻譯技術實作負載均衡, 當使用者請求到達負載均衡排程器後,排程器将請求的目标位址(即虛拟IP)改為標明的real server位址,同時将目标端口改成相應的real server 端口,最後将封包發送給標明的real server。real server将資料傳回給使用者時,需要再次經過負載均衡排程器,将封包的源位址和端口位址改為相應的虛拟IP和端口,然後經過排程器發送給用戶端。可以看出NAT模式下,封包都必須通過director server 對位址和端口進行改寫,流量大的情況下,director server将成為瓶頸。
VS/TUN:通過IP隧道技術實作虛拟伺服器。這種方式的連結排程管理和NAT方式相同,隻是封包轉發方法不一樣。在VS/TUN模式下,排程器采用IP隧道技術将使用者的請求轉發到某個real server節點上,而這個real server 将直接響應使用者的請求,不再經過前端排程器。此外對real server的地域位置沒有要求,其可以喝director server在同一個網絡,也可以位于單獨的網絡。是以,相對于NAT模式,VS/TUN模式大大提高系統吞吐量。
VS/DR:也就是直接路由技術實作虛拟伺服器。這種方式的連結排程管理和前兩種方式一樣,但它的封包轉發方法又有所不同,VS/DR通過改寫封包的請求MAC位址,将請求發送到real server, 而real server将相應直接傳回給客戶,免去VS/TUN的IP隧道開銷。這三種方式中,VS/TR的負載排程模式性能最好,但要求director server 與 real server 由同一塊網卡連結在同一個實體網絡中。
負載排程算法有四中:
輪叫排程:通過"輪叫"排程算法将外部使用者請求按1:1的配置設定到叢集中每個real server節點上,這種算法平等對待每台real server。
權重輪叫排程:該算法根據real server的不同處理能力來排程通路請求。可以對每台real server設定不同的排程權值,性能高的設定高些,性能低的設定低些,進而保證性能好的處理更多流量,充分合理利用伺服器資源。同時排程器動态查詢real server的負載情況,并動态調整其權值。
最少連接配接排程:該排程算法動态的将請求排程到連接配接數最少的real server 上。
權重最少連接配接排程:該算法是"最少連接配接排程"算法的增強版,每個伺服器可以設定相應的權值表示其處理能力,而系統管理者可以設定其權值,其在配置設定請求時盡可能使伺服器連接配接數和其權值成正比。
好了,介紹完以上知識,我們這裡就要實踐一下這個HA雙機熱備、負載均衡叢集了
第一步:配置各個伺服器IP
這裡私有IP怎樣配置筆者就不再累述了,這裡就講下虛拟IP如何配置(主備不需要虛拟IP的配置,keepalived或者heartbeat會自動進行配置,筆者這裡主要是講的real server節點的虛拟IP配置),這裡筆者通過shell腳本實作,shell的内如如下(/etc/init.d/functions 要給755權限奧)
#!/bin/bash
#開啟或關閉real server 服務
VIP=192.168.138.200
./etc/rc.d/init.d/functions
case "$1" in
start)
echo "Start LVS of Real Server 3"
/sbin/ifconfig lo:0 $VIP broadcast $VIP netmask 255.255.255.255 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
;;
stop)
/sbin/ifconfig lo:0 down
echo "Close LVS Director Server"
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 "Usage:$0 {start|stop}"
exit 1
esac
然後放到 '/etc/init.d/lvsrs' 并賦予權限
chomd 755 /etc/init.d/lvsrs
第二步:在主、備 director server 上安裝 keepalived ipvsadm 等軟體
其中keepalived 用來監控伺服器叢集各個節點的狀态,如果某個服務節點出現異常或工作出現故障,keepalived将檢測到并将故障的節點從叢集中踢出出去,當節點恢複正常後keepalived又自動的将節點加入到叢集中。
ipvsadm 是ipvs子產品的管理軟體,而LVS(Linux 虛拟主機)就是通過IPVS子產品來實作的,由于筆者使用的是Centos6.4,核心已經預設支援LSV功能了,這裡可以通過指令檢測kernel是否已經支援LVS的IPVS子產品
modprobe -l|grep 'ipvs'
如果列出以下結果就算支援了
kernel/net/netfilter/ipvs/ip_vs.ko
kernel/net/netfilter/ipvs/ip_vs_rr.ko
kernel/net/netfilter/ipvs/ip_vs_wrr.ko
kernel/net/netfilter/ipvs/ip_vs_lc.ko
kernel/net/netfilter/ipvs/ip_vs_wlc.ko
kernel/net/netfilter/ipvs/ip_vs_lblc.ko
kernel/net/netfilter/ipvs/ip_vs_lblcr.ko
kernel/net/netfilter/ipvs/ip_vs_dh.ko
kernel/net/netfilter/ipvs/ip_vs_sh.ko
kernel/net/netfilter/ipvs/ip_vs_sed.ko
kernel/net/netfilter/ipvs/ip_vs_nq.ko
kernel/net/netfilter/ipvs/ip_vs_ftp.ko
先到其官網上下載下傳最新版本的源碼安裝包
安裝之前你先确認下 /usr/src/kernels/目錄是不是空的,如果是空的還要安裝這兩個東東
yum install -y kernel-devel kernel
tar -zxvf keepalived-1.2.19.tar.gz
cd keepalived-1.2.19
./configure --prefix=/usr/local/keepalived --with-kernel-dir=/usr/src/kernels/2.6.32-573.12.1.el6.i686
make && make install
安裝ipvsadm 管理軟體
yum install ipvsadm
第三步:配置keepalived
用keepalived + lvs 來實作雙機熱備和負載均衡
先對"主director server"進行配置,這裡筆者貼出自己的配置檔案 '/usr/local/keepalived/etc/keepalived/keepalived.conf'
#這裡是全局定義部分
global_defs {
notification_email {
[email protected] #設定報警郵件位址 每行一個 可以設定多個
[email protected]
[email protected]
}
notification_email_from [email protected] #郵件的發送位址
smtp_server 192.168.138.10 #smtp 位址
smtp_connect_timeout 30 #連接配接smtp伺服器逾時的實際
router_id LVS_DEVEL
}
#vrrp 執行個體定義部分
vrrp_instance VI_1 {
state MASTER #keepalived 的角色 MASTER 表示主機是主伺服器 BACKUP表示是以備用伺服器
interface eth0 #指定監測的網絡網卡
virtual_router_id 51 #虛拟路由标示
priority 100 #定義優先級 數字越大 優先級越高 MASTER的優先級必須大于BACKUP的優先級
advert_int 1 #設定主備之間檢查時間 機關s
authentication { #設定驗證類型和密碼
auth_type PASS
auth_pass 1111
}
virtual_ipaddress { #設定虛拟IP位址 可以設定多個 每行一個
192.168.138.200
}
}
#虛拟伺服器部分
virtual_server 192.168.138.200 80 {
delay_loop 6 #設定運作情況檢查時間 機關s
lb_algo rr #負載排程算法 rr即輪叫算法
lb_kind DR #設定LVS負載機制 NAT TUN DR 三種模式可選
nat_mask 255.255.255.0
persistence_timeout 0 #會話保持時間
#有了這個會話保持功能 使用者的請求會被一直分發到某個服務節點
#如果使用者在動态頁面50s内沒有任何動作,那麼後面就會被分發到其他節點
#如果使用者一直有動作,不受50s限制
protocol TCP #協定
#real server部分
real_server 192.168.138.3 80 {
weight 1 #服務節點權值,數字越大,權值越高
#權值的大小可以為不同性能的伺服器配置設定不同的負載
#這樣才能有效合理的利用伺服器資源
TCP_CHECK { #狀态檢查部分
connect_timeout 3 #3s無響應逾時
nb_get_retry 3 #重試次數
delay_before_retry 3 #重試間隔
connect_port 80 #連接配接端口
}
}
#real server部分
real_server 192.168.138.4 80 {
weight 1 #服務節點權值,數字越大,權值越高
#權值的大小可以為不同性能的伺服器配置設定不同的負載
#這樣才能有效合理的利用伺服器資源
TCP_CHECK { #狀态檢查部分
connect_timeout 3 #3s無響應逾時
nb_get_retry 3 #重試次數
delay_before_retry 3 #重試間隔
connect_port 80 #連接配接端口
}
}
}
然後筆者再貼出備分主機的配置
#這裡是全局定義部分
global_defs {
notification_email {
[email protected] #設定報警郵件位址 每行一個 可以設定多個
[email protected]
[email protected]
}
notification_email_from [email protected] #郵件的發送位址
smtp_server 192.168.138.10 #smtp 位址
smtp_connect_timeout 30 #連接配接smtp伺服器逾時的實際
router_id LVS_DEVEL
}
#vrrp 執行個體定義部分
vrrp_instance VI_1 {
state BACKUP #keepalived 的角色 MASTER 表示主機是主伺服器 BACKUP表示是以備用伺服器
interface eth0 #指定監測的網絡網卡
virtual_router_id 51 #虛拟路由标示
priority 80 #定義優先級 數字越大 優先級越高 MASTER的優先級必須大于BACKUP的優先級
advert_int 1 #設定主備之間檢查時間 機關s
authentication { #設定驗證類型和密碼
auth_type PASS
auth_pass 1111
}
virtual_ipaddress { #設定虛拟IP位址 可以設定多個 每行一個
192.168.138.200
}
}
#虛拟伺服器部分
virtual_server 192.168.138.200 80 {
delay_loop 6 #設定運作情況檢查時間 機關s
lb_algo rr #負載排程算法 rr即輪叫算法
lb_kind DR #設定LVS負載機制 NAT TUN DR 三種模式可選
nat_mask 255.255.255.0
persistence_timeout 0 #會話保持時間
#有了這個會話保持功能 使用者的請求會被一直分發到某個服務節點
#如果使用者在動态頁面50s内沒有任何動作,那麼後面就會被分發到其他節點
#如果使用者一直有動作,不受50s限制
protocol TCP #協定
#real server部分
real_server 192.168.138.3 80 {
weight 1 #服務節點權值,數字越大,權值越高
#權值的大小可以為不同性能的伺服器配置設定不同的負載
#這樣才能有效合理的利用伺服器資源
TCP_CHECK { #狀态檢查部分
connect_timeout 3 #3s無響應逾時
nb_get_retry 3 #重試次數
delay_before_retry 3 #重試間隔
connect_port 80 #連接配接端口
}
}
#real server部分
real_server 192.168.138.4 80 {
weight 1 #服務節點權值,數字越大,權值越高
#權值的大小可以為不同性能的伺服器配置設定不同的負載
#這樣才能有效合理的利用伺服器資源
TCP_CHECK { #狀态檢查部分
connect_timeout 3 #3s無響應逾時
nb_get_retry 3 #重試次數
delay_before_retry 3 #重試間隔
connect_port 80 #連接配接端口
}
}
}
整完了之後要把'/usr/local/keepalived/etc/rc.d/init.d/keepalived'複制到'/etc/rc.d/init.d/'目錄下
吧'/usr/local/keepalived/etc/sysconfig/keepalived' 複制到'/etc/sysconfig/'目錄下
把'/usr/local/keepalived/sbin/keepalived' 複制到'/sbin/'目錄下
把'/usr/local/keepalived/etc/keepalived/keepalived.conf'複制到'/etc/keepalived/'目錄下
cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/rc.d/init.d/
cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
cp /usr/local/keepalived/sbin/keepalived /sbin/
mkdir -p /etc/keepalived
cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
由于keepalived日志檔案放在'/var/log/message'下,該檔案還有其他東西的日志不便于閱讀,這裡筆者為其指定單獨的位置 '/usr/local/keepalived/logs/keepalived.log'
先要修改 '/etc/sysconfig/keepalived' 檔案,在最後一行 KEEPALIVED_OPTIONS="-D" 換成 KEEPALIVED_OPTIONS="-D -d -S 0" (筆者算是醉了,尼瑪軟體開發者難道不能給個參數指定日志檔案路徑嗎),然後在/etc/rsyslog.conf 後面加上一句
#keepalived -S 0
local0.* /usr/local/keepalived/logs/keepalived.log
然後建立日志目錄
mkdir -p /usr/local/keepalived/logs
然後重新啟動系統日志
/etc/init.d/rsyslog restart
然後我們啟動 主備 keepalived 和 服務節點的lvsrs
service keepalived start
service lvsrs start
然後我們啟動 real server 的nginx
/usr/local/nginx/sbin/nginx
第四步:測試
首先我們來測試負載均衡部分,筆者這裡整個腳本 test.sh
#!/bin/bash
if [ ! -f "/root/backup/test.txt" ]
then
touch /root/backup/test.txt
fi
for((i=0;i<10;i++))
do
curl http://192.168.138.200 >> /root/backup/test.txt
sleep 1
done
然後運作之
./test.sh
然後我們到 主director server 上面瞅瞅
ipvsadm
然後出現下面這個結果
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.138.200:http rr
-> 192.168.138.3:http Route 1 0 5
-> 192.168.138.4:http Route 1 0 5
就對了,每個都被分發了5次
當然,你不放心可以檢視'/root/backup/test.txt'檔案,看看裡面的内容是否都是循環的列出的(筆者這裡兩個首頁内容略有不同以便于區分)
接着我們将real server 某台nginx停掉,看看效果
/usr/local/nginx/sbin/nginx -s stop
我們來看看master的日志
cat /usr/local/keepalived/keepalived.log
Feb 3 18:01:46 localhost Keepalived_healthcheckers[706]: TCP connection to [192.168.138.3]:80 failed !!!
Feb 3 18:01:46 localhost Keepalived_healthcheckers[706]: Removing service [192.168.138.3]:80 from VS [192.168.138.200]:80
Feb 3 18:01:46 localhost Keepalived_healthcheckers[706]: SMTP connection ERROR to [192.168.138.10]:25.
瞅着了吧先是連接配接不上192.168.138.3,然後從清單中移除,然後發送預警郵件(筆者這裡郵件瞎配的是以連接配接不上SMTP伺服器)
當然你也可以通路下頁面,再也看不到192.168.138.4 了
最後我們來驗證雙機熱備部分
我們把master keepalived 服務停掉
service keepalived stop
然後我們檢視下backup的日志
Feb 3 18:05:06 localhost Keepalived_vrrp[5549]: VRRP_Instance(VI_1) Transition to MASTER STATE
Feb 3 18:05:07 localhost Keepalived_vrrp[5549]: VRRP_Instance(VI_1) Entering MASTER STATE
Feb 3 18:05:07 localhost Keepalived_vrrp[5549]: VRRP_Instance(VI_1) setting protocol VIPs.
Feb 3 18:05:07 localhost Keepalived_vrrp[5549]: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth0 for 192.168.138.200
Feb 3 18:05:07 localhost Keepalived_healthcheckers[5548]: Netlink reflector reports IP 192.168.138.200 added
Feb 3 18:05:12 localhost Keepalived_vrrp[5549]: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth0 for 192.168.138.200
可以看到backup director 自動變為MASTER , 我們可以通路下 192.168.138.200
OK,然後我們再次啟動MASTER
service keepalived start
再看看BACKUP的日志檔案
b 3 18:08:09 localhost Keepalived_vrrp[5549]: VRRP_Instance(VI_1) Received higher prio advert
Feb 3 18:08:09 localhost Keepalived_vrrp[5549]: VRRP_Instance(VI_1) Entering BACKUP STATE
Feb 3 18:08:09 localhost Keepalived_vrrp[5549]: VRRP_Instance(VI_1) removing protocol VIPs.
Feb 3 18:08:09 localhost Keepalived_healthcheckers[5548]: Netlink reflector reports IP 192.168.138.200 removed
自動切換回BACKUP
OK,自此,筆者所說的雙機熱備+負載均衡+實效轉移 實作高可用、高性能、高伸縮性能的服務叢集已經搭建完成,希望能應用到讀者日常工作中