基於Keepalived構建高可用集羣配置實例

什麼是集羣

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

Keepalived是什麼

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

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協議的。linux

keepalived延伸之VRRP協議原理

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

keepalived核心組件

vrrp stack 
ipvs wrapper 
checkers 
控制組件:配置文件分析器 
IO複用器 
內存管理組件 
web

測試實驗環境

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

配置基於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安裝 bash

yum install keepalived

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

Keepalived配置文件組成部分

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

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,若是能請求到集羣節點則反代功能配置成功!!!到此結束



若有不足的請多多指點一直在學習中,其它的功能我也在慢慢練習經過上面的三種狀態腳本加入systemd

而後經過這個腳本定義的觸發機制,來監控實現nginx服務故障自動重啓.....

相關文章
相關標籤/搜索