keepalived +lvs+nginx
簡介
Keepalived是一個基於VRRP協議來實現服務器的高可用方案,可以利用其來避免單點故障。至少會有2臺服務器運行Keepalived,一臺為主服務器(MASTER),其他為備份服務器(BACKUP),但是對外表現為一個虛擬IP,主服務器會通過組播的方式發送消息給各個備份服務器,當備份服務器收不到這個消息的時候,即主服務器宕機的時候,各個備份服務器就會根據它們的優先級選舉出來一個MASTER來接管虛擬IP,繼續提供服務,從而保證了高可用性。
vrrp概念
keepalived的工作原理是VRRP(Virtual Router Redundancy Protocol)虛擬路由冗余協議。
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協議的安全性,提供了兩種安全認證措施:明文認證和IP頭認證明文認證方式要求:在加入一個VRRP路由器組時,必須同時提供相同的VRID和明文密碼適合於避免在局域網內的配置錯誤,但不能防止通過網絡監聽方式獲得密碼IP頭認證的方式提供了更高的安全性,能夠防止報文重放和修改等攻擊。
安裝
yum install keepalived
keepalive 實現模式
單主模式
vrrp的地址轉移實現。單主模式。一個虛擬路由vip
環境:172.16.253.95 做master
172.16.253.96做backup95 配置
vi /etc/keepalived/keepalived.confglobal_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 ;; esacView 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