基於Keepalived構建高可用集羣配置實例(HA Cluster)

什麼是集羣

簡單的講集羣(cluster)就是一組計算機,它們作爲一個整體向用戶提供一組網絡資源。這些單個的計算機系統就是集羣的節點(node)。一個理想的集羣是,用戶從來不會意識到集羣系統底層的節點,在他/她們看來,集羣是一個系統,而非多個計算機系統。並且集羣系統的管理員可以隨意增加和刪改集羣系統的節點。 
關於更詳細的高可用集羣我們在後面再做詳解,先來說說Keepalived

Keepalived是什麼

Keepalived是集羣管理中保證集羣高可用的一個服務軟件,其功能類似於heartbeat,用來防止單點故障。可以說就是爲了高可用集羣而生…

keepalived工作原理

Keepalived是以VRRP協議爲實現基礎的,VRRP全稱Virtual Router Redundancy Protocol,即虛擬路由冗餘協議。 
虛擬路由冗餘協議,可以認爲是實現路由器高可用的協議,即將N臺提供相同功能的路由器組成一個路由器組,這個組裏面有一個master和多個backup,master上面有一個對外提供服務的VIP(該路由器所在局域網內其他機器的默認路由爲該VIP),Master會發組播,當Backup收不到VRRP包時就認爲Master宕掉了,這時就需要根據VRRP的優先級來選舉一個Backup當Master。這樣的話就可以保證路由器的高可用了。 
Keepalived主要有三個模塊,分別是core、check和vrrp。core模塊爲keepalived的核心,負責主進程的啓動、維護以及全局配置文件的加載和解析。check負責健康檢查,包括常見的各種檢查方式。VRRP模塊是來實現VRRP協議的。

keepalived延伸之VRRP協議原理

1、 一個VRRP路由器有唯一的標識:VRID範圍爲0-255是該路由器對外表現爲唯一的虛擬MAC地址,地址的格式爲00-00-5E- 00-01-[VRID]主控路由器負責對ARP請求用該MAC地址做應答這樣,無論如何切換,保證給終端設備的是唯一一致的IP和MAC地址,減少了切換對終端設備的影響。 
2、VRRP控制報文只有一種:VRRP通告(advertisement)它使用IP多播數據包進行封裝,組地址爲224.0.0.18,發佈範圍只限於同一局域網內這保證了VRID在不同網絡中可以重複使用爲了減少網絡帶寬消耗只有主控路由器纔可以週期性的發送VRRP通告報文備份路由器在連續三個通告間隔內收不到VRRP或收到優先級爲0的通告後啓動新的一輪VRRP選舉。 
3、上面我們講過在VRRP路由器組中,按優先級選舉主控路由器,VRRP協議中優先級範圍是0-255若VRRP路由器的IP地址和虛擬路由器的接口IP地址相同,則稱該虛擬路由器作VRRP組中的IP地址所有者;IP地址所有者自動具有最高優先級:255優先級0一般用在IP地址所有者主動放棄主控者角色時使用可配置的優先級範圍爲1-254優先級的配置原則可以依據鏈路的速度和成本路由器性能和可靠性以及其它管理策略設定主控路由器的選舉中,高優先級的虛擬路由器獲勝,因此,如果在VRRP組中有IP地址所有者,則它總是作爲主控路由的角色出現對於相同優先級的候選路由器,按照IP地址大小順序選舉VRRP還提供了優先級搶佔策略,如果配置了該策略,高優先級的備份路由器便會剝奪當前低優先級的主控路由器而成爲新的主控路由器。 
4、爲了保證VRRP協議的安全性,提供了兩種安全認證措施:明文認證和IP頭認證。 
明文認證方式要求:在加入一個VRRP路由器組時,必須同時提供相同的VRID和明文密碼適合於避免在局域網內的配置錯誤,但不能防止通過網絡監聽方式獲得密碼IP頭認證的方式提供了更高的安全性,能夠防止報文重放和修改等*** 
好了基於以上了解內容,我們大致對Keepalived基於VRRP協議怎麼實現高可用集羣有了概念性理解,下面我們就簡單配置個示例來加深印象

keepalived核心組件

vrrp stack 
ipvs wrapper 
checkers 
控制組件:配置文件分析器 
IO複用器 
內存管理組件 
我們來看張圖吧

