1. 程式人生 > 實用技巧 >利用LVS+keepalived的主從模式實現http的高可用性

利用LVS+keepalived的主從模式實現http的高可用性

實驗前提:
1、本次實驗作者使用的是RHEL5.8的32位系統平臺。
2、實驗所需軟體為ipvsadm、keepalived、httpd
3、每個節點對應的ip地址如下:
direct1 192.168.108.199
direct2 192.168.108.201
realserver1192.168.108.202
realserver2192.168.108.150
VIP192.168.108.100

實驗拓撲如下:

wKioL1UFi5Pj4gRuAACck0M2hr0262.jpg


安裝ipvsadm
在keepalived的配置檔案中有一部分是關於LVS的配置,這部分配置在keepalived指令碼啟動後會作為引數傳遞給ipvsadm,ipvsadm從而會自動生成相關的IPVS規則。ipvsadm需要在兩個direct上都安裝

#yum -y install ipvsadm


安裝keepalived
在這裡使用編譯的方式進行安裝keepalived,軟體下載地址http://www.keepalived.org/download.html
keepalived需要在前端2個direct上都安裝

#tar xf keepalived-1.2.13.tar.gz
#cd keepalived-1.2.13
#./configure --prefix=/
#make && make install

如果在安裝keepalived時出現如下錯誤,只需要在編譯時,新增--disable-fwmark引數即可
checking for nl_socket_modify_cb in -lnl... no

configure: WARNING: keepalived will be built without libnl support.
checking for kernel version... 2.6.18
checking for IPVS syncd support... yes
checking for kernel macvlan support... no
checking whether SO_MARK is declared... no
configure: error: No SO_MARK declaration in headers


編輯配置檔案/etc/keepalived.conf

global_defs {
notification_email {
[email protected]
}
notification_email_from [email protected]
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id LVS_DIRECT1
}

vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 88
priority 100
advert_int 2
authentication {
auth_type PASS
auth_pass suiji
}
virtual_ipaddress {
192.168.108.100
}
}

virtual_server 192.168.108.100 80 {
delay_loop 6
lb_algo rr
lb_kind DR
persistence_timeout 0
protocol TCP

real_server 192.168.108.150 80 {
weight 1
HTTP_GET {
url {
path /www/xsl.com/index.html
}
connect_timeout 3
nb_get_retry 2
delay_before_retry 2
}
}


real_server 192.168.108.202 80 {
weight 1
HTTP_GET {
url {
path /www/xsl.com/index.html
}
connect_timeout 3
nb_get_retry 2
delay_before_retry 2
}
}
}
編輯好配置檔案後,可以將這個檔案複製到另一個direct節點,另一個節點必須事先建立好/etc/keepalived目錄
#scp /etc/keepalived/keepalived.conf direct2:/etc/keepalived
然後在direct2上修改state為BACKUP,priority為90即可


#chkconfig --add keepalived
#chkconfig keepalived on


接在在這兩個direct上啟動keepalived服務
#service keepalived start

當keepalived啟動完成之後,可以檢查虛擬IP地址是否已經生產,且虛擬IP地址位於MASTER上。
由於在配置檔案中將direct1設定為MASTER,因此,只需要在direct上執行如下命令,即可檢查配置是否成功
#ip addr show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000
link/ether 00:0c:29:ed:fa:67 brd ff:ff:ff:ff:ff:ff
inet 192.168.108.199/24 brd 192.168.108.255 scope global eth0
inet 192.168.108.100/32 scope global eth0
inet6 fe80::20c:29ff:feed:fa67/64 scope link
valid_lft forever preferred_lft forever

需要說明的是虛擬ip地址是配置在介面上的,作為這個介面的第二地址,因此,使用ifconfig命令是看不出來的。

測試VIP漂移過程
當direct1發生故障時,測試VIP是否會漂移到direct2上去。
可以在direct1上執行如下命令來模擬direct1發生故障:
#service keepalived stop

執行命令完成之後,再在direct2上執行如下命令:
#ip addr show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000
link/ether 00:0c:29:4f:f1:6a brd ff:ff:ff:ff:ff:ff
inet 192.168.108.201/24 brd 192.168.108.255 scope global eth0
inet 192.168.108.100/32 scope global eth0
inet6 fe80::20c:29ff:fe4f:f16a/64 scope link
說明,當direct1發生故障時,VIP會立即漂移到direct2上去

其實配置到這裡,keepalived的高可用功能已經實現了,接下來需要配置的是與lvs有關的內容


realserver上的配置
安裝httpd服務
在兩個realserver上安裝httpd服務
#yum -y install httpd

