Linux LVS(Linux virtual server)V1.26 負載均衡 詳細配置教程
配置思路:
- 安裝LVS服務器 在LVS服務器上安裝kernel 鏈接內核文件 並手動綁定VIP
- 配置realserver後端服務,手動執行VIP綁定腳本
2.1 LVS 概念
LVS是Linux Virtual Server的簡稱,也就是Linux虛擬服務器, 是一個由章文嵩博士發起的自由軟件項目,它的官方站點是www.linuxvirtualserver.org。現在LVS已經是 Linux標準內核的一部分,在Linux2.4內核以前,使用LVS時必須要重新編譯內核以支持LVS功能模塊,但是從Linux2.4內核以後,已經完全內置了LVS的各個功能模塊,無需給內核打任何補丁,可以直接使用LVS提供的各種功能。
LVS是一個模塊,可以單獨使用,但是配合keepalived更方便,
版本: 根據內核選擇版本
Branch Version Release date Status License
IPVS for kernel 2.6
1.2.1
24-Dec-2004 Stable GNU General Public License (GPL)
IPVS for kernel 2.5
1.1.7
5-Jul-2003 Devel GNU General Public License (GPL)
IPVS for kernel 2.4
1.0.12
17-Nov-2004 Stable GNU General Public License (GPL)
1.0.8
14-May-2001 Stable GNU General Public License (GPL)
LVS負載均衡方案
- 通過自已書寫腳本的方式監控LVS
- heartbeat+lvs+ldirectord 比較復雜,不易控制
- 通過redhat提供的工具piranha來配置lvs
- keepalived+LVS方案(推薦)
2.2 LVS 負載均衡模式
VIP 虛擬IP地址(Virtual Ip Address)
RIP 後端服務器真實IP(Real Server IP Address)
DIP Director的IP地址(Director IP Address) 主要是連接後端服務器和外網的網卡IP地址
2.2.1 LVS DR模式:直接路由 (企業常用)
- 用戶請求VIP, 將數據包發送到LVS服務器,(這裏是通過ARP廣播找到LVS服務器的),包的源IP是CIP,目的IP是VIP
- LVS收到請求包後,根據調度算法和轉發方式,將數據包轉發到其中的某一臺RS服務器上,並將數據包的目的mac地址修改成RS的mac地址。
- RS收到數據包後,首先要做包的解封裝,發現目的mac和目的IP都是本地的,於是會接收並處理數據包,(因為RS上的lo接口都綁定了VIP,所以它認為是給自已的包)
- RS將請求的目的IP修改為CIP,源IP為本地的VIP,將結果直接返回給客戶端,(轉發的過程是通過arp廣播的方式,通過網關轉發出去的)
優缺點:
- LVS和RS都需要配置VIP,而且必須在同一網段中,因為它是通過修改MAC地址來實現轉發
- DR模式僅修改了目的MAC地址,所以無法更改目的端口,所以RS和LVS端口必須一致
- RS最好能有外網IP,如果是通過內網服務器做網關,那麽壓力瓶頸會很大
2.2.2 LVS NAT模式:網絡地址轉換
NAT(Network Address Translation)是一種外網和內網地址映射的技術。NAT模式下,網絡數據報的進出都要經過LVS的處理。LVS需要作為RS(真實服務器)的網關。當包到達LVS時,LVS做目標地址轉換(DNAT),將目標IP改為RS的IP。RS接收到包以後,仿佛是客戶端直接發給它的一樣。RS處理完,返回響應時,源IP是RS IP,目標IP是客戶端的IP。這時RS的包通過網關(LVS)中轉,LVS會做源地址轉換(SNAT),將包的源地址改為VIP,
註 NAT模式需要開啟路由轉發
vi /etc/sysctl.conf
net.ipv4.ip_forward = 1
執行sysctl –p 生效
特點:
- 後端RS不需要外網IP和接入外網
- RS節點的網關必須指向LVS
- LVS瓶頸大
- NAT支持LVS與RS的端口中不一致,
- 所有RS節點不需要配置VIP,
- LVS需要開啟路由轉發
2.2.3 LVS TUN 隧道
可以實現一些應用的跨機房的高可用
2.2.4 LVS FULL NAT
實現多個LB調度器來處理請求,(OSPF+多臺LVS)
2.3 LVS 調度算法
固定調度算法:rr,wrr,dh,sh
動態調度算法:wlc,lc,lblc,SED,NQ
常用算法: rr, wrr, wlc
rr 輪循調度(Round-Robin),它將請求依次分配不同的RS節點,也就是在RS節點中均攤請求,這種算法簡單,但 只適合RS節點處理性能差不大的情況
wrr, 加權輪循調度(weighted Round-Robin),它將依據不同RS節點的權值分配任務,權值較高的RS將優先獲得任務 ,並且分配到的連接數將比權值較低的RS節點更多,相同的權值的RS得到相同的數目的連接數
dh 目的地址哈希調度(Destination Hashing)以目的地址為關鍵字查找一個靜態hash表來獲得需要的RS
sh 源地址哈希調度(source hashing)以源地址為關鍵字查找一個靜態hash表來獲得需要的RS
wlc 加權最小連接數調度(weighted Least-Connection),假設各臺RS的權值依次為Wi(I=1..n),當前的TCP連接 數依次為Ti(I=1..n),依次選取Ti/Wi為最小的RS作為下一個分配的RS
lc 最小連接數調度(Least-Connection),IPVS表存儲了所有的活動的連接,把新的連接請求發送到當前連接數最 小的RS
生產環境選型:
- 一般的網絡服務,如HTTP MAIL MYSQL等,常用的LVS調度算法為
a. 基本輪叫調度rr算法
b. 加權最小連接調度wlc
c. 加權輪叫調度wrr算法
? Fixed Scheduling Method 靜態調服方法
RR #輪詢
#調度器通過"輪叫"調度算法將外部請求按順序輪流分配到集群中的真實服務器上,它均等地對待每一臺服務器,而不管服務器上實際的連接數和系統負載。
WRR #加權輪詢
#調度器通過"加權輪叫"調度算法根據真實服務器的不同處理能力來調度訪問請求。 這樣可以保證處理能力強的服務器處理更多的訪問流量。調度器 可以自動問詢真實服務器的負載情況,並動態地調整其權值。
DH #目標地址hash
#算法也是針對目標IP地址的負載均衡,但它是一種靜態映射算法,通過一個散列(Hash)函數將一個目標IP地址映射到一臺服務器。
#目標地址散列調度算法先根據請求的目標IP地址,作為散列鍵(Hash Key)從靜態分配的散列表找出對應的服務器,若該服務器是可用的且未超載,將請求發送到該服務器,否則返回空。
SH #源地址hash
#算法正好與目標地址散列調度算法相反,它根據請求的源IP地址,作為散列鍵(Hash Key)從靜態分配的散列表找出對應的服務器,若該服務器是 可用的且未超載,將請求發送到該服務器,否則返回空。
#它采用的散列函數與目標地址散列調度算法的相同。除了將請求的目標IP地址換成請求的源IP地址外,它的算法流程與目標地址散列調度算法的基本相似。在實際應用中,源地址散列調度和目標地址散列調度可以結合使用在防火墻集群中,它們可以保證整個系統的唯一出入口。
? Dynamic Scheduling Method 動態調服方法
LC #最少連接
#調度器通過"最少連接"調度算法動態地將網絡請求調度到已建立的鏈接數最少的服務器上。 如果集群系統的真實服務器具有相近的系統性能,采用"最小連接"調度算法可以較好地均衡負載。
WLC #加權最少連接
#在集群系統中的服務器性能差異較大的情況下,調度器采用"加權最少鏈接"調度算法優化負載均衡性能,具有較高權值的服務器將承受較大比例的活動連接負載。調度器可以自動問詢真實服務器的負載情況,並動態地調整其權值。
SED #最少期望延遲
#基於wlc算法,舉例說明:ABC三臺機器分別權重123,連接數也分別是123,name如果使用WLC算法的話一個新請求 進入時他可能會分給ABC中任意一個,使用SED算法後會進行這樣一個運算
#A:(1+1)/2
#B:(1+2)/2
#C:(1+3)/3
#根據運算結果,把連接交給C
NQ #從不排隊調度方法
#無需列隊,如果有臺realserver的連接數=0 就直接分配過去,不需要進行sed運算.
LBLC #基於本地的最少連接
"基於局部性的最少鏈接" 調度算法是針對目標IP地址的負載均衡,目前主要用於Cache集群系統。
#該算法根據請求的目標IP地址找出該 目標IP地址最近使用的服務器,若該服務器 是可用的且沒有超載,將請求發送到該服務器;
#若服務器不存在,或者該服務器超載且有服務器處於一半的工作負載,則用"最少鏈接"的原則選出一個可用的服務器,將請求發送到該服務器。
LBLCR #帶復制的基於本地的最少連接
#"帶復制的基於局部性最少鏈接"調度算法也是針對目標IP地址的負載均衡,目前主要用於Cache集群系統。
#它與LBLC算法的不同 之處是它要維護從一個 目標IP地址到一組服務器的映射,而LBLC算法維護從一個目標IP地址到一臺服務器的映射。
#該算法根據請求的目標IP地址找出該目標IP地址對應的服務器組,按"最小連接"原則從服務器組中選出一臺服務器,
#若服務器沒有超載,將請求發送到該服務器;若服務器超載,則按"最小連接"原則從這個集群中選出一 臺服務器 ,將該服務器加入到服務器組中,將請求發送到該服務器。同時,當該服務器組有一段時間沒有被修改, 將最忙的服務器從服務器組中刪除,以降低復制的程度。
2.4 LVS 安裝
官網: http://www.linuxvirtualserver.org/software/
版本:
1.27-7.el7 最新版
ipvsadm-1.26-1.src.rpm (for kernel 2.6.28-rc3 or later) - February 8, 2011
ipvsadm-1.26.tar.gz (for kernel 2.6.28-rc3 or later) - February 8, 2011
【註意】
根據內核選擇版本
2.4.1 yum安裝
linux內核2.4版本以上的基本都支持LVS,要使用lvs,只需要再安裝一個lvs的管理工具:ipvsadm
yum install ipvsadm
yum安裝的自動會加載ip_vs模塊
[root@localhost ~]# lsmod |grep ip
ip_vs 140944 0
2.4.2 源碼安裝
- 安裝依賴
yum install popt-static popt-devel kernel-devel kernel libnl-devel libnl3-devel 安裝內核模塊
ln -s /usr/src/kernels/2.6.* /usr/src/linux - 下載LVS所需軟件ipvsadm-1.2.6.tar.gz軟件,編譯安裝:
wget -c http://www.linuxvirtualserver.org/software/kernel-2.6/ipvsadm-1.26.tar.gz
tar xzvf ipvsadm-1.26.tar.gz &&cd ipvsadm-1.26 && make && make install
./configure --sysconf=/etc --with-kernel-dir=/usr/src/kernels/2.6.32-358.el6.x86_64/
如果沒有做上面軟鏈接,就需要指定內核目錄
- 加載模塊
執行命令:modprobe ip_vs 或者執行 /usr/sbin/ipvsadm自動加載
lsmod | grep ip_vs
安裝小結
- Centos5.x 安裝lvs,使用1.24版本,不要用1.26
- centos6.4安裝lvs,使用1.26版本,並且安裝yum install libnl popt -y
- 安裝lvs後,要執行ipvsadm把ip_vs模塊加載到內核
2.5 LVS Ipvsadm配置
其實LVS的本身跟iptables很相似,而且連命令的使用格式都很相似,其實LVS是根據iptables的框架開發的,那麽LVS的本身分成了兩個部分:
- 第一部分是工作在內核空間的一個IPVS的模塊,其實LVS的功能都是IPVS模塊實現的,
- 第二部分是工作在用戶空間的一個用來定義集群服務的一個工具ipvsadm, 這個工具的主要作用是將管理員定義的集群服務列表傳送給工作在內核空間中的IPVS模塊,下面來簡單的介紹下ipvsadm命令的用法
2.5.1 Ipvsadm參數詳解
參數說明:
-A 增加一臺虛擬服務器地址(實例服務器,類似於haproxy的一個backend )。此處以VIP命名
-a 在虛擬服務器中增加一臺後端RS真實服務器。
-D 刪除一臺虛擬服務器,刪除VIP實例名
-d 刪除一臺RS服務器
-t 指定虛擬服務器提供的tcp服務端口。
-s 使用的調度算法。
-r 指定RS真實服務器地址。
-m 設置當前轉發方式為NAT模式;
-g 設置為DR直接路由模式;
-i 設置為tun隧道模式。
-w 後端真實服務器的權重。
-C --clear #清除所有配置。
--set tcp tcpfin udp #設置連接超時值
查看LVS轉發列表命令為:ipvsadm –Ln
#virtual-service-address:是指虛擬服務器的ip 地址(一般是VIP 當多個虛擬服務器時就有多個VIP)
#real-service-address:是指真實服務器的ip 地址(後端的Real server)
#scheduler:調度方法
ipvsadm 的用法和格式如下:
ipvsadm -A|E -t|u|f virutal-service-address:port [-s scheduler] [-p[timeout]] [-M netmask]
ipvsadm -D -t|u|f virtual-service-address
ipvsadm -C
ipvsadm -R
ipvsadm -S [-n]
ipvsadm -a|e -t|u|f service-address:port -r real-server-address:port [-g|i|m] [-w weight]
ipvsadm -d -t|u|f service-address -r server-address
ipvsadm -L|l [options]
ipvsadm -Z [-t|u|f service-address]
ipvsadm --set tcp tcpfin udp
ipvsadm --start-daemon state [--mcast-interface interface]
ipvsadm --stop-daemon
ipvsadm -h
-A --add-service #在內核的虛擬服務器表中添加一條新的虛擬服務器記錄。也就是增加一臺新的虛擬服務器。
-E --edit-service #編輯內核虛擬服務器表中的一條虛擬服務器記錄。
-D --delete-service #刪除內核虛擬服務器表中的一條虛擬服務器記錄。
-C --clear #清除內核虛擬服務器表中的所有記錄。
-R --restore #恢復虛擬服務器規則
-S --save #保存虛擬服務器規則,輸出為-R 選項可讀的格式
-a --add-server #在內核虛擬服務器表的一條記錄裏添加一條新的真實服務器記錄。也就是在一個虛擬服務器中增加一臺新的真實服務器
-e --edit-server #編輯一條虛擬服務器記錄中的某條真實服務器記錄
-d --delete-server #刪除一條虛擬服務器記錄中的某條真實服務器記錄
-L|-l --list #顯示內核虛擬服務器表
-Z --zero #虛擬服務表計數器清零(清空當前的連接數量等)
--set tcp tcpfin udp #設置連接超時值
--start-daemon #啟動同步守護進程。他後面可以是master 或backup,用來說明LVS Router 是master 或是backup。在這個功能上也可以采用keepalived 的VRRP 功能。
--stop-daemon #停止同步守護進程
-h --help #顯示幫助信息
#其他的選項:
-t --tcp-service service-address #說明虛擬服務器提供的是tcp 的服務[vip:port] or [real-server-ip:port]
-u --udp-service service-address #說明虛擬服務器提供的是udp 的服務[vip:port] or [real-server-ip:port]
-f --fwmark-service fwmark #說明是經過iptables 標記過的服務類型。
-s --scheduler scheduler #使用的調度算法,有這樣幾個選項rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq,默認的調度算法是: wlc.
-p --persistent [timeout] #持久穩固的服務。這個選項的意思是來自同一個客戶的多次請求,將被同一臺真實的服務器處理。timeout 的默認值為300 秒。
-M --netmask #子網掩碼
-r --real-server server-address #真實的服務器[Real-Server:port]
-g --gatewaying 指定LVS 的工作模式為直接路由模式(也是LVS 默認的模式)
-i --ipip #指定LVS 的工作模式為隧道模式
-m --masquerading #指定LVS 的工作模式為NAT 模式
-w --weight weight #真實服務器的權值
--mcast-interface interface #指定組播的同步接口
-c --connection #顯示LVS 目前的連接 如:ipvsadm -L -c
--timeout #顯示tcp tcpfin udp 的timeout 值 如:ipvsadm -L --timeout
--daemon #顯示同步守護進程狀態
--stats #顯示統計信息
--rate #顯示速率信息
--sort #對虛擬服務器和真實服務器排序輸出
--numeric -n #輸出IP 地址和端口的數字形式
2.5.2 配置LVS Server
-
配置LVS的VIP
ifconfig eth0:0 10.204.3.250 up -
添加虛擬主機(實例名 VIP)
ipvsadm -C 清空配置
ipvsadm --set 30 5 60 tcp/tcp fin udp超時時間
ipvsadm -A -t 10.204.3.250:80 -s rr 添加虛擬主機 -
在虛擬服務器下添加Real server真實服務器
ipvsadm -a -t 10.204.3.250:80 -r 10.204.3.21:80 -g -w 1 # 添加RS -g DR模式 -w 權重
ipvsadm -a -t 10.204.3.250:80 -r 10.204.3.22:80 -g -w 1 - ipvsadm -L -n 查看配置
2.5.3 配置LVS RServer
- RS綁定VIP
ifconfig lo:0 10.0.0.10/32 - 配置RS端抑制ARP響應
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
監控RS訪問
watch -n 1 ipvsadm -L -n # 1秒鐘查看ipvsadm訪問情況
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 10.204.3.250:80 rr
-> 10.204.3.23:80 Route 1 2 20
-> 10.204.3.24:80 Route 1 2 20
2.5.4 Ipvsadm 刪除 修改
刪除方法
ipvsadm -D -t 10.0.0.10:80 -s wrr 刪除LVS-server
ipvsadm -d -t 10.0.0.10:80 -r 10.0.0.12:80 刪除RS
2.1 LVS 通過腳本管理ipvsadm
2.1.1 LVS Server 啟動守戶進程腳本
#!/bin/bash
lvs_server
VIP=10.204.1.250
PORT=80
RIP=(
10.204.3.23
10.204.3.24
)
start(){
ipvsadm –C
ifconfig eth0:0 $VIP up
ipvsadm -A -t $VIP:$PORT -s rr
for ((i=0;i<${#RIP[*]};i++)) #循環數組中的值
do
ipvsadm -a -t $VIP:$PORT -r ${RIP[$i]}:$PORT -g
done
}
stop(){
ipvsadm -C
}
restart(){
stop
start
}
status(){
ipvsadm -Ln
}
case $1 in
start)
start
;;
stop)
stop
;;
restart)
restart
;;
status)
status
;;
*)
echo "USAGE: START|STOP|RESTART|STATUS"
esac
2.1.2 LVS realserver啟動守戶進程腳本:
#!/bin/sh
#LVS Client Server
VIP=192.168.33.188
case $1 in
start)
ifconfig lo:0 $VIP netmask 255.255.255.255 broadcast $VIP
/sbin/route add -host $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"
exit 0
;;
stop)
ifconfig lo:0 down
route del $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 OK"
exit 1
;;
*)
echo "Usage: $0 {start|stop}"
;;
esac
2.1.3 LVS 進程監控恢復腳本
#!/bin/bash
rs_1=192.168.136.129
rs_2=192.168.136.130
vip=192.168.136.127
. /etc/init.d/functions
web_result() {
rs=curl -I -s $1 |awk ‘NR==1 {print $2}‘
return $rs
}
lvs_result() {
rs=ipvsadm -ln |grep $1:80 |wc -l
return $rs
}
auto_lvs (){
web_result $1
a=$?
lvs_result $1
b=$?
if [ $a -ne 200 ] && [ $b -ge 1 ]
then
ipvsadm -d -t $vip:80 -r $1
action “kill $1” /bin/true
fi
if [ $a -eq 200 ] && [ $b -lt 1 ]
then
ipvsadm -a -t $vip:80 -r $1 -g -w 1
action “add $1” /bin/true
fi
}
while true
do
auto_lvs $rs_1
auto_lvs $rs_2
sleep 2
done
2.2 LVS 通過Keepalived管理ipvsadm
配置小結:
- realserver如果是DR模式,需要綁定VIP
- LVS不需要綁定VIP,在配置文件中已經指定
- 要實現高可用,需寫守護進程腳本監聽realserver的服務是否正常,
- Real_server中的connect_port端口一定要是存在,否則會誤判為RS故障,自動T除,。
- LVS不能轉換端口,nginx可以轉換端口
LVS負載均衡是單點,為了解決單點問題,我們利用keepalived在兩臺LVS上實現高可用。
LVS+keepalived的配置腳本要寫入keepalived.conf中,keepavlied會接管lvs的服務啟動
global_defs {
notification_email {
[email protected]
}
notification_email_from [email protected]
smtp_server 192.168.80.1
smtp_connection_timeout 30
router_id LVS_DEVEL # 設置lvs的id,在一個網絡內應該是唯一的
}
vrrp_instance VI_1 {
state MASTER #指定Keepalived的角色,MASTER為主,BACKUP為備
interface eth1 #指定Keepalived的角色,MASTER為主,BACKUP為備
virtual_router_id 51 #虛擬路由編號,主備要一致
priority 100 #定義優先級,數字越大,優先級越高,主DR必須大於備用DR
advert_int 1 #檢查間隔,默認為1s
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.80.200 #定義虛擬IP(VIP)為192.168.2.33,可多設,每行一個
}
}
定義對外提供服務的LVS的VIP以及port
virtual_server 192.168.80.200 80 {
delay_loop 6 # 設置健康檢查時間,單位是秒
lb_algo wrr # 設置負載調度的算法為wlc
lb_kind DR # 設置LVS實現負載的機制,有NAT、TUN、DR三個模式
nat_mask 255.255.255.0
persistence_timeout 60
protocol TCP
ipvsadm –A –t 192.168.80.200:80 –s wrr –p 20 以上語句對應此條命令
real_server 192.168.80.102 80 { # 指定real server1的IP地址
weight 3 # 配置節點權值,數字越大權重越高
TCP_CHECK {
connect_timeout 10
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
ipvsadm –a –t 192.168.80.200:80 -
real_server 192.168.80.103 80 { # 指定real server2的IP地址
weight 3 # 配置節點權值,數字越大權重越高
TCP_CHECK {
connect_timeout 10
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
}
#pvsadm -a -t 192.168.80.200:80 -r 192.168.80.102:80 -g -w 1以上語句對應此條命令
#pvsadm -a -t 192.168.80.200:80 -r 192.168.80.103:80 -g -w 1以上語句對應此條命令
2.3 LVS+交換機OSPF實現多主
2.4 LVS 故障排錯
tcpdump -nn port 80 檢測80端口的包
tcpdump -nn port 22 and host 192.168.1.100
2.4.1 LVS排錯流程
1.PING網站哉名,能解析,域名正常
2.登錄LVS服務器,查看ipvsadm -Ln
- 查看日誌tail -fn 100 /var/log/message
- 查看realserver 80端口
- 查zabbix監控
- 看keepalived配置文件,進程
- 看realserver.sh腳本運行是否正常
-
使用tcpdump抓包
- 當LVS訪問站點出現緩慢或者無法訪問的情況時,需要檢查後臺站點的VIP是否服務已停止。
2.4.2 LVS分發請求RS不均衡故障
生產環境中,ipvsadm -L -n發現兩臺RS的負載不均衡,一臺有很多請求,一臺沒有,並且沒有請求的那臺RS經測試服務正常,lo:VIP也有,但是就是沒有請求
問題原因:
配置了persistent 10的原因,persistent會話保持,當client A訪問網站的時候,LVS把請求分發給了RS2 那麽以後client A再點擊的其它操作和請求,也會發給RS2這臺機器,
解決方法:
到keepalived中註釋掉persistent 10後,/etc/init.d/keepalived reload,然後可以看到以後負載兩邊請求都OK了
其它原因:
- LVS自身的會話保持參數設置(-p 300 persistent 300 )優化:大公司盡量用cookies替代sesson
- LVS調度算法設置,例如,rr,wrr,wlc,ls算法
- 後端RS節點會話保持參數,例如:apache的keealive參數
- 訪問量較少的情況,不均衡的現象更加明顯
- 用戶發送的請求時間長短,和請求資源多少大小
實現會話保持的方案:
http://oldboy/blog.51cto.com/2561410/1331316
http://oldboy/blog.51cto.com/2561410/1332468
2.4.3 LVS故障排錯思路
- 調度器上LVS調度規則IP的正確性
-
RS節點上VIP綁定和ARP抑制的檢查
生產處理思路:
a.對綁定的VIP做實時監控,出問題報警或者自動處理後報警
b.把綁定的vip做成配置文件,
arp抑制的配置思路:
a.如果是單個vip,那麽可以用stop傳參設置0
b.如果RS端有多個VIP綁定,此時,即使是停止vip綁定也一定不要設置0
if [ ${#VIP[@]} -le 1 ];then
echo "0" >/proc/sys/net/ipv4/config/lo/arp_ignore
echo "0" >/proc/sys/net/ipv4/config/lo/arp_announce
echo "0" >/proc/sys/net/ipv4/config/all/arp_ignore
echo "0" >/proc/sys/net/ipv4/config/all/arp_announce
fi - RS節點上自身提供服務的檢查
- 輔助排除工具 tcpdump ping
- 負載均衡和反向代理集群
2.4.4 LVS make報錯
[root@monitor ipvsadm-1.23]# make
make -C libipvs
make[1]: Entering directory `/opt/lvs/ipvsadm-1.23/libipvs‘
gcc -Wall -Wunused -Wstrict-prototypes -g -O2 -I/usr/src/linux/include -DHAVE_NET_IP_VS_H -c -o libipvs.o libipvs.c
In file included from libipvs.c:23:
libipvs.h:14:23: error: net/ip_vs.h: No such file or directory
In file included from libipvs.c:23:
ln -s /usr/src/kernels/2.6.18-194.11.3.el5-i686/ /usr/src/linux
但是有時你找不到這個內核的路徑,網上很多都是以上的解決方法連接,可有的系統安裝完後並沒有kernerls的目錄
解決方法:yum install kernel-devel
接下來在進行連接 編譯 就ok了!
Linux LVS(Linux virtual server)V1.26 負載均衡 詳細配置教程