timg.jpg

測試實驗環境

實驗平臺:Windows10_64 
虛擬環境:基於Win系統搭建的VMware虛擬主機實現 
所需要的虛擬主機:兩臺,CentOS 7.2或者是CentOS 6.8,偏移CentOS 7.2 
虛擬主機的IP地址是:node1地址,10.1.15.43, node2地址,10.1.15.44

配置基於Keepalived HA Cluster的前提

(1) 各節點時間必須同步;使用ntp, 或者chrony同步主機時間 
(2) 確保iptables及selinux不會成爲阻礙; 
(3) 各節點之間可通過主機名互相通信(對KA可選)建議使用/etc/hosts文件實現 
(4) 各節點之間的root用戶可以基於密鑰認證的ssh服務完成互相通信;(可選)

使用ntp去同步你的主機時間,多同步幾次
ntpdate 10.1.0.1
或者是編輯以下文件加入server內容重啓chrony服務
vim /etc/chrony.conf
server 10.1.0.1 iburst
chronyc sources//去驗證下服務時間是否同步過來
或者你可以直接通過date命令手動修改
date XXXXXX//參考date命令
[root@localhost ~]# getenforce
Enforcing
[root@localhost ~]# setenforce 0
[root@localhost ~]# getenforce
Permissive
[root@localhost ~]# iptables -F
[root@localhost ~]#
各節點直接的互相通信可以是基於主機的也可以是ip,這裏我們就不嗷述(非必須)
各節點基於密鑰認證的互相通信:不是必須,但爲了拷貝文件方便,所以就做了
先在node1節點上生成字符串10.1.253.43
[root@localhost ~]# ssh-keygen -t rsa -P '' //也可以在後面自定義
把文件拷貝到另一臺主機上
ssh-copy-id -i .ssh/id_rsa.pub root@10.1.253.43
測試是否不需要密碼直接登錄
[root@localhost ~]# ssh [email protected]
Last login: Mon Oct 31 13:34:38 2016 from 10.1.15.85
[root@localhost ~]#
成功......

Keepalived的配置

Keepalived從Centos6以後是收集到base倉庫中的,所以我們可以直接yum安裝

yum install keepalived //直接yum安裝就行

Keepalived程序環境: 
配置文件是:/etc/keepalived/keepalived.conf 
主程序文件:/usr/sbin/keepalived 
Unit File服務文件:keepalived.service

Keepalived配置文件組成部分

先備份keepalived配置文件 
cp /etc/keepalived/keepalived.conf{,.back}

GLOBAL CONFIGURATION //全局配置段
   Global definitions //全局定義
   Static routes/addresses //靜態路由配置
VRRPD CONFIGURATION //VRRP實力,其實就是定義虛擬路由器
   VRRP synchronization group(s)// VRRP同步組
   VRRP instance(s) //VRRP實力
LVS CONFIGURATION// 集羣配置段
   Virtual server group(s)//組
   Virtual server(s)//

配置一個單主模型(主節點IP:10.1.15.43)

如果出現單點故障,另一個備節點會立馬接管這臺主機,並啓用vip備用地址
編輯etc目錄下keepalived目錄keepalived.conf文件填入以下內容
vim /etc/keepalived/keepalived.conf
打開文件擴展模式下在virtual_ipaddress處光標移動此處輸入:.,$d,刪除其它

! Configuration File for keepalived //keepalived全局配置文件

global_defs {
  notification_email { //接收郵箱地址,目標地址
   root@localhost //配置爲直接發給主機管理員  
}
  notification_email_from keepalived@localhost //誰發送的,源地址
  smtp_server 127.0.0.1//只在本機測試,所有隻發給自己
  smtp_connect_timeout 30 //smtp服務連接超時時長,30秒
  router_id node1 //當前路由器物理標識符,直接配置當前節點就可以
  vrrp_mcast_group4 224.15.15.15 //多播地址接口
} //使用多播地址確保MULTICAST服務啓動,網卡要支持

