RHEL6.4 Keepalive+LVS(DR)部署文档
1、簡介
LVS+Keepalived 能實現(xiàn)的功能:利用 LVS 控制器主備模式避免單點故障以及自動刪除故障 WEB 服務(wù)器結(jié)點并當它恢復(fù)后再自動添加到群集中。
拓撲圖:
2、系統(tǒng)環(huán)境
系統(tǒng)平臺:RHEL6.4
硬件平臺:dell R720*4
硬件參數(shù):cpu(e5-2609)兩顆;內(nèi)存 32G;磁盤 600G*6;RAID 5 ;雙電源
LVS 版本:ipvsadm-1.25
Keepalived 版本:keepalived-1.2.7
3、IP 地址規(guī)劃:
VIP:111.13.6.77
LVS-MASTER:111.13.6.75
LVS-BACKUP:111.13.6.76
WEB1:111.13.6.73
WEB2:111.13.6.74
這些 IP 地址根據(jù)實際情況而定
4、安裝及配置 keepalived
1)下載源碼包并在兩臺 LVS 服務(wù)器上進行編譯安裝
#wget http://www.keepalived.org/software/keepalived-1.2.7.tar.gz
[root@LVS-MASTER ~]# tar
-zxvf keepalived-1.2.7.tar.gz
[root@LVS-MASTER ~]# cd keepalived-1.2.7
[root@LVS-MASTER keepalived-1.2.7]# ./configure
省略......
checking for gcc... no
checking for cc... No
checking for cc... no
checking for cl... no
configure: error: no acceptable C compiler found in $PATH
See `config.log' for more details.
如果出現(xiàn)上面的提示說明缺少 gcc 編譯工具,執(zhí)行下面命令進行安裝:
[root@LVS-MASTER keepalived-1.2.7]# yum install gcc -y
[root@LVS-MASTER keepalived-1.2.7]# ./configure
省略....
checking for sys/ioctl.h... yes
checking sys/time.h usability... yes
checking sys/time.h presence... yes
checking for sys/time.h... yes
checking openssl/ssl.h usability... no
checking openssl/ssl.h presence... no
checking for openssl/ssl.h... no
configure: error:
!!! OpenSSL is not properly installed on your system. !!!
!!! Can not include OpenSSL headers files.
!!!
如果出現(xiàn)上面的提示說明缺少 openssl-devel 包,安裝軟件包如下:
[root@LVS-MASTER keepalived-1.2.7]# yum install openssl-devel -y
[root@LVS-MASTER keepalived-1.2.7]# ./configure
省略....
checking for openssl/md5.h... yes
checking openssl/err.h usability... yes
checking openssl/err.h presence... yes
checking for openssl/err.h... yes
checking for MD5_Init in -lcrypto... yes
checking for SSL_CTX_new in -lssl... yes
checking for poptGetContext in -lpopt... no
configure: error: Popt libraries is required
如果出現(xiàn)上面提示說明缺少 popt-devel 包,安裝軟件包如下:
[root@LVS-MASTER keepalived-1.2.7]# yum install popt-devel -y
[root@LVS-MASTER keepalived-1.2.7]# ./configure
config.status: creating Makefile
config.status: creating genhash/Makefile
config.status: creating keepalived/core/Makefile
config.status: creating keepalived/include/config.h
config.status: creating keepalived.spec
config.status: creating keepalived/Makefile
config.status: creating lib/Makefile
config.status: creating keepalived/vrrp/Makefile
Keepalived configuration
------------------------
Keepalived version
Compiler
: 1.2.7
: gcc
Compiler flags
: -g -O2
Extra Lib : -lpopt -lssl -lcrypto
Use IPVS Framework : No
IPVS sync daemon support : No
Use VRRP Framework : Yes
Use LinkWatch : No
Use Debug flags
: No
如果出現(xiàn)上面信息說明編譯環(huán)境檢查成功,編譯命令如下:
[root@LVS-MASTER keepalived-1.2.7]# yum install make -y
[root@LVS-MASTER keepalived-1.2.7]# make && make install
################ 將 keepalived 做成啟動服務(wù) #################
[root@LVS-MASTER ~]#cp /usr/local/etc/rc.d/init.d/keepalived /etc/init.d/
[root@LVS-MASTER ~]#cp /usr/local/etc/sysconfig/keepalived /etc/sysconfig/
[root@LVS-MASTER ~]#mkdir /etc/keepalived
[root@LVS-MASTER ~]#cp /usr/local/etc/keepalived/keepalived.conf /etc/keepalived/[root@LVS-MASTER ~]# cp /usr/local/sbin/keepalived ? /usr/sbin/
[root@LVS-MASTER ~]# /etc/init.d/keepalived start
正在啟動 keepalived: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? [確定]
[root@LVS-MASTER ~]# chkconfig --add keepalived
[root@LVS-MASTER ~]# chkconfig keepalived on
[root@LVS-MASTER ~]# cd /etc/keepalived/
[root@LVS-MASTER keepalived]# vim keepalived.conf
2)Keepalived 主節(jié)點配置如下,紅色表示需要配置項:
##################### LVS-MASTER ####################
! Configuration File for keepalived
global_defs {
notification_email {
renlifeng@redflag-linux.com ? ? ?#指定 keepalived 在發(fā)生切換時需要發(fā)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?送 email 到的對象,一行一個。
}
notification_email_from Alexandre.Cassen@firewall.loc ? ? #指定發(fā)件人
smtp_server 127.0.0.1 #指定 smtp 服務(wù)器地址
smtp_connect_timeout 30 #指定 smtp 連接超時時間
router_id LVS_DEVEL #運行 keepalived 機器的一個標識
}
vrrp_instance VI_1 { ? ?#監(jiān)控多個網(wǎng)段的實例
state MASTER ? ? ? ? ? ? #指定那個為 master,那個為 backup,如果設(shè)置了
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?nopreempt 這個值不起作用,主備靠 priority 決定
interface eth0 ? ? ? ? ? ?#設(shè)置實例綁定的網(wǎng)卡
virtual_router_id 51
priority 100 ? ? ? ? ? ? ? #優(yōu)先級,高優(yōu)先級竟先為 master
advert_int 1 ? ? ? ? ? ? ? #檢查間隔,默認為 1 秒
authentication { ? ? ? ?#設(shè)置認證
auth_type PASS ? ? ? ? #認證方式
auth_pass 1111 ? ? ? ? #認證密碼
}
virtual_ipaddress { ? ?#設(shè)置 VIP
111.13.6.77
}
}
virtual_server 111.13.6.77 80 {
delay_loop 6 ? ? ? ? ? ?#健康檢查時間間隔
lb_algo rr ? ? ? ? ? ? ? ? #LVS 調(diào)度算法 rr|wrr|lc|wlc|lblc|sh|dh
lb_kind DR ? ? ? ? ? ? ? #負載均衡轉(zhuǎn)發(fā)規(guī)則 NAT|DR|TUN,默認為 NAT
persistence_timeout 50 ? ? #會話保持時間
protocol TCP ? ? ? ? ? ? ? ? ? ? ?#使用的協(xié)議
real_server 111.13.6.73 80 { ? ? ? ? ? ?#真實服務(wù)器 IP 地址和端口
weight 3 ? ? ? ? ? ? ? ?#權(quán)重 默認為 1,0 為失效
TCP_CHECK {
connect_timeout 10 ? ? #連接超時時間
nb_get_retry 3 ? ? ? ? ? ? ?#重試次數(shù)
delay_before_retry 3 ? ? #重試時間間隔
connect_port 80 ? ? ? ? ? ? #健康檢查的端口
}
}
real_server 111.13.6.74 ?80 {
weight 3
TCP_CHECK {
connect_timeout 10
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
######################### END ########################
3)Keepalived 備節(jié)點配置如下,紅色表示配置項,藍色表示與 MASTER 不同之處:
########################### BACKUP#########################
! Configuration File for keepalived
global_defs {
notification_email {
renlifeng@redflag-linux.com ? ? ? ?#指定 keepalived 在發(fā)生切換時需要發(fā)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?送 email 到的對象,一行一個。
}
notification_email_from Alexandre.Cassen@firewall.loc ? #指定發(fā)件人smtp_server 127.0.0.1 ? ? ? ? ?#指定 smtp 服務(wù)器地址
smtp_connect_timeout 30 ? ?#指定 smtp 連接超時時間
router_id LVS_DEVEL ? ? ? ? ? ?#運行 keepalived 機器的一個標識
}
vrrp_instance VI_1 { ? ? ? ? ? ? ?#監(jiān)控多個網(wǎng)段的實例
state BACKUP ? ? ? ? ? ? ? ? ? ? ?#指定那個為 master,那個為 backup,如果設(shè)置了
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? nopreempt 這個值不起作用,主備靠 priority 決定
interface eth0 ? ? ? ? ? #設(shè)置實例綁定的網(wǎng)卡
virtual_router_id 51
priority 99 ? ? ? ? ? ? ? ? ?#優(yōu)先級,高優(yōu)先級竟先為 master
advert_int 1 ? ? ? ? ? ? ? #檢查間隔,默認為 1 秒
authentication { ? ? ? ? #設(shè)置認證
auth_type PASS ? ? ? ? ?#認證方式
auth_pass 1111 ? ? ? ? ?#認證密碼
}
virtual_ipaddress { ? ? #設(shè)置 VIP
111.13.6.77
}
}
virtual_server 111.13.6.77 80 {
delay_loop 6 ? ? ? ? ? ? #健康檢查時間間隔
lb_algo rr ? ? ? ? ? ? ? ? ?#LVS 調(diào)度算法 rr|wrr|lc|wlc|lblc|sh|dh
lb_kind DR ? ? ? ? ? ? ? ?#負載均衡轉(zhuǎn)發(fā)規(guī)則 NAT|DR|TUN,默認為 NAT
persistence_timeout 50 ? ?#會話保持時間(同一 IP 的連接 50 秒內(nèi)被分配到同一臺 realserver)
protocol TCP ? ? ? ? ? ? #使用的協(xié)議
real_server ?111.13.6.73 80 { ? #真實服務(wù)器 IP 地址和端口
weight 3 ? ? ? ? ? ?#權(quán)重 默認為 1,0 為失效
TCP_CHECK {
connect_timeout 10 ? ? ? ? #連接超時時間
nb_get_retry 3 ? ? ? ? ? ? ? ? #重試次數(shù)
delay_before_retry 3 ? ? ? #重試時間間隔
connect_port 80 ? ? ? ? ? ? ?#健康檢查的端口
}
}
real_server
111.13.6.74 80 {
weight 3
TCP_CHECK {
connect_timeout 10
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
######################### END #########################
5、安裝及配置 LVS(DR)
1)安裝 ipvsadm
[root@LVS-MASTER ~]# yum install ipvsadm -y
2)分別在 LVS-MASTER 和 LVS-BACKUP 上執(zhí)行 director.sh 腳本,腳本內(nèi)容如下:
[root@LVS-MASTER ~]# cat director.sh
#!/bin/bash
VIP=111.13.6.77
RIP1=111.13.6.73
RIP2=111.13.6.74
# Open IP Forwarding
echo "1"> /proc/sys/net/ipv4/ip_forward
#ifconfig eth0 172.16.86.167 netmask 255.255.248.0 up
ifconfig eth0:0 $VIP netmask 255.255.255.0 broadcast $VIP up
ipvsadm -C
ipvsadm -A -t $VIP:80 -s rr
ipvsadm -a -t $VIP:80 -r $RIP1 -g -w 1
ipvsadm -a -t $VIP:80 -r $RIP2 -g -w 1
service ? ipvsadm ?save
[root@LVS-MASTER ~]#
3)在兩臺 WEB Server 服務(wù)器上執(zhí)行 realserver.sh 腳本,為 lo:0 綁定 VIP 地址111.13.6.77,抑制 ARP 廣播,腳本內(nèi)容如下:
[root@WEB1 ~]# cat realserver.sh
#!/bin/bash
#description: Config realserver
VIP=111.13.6.77
#/etc/rc.d/init.d/functions
case "$1" in
start)
/sbin/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"
;;
stop)
/sbin/ifconfig lo:0 down
/sbin/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"
;;
*)
echo "Usage: $0 {start|stop}"
? ? exit 1
esac
exit 0
[root@WEB1 ~]# sh ? realserver.sh ? start ? ? ? ? ? 啟動命令
6、重啟兩臺 LVS 服務(wù)器的 keepalived 服務(wù)并做相關(guān)測試
1)重啟 keepalived 服務(wù)
[root@LVS-SERVER ~]# /etc/init.d/keepalived ? restart
停止 keepalived: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? [確定]
正在啟動 keepalived: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? [確定]
2)通過瀏覽器訪問頁面,查看 LVS-MASTER 狀態(tài)
[root@LVS-MASTER ~]# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port
Forward Weight ActiveConn InActConn
TCP
111.13.6.77:80 rr persistent 50
-> 111.13.6.73:80 Route 3 0 15
-> 111.13.6.74:80 Route 3 0 15
3)通過瀏覽器訪問頁面,查看 LVS-BACKUP 狀態(tài)
[root@LVS-BACKUP ~]# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port
TCP
Forward Weight ActiveConn InActConn
111.13.6.77:80 rr persistent 50
-> 111.13.6.73:80 Route 3 0 0
-> 111.13.6.74:80 Route 3 0 0
通過對比發(fā)現(xiàn)在 MASTER 上有數(shù)據(jù)包,在 BACKUP 上沒有任何數(shù)據(jù)包
4)接下來做高可用性測試和故障切換測試
##################### 高可用性測試 #################
模擬故障, 將LVS-MASTER 上的 keepalived 服務(wù)停掉,然后觀察 LVS-BACKUP上的日志,內(nèi)容如下:
[root@LVS-BACKUP ~]# tail -0f /var/log/messages
Aug 16 18:47:46 LVS-BACKUP Keepalived_vrrp[2061]: VRRP_Instance(VI_1)
Transition to MASTER STATE
Aug 16 18:47:47 LVS-BACKUP Keepalived_vrrp[2061]: VRRP_Instance(VI_1)
Entering MASTER STATE
Aug 16 18:47:47 LVS-BACKUP Keepalived_vrrp[2061]: VRRP_Instance(VI_1) setting
protocol VIPs.
Aug 16 18:47:47 LVS-BACKUP Keepalived_healthcheckers[2060]: Netlink reflector
reports IP 172.16.86.164 added
Aug 16 18:47:47 LVS-BACKUP Keepalived_vrrp[2061]: VRRP_Instance(VI_1)
Sending gratuitous ARPs on eth0 for 111.13.6.77
Aug 16 18:47:52 LVS-BACKUP Keepalived_vrrp[2061]: VRRP_Instance(VI_1)
Sending gratuitous ARPs on eth0 for 111.13.6.77
從日志中可知,主機出現(xiàn)故障后,備機立刻檢測到,此時備機變?yōu)?MASTER 角色,并且接管了主機的虛擬 IP 資源,最后將虛擬 IP 綁定到 eth0 設(shè)備上。
將 LVS-MASTER 上的 keepalived 服務(wù)開啟后,LVS-BACKUP 的日志狀態(tài):
[root@LVS-BACKUP ~]# tail -0f /var/log/messages
Aug 16 18:57:34 LVS-BACKUP Keepalived_vrrp[2061]: VRRP_Instance(VI_1)
Received higher prio advert
Aug 16 18:57:34 LVS-BACKUP Keepalived_vrrp[2061]: VRRP_Instance(VI_1)
Entering BACKUP STATE
Aug 16 18:57:34 LVS-BACKUP Keepalived_vrrp[2061]: VRRP_Instance(VI_1)
removing protocol VIPs.
Aug 16 18:57:34 LVS-BACKUP Keepalived_healthcheckers[2060]: Netlink reflector
reports IP 111.13.6.77 removed
從日志可知,備機在檢測到主機重新恢復(fù)正常后,釋放了虛擬 IP 資源重新成為BACKUP 角色。
#################### 故障切換測試 ##################
故障切換是測試當某個節(jié)點出現(xiàn)故障后,keepalived 監(jiān)控模塊是否能及時發(fā)現(xiàn)然后屏蔽故障節(jié)點,同時將服務(wù)器轉(zhuǎn)移到正常節(jié)點來執(zhí)行。
將 WEB2 節(jié)點停掉,假設(shè)這個節(jié)點出現(xiàn)故障,然后查看主、備機日志信息如下:
[root@LVS-MASTER ~]# tail -0f /var/log/messages
Aug 16 19:10:02 LVS-MASTER Keepalived_healthcheckers[2060]: TCP connection to
[111.13.6.74]:80 failed !!!
Aug 16 19:10:02 LVS-MASTER Keepalived_healthcheckers[2060]: Removing service
[111.13.6.74]:80 from VS [111.13.6.77]:80
Aug 16 19:10:02 LVS-MASTER Keepalived_healthcheckers[2060]: Remote SMTP
server [127.0.0.1]:25 connected.
Aug 16 19:10:03 LVS-MASTER Keepalived_healthcheckers[2060]: SMTP alert
successfully sent.
[root@LVS-BACKUP ~]# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port
TCP
Forward Weight ActiveConn InActConn
111.13.6.77:80 rr persistent 50
-> 111.13.6.73:80 ? ? Route ? 3 ? ? ? ?0 ? ? ? ?0
從以上信息可以看出,keeplived 監(jiān)控模塊檢測到 111.13.6.74 這臺主機出現(xiàn)故障后, 將WEB2 從集群中踢除出去,此時訪問 http://111.13.6.77 就只能訪問到 WEB1的內(nèi)容了。
重新啟動 WEB2 節(jié)點的服務(wù),日志信息如下:
[root@LVS-MASTER sbin]# tail -0f /var/log/messages
Aug 16 20:11:48 LVS-MASTER Keepalived_healthcheckers[3230]: TCP connection to
[111.13.6.74]:80 success.
Aug 16 20:11:48 LVS-MASTER Keepalived_healthcheckers[3230]: Adding service
[111.13.6.74]:80 to VS [111.13.6.77]:80
Aug 16 20:11:48 LVS-MASTER Keepalived_healthcheckers[3230]: Remote SMTP
server [127.0.0.1]:25 connected.
Aug 16 20:11:49 LVS-MASTER Keepalived_healthcheckers[3230]: SMTP alert
successfully sent.
[root@director1 ~]# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port
TCP
Forward Weight ActiveConn InActConn
111.13.6.77:80 rr persistent 50
-> 111.13.6.73:80 Route 3 0 0
-> 111.13.6.74:80 Route 3 0 0
當 keepalived 監(jiān)控模塊檢測到 111.13.6.74 這臺主機恢復(fù)正常后,又將此節(jié)點加入集群中,再次訪問就可以訪問到 WEB2 頁面了。
注意:
如果在 keepalived 配置文件中設(shè)置了 persistence_timeout 后,你通過 ipvsadm -L -n命令時會發(fā)現(xiàn)一直連接著某個 realserver,而不是平均分配資源,其實就是因為persistence_timeout 這個參數(shù)的導(dǎo)致的。具體解釋如下:
Keepalived 的 tcp 長連接問題(persistence_timeout)雖然應(yīng)用 keepalived 搞定了后端服務(wù)負載均衡和高可用性問題,但是在具體應(yīng)用的時候,還是要注意很多問題。很多應(yīng)用都用 tcp 或者 http 的長連接,因為建立tcp 連接或者 http 連接開銷比較大,而應(yīng)用端其實是需要頻繁跟 server 端通訊的,這時候保持長連接無疑是非常合適的。
LVS 的設(shè)置:
查看命令是 ipvsadm --list --timeout 比如我的機器就會返回如下結(jié)果:
Timeout (tcp tcpfin udp): 900 120 300
這就表明我的 tcp session 的 timeout 時間是 900 秒。
設(shè)置 timeout:
#ipvsadm ? --set ? 7200 120 ? 300
這個值如果設(shè)置太小,你的 client 將收到 connection reset by peer 此類的錯誤提示。
Keepalived 的配置:
就是 virtual_server 的 persistence_timeout,意思就是在一定時間內(nèi)會有來自同一用戶(根據(jù) IP 來判斷的)route 到同一個 realserver。對于長連接類的應(yīng)用,你肯定需要這么做。配置值最好跟 LVS 的配置的 timeout 一致。
轉(zhuǎn)載于:https://blog.51cto.com/renlifeng/1276234
總結(jié)
以上是生活随笔為你收集整理的RHEL6.4 Keepalive+LVS(DR)部署文档的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Visual C++中最常用的类与API
- 下一篇: .net remoting 技术