#service httpd start


安裝完成後,最好是編輯一下每個realserver上的httpd預設根路徑下的檔案,即/var/www/html/index.html檔案,使得2個檔案保持不一致。方便後續測試。
然後在本機測試一下,看http服務是否可以正常訪問,如果可以正常訪問,則繼續下面的操作。

將http服務設定為開機自啟動。需要在兩個realserver上都執行
#chkconfig httpd on

在兩個realserver上配置VIP,配置VIP的命令如下:
# echo 1 > /proc/sys/net/ipv4/conf/eth0/arp_ignore
# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
# echo 2 > /proc/sys/net/ipv4/conf/eth0/arp_announce
# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
#ifconfig lo:0 192.168.108.100 broadcast 192.168.108.100 netmask 255.255.255.255 up
#route add -host 192.168.108.100 dev lo:0

在MASTER上檢視IPVS規則是否生成
#ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.108.100:80 rr
-> 192.168.108.202:80 Route 1 0 0
-> 192.168.108.150:80 Route 1 0 0

測試一
在瀏覽器上面輸入http://192.168.108.100,然後再觀察頁面的內容

wKiom1UFisPAk31jAAEC9Av6iPo721.jpg


然後再次重新整理頁面,觀察頁面的內容

wKioL1UFi_ryNAUEAAETBPeLoeM182.jpg

從上面測試知道,LVS的負載均衡功能已經實現。

測試二
當direct1發生故障時,direct1上的IPVS規則應該會被刪除。
在direct1上執行如下命令用來模擬MASTER發生故障
#service keepalived stop
執行完成以後,分別在direct1和direct2上執行如下命令,來觀察各個direc上的IPVS規則:
#ipvsadm -L -n
執行完成後,就會發現direct1上面的規則沒有了。這裡就不截圖了。


測試三
當後端的realserver發生故障或執行在realserver上的服務發生故障時,則與這個realserver相關的IPVS規則會被刪除。
如在realserver1上執行如下命令,來模擬httpd服務發生故障
#service httpd stop
然後再在作為MASTER上的伺服器上檢視IPVS規則,使用如下命令即可檢視IPVS規則,這裡我的direct2是作為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 192.168.108.100:80 rr
-> 192.168.108.150:80 Route 1 0 0
看看,與realserver1相關的IPVS規則被刪除了,說明測試成功。


其實,實驗做到這裡來,一個LVS+keepalived來實現web服務的高可用叢集基本成功了。只是,對於這個實驗仍然有許多不足之處,比如:
1、如果後端的realserver都發生故障,則前端的direct將無法響應客戶端的請求,因此,會出現客戶端打不開頁面的情況,因此,在這種情況下,我們最好是返回一個提示資訊給使用者(如網站正在維護,請您稍後在瀏覽),這樣給使用者的感覺就比較直觀。
2、其中在整個實驗過程中,我們實現MASTER/BACKUP切換的主要是通過停止keepalived服務來進行的,那如何通過指令碼來完成模式切換功能呢?
3、當VRRP切換事務發生時,如何傳送警告給指定的管理員?

4、當keepalived與nginx或haproxy實現高可用時,如果nginx或haproxy服務本身不可用時,此時仍然需要實現主從切換,雖然MASTER伺服器雖然可以正常工作,但是不能對外提供服務,這也是不允許的?該過程如何實現?


補充一
當後端的realserver都出現故障時,如何返回一個提示資訊給使用者?
配置步驟:
1、需要在所有的direct上安裝httpd服務並將其設定為開機自啟動,如:
#yum -y install httpd
#chkconfig httpd on


2、修改httpd服務預設根路徑下的檔案index.html的內容
echo "Site is down for maintenance, please wait while browsing" > /www/xsl.com/index.html
說明:這裡我採用的基於虛擬主機的httpd服務,因此,根路徑可能不一樣。如果是基於中心主機來配置的httpd服務,那麼它的預設根路徑下的檔案為/var/www/html/index.html,即修改這個檔案中的內容即可。


3、在所有的direct上啟動httpd服務
#service httpd start

4、修改配置檔案,需要在所有的direct上做修改
#vim /etc/keepalived/keepalived.conf
需要在virtual_server 192.168.108.100 80 { }中新增一樣這樣的資訊
sorry_server 127.0.0.1 80

如:
virtual_server 192.168.108.100 80 {
delay_loop 6
lb_algo rr
lb_kind DR
persistence_timeout 0
protocol TCP
sorry_server 127.0.0.1 80
...
}