vrrp_instance VI_1 { //VI_1就是VRRP名稱,就是定義一個虛擬路由器
   state MASTER //當前節點在此虛擬路由器上的初始狀態,主的且只有一個
   interface eno16777736 //綁定爲當前虛擬路由器物理接口
   virtual_router_id 20 //當前虛擬路由器的惟一標識,範圍是0-255
   priority 100 //當前主機在此虛擬路徑器中的優先級;範圍1-254
   advert_int 1 //vrrp通告的時間間隔
   authentication { //認證信息
       auth_type PASS //不動
       auth_pass 6b8a916c // 生成一串字符串貼到此處
   } //字符串生成方法:openssl rand -hex 4
   virtual_ipaddress { //定義的轉移ip地址,這是最主要的,由它來決定哪個節點斷了下面配置的地址直接頂上去,這裏有個優先級和搶佔模式,可以自己去了解
   10.1.15.50/16
}
}
配置完用scp命令拷貝到備節點,只修改優先級priority 與 state狀態。
scp keepalived.conf root@10.1.15.44:/etc/keepalived/

配置一個單主模型(備節點IP:10.1.15.44)

編輯etc目錄下keepalived目錄keepalived.conf文件填入以下內容
vim /etc/keepalived/keepalived.conf
打開文件擴展模式下在virtual_ipaddress處光標移動此處輸入:.,$d,刪除其它

! 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 node1
  vrrp_mcast_group4 224.15.15.15
}

vrrp_instance VI_1 {
   state BACKUP
   interface eno16777736
   virtual_router_id 20
   priority 98
   advert_int 1
   authentication {
       auth_type PASS
       auth_pass 6b8a916c
   }
   virtual_ipaddress {
   10.1.15.50/16
}
}
測試模擬故障:
   在兩個節點43,44啓動關閉keepalived服務,並觀察日誌狀態,是否如我們配置文件所要求,單個節點故障後另一個節點馬上切換爲master狀態,反之亦然。
[root@node1 ~]# systemctl start|stop| keepalived.service
[root@node1 ~]# tail -f /var/log/messages  

配置一個雙主模型(主備,備主模型)

主節點ip:10.1.15.43 備節點:10.1.15.44
編輯etc目錄下keepalived目錄keepalived.conf文件填入以下內容
vim keepalived.conf增加 vrrp_instance VI_2 { 配置段
配置完用scp命令拷貝到雙主模型的備節點,只修改優先級priority 與 state狀態。
scp keepalived.conf root@10.1.15.44:/etc/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 node1
  vrrp_mcast_group4 224.15.15.15
}

vrrp_instance VI_1 {
   state MASTER
   interface eno16777736
   virtual_router_id 20
   priority 100
   advert_int 1
   authentication {
       auth_type PASS
       auth_pass 6b8a916c
   }
   virtual_ipaddress {
   10.1.15.50/16
}
}
vrrp_instance VI_2 {
   state BACKUP
   interface eno16777736
   virtual_router_id 30
   priority 98
   advert_int 1
   authentication {
       auth_type PASS
       auth_pass 6b9a916c
   }
   virtual_ipaddress {
   10.1.15.60/16
}
}
   notify_master "/etc/keepalived/notify.sh master"
   notify_backup "/etc/keepalived/notify.sh backup"
   notify_fault "/etc/keepalived/notify.sh fault"
最後測試模擬故障,監控兩臺雙主備節點服務啓動各個地址切換狀態
[root@node1 ~]# systemctl start|stop| keepalived.service
[root@node1 ~]# tail -f /var/log/messages
如果成功,則雙主模型配置成功,處於監控狀態

寫一個腳本來觸發三種狀態檢測(master,backup,fault狀態)

配置個腳本叫notify.sh 放在etc/keepalived/目錄下,通過配置文件直接調用
調用方法是:./notify.sh master/BACKUP/fault,觀察各節點ip切換信息
#!/bin/bash
#
#只在本機測試,只發給本機就可以
contact='root@localhost'
#定義一個函數notify,在後面調用
notify()
{
#定義一個local變量,郵件標題,命令替換獲取當前主機,並且vip發生了轉移
mailsubject="$(hostname) to be $1, vip floating"
#郵件正文,命令調用,完整日期格式,在這個時刻vrrp發生了轉移,轉移到主或者備的
mailbody="$(date +'%F %T'): vrrp transition, $(hostname) changed to be $1"
#發郵件,mailbody通過管道送給主題,聯繫人是,都是命令調用
echo "$mailbody" | mail -s "$mailsubject" $contact

}
#可接收的參數
case $1 in
#如果傳遞參數是master
   master)
   notify master
