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

什么是集群

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

Keepalived是什么

Keepalived是集群管理中保證集群高可用的一個服務軟件,其功能類似于heartbeat,用來防止單點故障??梢哉f就是為了高可用集群而生…

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虛擬主機實現 
所需要的虛擬主機:兩臺,Centos7.2或者是Centos6.8,偏移Centos7.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 root@10.1.253.44
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服務故障,實現自動重啟 
算了我還是貼上來吧,以后忘了怎么辦(我自己留著?。。。?/p>

原創文章,作者:51eA,如若轉載,請注明出處:http://www.www58058.com/57274

(0)
51eA51eA
上一篇 2016-11-03 17:30
下一篇 2016-11-03 21:32

相關推薦

  • 網絡配置——CentOS7

    CentOS 7 網絡屬性配置 使用傳統命名方式: (1) 編輯/etc/default/grub 配置文件 GRUB_CMDLINE_LINUX ="rhgb quiet net.ifnames=0" 或:修改/boot/grub2/grub.cfg (2) 為grub2 生成其配置文件 grub2-mkconfig -o /etc/g…

    Linux干貨 2016-09-11
  • kickstart 的使用!

    簡介 1.什么是kickstart KickStart是一種無人職守安裝方式。KickStart的工作原理是通過記錄典型的安裝過程中所需人工干預填寫的各種參數,并生成一個名為ks.cfg的文件;在其后的安裝過程中(不只局限于生成KickStart安裝文件的機器)當出現要求填寫參數的情況時,安裝程序會首先去查找KickStart生成的文件,當找到合適的參數時,…

    Linux干貨 2016-11-03
  • LINUX命令幫助

    命令幫助 在維護和使用Linux系統時,常常會遇到忘記命令的使用方法,遇到一個比較陌生的命令,又或者想知道這個命令是什么的情況可以查看命令使用幫助。 LINUX命令使用幫助可參考:程序自身的幫助文檔、官方文檔、官方站點、LINUX的發行版官方文檔、其他網站或者搜索引擎 LINUX命令分為內部命令(shell內置的命令)和外部命令,內部命令和外部命令…

    Linux干貨 2017-05-28
  • 馬哥教育網絡班21期+第10周課程練習

    1、請詳細描述CentOS系統的啟動流程(詳細到每個過程系統做了哪些事情) POST –>Boot Sequence(BIOS) –> Boot Loader(MBR) –> Kernel(ramdisk) –>rootfs –>…

    Linux干貨 2016-09-19
  • N22-第二周博客作業

    1、Linux系統上常見的文件管理類命令有哪些,其常用的使用方法及其示例演示。 常見的文件類管理命令:cp,rm,mv cp復制文件和目錄: -f, –force 強制執行 -i 顯示交互信息,默認cp 帶-i選項 -r,-R 遞歸復制目錄 -s 創建一個符號鏈接而不復制文件 -d 復制符號鏈接本身 cp aa.link qqq 相當于創建qqq…

    Linux干貨 2016-08-22
欧美性久久久久