在這裡我們要講Keepalived的使用,在講Keepalived之前,我們要先講講VRRP的使用。因為Keepalived加入VRRP功能,使得現在的Keepalived具有伺服器運作檢測功能與HA Cluster功能。
一、VRRP定義
VRRP(Virtual Routing Redundent Protocol):虛拟路由備援協定,它是一種協定,将多态實體裝置組合成一台虛拟裝置。
1、備份組中路由器的優先級
在一個備份組中,有一個主(master),多個從(slave),當主伺服器(master)當機了,從伺服器就要取而代之,但是那麼多從服務哪個取代呢?它有一個根據優先級的選舉協定,優先級高的誰就成為主的了,或者讓它工作在搶占模式下,誰反應快,誰就成為主的了。是以它是一主多從的工作機制,但是多個從平時都不上線,這就造成了資源的浪費,是以我們常見的就是一主一從,實際它是可以實作一主多從的。
VRRP優先級的取值範圍為0~255(數值越大表名優先級越高),可配置的範圍是1~254,優先級0為形同保留,255則是系統保留給IP位址擁有者,當路由器為IP位址擁有者時,其優先級始終為255,是以,當備份組記憶體在IP位址擁有者時,隻要其工作正常,則為Master路由器。
在一個實體裝置上,可以配置多個組,靠組ID差別不同的組。在同一個組内,所有的工作都在同一個組内工作的。
2、VRRP工作過程
(1)路由器使用VRRP功能後,會根據優先級确定自己在備份中的角色。優先級高的為Master,低的為Backup,Master定義發送VRRP通告封包,通知備份組中的其它路由器自己工作正常。Backup則啟動定時器等待通告封包的到來。
(2)在搶占模式下,當Backup收到VRRP通告的封包後,會拿自己的優先級比較通報封包中的優先級,如果大于通告封包中的優先級,則成為Master ,如果小于通告封包中的優先級,則還是Backup。
(3)在非搶占模式下,隻要Master路由器沒有出現問題,備份組中的路由器始終保持着自己原來的狀态,即使後來有的Backup有更高的優先級也不會成為Master。
(4)如果Backup的定時逾時後仍然沒有收到Master路由器發送來的VRRP通告封包,則認為Master已經無法正常工作了,此時Backup會認為自己是Master,并對外發送VRRP通告封包,備份組内的路由會根據優先級選舉出來Master,承擔封包的轉發功能。
二、Keepalived定義及主要功能
Keepalived:最初目的為ipvs提供高可用功能的,是以我們實作ipvs高可用的時候我們使用Keepalived來配置更簡
主要提供三個功能
1、IP:對IP位址實作飄移,依賴于ARRP協定
2、lvs:重新啟用一份ipvs規則
3、health check:健康檢查
三、配置安裝Keepalived實作LVS服務的高可用
我們這裡使用四台虛拟機,其中HA1和HA2當做高可用的Web服務,另外兩個做成real server。這裡我們要先在HA1和HA2上面安裝keepalived,這個軟體我們這些下載下傳到本地了,大家配置了上官網上下載下傳(keepalived-1.2.7-5.el5.i386.rpm) 軟體包,因為安裝這個包還需要解決依賴關系,是以這裡我們還需要安裝yum庫,安裝完成後我們就開始安裝keepalived。
1、安裝yum庫
我們這裡用挂載CD光牒來安裝yum庫,進而安裝開發環境,需要安裝Development Libraries和Development Tools,但是Development Tools預設都安裝過了,是以我們這裡安裝一個就行了。安裝完成後開發環境就安裝成功了。