#轉給函數notify調用,往下見名之意
;;
   backup)
   notify backup
;;
   fault)
   notify fault
;;
#如果其它,腳本用錯了,所發送的內容
   *)
   echo "Usage: $(basename $0) {master|backup|fault}"
   exit 1
;;

esac
給執行權限或者直接bash運行 chmod +x notify.sh,應該郵件已發送
測試:
./notify.sh 給傳遞的參數是master或者BACKUP或者fault
這樣我們就實現了通過腳本來接管三種狀態,並可以通過mail命令來監控服務狀態

以上測試完成我們接下來配置基於Keepalived的高可用集羣

以httpd服務爲測試目標

測試的環境和主機我們都用上面的 
使用LVS的DR模型結合Keepalived配置高可用集羣,實現服務調度 
配置的拓撲再細化下: 
兩臺Director server當VIP,兩臺Real server當檢測機,每個節點都接在交換機上 
IP地址:10.1.15.43,10.1.15.44作爲Real server1與 Real server2 
兩臺Real server的80端口分別向外提供服務 
IP地址:10.1.15.45,10.1.15.46作爲Director server 當VIP 
VIP server的輪轉地址爲10.1.15.50 80端口向外提供web服務

配置vip的內核參數在lo:0上加入輪詢的ip地址

我們通過腳本來實現
!#/bin/bash
#
vip='10.1.15.50'
vport='80'
netmask='255.255.255.255'
iface='lo:0'

case $1 in
start)
   echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
   echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
   echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
   echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
   ifconfig $iface $vip netmask $netmask broadcast $vip up
   route add -host $vip dev $iface
esac
也可以手動測試下

在Real server1和2主機上用keepalived來輪詢10.1.15.50地址

編輯keepalived.conf其它全刪除,填入以下內容
Real server1和2都要修改,確保配置都一樣
   ! 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 node1
      vrrp_mcast_group4 224.15.15.15
   }

   vrrp_instance VI_1 {
       state BACKUP
       interface eno16777736
       virtual_router_id 20
       priority 98
       advert_int 1
       authentication
{
           auth_type PASS
           auth_pass 6b8a916c
       }
       virtual_ipaddress {
       10.1.15.50/16 //這個是我們要輪詢的地址
   }
   }
       notify_master "/etc/keepalived/notify.sh master"
       notify_backup "/etc/keepalived/notify.sh backup"
       notify_fault "/etc/keepalived/notify.sh fault"
#### 我們要輪詢的地址是50而輪詢的服務是Director server上的web服務
> 我們接下來要在real server上去使用ipvsadm命令,使用10.1.15.50輪詢地址去配置把Director server上的web服務集羣給測試出來,並且是成功的
> 在real server配置以下命令,real server1與2都要配置,然後再刪除,只是爲了測試輪詢與集羣web服務是工作正常的。

   [root@node1 keepalived]# ipvsadm -A -t 10.1.15.50:80 -s rr
   [root@node1 keepalived]# ipvsadm -a -t 10.1.15.50:80 -r 10.1.15.45 -g -w 1
   [root@node1 keepalived]# ipvsadm -a -t 10.1.15.50:80 -r 10.1.15.46 -g -w 1

> 在客戶端用curl 命令確認real server上的集羣配置是否成功且Director server的web服務是可正常提供服務的
> 注意:我們是用real server 的keepalived去輪詢50地址做的,目的就是這個

       curl http://10.1.15.50
       [root@Centos6 ~]# curl 10.1.15.50
       <h1>RS 1 </h1>  
       [root@Centos6 ~]# curl 10.1.15.50
       <h1> RS 2 </h1>
       [root@Centos6 ~]#
       測試成功,只要能輪詢我們指定的Director server上的web服務就可以    
#### 在Real server 1上的keepalived.con配置文件
   配置完畢後記得把Real server 1 上的配置文件拷貝一份到Real server 2
   scp keepalived.conf root@10.1.15.44:/etc/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 node1
  vrrp_mcast_group4 224.15.15.15
}
vrrp_script chk_down { //keepalived調用外部的輔助腳本
   script "[[ -f /etc/keepalived/down ]] && exit 1 || exit 0"
   interval 1
   weight -5
   }

