一、keepalive軟件概述:
那麼什麼是keepalived呢?keepalived見名知意,那就是保持存活,那麼在網絡術語中就是保持在線,這就是所謂的高可用或熱備,用來防止單點故障的發生。那說到keepalived時不得不說的一個協議就是VRRP協議,可以說這個協議就是keepalived實現的基礎,那麼首先我們來看看VRRP協議;
二、vrrp協議概述:
隨着Internet的不斷髮展,人們對於網路可靠性的要求越來越高,特別是針對於依賴於網絡辦公的終端用戶,能夠實時與網路其他部分保持聯繫是非常重要的。由於公網IP資源的稀少,我們不得不依靠其他的網路技術來實現上網功能;下面這幅圖就是一個典型的網路拓撲:
主機A、B、C通過網關聯繫互聯網,以實現上網通信的目的,但是此時我們不得不考慮一個問題,那就是當我們只擁有一個網關設備時,這個網關就是在整個的網絡中的一個關鍵點;我們不得不去考慮當網關宕機的時候該如何去處理;此時另外一種技術應運而生:那就是VRRP。
VRRP(Virtual Router Redundancy Protocol,虛擬路由器冗餘協議)將可用承擔網關功能的一組路由器加入到備份組中形成有一臺虛擬路由器,由VRRP的選舉機制決定哪臺路由器承擔轉發任務,局域網內的主機只需要將虛擬路由器配置爲網關即可實現正常的上網功能,並且在物理網關中的某臺或某幾臺設備宕機之後也不影響客戶端的使用。拓撲如下:
我們使用多臺的路由設備,將其組成一臺虛擬路由器,此時客戶端只需要知道虛擬路由的地址配置網關即可,不僅實現了網絡的高可用,同時也減少了網絡管理的繁瑣工作;
三、VRRP備份組簡介:
VRRP將局域網內的一組路由器劃分在一起,稱爲一個備份組。備份組由一個master路由器和多個backup路由器組成。Master由選舉產生,優先級高的成爲master,優先級的取值範圍在0到255之間,可配置的範圍在1到254之間。
在同一個物理設備上可以配置多個組,組與組之間依靠組ID進行區分;同組之間的backup路由器有兩種工作模式:
非搶佔方式:依靠各路由器的優先級進行自主選擇,選擇完成後如非路由故障,否則即使其他路由器的優先級被提升也不會成爲master。
搶佔方式:備份路由器如果工作在搶佔方式下,那麼一旦路由的優先級發生變動,那麼master角色就會根據優先級重新選舉產生;
那麼VRRP是如何知道優先級變化呢?
VRRP自身會維護兩種定時器:VRRP通告報文間隔時間定時器和VRRP搶佔延時時間定時器;VRRP會在固定的時間內向外發送VRRP通告報文,當backup路由器在固定時間內沒有收到報文,並且間隔三次時間之後依然沒有收到報文,那麼backup路由器就會認定自己是master路由器,並向外通告進行重新選舉;
由於報文需要在網絡中進行流轉發送,VRRP提供了三種認證方式:
無認證:不進行任何的VRRP報文的合法性認證,不提供安全性保障;
簡單字符認證:發送VRRP報文的路由器將認證字填入到報文中,而收到報文的路由器會將報文中的認證字和本地配置的認證字進行對比,從而實現認證安全保障;
MD5認證:發送報文的路由器利用認證字和MD5算法對VRRP報文進行加密,加密後的報文保存在Authentication Header中,收到報文的路由器利用認證字解密報文,檢查該報文的合法性。
基於這些技術,keepalive實現了高可用。
四、keepalive安裝配置:
1、安裝準備:
keepalived、lm_sensors、httpd軟件包
兩臺主機:
node1:172.16.12.8
node2:172.16.12.9
虛擬IP:172.16.12.254
2、配置:
master配置:
! Configuration File for keepalived global_defs { notification_email { root@localhost } notification_email_from kanotify@localhost smtp_connect_timeout 3 smtp_server 127.0.0.1 router_id LVS_DEVEL } vrrp_script chk_httpd { script "killall -0 httpd" interval 2 weight -2 fall 2 rise 1 } vrrp_script chk_schedown { script "[[ -f /etc/keepalived/down ]] && exit 1 || exit 0" interval 2 weight -2 } vrrp_instance VI_1 { interface eth0 state MASTER priority 101 virtual_router_id 51 garp_master_delay 1 authentication { auth_type PASS auth_pass password } track_interface { eth0 } virtual_ipaddress { 172.16.12.254/16 dev eth0 label eth0:0 } 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" }
backup配置:
! Configuration File for keepalived global_defs { notification_email { root@localhost } notification_email_from kanotify@localhost smtp_connect_timeout 3 smtp_server 127.0.0.1 router_id LVS_DEVEL } vrrp_script chk_httpd { script "killall -0 httpd" interval 2 weight -2 fall 2 rise 1 } vrrp_script chk_schedown { script "[[ -f /etc/keepalived/down ]] && exit 1 || exit 0" interval 2 weight -2 } vrrp_instance VI_1 { interface eth0 state BACKUP priority 100 virtual_router_id 51 garp_master_delay 1 authentication { auth_type PASS auth_pass password } track_interface { eth0 } virtual_ipaddress { 172.16.12.254/16 dev eth0 label eth0:0 } 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_1 { #定義虛擬路由 state MASTER #定義初始狀態下的主從路由 interface eth0 #定義連接端口 virtual_router_id 51 #定義虛擬路由的ID priority 100 #定義優先級 advert_int 1 #定義通告間隔時間 authentication { auth_type PASS #定義認證類型 auth_pass 1111 #定義認證密碼 } virtual_ipaddress { #定義虛擬地址 192.168.200.16 } }
五、keepalive功能驗證:
1、安裝httpd
# yum -y install httpd # echo '<h1>node2.wangej.com</h1>' > /var/www/html/index.html # cat /var/www/html/index.html # service httpd start
2、啓動keepalive服務
在兩臺機器上啓動keepalive服務
# service keepalived start
關閉主節點,重新測試頁面:
至此,一個簡易的爲WEB服務提供高可用服務的集羣就搭建完成了;
PS:關閉主節點是在腳本中完成的,腳本內容如下:
#!/bin/bash # 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
在/etc/keepalived目錄中創建一個down文件即可實現關閉主節點的目的。
我們最後再看一下master和backup的IP地址: