LVS+ldirector實現負載均衡

一、先介紹幾個軟件:
ipvsadm:lvs的負載均衡調度是靠這個軟件來實現的。
ldirectord:用這個軟件可以自動檢測後端服務器是否連接。如果網絡down掉,直接在ipvsadm表裏邊把這個後端的權值變爲0,代表不用這個後端。如果網絡恢復,ipvsadm表中這個後端的權重又變爲設置的值,代表可用。

heartbeat:做lvs的時候,調度器是一個瓶頸,會產生單點失敗,做雙機的時候用到heartbeat來實現兩臺調度器互爲主備。但是heartbeat有可能會產生腦裂現象。
http://czmmiao.iteye.com/blog/1180851
keepalive:這個軟件是用vrrp協議來實現雙機,配置文件比較簡單。
http://bbs.ywlm.net/thread-845-1-1.html

二、幾個名詞的解釋:
腦裂:在“雙機熱備”高可用(HA)系統中,當聯繫2個節點的“心跳線”斷開時,本來爲一整 體、動作協調的HA系統,就分裂成爲2個獨立的個體。由於相互失去了聯繫,都以爲是對方出了故障,2個節點上的HA軟件像“裂腦人”一樣,“本能”地爭搶 “共享資源”、爭起“應用服務”,就會發生嚴重後果:或者共享資源被瓜分、2邊“服務”都起不來了;或者2邊“服務”都起來了,但同時讀寫“共享存儲”, 導致數據損壞(常見如數據庫輪詢着的聯機日誌出錯)。
腦裂現象的解決:
1、串行電纜:被認爲是比以太網連接安全性稍好些的連接方式,因爲hacker無法通過串行連接運行諸如telnet、ssh或rsh類的程序,從而可以降低其通過已劫持的服務器再次侵入備份服務器的機率。但串行線纜受限於可用長度,因此主、備服務器的距離必須非常短。
2、以太網連接:使用此方式可以消除串行線纜的在長度方面限制,並且可以通過此連接在主備服務器間同步文件系統,從而減少了從正常通信連接帶寬的佔用。
vrrp協議:
這個網址很好的介紹了vrrp協議的工作過程和原理:http://bbs.ywlm.net/thread-790-1-1.html

三、幾種軟件的結合使用,建立高可用的lvs
1、單獨用ipvsadm,實現負載均衡:
網絡環境:
虛擬ip:192.168.0.90
調度器ip:192.168.0.184
後端1ip:192.168.0.185
後端2ip:192.168.0.186

調度器(192.168.0.184)上操作:
在調度器上安裝ipvsadm: yum install ipvsadm

寫ipvsadm啓動腳本:
vim /usr/local/sbin/lvs-dr.sh

#!/bin/bash
#description:start LVS of DirectorServer

#mysql director vip.

MYSQL_VIP=192.168.0.90
MYSQL_RIP1=192.168.0.185
MYSQL_RIP2=192.168.0.186

logger $0 called with $1

case "$1" in

start)
# set squid vip
# /sbin/ipvsadm --set 30 5 60
/sbin/ifconfig eth0:0 $MYSQL_VIP broadcast $MYSQL_VIP netmask 255.255.255.255 up
/sbin/route add -host $MYSQL_VIP dev eth0:0
echo "1">/proc/sys/net/ipv4/ip_forward

#set LVS mysql
/sbin/ipvsadm -C
/sbin/ipvsadm -A -t $MYSQL_VIP:3306 -s wlc
/sbin/ipvsadm -a -t $MYSQL_VIP:3306 -r $MYSQL_RIP1:3306 -g -w 1
/sbin/ipvsadm -a -t $MYSQL_VIP:3306 -r $MYSQL_RIP2:3306 -g -w 1
touch /var/lock/subsys/ipvsadm >/dev/null 2>&1
;;
stop)
/sbin/ipvsadm -C
/sbin/ipvsadm -Z
ifconfig eth0:0 down
route del $MYSQL_VIP
rm -rf /var/lock/subsys/ipvsadm >/dev/null 2>&1
echo "ipvsadm stoped"
;;

status)

if [ ! -e /var/lock/subsys/ipvsadm ];then
echo "ipvsadm stoped"
exit 1
else
/sbin/ipvsadm
echo "ipvsadm OK"
fi
;;
*)
echo "Usage: $0 {start|stop|status}"
exit 1
esac

exit 0