vrrp_instance VI_1 {
   state BACKUP
   interface eno16777736
   virtual_router_id 20
   priority 98
   advert_int 1
   authentication
{
       auth_type PASS
       auth_pass 6b8a916c
   }
   virtual_ipaddress {
   10.1.15.50/16  dev eno16777736

}
   track_script { //檢測這個腳本,只要存在down文件就地址輪詢
   chk_down
}

   notify_master "/etc/keepalived/notify.sh master"
   notify_backup "/etc/keepalived/notify.sh backup"
   notify_fault "/etc/keepalived/notify.sh fault"
}

virtual_server 10.1.15.50 80 {
   delay_loop 3
   lb_algo rr
   lb_kind DR
   protocol TCP

   sorry_server 127.0.0.1 80

   real_server 10.1.15.45 80 {
       weight 1
       HTTP_GET {
           url {
             path /
       status_code 200
           }
          connect_timeout 1
     nb_get_retry 3
     delay_before_retry 1
}
}

  real_server 10.1.15.46 80 {
   weight 1
   HTTP_GET {
       url {
       path /
          status_code 200
       }
       connect_timeout 1
       nb_get_retry 3
       delay_before_retry 1
   }  
   }
}

在任意客戶端上模擬故障並測試是否單點故障,另一個可正常工作

測試模擬故障,看Real server 上是否自動加入了LVS集羣服務地址
[root@node1 ~]# systemctl start|stop| keepalived.service
[root@node1 ~]# ipvsadm -L -n
[root@node2 keepalived]# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
->
RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP  10.1.15.50:80 rr
 ->
10.1.15.45:80                Route   1      0          0        
 ->
10.1.15.46:80                Route   1      0          0        
任意客戶端執行curl請求
[root@Centos6 ~]# curl http://10.1.15.50
<h1> Sorry Server 2 </h1>
[root@Centos6 ~]# curl http://10.1.15.50
<h1> RS 2 </h1>
[root@Centos6 ~]# curl http://10.1.15.50
<h1>RS 1 </h1>  
[root@Centos6 ~]#
注意:使用keepalived做集羣檢測web服務,四臺主機80端口都必須是監聽狀態,但請求的服務是Director server主機上的web服務的80端口,
也可向上面的步驟做個腳本,調用腳本來監控keepalived服務的運行狀態

keepalived調用外部的輔助腳本進行資源監控,並根據監控的結果狀態能實現優先動態調整實行健康檢測; 
分兩步:(1) 先定義一個腳本;(2) 調用此腳本; 
在keepalived目錄創建down文件地址會自動輪詢 
參考Real Server 1 的配置文件,腳本已經在上面定義

配置高可用nginx集羣反向代理

在Real Server1和2的主機上安裝nginx

[root@node1 ~]# rpm -ivh nginx-1.10.0-1.el7.ngx.x86_64.rpm

配置nginx反代功能

編輯nginx.conf文件
vim /etc/nginx/nginx.conf 加入以下內容,
   access_log  /var/log/nginx/access.log  main; //定義到此處加入
       upstream websrvs { //這是我們要加入的集羣節點
           server 10.1.15.45;
           server 10.1.15.46;
       }
編輯conf.d目錄下default.conf文件,加入以下內容
vim /etc/nginx/conf.d/default.conf
   location / {
   root   /usr/share/nginx/html;
   index  index.html index.htm;
   proxy_pass http://websrvs; //這個是我們需要加入的反代web站點
       }
啓動服務 systemctl start nginx.service
模擬故障隨隨便啓動一臺測試反代是否響應
   systemctl start keepalived.service
在客戶端請求
curl 10.1.15.50,如果能請求到集羣節點則反代功能配置成功!!!到此結束

如有不足的請多多指點,一直在學習中……,其它的功能我也在慢慢練習 
通過上面的三種狀態腳本加入systemctl restart nginx.service, 
然後通過這個腳本定義的觸發機制,來監控如果nginx服務故障,實現自動重啓 
算了我還是貼上來吧,以後忘了怎麼辦(我自己留着!!!)


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