4、模擬所有的realserver都down掉,如下命令需要在所有的realserver上執行
#service httpd stop

5、測試
在瀏覽器上面輸入http://192.168.108.100,觀察網頁的內容

wKiom1UFiy-xJME7AAEM-uowd6U224.jpg


發現網頁的內容就是我們剛剛新增的內容。說明當所有的realserver都掛掉之後,訪問的httpd服務是MASTER上的httpd服務,本地的httpd服務將返回本地頁面中的內容給使用者,該頁面主要提供警示資訊。


補充二、通過自寫監測指令碼來實現MASTER/BACKUP的切換
1、在所有的direct的配置檔案/etc/keepalived/keepalived.conf新增如下配置:
vrrp_script chk_httpd_down {
scripts "[[ -f /etc/keepalived/down ]] && exit 1 || exit 0" 這個表示要執行的命令或指令碼
interval 2 每個2秒檢測一次
weight 20 檢測失敗後,本節點的priority值會響應減少20
fall 2 如果檢測2次都失敗了,則認為失敗
rise 1 如果檢測一次成功,則認為是成功了。
}

指令碼對好了之後,還需要在例項中呼叫。下面這段配置需要新增到例項配置下
track_script {
chk_httpd_down
}


整個步驟如下:
vrrp_script chk_httpd_down {
script "[[ -f /etc/keepalived/down ]] && exit 1 || exit 0 "
interval 2 每隔2秒檢查一下該檔案是否存在
weight -20 上述指令碼如果執行失敗(即狀態碼返回1),則優先順序減20
fall 2 連續檢查2次都失敗了,則最終認為失敗了
rise 1 連續檢查1次成功了,則認為成功了。
}

vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 88
priority 100
advert_int 2
authentication {
auth_type PASS
auth_pass suiji
}
virtual_ipaddress {
192.168.108.100
}
track_script {
chk_httpd_down
}
}

上述新增的內容的意思是:只要在/etc/keepalived/目錄下存在down這個檔案,則MASTER就會切換成BACKUP。

3、測試

在當前MASTER節點上的/etc/keepalived/目錄下建立down檔案,觀察此時節點的狀態,此時你會發現,VIP已經飄逸到之前的BACKUP上去了。此時此刻該節點的狀態為BACKUP。

補充三、當VRRP切換事務發生時,如何傳送警告給指定的管理員?
在所有的direct上修改配置檔案,並新增如下配置
notify_master "/etc/keepalived/notify.sh master"
notify_backup "/etc/keepalived/notify.sh backup"
notify_fault "/etc/keepalived/notify.sh fault"

這段配置是配置在vrrp_instance VI_1 {}例項中的


編寫通知指令碼
#vim notify.sh

通知指令碼如下:
#vim notify.sh
#!/bin/bash

#author:xsl
#description: An example of notify script
#

vip=192.168.108.100
contact='[email protected]'

notify() {
mailsubjiect="`hostname` is to be $1 ,$vip floating"#這裡是郵件的主題
mailbody="`date '+%F %H:%M:%S'`:vrrp transition,`hostname` changed to be $1 "
echo $mailbody | mail -s "$mailsubject" $contact
}

case $1 in
master)
notify master
/etc/rc.d/init.d/haproxy start
exit 0
;;
backup)
notify backup
/etc/rc.d/init.d/haproxy stop
exit 0
;;
fault)
notify fault

/etc/rc.d/init.d/haproxy stop
exit 0
;;
*)
echo "usage:`basename $0` {master|backup|fault}"
exit 1
;;
esac

給指令碼加執行許可權
#chmod +x notify.sh

然後將其複製一份傳給direct2
#scp /etc/keepalived/notify.sh direct2:/etc/keepalived/

測試,在direct1節點上新增down檔案
#touch /etc/keepalived/down

檢視虛擬IP地址是否還位於direct1上
#ip addr show


檢視ipvs規則是否已被刪除
#ipvsadm -L -n


如果虛擬ip地址不存在了,則表示操作都成功了。一旦發生主從切換,root使用者應該可以收到相關的郵件資訊了。

四、當keepalived與nginx或haproxy實現高可用時,如果nginx或haproxy服務本身不可用,如何實現主從切換?

其實這個過程和之前自寫指令碼完成MASTER/BACKUP切換過程是一樣的。以haproxy為例,其配置如下:

vrrp_script haproxy_check {

script "killall -0 haproxy" //這個命令用來測試haproxy這個程序是否存在,不會真正執行

interval 2

weight -2

}

track_script {

haproxy_check

}


轉載於:https://blog.51cto.com/xslwahaha/1620658