ipvsadm主要選項的解釋:
--set tcp tcpfin udp 設置連接超時值
-A --add-service 在內核的虛擬服務器表中添加一條新的虛擬服務器記錄。也
就是增加一臺新的虛擬服務器。
-C --clear 清除內核虛擬服務器表中的所有記錄。
-t --tcp-service service-address 說明虛擬服務器提供的是tcp 的服務
-u --udp-service service-address 說明虛擬服務器提供的是udp
-a --add-server 在內核虛擬服務器表的一條記錄裏添加一條新的真實服務器
記錄。也就是在一個虛擬服務器中增加一臺新的真實服務器
-d --delete-server 刪除一條虛擬服務器記錄中的某條真實服務器記錄
-r --real-server server-address 真實的服務器[Real-Server:port]
-w --weight weight 真實服務器的權值
-s --scheduler scheduler 使用的調度算法,有這樣幾個選項
rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq,
-L|-l --list 顯示內核虛擬服務器表
默認的調度算法是: wlc.

ipvsadm的啓動和停止:
啓動:/usr/local/sbin/lvs-dr.sh start
運行腳本之後可以運行service ipvsadm save,腳本中ipvsadm幾個規則就被保存在/etc/sysconfig/ipvsadm文件中。之後再運行service ipvsadm stop的時候規則不會丟失,再啓動ipvsadm的時候可以直接用service ipvsadm start。
/etc/sysconfig/ipvsadm.conf-config文件保存在ipvsadm在啓動和停止的時候要做的操作。
停止:service ipvsadm stop 或者 /usr/local/sbin/lvs-dr.sh stop

在後端realserver上要執行的動作有兩點:
1、 給調度器上指定的真實ip的網卡上配置虛擬ip
2、 把arp解析給關閉

寫腳本如下:
vim /usr/local/sbin/realserver.sh

#!/bin/bash
# description: Config realserver lo and apply noarp

MYSQL_VIP=192.168.0.90

. /etc/rc.d/init.d/functions

case "$1" in
start)
ifconfig lo:0 $MYSQL_VIP netmask 255.255.255.255 broadcast $MYSQL_VIP up
/sbin/route add -host $MYSQL_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 $MYSQL_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

2、ldirectord的實現:
單獨使用ipvsadm來實現的負載均衡,如果調度器和後端某臺服務器不通,調度器不能及時發現,還去後端請求這臺服務器,會導致請求不到而造成響應失敗。ldirectord能夠自動檢測調度器和後端的網絡狀況,在後端某臺服務器失效的情況下,自動把ipvsadm中記錄這臺服務器的權重變爲0,如果恢復,又重新把權重變爲設置的值。
查看ipvsadm的鏈接狀況可以用命令:watch ipvsadm –L -n

ldirectord的安裝和配置(調度上操作):
ldirectord是heartbeat帶的一個軟件,可以直接用yum安裝:
yum install heartbeat-ldirectord
安裝之後可以去查看ldirectod這個腳本調用的配置配置在哪兒位置放着:
vim /usr/sbin/ldirectord

可以看到這個服務器啓動的時候默認用/etc/ha.d/或者/etc/ha.d/conf/這兩個目錄下的配置文件來啓動。
在/etc/ha.d/conf/下建立ldirectord.cf,這個軟件自帶的有這個配置文件的模板,可以直接拷貝到這個目錄下:
cp /usr/share/doc/heartbeat-ldirectord-2.1.4/ldirectord.cf /etc/ha.d/conf/
vim /etc/ha.d/conf/ldirectord.cf

# Global Directives
checktimeout=3
checkinterval=1
#fallback=127.0.0.1:80
autoreload=yes
logfile="/var/log/ldirectord.log"
logfile="local0"
#emailalert="[email protected]"
#emailalertfreq=3600
#emailalertstatus=all
quiescent=yes

# Sample for an http virtual service
virtual=192.168.0.90:3306
real=192.168.0.185:3306 gate 1
real=192.168.0.186:3306 gate 1
service=mysql
scheduler=rr
#persistent=600
#netmask=255.255.255.255
protocol=tcp
checktype=negotiate
checkport=3306
login="lvs"
passwd="123456"
database="mysql"
request="select * from user limit 1"

啓動ldirectord:/usr/sbin/ldirectord start
此時可以查看ipvsadm表中的活動連接數:
watch ipvsdam –L –n

把186網卡down之後可以看到ipvsadm的連接數:


可以看到186的權值變爲0
把186網卡重新啓用,可以看到186的權值重新恢復成1。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章