上篇記錄了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