1. 程式人生 > >keepalived +lvs+nginx

keepalived +lvs+nginx

state 外部網絡 -c 管理 雙主模式 缺省 apr ucc isp

簡介

Keepalived是一個基於VRRP協議來實現服務器的高可用方案,可以利用其來避免單點故障。至少會有2臺服務器運行Keepalived,一臺為主服務器(MASTER),其他為備份服務器(BACKUP),但是對外表現為一個虛擬IP,主服務器會通過組播的方式發送消息給各個備份服務器,當備份服務器收不到這個消息的時候,即主服務器宕機的時候,各個備份服務器就會根據它們的優先級選舉出來一個MASTER來接管虛擬IP,繼續提供服務,從而保證了高可用性。

vrrp概念

keepalived的工作原理是VRRP(Virtual Router Redundancy Protocol)虛擬路由冗余協議。

在VRRP中有兩組重要的概念:VRRP路由器和虛擬路由器,主控路由器和備份路由器。
VRRP路由器是指運行VRRP的路由器,是物理實體,虛擬路由器是指VRRP協議創建的,是邏輯概念。一組VRRP路由器協同工作,共同構成一臺虛擬路由器。
Vrrp中存在著一種選舉機制,用以選出提供服務的路由即主控路由,其他的則成了備份路由。當主控路由失效後,備份路由中會重新選舉出一個主控路由,來繼續工作,來保障不間斷服務。

VRRP協議過程簡述

VRRP 將局域網的一組路由器(包括一個Master 即活動路由器和若幹個Backup 即備份路由器)組織成一個虛擬路由器,稱之為一個備份組。這個虛擬的路由器擁有自己的IP 地址10.100.10.1(這個IP 地址可以和備份組內的某個路由器的接口地址相同,相同的則稱為ip擁有者),備份組內的路由器也有自己的IP 地址(如Master的IP 地址為10.100.10.2,Backup 的IP 地址為10.100.10.3)。局域網內的主機僅僅知道這個虛擬路由器的IP 地址10.100.10.1,而並不知道具體的Master 路由器的IP 地址10.100.10.2 以及Backup 路由器的IP 地址10.100.10.3。[1]它們將自己的缺省路由下一跳地址設置為該虛擬路由器的IP 地址10.100.10.1。於是,網絡內的主機就通過這個虛擬的路由器來與其它網絡進行通信。如果備份組內的Master 路由器壞掉,Backup 路由器將會通過選舉策略選出一個新的Master 路由器,繼續向網絡內的主機提供路由服務。從而實現網絡內的主機不間斷地與外部網絡進行通信。

VRRP原理

一個VRRP路由器有唯一的標識:VRID,範圍為0—255該路由器對外表現為唯一的虛擬MAC地址,地址的格式為00-00-5E-00-01-[VRID]主控路由器負責對ARP請求用該MAC地址做應答這樣,無論如何切換,保證給終端設備的是唯一一致的IP和MAC地址,減少了切換對終端設備的影響[3]
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還提供了優先級搶占策略,如果配置了該策略,高優先級的備份路由器便會剝奪當前低優先級的主控路由器而成為新的主控路由器[3]
為了保證VRRP協議的安全性,提供了兩種安全認證措施:明文認證和IP頭認證明文認證方式要求:在加入一個VRRP路由器組時,必須同時提供相同的VRID和明文密碼適合於避免在局域網內的配置錯誤,但不能防止通過網絡監聽方式獲得密碼IP頭認證的方式提供了更高的安全性,能夠防止報文重放和修改等攻擊。

安裝

yum install keepalived

keepalive 實現模式

單主模式

vrrp的地址轉移實現。單主模式。一個虛擬路由vip

環境:172.16.253.95 做master

   172.16.253.96做backup

95 配置

vi /etc/keepalived/keepalived.conf 技術分享圖片
global_defs {
#   notification_email {
#     [email protected]        #出問題時接收郵件的地址
#     [email protected]
#   }
#   notification_email_from [email protected]    #發郵件的地址
#   smtp_server 192.168.200.1                    #郵件服務器地址
#   smtp_connect_timeout 30                    #連接超時時間
   router_id         keepalive-node-1            #服務器標識名稱,建議為主機名
   vrrp_mcast_group4 224.24.24.18                 #多播地址段,默認為224.0.0.18.可以自設置地址
}

vrrp_instance VI_1 {
    state         MASTER        #必須大寫,只有一個MASTER,其余都為BACKUP
    interface         eth0        #虛擬ip 綁定的網卡
    virtual_router_id     51        #vrid 同一虛擬路由組內的id 必須一致;同一主機上的其他虛擬路由id 區分開來
    priority         100        #優先級,MASTER為最大,範圍:0-254
    advert_int         1        #發送組播的頻率,默認為1s
    authentication {
        auth_type     PASS        #認證方式為密碼
        auth_pass     1111        #同一虛擬路由組內的各個節點的密碼必須一致,否則無法接收通訊,密碼僅支持8位以內
    }
    virtual_ipaddress {
        172.16.253.100            #虛擬ip 地址
    }

####調用通知機制(非必要配置),當主機狀態發生相應變化執行腳本進行相應的郵件報警,當然也可配置其他操作,如zabbix 報警######
    notify_master "/etc/keepalived/notify.sh master"    #notify_master 表示當當前主機為master時執行後面腳本操作。
    notify_backup "/etc/keepalived/notify.sh backup"    #狀態為backup時的操作
    notify_fault "/etc/keepalived/notify.sh fault"    #狀態為錯誤時的操作
}
View Code

