LVS+Heartbeat實現高可用負載平衡羣集
LVS Master |
IP:172.16.0.5 IP: 192.168.1.1 |
VIP:172.16.0.111 |
LVS Slave |
IP:172.16.0.6 IP: 192.168.1.2 |
|
WEB1 |
IP:172.16.0.10 |
VIP:172.16.0.111 |
WEB2 |
IP:172.16.0.20 |
VIP:172.16.0.111 |
工作原理:
當客戶當訪問網站的時候,會訪問VIP所在的調度器LVS Master(當Master掛掉,訪問Slave),LVS Master(Slave)會根據算法選擇合適的WEB服務器,隨後將請求包中的目的MAC改寫爲目的服務器的MAC,並將此包(單播,多播,廣播)給服務器(服務器上面設定了和LVS一樣的VIP,但是由於不進行ARP解析,所以不會產生IP地址衝突問題),服務器接收到請求後,經過處理將結果直接返回給客戶機,而不再經過LVS調度器。
軟件包需求:
yum -y install ipvsadm
yum -y install heartbeat*
yum -y install heartbeat
在LVS Master 上面編寫所需腳本:
Vim /opt/vip.sh
#!/bin/bash
#設置腳本所需變量
vip=172.16.0.111
lvs_1=172.16.0.5
web1=172.16.0.10
web2=172.16.0.20
ip=/sbin/ifconfig
ipv=/sbin/ipvsadm
ips=/sbin/ipvsadm-save
ro=/sbin/route
path=/etc/sysconfig/ipvsadm
mask=255.255.255.255
#利用case語句編寫腳本
case $1 in
start)
#配置vip
$ip eth0:1 $vip broadcast $vip netmask $mask
#添加路由
$ro add -host $vip dev eth0:1
#以輪轉算法開啓服務,並設置連接保持時間爲600s
#-A:添加服務,-t:tcp協議, -s rr:設置輪轉算法, -p:設置保持時間
$ipv -A -t $vip:80 -s rr -p 600
#以DR模式添加負載均衡服務器
#-a添加服務器, -t:tcp協議, -r:route, -g:DR模式, -i:TUN, -m:NAT
$ipv -a -t $vip:80 -r $web1:80 -g
$ipv -a -t $vip:80 -r $web2:80 –g
#儲存ipvsadm配置
$ips $path
echo "Start OK!!!"
;;
stop)
#清空ipvsadm設置
$ipv –C
#刪除路由
$ro del -host $vip dev eth0:1
echo "Stop OK!!!"
;;
*)
echo "If you want to use this script,Please enter start or stop "
exit 1
esac
#爲腳本添加可執行權限
chmod +x /opt/vip.sh
在web服務器上編寫腳本:
Vim /opt/vip.sh
#!/bin/bash
#設置環境所需變量
vip=172.16.0.111
web1=172.16.0.10
case $1 in
start)
#設置網卡ip,vip和路由
/sbin/ifconfig eth0 $web1
/sbin/ifconfig lo:0 $vip broadcast $vip netmask 255.255.255.255
/sbin/route add -host $vip dev lo:0
#關閉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
echo "start OK"
;;
stop)
#開始arp響應
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
/sbin/route del -host $vip dev lo:0
echo "Stop OK"
;;
*)
echo "If you want to use this script,Please enter start or stop"
;;
esac
#爲腳本添加可執行權限
chmod +x /opt/web1.sh
編寫web2所需腳本
Vim /opt/vip.sh
#!/bin/bash
#設置環境所需變量
vip=172.16.0.111
web2=172.16.0.20
case $1 in
start)
#設置網卡ip,vip和路由
/sbin/ifconfig eth0 $web2
/sbin/ifconfig lo:0 $vip broadcast $vip netmask 255.255.255.255
/sbin/route add -host $vip dev lo:0
#關閉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
echo "start OK"
;;
stop)
#開始arp響應
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
/sbin/route del -host $vip dev lo:0
echo "Stop OK"
;;
*)
echo "If you want to use this script,Please enter start or stop"
;;
esac
#爲腳本添加可執行權限
chmod +x /opt/web1.sh
複製ha.cf、haresources、authkeys、ldirectord.cf等配置文件:
rpm -q heartbeat -d #查找配置文件所在位置
[root@localhost ~]# cp -a /usr/share/doc/heartbeat-2.1.3/ha.cf /etc/ha.d/
[root@localhost ~]# cp -a /usr/share/doc/heartbeat-2.1.3/haresources /etc/ha.d/
[root@localhost ~]# cp -a /usr/share/doc/heartbeat-2.1.3/authkeys /etc/ha.d/
[root@localhost ~]# find / -name ldirectord.cf/etc/ha.d/ldirectord.cf
[root@localhost ~]# cp -a /usr/share/doc/heartbeat-ldirectord-2.1.3/ldirectord.cf
/etc/ha.d/
ha.cf 配置:
debugfile /var/log/ha-debug #debug日誌路徑 #
logfile /var/log/ha-log #heartbeat日誌路徑
logfacility local0
keepalive 2 #心跳檢測時間間隔
#initdead 120 #指定heartbeat首次啓動時的死亡時間
deadtime 20 #心跳死亡時間
warntime 10 #心跳延遲時間
udpport 694 #heartbeat監聽端口
#baud 19200 #串口通訊波特率
ucast eth1 192.168.1.2 #採用單播來通知心跳,Ip地址爲對端Ip
auto_failback on #主節點重新啓動後是否主動拿回資源
#watchdog /dev/watchdog #需要softdog支持,系統故障1分鐘後自動重啓
node lvs_1 #主調度器主機名與uname –n必須一致
node lvs_2 #輔調度器主機名與uname –n必須一致
ping 172.16.0.1 #檢測服務器是否正常
haresources 配置:
lvs_1 IPaddr::172.16.0.111/32 ldirectord::ldirectord.cf
lvs_1: 主調度器主機名
172.16.0.111: vip
lidrectord.cf:lidrectord文件名稱
authkeys設置:
auth 3
#1 crc
#2 sha1 HI!
3 md5 Hello!
#1、2、3表示認證算法,這裏啓用了md5算法
#修改完authkeys文件必須將文件權限修改爲600
ldirectord.cf配置:
checktimeout=3 #服務器超時時間checkinterval=1 #檢測服務器的間隔時間fallback=127.0.0.1:80 #當服務器全部掛掉後重定向的地址autoreload=yes #修改ldirectord.cf後自動加載quiescent=yes #virtual=172.16.0.111:80 #vip和端口
real=172.16.0.10:80 gate #web服務器地址和端口,gate代表DR
real=172.16.0.20:80 gate #web服務器地址和端口,gate代表DR
fallback=127.0.0.1:80 gate #如果服務器全部掛掉重定向到本機
service=http #服務類型爲http
request="haha.html" #檢測服務器時用到的文件名
receive="Test Page" #檢測服務器時文件中的內容
virtualhost=some.domain.com.au
scheduler=rr #啓用輪叫調度算法
persistent=600 #連接保持時間
#netmask=255.255.255.255
protocol=tcp #協議類型
checktype=negotiate #調度器檢測服務器的類型
checkport=80 #指定監聽端口
#需要在服務器的網頁文件主目錄中創建haha.html文件內容爲Test Page 用於調度器檢測服務器是否存在
修改主機名和/etc/hosts文件:
vim /etc/sysconfig/network
NETWORKING=yes
NETWORKING_IPV6=no
HOSTNAME=lvs_1
vim /etc/hosts
172.16.0.5 lvs_1
172.16.0.6 lvs_2
#LVS Slave 與LVS Master 一樣修改只是主機名需要改爲lvs_2
在lvs上面啓動服務:
[root@lvs_1 ~]# export LANGUAGE=C #如果不更改編碼啓動ldirectord會報錯[root@lvs_1 ~]# export LC_ALL=C #最好還是定義到/etc/profile文件中
[root@lvs_1 ~]# service heartbeat start
[root@lvs_1 ~]# /etc/ha.d/resource.d/ldirectord star
在web服務器上面啓動服務:
[root@lvs_1 ~]# Service httpd start
在lvs_1上面查看LVS狀態:
[root@lvs_1 ~]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 172.16.0.111:80 rr persistent 600
-> 172.16.0.20:80 Route 1 0 0
-> 172.16.0.10:80 Route 1 0 0
#發現兩個web服務器權重都爲1,說明正常
停掉lvs_1查看lvs_2是否能夠正常切換:
[root@lvs_2 ~]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 172.16.0.111:80 rr persistent 600
-> 172.16.0.20:80 Route 1 0 0
-> 172.16.0.10:80 Route 1 0 0
#發現lvs_2可以自動切換,說明lvs配置沒有問題
最後檢測lvs_1重新啓動後,能否奪回資源:
[root@lvs_1 ~]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 172.16.0.111:80 rr persistent 600
-> 172.16.0.20:80 Route 1 0 0
-> 172.16.0.10:80 Route 1 0 0