[root@localhost ~]# mkdir /mnt/cdrom ###建立cdrom目錄
[root@localhost ~]# mount /dev/cdrom /mnt/cdrom ###挂載CD光牒(當場有效,開機無效)
[root@localhost ~]# vim /etc/fstab ###在配置檔案中挂載CD光牒(當場無效,開機有效)
/dev/cdrom /mnt/cdrom ext3 defaults 0 0
[root@localhost ~]# cd /etc/yum.repos.d/ ###進入yum.repos.d目錄下面
[root@localhost yum.repos.d]# vim server.repo ###編輯server.repo
[base]
name=Server
baseurl=file:///mnt/cdrom/Server
enabled=1
gpgcheck=0
[root@localhost yum.repos.d]# yum groupinstall "Development Libraries"
2、安裝keepalived
# yum -y--nogpgcheck localinstall keepalived-1.2.7-5.el5.i386.rpm
# rpm -qlkeepalived ###檢視配置檔案
/etc/keepalived ###配置檔案目錄
/etc/keepalived/keepalived.conf ###主配置檔案
/etc/keepalived/keepalived.conf.haproxy_example ###自己設定的主配置檔案将haproxy配置成高可用功能了
/etc/keepalived/notify.sh ###這裡我們設定的腳本,網上下載下傳是沒有的。
# scpkeepalived-1.2.7-5.el5.i386.rpm node1:/root ###把下載下傳的軟體包給前HA2發過去。
3、檢視并解釋配置檔案。
四、配置real server
我們需要設定IP位址與director在同一個網段内,首先我們要先關閉selinux,然後安裝http伺服器進行通路測試,然後編輯網頁,網頁編輯完成後我們就要開啟服務,下來進行網頁測試。
#setenforce0 ###關閉selinux
# yum installhttpd ###安裝http服務
# vim /var/www/html/index.html ###編輯網頁
# service httpdrestart ###開啟服務
我們這裡使用的是一個腳本,此腳本隻需要在real server中使用就行了。
# vim start.sh###編輯腳本,腳本内容如下:
#!/bin/bash
#
# Script to start LVS DR real server.
# description: LVS DR real server
#
. /etc/rc.d/init.d/functions
VIP=172.16.58.1
host=`/bin/hostname`
case "$1" in
start)
# Start LVS-DR real server on this machine.
/sbin/ifconfig lo down
/sbin/ifconfig lo up
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
/sbin/ifconfig lo:0 $VIP broadcast $VIP netmask 255.255.255.255 up
/sbin/route add -host $VIP dev lo:0
;;
stop)
# Stop LVS-DR real server loopback device(s).
/sbin/ifconfig lo:0 down
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
;;
status)
# Status of LVS-DR real server.
islothere=`/sbin/ifconfig lo:0 | grep $VIP`
isrothere=`netstat -rn | grep "lo:0" | grep $VIP`
if [ ! "$islothere" -o ! "isrothere" ];then
# Either the route or the lo:0 device
# not found.
echo "LVS-DR real server Stopped."
else
echo "LVS-DR real server Running."
fi
;;
*)
# Invalid entry.
echo "$0: Usage: $0 {start|status|stop}"
exit 1
;;
esac
## chmod +x start.sh
# ./start.sh start
# ifconfig (顯示的是隻是添加的内容)
# scp start.sh172.16.58.10:/root/ ###将腳本複制到另一個real server上進行執行。
五、修改主配置檔案
1、修改HA1中的keepalived的配置檔案
下面我們就去HA1和HA2中修改主配置檔案,我們在修改主配置檔案的時候首先就是要将主配置檔案複制一份,然後在修改,這樣避免出錯後,無法修改。
! Configuration File for keepalived ###表示注釋資訊,#也表是注釋
global_defs { ###這裡面都是全局預設
notification_email {
root@localhost
}
notification_email_from root@localhost
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id LVS_DEVEL
}
vrrp_instance VI_1 { ###定義虛拟路由(可以定義多個虛拟路由組)
state MASTER ###狀态(有兩種,一種MASTER另一種BACKUP)【提示:隻在初始的時候定義主、從】
interface eth0 ###在哪個接口上實作配置位址和完成選舉
virtual_router_id 77 ###在VI_1下面定義的虛拟ID,必須要和别的人不一樣
priority 101 ###優先級
advert_int 1 ###多長時間通告一次(這裡是1秒鐘)
authentication { ###認證
auth_type PASS ###表示用字元串來認證
auth_pass password ###生成随機串(最好是随機的)
}
virtual_ipaddress { ###提供虛拟IP(可以是一個,也可以是多個)
172.16.58.1
}
}
virtual_server 172.16.58.1 80 { ###定義虛拟伺服器,後面是VIP,最後面是端口【提示:可以定義多個叢集服務】
delay_loop 6
lb_algo wlc ####負載均衡排程方法,rr為輪詢
lb_kind DR ###LVS的類型
nat_mask 255.255.0.0
protocol TCP ###端口協定使用TCP
real_server 172.16.58.8 80 { ###real server位址,端口
weight 1 ###權重
url {
path / ###擷取web伺服器的根目錄,直接擷取首頁,顯示200正常,顯示404等為不正常
status_code 200
}
connect_timeout 2 ###多長時間探測一次(2s),如果3s中後擷取不到,則為不健康
nb_get_retry 3 ###在探測不健康的時候要嘗試幾次(3次)
delay_before_retry 1 ###每一次嘗試之前要延遲多長時間 (1s)
}
virtual_server 172.16.58.1 80 {
delay_loop 6
lb_algo wlc
lb_kind DR
nat_mask 255.255.0.0
protocol TCP
real_server 172.16.58.10 80 {
weight 1
url {
path /
status_code 200
}
connect_timeout 2
nb_get_retry 3
delay_before_retry 1
}
}
2、将HA1中配置檔案複制到HA2中
修改好配置檔案後,我們還需要将這個配置檔案複制到HA2一份,不隻是複制過去就行了,我們還需要修改配置檔案的。
3、開啟兩個HA服務
#service keepalived start ###啟動keepalived
#ip add show ###檢視網絡狀态
4、安裝ipvsadm (兩個服務上都要安裝)
# ip add show
# servicekeepalived restart ###重新開機keepalived
# ipvsadm -L –n ###檢視每一個real server對外所提供使用者請求的次數
六、實作基于web服務的高可用叢集(在HA1和HA2上)
1、工作圖
簡述:當用戶端通過路由器通路我們的伺服器的時候,隻能通路到我們的MASTER伺服器上,當MASTER出現問題的時候,它的VIP會飄移到BACKUP上,會替代MASTER而成為MASTER的。
2、編輯網頁并進行測試
# service keepalived stop ###停止keepalived
# yum -y install httpd ###裝好web服務
# vim /var/www/html/index.html ###編輯網頁
<h1>node1</h1> ###HA1網頁内容
<h1>node2</h1> ###HA2網頁内容
# service httpd start ###啟動服務
首先確定服務不會成為高可用叢集的故障,我們首先要啟動服務,然後進行測試。
3、修改keepalived配置檔案并設定腳本
這裡我們還需要将配置檔案中的内容修改,我們修改後的内容如下:
! Configuration File for keepalived
global_defs {
notification_email {
[email protected]
[email protected]
}
notification_email_from [email protected]
smtp_connect_timeout 3
smtp_server 127.0.0.1
router_id LVS_DEVEL
}
vrrp_script chk_httpd{
script "killall -0 httpd"
interval 2
# check every 2 seconds
weight -2
# if failed, decrease 2 of the priority
fall 2
# require 2 failures for failures
rise 1
# require 1 sucesses for ok
}
vrrp_script chk_schedown {
script "[[ -f /etc/keepalived/down ]] && exit 1 || exit 0"
interval 2
weight -2
}
vrrp_instance VI_1 {
interface eth0
# interface for inside_network, bound by vrrp
state MASTER
# Initial state, MASTER|BACKUP
# As soon as the other machine(s) come up,
# an election will be held and the machine
# with the highest "priority" will become MASTER.
# So the entry here doesn't matter a whole lot.
priority 101
# for electing MASTER, highest priority wins.
# to be MASTER, make 50 more than other machines.
virtual_router_id 51
# arbitary unique number 0..255
# used to differentiate multiple instances of vrrpd
# running on the same NIC (and hence same socket).
garp_master_delay 1
authentication {
auth_type PASS
auth_pass password
}
track_interface {
eth0
}
# optional, monitor these as well.
# go to FAULT state if any of these go down.
virtual_ipaddress {
172.16.58.1/16 dev eth0 label eth0:0
}
#addresses add|del on change to MASTER, to BACKUP.
#With the same entries on other machines,
#the opposite transition will be occuring.
#<IPADDR>/<MASK> brd <IPADDR> dev <STRING> scope <SCOPE> label <LABEL>
track_script {
chk_httpd
chk_schedown
}
notify_master "/etc/keepalived/notify.sh master"
notify_backup "/etc/keepalived/notify.sh backup"
notify_fault "/etc/keepalived/notify.sh fault"
}
#vrrp_instance VI_2 {
# interface eth0
# state MASTER # BACKUP for slave routers
# priority 101 # 100 for BACKUP
# virtual_router_id 52
# garp_master_delay 1
#
# authentication {
# auth_type PASS
# auth_pass password
# }
# track_interface {
# eth0
# }
# virtual_ipaddress {
# 172.16.58.2/16 dev eth0 label eth0:1
# }
# track_script {
# chk_httpd
# chk_mantaince_down
# }
#
# notify_master "/etc/keepalived/notify.sh master eth0:1"
# notify_backup "/etc/keepalived/notify.sh backup eth0:1"
# notify_fault "/etc/keepalived/notify.sh fault eth0:1"
#}
開始的時候我就說過,我們這裡自己設定的有腳本,大家如果想配置,腳本的内容如下:
#vim notify.sh
腳本内容如下:
#!/bin/bash
# Author: MageEdu <[email protected]>
# description: An example of notify script
#
ifalias=${2:-eth0:0}
interface=$(echo $ifalias | awk -F: '{print $1}')
vip=$(ip addr show $interface | grep $ifalias | awk '{print $2}')
#contact='[email protected]'
contact='root@localhost'
workspace=$(dirname $0)
notify() {
subject="$ip change to $1"
body="$ip change to $1 $(date '+%F %H:%M:%S')"
echo $body | mail -s "$1 transition" $contact
}
case "$1" in
master)
notify master
exit 0
;;
backup)
notify backup
/etc/rc.d/init.d/httpd restart
exit 0
;;
fault)
notify fault
exit 0
;;
*)
echo 'Usage: $(basename $0) {master|backup|fault}'
exit 1
;;
esac
4、在HA2上編輯keepalived的配置檔案,完成後進行測試
# vim keepalived.conf
# service keepalived start ###啟動keepalived
# ifconfig ###在主伺服器上使用它
這時候我們給HA1上使用了别名,我們使用别名通路一下。
5、模拟MASTER出故障
這時候我們把主伺服器的Web伺服器停了,我們看看ip位址是否會飄移到從伺服器上。從下面的兩個圖可以看到,它真的轉移了,如果不相信我們可以測試下網頁,我們可以看到它的頁面内容也是我們原來設定從伺服器的内容。
# service httpd stop ###停止主伺服器的Web服務
主伺服器上:
從伺服器上:
6、測試一下:
七、雙主模型
1、工作圖:
簡述:當用戶端發送通路上面的伺服器時,上面的伺服器比較繁忙,我們就要用兩台主機都進行工作,不過這裡我們要使用兩個虛拟IP位址,這兩個虛拟IP位址是不一樣的。我們這裡是兩個組,第一個組上面是主,下面是從,第二組下面是主,上面是從。如果有一個組中的MASTER挂了,它的VIP就會飄移到另一個組的上面。
2、修改配置檔案
在上面基于web服務的高可用叢集中,我們把keepalived配置檔案中的最下面#開頭的行開啟了,開啟後我們還要進行編輯,在HA1中将VI_2我們需要将state MASTER改為state BACKUP,我們把優先級改為100,隻要比MASTER的優先級小就行。内容如下:
vrrp_instance VI_2 {
interface eth0
state BACKUP # BACKUP for slave routers
priority 100 # 100 for BACKUP
virtual_router_id 52
garp_master_delay 1
authentication {
auth_type PASS
auth_pass password
}
track_interface {
eth0
}
virtual_ipaddress {
172.16.58.2/16 dev eth0 label eth0:1
}
track_script {
chk_httpd
chk_mantaince_down
}
notify_master "/etc/keepalived/notify.sh master eth0:1"
notify_backup "/etc/keepalived/notify.sh backup eth0:1"
notify_fault "/etc/keepalived/notify.sh fault eth0:1"
}
# service keepalived restart ###啟動keepalived伺服器
#ifconfig
3、檢視IP位址配置
檢視HA1的IP位址配置:
檢視HA2的IP位址配置:
4、測試:
5、模拟HA1發生故障
# cd /etc/keepalived/
# touch down
檢視HA2上IP位址配置:
6、測試一下
我們會發現用172.16.58.6和172.16.58.7通路的都是由HA2傳回的結果。