keepalived高可用的常用功能介紹,keepalived功能介紹
Keepalived的作用是檢測web伺服器的狀態,如果有一台web伺服器死機,或工作出現故障,Keepalived將檢測到,並將有故障的web伺服器從系統中剔除,當web伺服器工作正常後Keepalived自動將web伺服器加入到伺服器群中,這些工作全部自動完成,不需要人工幹涉,需要人工做的只是修複故障的web伺服器。本篇文章會介紹keepalived的安裝,配置,還有keepalived的一些指令碼,keepalived+nginx高可用實現和keepalived雙機互為主從的實現。
keepalived環境安裝:
centos6.5上預設提供的keepalived版本為1.2.7的版本,但是官網最新的版本已經為1.2.13,所以這裡我們源碼的方式來安裝keepalived。首先去http://www.keepalived.org/software/keepalived-1.2.13.tar.gz下載最新的keepalived。然後直接編譯安裝的話就可以,如果沒有裝上預設的開發環境,編譯過程中會報一些常見的錯誤,遇到什麼錯誤,裝上對應的環境包即可。當然如果為了方便,可以直接裝上centos 6提供的開發包,這樣編譯過程中就不會出現什麼問題。yum groupinstall "Desktop Platform Development" "Development tools" "Server Platform Development"。我的編譯安裝過程如下:
[root@bogon ~]# tar xf keepalived-1.2.13.tar.gz
[root@bogon ~]# cd keepalived-1.2.13
[root@bogon ~]# ./configure --prefix=/usr/local/keeaplived --sysconfdir=/etc/
[root@bogon ~]# make && make install
[root@bogon ~]# chkconfig --add keepalived
上面裝的keepalived在使用service keepalived start的時候會報錯,因為我們把keepalived的指令碼安裝在了/usr/local/keepalived/sbin目錄下,而/etc/rc.rd下的keepalived中直接使用的是keepalived指令碼。因此可以在PATH中加入/usr/local/keepalived/sbin這個目錄或者在keepalived把調用keepalived的地方全部改成/usr/local/keepalived/sbin/keepalived即可。
為了查閱keepalived.conf檔案的方便,可以在/etc/man.config檔案中加入如下配置:
MANPATH /usr/local/keepalived/share/man
這樣以後就可以直接使用man keepalived.conf來方便的查看keepalived的設定檔了
keepalived+ipvs實現httpd的高可用實驗環境(centos6.5):
1.keepalived的MASTER節點(192.168.1.134)
2.keepalived的BACKUP節點(192.168.1.136)
3.兩台real server的地址分別是(192.168.1.143,192.168.1.170)
4.vip的地址是192.168.1.200
一。首先在兩台real server下配置好arp協議,vip地址和路由策略:
[root@bogon ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@bogon ~]# echo 1 > /proc/sys/net/ipv4/conf/eth0/arp_ignore
[root@bogon ~]# echo 2 > /proc/sys/net/ipv4/conf/eth0/arp_announce
[root@bogon ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
[root@bogon ~]# ifconfig lo:0 192.168.1.200 broadcast 192.168.1.200 netmask 255.255.255.255
[root@bogon ~]# route add -host 192.168.1.200 dev lo:0
二。在192.168.1.134和192.168.1.136兩台節點上裝上keepalived和ipvsadm。
並且為MASTER節點的/etc/keepalived/keepalived.conf中提供如下的設定檔
! Configuration File for keepalived
global_defs {
notification_email {
root@localhost #郵件的收信人地址
}
notification_email_from keepalived@localhost #郵件的發信人地址
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id LVS_DEVEL
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 110
advert_int 1 #兩台節點之間同步資訊的間隔
authentication {
auth_type PASS
auth_pass 123456
}
virtual_ipaddress {
192.168.1.200
}
}
virtual_server 192.168.1.200 80 {
delay_loop 6 #選舉服務投票的延遲時間
lb_algo rr #調度演算法
lb_kind DR #LVS的類型
nat_mask 255.255.255.0
# persistence_timeout 50 #持久串連的逾時時間
protocol TCP
real_server 192.168.1.143 80 {
weight 1
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 3 #串連的逾時時間
nb_get_retry 3 #嘗試的次數
delay_before_retry 3 #嘗試的延遲
}
}
real_server 192.168.1.170 80 {
weight 1
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
把上面的內容複寫到BACKUP節點上,只需要修改state MASTER為state BACKUP和priority 110為priority 100即可。然後啟動keepalived服務,觀察ipvsadm中是否有對應的列表,如果有,證明我們的keepalived已經配置成功.
keepalived預設支援的檢查機制不止HTTP的方式,還有SSL_GET,TCP_CHECK,SMTP_CHECK,MISC_CHECK。如果想要插敘具體的用法,直接man keepalived.conf即可
擴充keepalived的功能:
1.在real server中所有的節點都掛了的時候,再次訪問的時候將不會得到服務,為了使用者的體驗友好性,可以在MASTER和SLAVE節點上提供一個錯誤,當所有的節點都不在的時候,提供一個錯誤的頁面。因此在MASTER和BACKUP兩台主機上裝上httpd服務,並且提供預設的頁面。在此需要在MASTER和BACKUP上修改keepalived.conf設定檔
virtual_server 192.168.1.200 80 {
delay_loop 6
lb_algo rr
lb_kind DR
nat_mask 255.255.255.0
# persistence_timeout 50
protocol TCP
sorry_server 127.0.0.1 80 #virtual_server的配置地方和上面一樣,只是這裡需要新增一行
real_server 192.168.1.143 80 {
weight 1
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 192.168.1.170 80 {
weight 1
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
通過上述的配置以後,當所有的real server都掛掉的時候,預設MASTER上的httpd伺服器將啟用,而當有一台real server上線的時候,MASTER上面的http伺服器將會下線。
2.預設情況下,keepalived的預設配置郵件服務功能,只會在real server發生宕機或者恢複功能的時候發出郵件。很多時候,更希望看到的是提供keepalived的節點發生故障的時候提供郵件服務。keepalived預設提供了三個參數為notify_master,notify_backup和notify_fault。他們分別表示在節點變為master,節點變為backup和節點不可用時可以執行的指令碼。具體的資訊可以通過man查看。因此下面的配置是為keepalived的MASTER節點發生轉移的時候提供郵件功能:
在/etc/keepalived/下面建立一個新的指令檔keepalived_message.sh,這個指令碼接收2個參數,分別是狀態和VIP的地址。當我們調用前面notify_master等指令碼的時候就去自動調用這個指令碼對應的參數,實現發送郵件的功能。指令碼內容如下:
#!/bin/bash
VIP=$2
Usage (){
echo "Usage: `basename $0` {mater|backup} VIP"
}
Send_message (){
subject="${VIP}'s server keepalived state is translate"
content="`date +'%F %T'`: `hostname`'s state change to $1"
echo $content | mail -s "$subject" root@localhost
}
[ $# -lt 2 ] && Usage && exit
case $1 in
master)
Send_message master
;;
backup)
Send_message backup
;;
fault)
Send_message fault
;;
*)
Usage
exit 1
;;
esac
然後在設定檔keepalived.conf中添加如下內容:
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 110
advert_int 1
authentication {
auth_type PASS
auth_pass qiguo139
}
virtual_ipaddress {
192.168.1.200
}
#下面的內容是我們新添加的三行,當keepalived的節點變成對應狀態的時候就去執行上面給出的指令碼發郵件
notify_master "/etc/keepalived/keepalived_message.sh master 192.168.1.200"
notify_backup "/etc/keepalived/keepalived_message.sh backup 192.168.1.200"
notify_fault "/etc/keepalived/keepalived_message.sh fault 192.168.1.200"
}
把上面新添加的keepalived_message.sh指令碼和主設定檔中新添加的三條資訊傳給另外一台keepalived伺服器,然後測試,會發現,對應keepalived的關閉,啟動都會有相應的郵件過來了。
3.keepalived還提供了vrrp_script指令碼,可以擴充當前的監控,這樣我們就可以讓keepalived用在nginx和haproxy的高可用上了。vrrp_script的預設文法為:
vrrp_script check_name {
script "" 需要執行的指令碼內容或指令檔存放的位置
interval 2 每隔多少秒做一次檢測
weight -2 如果失敗了,降低多少權重
fail 2 檢測多少次失敗,才認為是真的失敗
rise 1 檢測一次成功,就認為線上了
}
vrrp_script指令碼定義在執行個體之外。
上面只是定義了一個vrrp_script指令碼,還需要執行它,執行的話可以通過track_script來執行。track_script需要放在執行個體中,讓執行個體隨時的去執行這個指令碼,判斷服務的狀況。因此如果我們定義的是vrrp_script check_name{xxx},在vrrp_instance中需要相應的添加:
track_script{
check_name
}
下面實現keepalived+nginx的高可用功能指令碼,這裡的nginx伺服器仍然做的是負載平衡伺服器,MASTER上的指令碼如下:
! Configuration File for keepalived
global_defs {
notification_email {
root@localhost
}
notification_email_from keepalived@localhost
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id LVS_DEVEL
}
vrrp_script check_nginx {
script "killall -0 nginx"
interval 2
weight -2
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 101
advert_int 1
authentication {
auth_type PASS
auth_pass qiguo139
}
virtual_ipaddress {
192.168.1.200
}
track_script {
check_nginx
}
}
在BACKUP節點上只需要把priority 的值換成100,把state的狀態換成BACKUP即可.
4.有時候讓一台BACKUP長期處於空閑狀態容易造成資源浪費,因此可以配置雙機互為主從。其主要的思路就是建立2個虛擬路由器,並以兩個節點互為主從。我們修改上面頂一個nginx+keepalived的高可用指令碼來實現互為主從:
! Configuration File for keepalived
global_defs {
notification_email {
root@localhost
}
notification_email_from keepalived@localhost
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id LVS_DEVEL
}
vrrp_script check_nginx {
script "killall -0 nginx"
interval 2
weight -2
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 101
advert_int 1
authentication {
auth_type PASS
auth_pass qiguo139
}
virtual_ipaddress {
192.168.1.200
}
track_script {
check_nginx
}
}
vrrp_instance VI_2 {
state BACKUP #對於另外一台主的從
interface eth0
virtual_router_id 52 #定義一個新的虛擬路由的時候,不能和原來的虛擬路由ID的值一樣
priority 100 #對於另外一台的優先順序
advert_int 1
authentication {
auth_type PASS
auth_pass qiguo139
}
virtual_ipaddress {
192.168.1.201 #定義在BACKUP上的VIP
}
track_script {
check_nginx
}
}
然後在BACKUP上面互換關係即可。然後再次查看會發現在原來的MASTER上面會綁定192.168.1.200的VIP,原來的BACKUP上面會綁定192.168.1.201的VIP。
lvs 與 keepalived的有什不同
呵呵,這個問題也困擾我一陣子,今天上午查了很多資料才搞清楚:1. ipvsadm(LVS)有負載平衡機制,目前支援8中均衡演算法。2. keepalived除了健全狀態檢查以外,也具備負載平衡功能。現在他的健全狀態檢查功能用的比較多,其負載平衡能力被大部分人忽略了。3. lvs+keepalived這種架構下,完全可以使用keepalived來均衡負載(ipvsadm這個組件也需要裝上,只是為了便於管理叢集)。
keepalived的問題
是必須的,不能選擇