global_defs  為全局配置

96 配置

技術分享圖片
global_defs {
#   notification_email {
#     [email protected]
#     [email protected]
#     [email protected]
#   }
#   notification_email_from [email protected]
#   smtp_server 192.168.200.1
#   smtp_connect_timeout 30
   router_id         keepalive-node-2
   vrrp_mcast_group4 224.24.24.18                              #多播地址段,默認為224.0.0.18.可以自設置地址
}

vrrp_instance VI_1 {
    state         BACKUP        #必須大寫,只有一個MASTER,其余都為BACKUP
    interface         eth0        #虛擬ip 綁定的網卡
    virtual_router_id     51        #vrid 同一虛擬路由組內的id 必須一致
    priority         90        #優先級,MASTER為最大,範圍:0-254
    advert_int         1        #發送組播的頻率,默認為1s
    authentication {
        auth_type     PASS        #認證方式為密碼
        auth_pass     1111        #同一虛擬路由組內的各個節點的密碼必須一致,否則無法接收通訊
    }
    virtual_ipaddress {
        172.16.253.100            #虛擬ip 地址
    }
####調用通知機制(非必要配置),當主機狀態發生相應變化執行腳本進行相應的郵件報警,當然也可配置其他操作,如zabbix 報警######
    notify_master "/etc/keepalived/notify.sh master"    #notify_master 表示當當前主機為master時執行後面腳本操作。
    notify_backup "/etc/keepalived/notify.sh backup"    #狀態為backup時的操作
    notify_fault "/etc/keepalived/notify.sh fault"      #狀態為錯誤時的操作
}
View Code

通知回調腳本(此功能可以不配置)

vi notify.sh

技術分享圖片
contact=‘root@localhost‘

notify() {
local mailsubject="$(hostname) to be $1, vip floating"
local mailbody="$(date +‘%F %T‘): vrrp transition, $(hostname) changed to be $1"
echo "$mailbody" | mail -s "$mailsubject" $contact
}

case $1 in
master)
       notify master
                   ;;
backup)
       notify backup
                   ;;
fault)
       notify fault
                   ;;
*)
       echo "Usage: $(basename $0) {master|backup|fault}"
       exit 1
                   ;;
esac
View Code

測試

95 上停止keepalived 服務

service keepalived stop

96 上查看ip 是否已經切換過來

ip a

總結:單主模式,就是一個MASTER,其余都是BACKUP ,主的優先級最大,其余備的優先級小,正常請況下vip 綁定在主上,如果主服務器宕掉,那麽備服務器根據優先級選舉出來一個MASTER,當原來的主服務器正常後又會重新奪回VIP,成為MASTER。

雙主模式

有兩個服務各自通過不同的IP 地址對外提供服務,此時可以配置兩個vip ,然後兩個vip 的主備分別在兩個主機上,形成雙主模式,這樣既負載均衡了,出故障也一樣可以切換實現高可用。

95主機增加如下代碼:

技術分享圖片
vrrp_instance VI_2 {

state BACKUP
interface eth0
virtual_router_id 02
priority 95
advert_int 1
authentication {
    auth_type PASS
    auth_pass 2222
}   
virtual_ipaddress {
172.16.253.200
}
}
View Code

96主機:
增加如下代碼,相當於增加了另一組虛擬路由器vip2 172.16.253.200

技術分享圖片
vrrp_instance VI_2 {

state MASTER
interface eth0
virtual_router_id 02
priority 100
advert_int 1
authentication {
    auth_type PASS
    auth_pass 2222
}
virtual_ipaddress {
172.16.253.200
}
}
View Code

重啟服務,測試步驟省略。

腳本檢測實現優先級的改變進而切換主備

此文件內有腳本的例子,以及如何調用
/usr/share/doc/keepalived-1.2.13/samples/keepalived.conf.vrrp.localcheck

腳本簡述

1:在配置文件中定義腳本
vrrp_script chk_sshd {

   script "killall -0 sshd"        # cheaper than pidof
   interval 2                      # check every 2 seconds
   weight -4                       # default prio: -4 if KO
   fall 2                          # require 2 failures for KO
   rise 2                          # require 2 successes for OK

}

調用腳本 使用 vrrp_script 關鍵詞
腳本名 chk_sshd

腳本內容分為兩塊

1 script "killall -0 sshd"
表示 此段代碼 返回0值,部分功能不變 
              返回非0值。要執行一些關鍵指令

killall -0 sshd :測試 是否可以殺掉 sshd進程。能殺掉返回0值,表示sshd服務

正常運行。返回其他值,表示sshd服務沒有運行正常。

2:weight -4 測試失敗權重-4

  fall 2        檢測失敗2次,才減去權重
 rise -2  檢查兩次成功,ok 

2:在配置文件中調用腳本
在 vrrp_instance中
使用track_script {

   chk_haproxy weight 2
   chk_http_port
   chk_https_port
   chk_smtp_port
}

keepalived +lvs+nginx