RHEL6.4 Keepalive+LVS(DR)部署文檔

1、簡介
LVS+Keepalived 能實現的功能:利用 LVS 控制器主備模式避免單點故障以及自動刪除故障 WEB 服務器結點並當它恢復後再自動添加到羣集中。
拓撲圖:


2、系統環境
系統平臺:RHEL6.4
硬件平臺:dell R720*4
硬件參數:cpu(e5-2609)兩顆;內存 32G;磁盤 600G*6;RAID 5 ;雙電源
LVS 版本:ipvsadm-1.25
Keepalived 版本:keepalived-1.2.7
3、IP 地址規劃:
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 地址根據實際情況而定
4、安裝及配置 keepalived
1)下載源碼包並在兩臺 LVS 服務器上進行編譯安裝
#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.
如果出現上面的提示說明缺少 gcc 編譯工具,執行下面命令進行安裝:

[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.
!!!
如果出現上面的提示說明缺少 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
如果出現上面提示說明缺少 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
如果出現上面信息說明編譯環境檢查成功,編譯命令如下:

[root@LVS-MASTER keepalived-1.2.7]# yum install make -y
[root@LVS-MASTER keepalived-1.2.7]# make && make install
################ 將 keepalived 做成啓動服務 #################
[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 主節點配置如下,紅色表示需要配置項:
##################### LVS-MASTER ####################
! Configuration File for keepalived
global_defs {
notification_email {
[email protected]      #指定 keepalived 在發生切換時需要發
                                                     送 email 到的對象,一行一個。

}
notification_email_from [email protected]     #指定發件人
smtp_server 127.0.0.1 #指定 smtp 服務器地址
smtp_connect_timeout 30 #指定 smtp 連接超時時間
router_id LVS_DEVEL #運行 keepalived 機器的一個標識
}
vrrp_instance VI_1 {    #監控多個網段的實例

state MASTER             #指定那個爲 master,那個爲 backup,如果設置了
                                     nopreempt 這個值不起作用,主備靠 priority 決定
interface eth0            #設置實例綁定的網卡
virtual_router_id 51
priority 100               #優先級,高優先級竟先爲 master
advert_int 1               #檢查間隔,默認爲 1 秒
authentication {        #設置認證
auth_type PASS         #認證方式
auth_pass 1111         #認證密碼
}
virtual_ipaddress {    #設置 VIP
111.13.6.77

}
}
virtual_server 111.13.6.77 80 {
delay_loop 6            #健康檢查時間間隔
lb_algo rr                 #LVS 調度算法 rr|wrr|lc|wlc|lblc|sh|dh
lb_kind DR               #負載均衡轉發規則 NAT|DR|TUN,默認爲 NAT
persistence_timeout 50     #會話保持時間
protocol TCP                      #使用的協議
real_server 111.13.6.73 80 {            #真實服務器 IP 地址和端口

weight 3                #權重 默認爲 1,0 爲失效
TCP_CHECK {
connect_timeout 10     #連接超時時間

nb_get_retry 3              #重試次數

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 備節點配置如下,紅色表示配置項,藍色表示與 MASTER 不同之處:
########################### BACKUP#########################
! Configuration File for keepalived
global_defs {
notification_email {
[email protected]        #指定 keepalived 在發生切換時需要發
                                                       送 email 到的對象,一行一個。

}
notification_email_from [email protected]   #指定發件人smtp_server 127.0.0.1          #指定 smtp 服務器地址
smtp_connect_timeout 30    #指定 smtp 連接超時時間
router_id LVS_DEVEL            #運行 keepalived 機器的一個標識
}
vrrp_instance VI_1 {              #監控多個網段的實例

state BACKUP                      #指定那個爲 master,那個爲 backup,如果設置了
                                              nopreempt 這個值不起作用,主備靠 priority 決定
interface eth0           #設置實例綁定的網卡
virtual_router_id 51
priority 99                  #優先級,高優先級竟先爲 master
advert_int 1               #檢查間隔,默認爲 1 秒
authentication {         #設置認證
auth_type PASS          #認證方式
auth_pass 1111          #認證密碼
}
virtual_ipaddress {     #設置 VIP
111.13.6.77

}
}
virtual_server 111.13.6.77 80 {
delay_loop 6             #健康檢查時間間隔
lb_algo rr                  #LVS 調度算法 rr|wrr|lc|wlc|lblc|sh|dh
lb_kind DR                #負載均衡轉發規則 NAT|DR|TUN,默認爲 NAT
persistence_timeout 50    #會話保持時間(同一 IP 的連接 50 秒內被分配到同一臺 realserver)
protocol TCP             #使用的協議

real_server  111.13.6.73 80 {   #真實服務器 IP 地址和端口

weight 3            #權重 默認爲 1,0 爲失效
TCP_CHECK {
connect_timeout 10         #連接超時時間

nb_get_retry 3                 #重試次數

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 上執行 director.sh 腳本,腳本內容如下:
[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 服務器上執行 realserver.sh 腳本,爲 lo:0 綁定 VIP 地址111.13.6.77,抑制 ARP 廣播,腳本內容如下:
[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 服務器的 keepalived 服務並做相關測試
1)重啓 keepalived 服務
[root@LVS-SERVER ~]# /etc/init.d/keepalived   restart
停止 keepalived:                                             [確定]
正在啓動 keepalived:                                       [確定]
2)通過瀏覽器訪問頁面,查看 LVS-MASTER 狀態
[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 狀態
[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
通過對比發現在 MASTER 上有數據包,在 BACKUP 上沒有任何數據包
4)接下來做高可用性測試和故障切換測試
##################### 高可用性測試 #################
模擬故障, 將LVS-MASTER 上的 keepalived 服務停掉,然後觀察 LVS-BACKUP上的日誌,內容如下:
[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
從日誌中可知,主機出現故障後,備機立刻檢測到,此時備機變爲 MASTER 角色,並且接管了主機的虛擬 IP 資源,最後將虛擬 IP 綁定到 eth0 設備上。
將 LVS-MASTER 上的 keepalived 服務開啓後,LVS-BACKUP 的日誌狀態:
[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
從日誌可知,備機在檢測到主機重新恢復正常後,釋放了虛擬 IP 資源重新成爲BACKUP 角色。
#################### 故障切換測試 ##################
故障切換是測試當某個節點出現故障後,keepalived 監控模塊是否能及時發現然後屏蔽故障節點,同時將服務器轉移到正常節點來執行。
將 WEB2 節點停掉,假設這個節點出現故障,然後查看主、備機日誌信息如下:
[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 監控模塊檢測到 111.13.6.74 這臺主機出現故障後, 將WEB2 從集羣中踢除出去,此時訪問 http://111.13.6.77 就只能訪問到 WEB1的內容了。
重新啓動 WEB2 節點的服務,日誌信息如下:
[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 監控模塊檢測到 111.13.6.74 這臺主機恢復正常後,又將此節點加入集羣中,再次訪問就可以訪問到 WEB2 頁面了。
注意:
如果在 keepalived 配置文件中設置了 persistence_timeout 後,你通過 ipvsadm -L -n命令時會發現一直連接着某個 realserver,而不是平均分配資源,其實就是因爲persistence_timeout 這個參數的導致的。具體解釋如下:
Keepalived 的 tcp 長連接問題(persistence_timeout)雖然應用 keepalived 搞定了後端服務負載均衡和高可用性問題,但是在具體應用的時候,還是要注意很多問題。很多應用都用 tcp 或者 http 的長連接,因爲建立tcp 連接或者 http 連接開銷比較大,而應用端其實是需要頻繁跟 server 端通訊的,這時候保持長連接無疑是非常合適的。
LVS 的設置:
查看命令是 ipvsadm --list --timeout 比如我的機器就會返回如下結果:
Timeout (tcp tcpfin udp): 900 120 300
這就表明我的 tcp session 的 timeout 時間是 900 秒。
設置 timeout:
#ipvsadm   --set   7200 120   300
這個值如果設置太小,你的 client 將收到 connection reset by peer 此類的錯誤提示。
Keepalived 的配置:
就是 virtual_server 的 persistence_timeout,意思就是在一定時間內會有來自同一用戶(根據 IP 來判斷的)route 到同一個 realserver。對於長連接類的應用,你肯定需要這麼做。配置值最好跟 LVS 的配置的 timeout 一致。

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