本文下載
參考文檔
Keepalived configuration synopsis
keeplived是什麼
Keepalived是Linux下一個輕量級別的高可用解決方案。高可用(High Avalilability,HA),其實兩種不同的含義:廣義來講,是指整個系統的高可用性,狹義的來講就是指主機的冗餘和接管。
Keepalived主要是通過虛擬路由冗餘來實現高可用功能,且部署和使用非常的簡單,所有配置只需要一個配置文件即可以完成。
Keepalived起初是爲LVS設計的,專門用來監控集羣系統中各個服務節點的狀態,它根據TCP/IP參考模型的第三、第四層、第五層交換機制檢測每個服務節點的狀態,如果某個服務器節點出現異常,或者工作出現故障,Keepalived將檢測到,並將出現的故障的服務器節點從集羣系統中剔除,這些工作全部是自動完成的,不需要人工干涉,需要人工完成的只是修復出現故障的服務節點。
後來Keepalived又加入了VRRP的功能,VRRP(Vritrual Router Redundancy Protocol,虛擬路由冗餘協議)出現的目的是解決靜態路由出現的單點故障問題,通過VRRP可以實現網絡不間斷穩定運行,因此Keepalvied 一方面具有服務器狀態檢測和故障隔離功能,另外一方面也有HA cluster功能,下面介紹一下VRRP協議實現的過程。
keeplived工作原理
VRRP協議與工作原理
爲什麼要引入VRRP協議
LAN客戶端判定哪個路由器應該爲其到達目標主機的下一跳網關的方式有動態及靜態決策兩種方式,其中,常見的動態路由發現方式有如下幾種:
1、Proxy ARP —— 客戶端使用ARP協議獲取其想要到達的目標,而後,由某路由以其MAC地址響應此ARP請求;
2、Routing Protocol —— 客戶端監聽動態路由更新(如通過RIP或OSPF協議)並以之重建自己的路由表;
3、ICMP IRDP (Router Discovery Protocol) 客戶端 —— 客戶端主機運行一個ICMP路由發現客戶端程序;
動態路由發現協議的不足之處在於它會導致在客戶端引起一定的配置和處理方面的開銷,並且,如果路由器故障,切換至其它路由器的過程會比較慢。解決此類問題的一個方案是爲客戶端靜態配置默認路由設備,這大大簡化了客戶端的處理過程,但也會帶來單點故障類的問題。默認網關故障時,LAN客戶端僅能實現本地通信。因此爲了解決這個問題,就引入了VRRP協議。
工作模式
VRRP是一種主備模式的協議,通過VRRP可以在網絡發生故障時透明的進行設備切換而不影響主機之間的數據通信,這其中涉及到兩個概念:物理路由器和虛擬路由器。
VRRP可以將兩臺或者多臺物理路由器設備虛擬成一個虛擬路由,這個虛擬路由器通過虛擬IP(一個或者多個)對外提供服務,而在虛擬路由器內部的多個物理路由器協同工作,同一時間只有一臺物理路由器對外提供服務,這臺物理路由設備被成爲:主路由器(Master角色)。
一般情況下Master是由選舉算法產生,它擁有對外服務的虛擬IP,提供各種網絡功能,如:ARP請求,ICMP 數據轉發等。而其它的物理路由器不擁有對外的虛擬IP,也不提供對外網絡功能,僅僅接收MASTER的VRRP狀態通告信息,這些路由器被統稱爲“BACKUP的角色”。
當主路由器失敗時,處於BACKUP角色的備份路由器將重新進行選舉,產生一個新的主路由器進入MASTER角色,繼續提供對外服務,整個切換對用戶來說是完全透明的。
VRID
每個虛擬路由器都有一個唯一的標識號,稱爲VRID,一個VRID與一組IP地址構成一個虛擬路由器,在VRRP協議中,所有的報文都是通過IP多播方式發送的,而在一個虛擬路由器中,只有處於Master角色的路由器會一直髮送VRRP數據包,處於BACKUP角色的路由器只會接受Master角色發送過來的報文信息,用來監控Master運行狀態。
一般不會發生BACKUP搶佔的情況,除非它的優先級更高,而當MASTER不可用時,BACKUP也就無法收到Master發過來的信息,於是就認定Master出現故障,接着多臺BAKCUP就會進行選舉,優先級最高的BACKUP將稱爲新的MASTER,這種選舉角色切換非常之快,因而保證了服務的持續可用性。
Keeplived的工作原理
Keepalived可通過VRRP實現高可用性,而Keepalived作爲一個高性能集羣軟件,它還能實現對集羣中服務器運行狀態的監控以及故障隔離,下面我們介紹一下Keepalived對服務器運行狀態和故障隔離的工作原理。
Keepalived工作在TCP/IP 參考模型的三層、四層、五層,也就是分別爲:網絡層
傳輸層和應用層,根據TCP、IP參數模型隔層所能實現的功能,Keepalived運行機制如下。
網絡層
在網絡層:我們知道運行這4個重要的協議,互聯網絡IP協議,互聯網絡可控制報文協議ICMP、地址轉換協議ARP、反向地址轉換協議RARP。
Keepalived在網絡層採用最常見的工作方式是通過ICMP協議向服務器集羣中的每一個節點發送一個ICMP數據包(有點類似與Ping的功能),如果某個節點沒有返回響應數據包,那麼認爲該節點發生了故障,Keepalived將報告這個節點失效,並從服務器集羣中剔除故障節點。
傳輸層
在傳輸層:提供了兩個主要的協議:傳輸控制協議TCP和用戶數據協議UDP,傳輸控制協議TCP可以提供可靠的數據輸出服務、IP地址和端口,代表TCP的一個連接端,要獲得TCP服務,需要在發送機的一個端口和接收機的一個端口上建立連接。
Keepalived在傳輸層裏利用了TCP協議的端口連接和掃描技術來判斷集羣節點的端口是否正常,比如對於常見的WEB服務器80端口。或者SSH服務22端口,Keepalived一旦在傳輸層探測到這些端口號沒有數據響應和數據返回,就認爲這些端口發生異常,然後強制將這些端口所對應的節點從服務器集羣中剔除掉。
應用層
在應用層:可以運行FTP,TELNET,SMTP,DNS等各種不同類型的高層協議,Keepalived的運行方式也更加全面化和複雜化。
用戶可以自定義Keepalived工作方式,例如:可以通過編寫程序或者腳本來運行Keepalived,而Keepalived將根據用戶的設定參數檢測各種程序或者服務是否允許正常,如果Keepalived的檢測結果和用戶設定的不一致時,Keepalived將把對應的服務器從服務器集羣中剔除
keeplived的體系架構
Keepalived起初是爲LVS設計的,由於Keeplalived可以實現對集羣節點的狀態檢測,而IPVS可以實現負載均衡功能,因此,Keepalived藉助於第三方模塊IPVS就可以很方便地搭建一套負載均衡系統,在這裏有個誤區,由於Keepalived可以和IPVS一起很好的工作,會誤以爲Keepalived就是一個負載均衡軟件,這種理解是錯誤的。
在Keepalived當中IPVS模塊是可配置的,如果需要負載均衡功能,可以在編譯Keepalived時開打負載均衡功能,也可以通過編譯參數關閉。
由圖中我們可以看到keeplived的體系架構分爲了內核層和用戶空間層。
內核層
IPVS
LVS的IP負載均衡技術就是通過IPVS模塊來實現的。
它的主要作用是:安裝在Director Server上,同時在Director Server上虛擬出一個IP地址,用戶必須通過這個虛擬的IP地址訪問服務。這個虛擬IP一般稱爲LVS的VIP,即Virtual IP。訪問的請求首先經過VIP到達負載調度器,然後由負載調度器從Real Server列表中選取一個服務節點響應用戶的請求
NETLINK
NETLINK模塊主要用於實現一些高級路由框架和一些相關參數的網絡功能,完成用戶空間層Netlink Reflector模塊發來的各種網絡請求。
用戶空間層
Scheduler I/O Multiplexer
是一個I/O複用分發調度器,它負載安排Keepalived所有內部的任務請求,
Memory Mngt
是一個內存管理機制,這個框架提供了訪問內存的一些通用方法
Control Plane
是keepalived的控制版面,可以實現對配置文件編譯和解析
Core componets
Watchdog
是計算機可靠領域中極爲簡單又非常有效的檢測工具,Keepalived正是通過它監控Checkers和VRRP進程的。
Checkers
這是Keepalived最基礎的功能,也是最主要的功能,可以實現對服務器運行狀態檢測和故障隔離。
VRRP Stack
這是keepalived後來引用的VRRP功能,可以實現HA集羣中失敗切換功能。
IPVS wrapper
這個是IPVS功能的一個實現,IPVS warrper模塊將可以設置好的IPVS規則發送的內核空間並且提供給IPVS模塊,最終實現IPVS模塊的負載功能。
Netlink Reflector
用來實現高可用集羣Failover時虛擬IP(VIP)的設置和切換,Netlink Reflector的所有請求最後都發送到內核空間層的NETLINK 模塊來完成。
文件位置
主配置文件:/etc/keepalived/keepalived.conf
主程序文件:/usr/sbin/keepalived
提供校驗碼:/usr/bin/genhash
Unit File:keepalived.service
Unit File的環境配置文件:/etc/sysconfig/keepalived
keeplived配置文件詳解
keepalived.conf中有三類配置區域。
l 全局配置(Global Configuration)
l VRRPD配置
l LVS配置
全局配置
全局配置又包括兩個子配置:
n 全局定義(global definition)
n 靜態路由配置(static ipaddress/routes)
global
static
這裏實際上和系統裏面命令配置IP地址和路由一樣例如:
192.168.1.1/24 dev eth0 scope global
就是給eth0配置IP地址,路由同理
一般這個區域不需要配置。這裏實際上就是給服務器配置真實的IP地址和路由的,在複雜的環境下可能需要配置,一般不會用這個來配置,我們可以直接用vi /etc/sysconfig/network-script/ifcfg-eth0來配置,切記這裏可不是VIP
VRRPD配置
VRRPD配置包括三個類
l VRRP同步組(synchroization group)
l VRRP實例(VRRP Instance)
l VRRP腳本
VRRP同步組(synchroization group)
vrrp_sync_group VG_1 { #定義一個故障組,組內有一個虛擬路由出現故障另一個也會一起跟着轉移,適用於LVS的NAT模型。
group {
VI1 # name of vrrp_instance (below)
VI2 # One for each moveable IP
}
}
VRRP實例(VRRP Instance)
vrrp_instance VI_1 { #定義一個虛擬路由
state MASTER|BACKUP #當前節點在此虛擬路由器上的初始狀態;只能有一個是MASTER,餘下的都應該爲BACKUP;
interface eth0 #綁定爲當前虛擬路由器使用的物理接口;
virtual_router_id 51 #當前虛擬路由器的惟一標識,範圍是0-255;
priority 100 #當前主機在此虛擬路徑器中的優先級;範圍1-254;
advert_int 1 #通告發送間隔,包含主機優先級、心跳等。
authentication { #認證配置
auth_type PASS #認證類型,PASS表示簡單字符串認證。還有HA認證
auth_pass 1111 #密碼,PASS密碼最長爲8位
}
virtual_ipaddress {
192.168.200.16 #虛擬路由IP地址,以輔助地址方式設置
192.168.200.18/24 dev eth2 label eth2:1 #以別名的方式設置
}
track_interface {
eth0
eth1
} #配置要監控的網絡接口,一旦接口出現故障,則轉爲FAULT狀態;
nopreempt #定義工作模式爲非搶佔模式;
preempt_delay 300 #搶佔式模式下,節點上線後觸發新選舉操作的延遲時長;
virtual_routes { #配置路由信息,可選項
# src <IPADDR> [to] <IPADDR>/<MASK> via|gw <IPADDR> [or <IPADDR>] dev <STRING> scope
<SCOPE> tab
src 192.168.100.1 to 192.168.109.0/24 via 192.168.200.254 dev eth1
192.168.112.0/24 via 192.168.100.254 192.168.113.0/24 via 192.168.200.254 or 192.168.100.254 dev eth1 blackhole 192.168.114.0/24
}
notify_master <STRING>|<QUOTED-STRING> #當前節點成爲主節點時觸發的腳本。
notify_backup <STRING>|<QUOTED-STRING> #當前節點轉爲備節點時觸發的腳本。
notify_fault <STRING>|<QUOTED-STRING> #當前節點轉爲“失敗”狀態時觸發的腳本。
notify <STRING>|<QUOTED-STRING> #通用格式的通知觸發機制,一個腳本可完成以上三種狀態的轉換時的通知。
smtp_alert #如果加入這個選項,將調用前面設置的郵件設置,並自動根據狀態發送信息
}
VRRP腳本
vrrp_script check_running {
script "/usr/local/bin/check_running"
interval 10
weight 10
}
vrrp_instance http {
state BACKUP
smtp_alert
interface eth0
virtual_router_id 101
priority 90
advert_int 3
authentication {
auth_type PASS
auth_pass whatever
}
virtual_ipaddress {
1.1.1.1
}
track_script {
check_running weight 20
}
}
首先在vrrp_script區域定義腳本名字和腳本執行的間隔和腳本執行的優先級變更
vrrp_script check_running {
script "/usr/local/bin/check_running"
interval 10 #腳本執行間隔
weight 10 #腳本結果導致的優先級變更:10表示優先級+10;-10則表示優先級-10
}
然後在實例(vrrp_instance)裏面引用,有點類似腳本里面的函數引用一樣:先定義,後引用函數名
track_script {
check_running weight 20
}
注意:VRRP腳本(vrrp_script)和VRRP實例(vrrp_instance)屬於同一個級別
LVS配置
如果你沒有配置LVS+keepalived那麼無需配置這段區域,這裏的LVS配置是專門爲keepalived+LVS集成準備的。
注意,這裏LVS配置並不是指真的安裝LVS然後用ipvsadm來配置他,而是用keepalived的配置文件來代替ipvsadm來配置LVS,這樣會方便很多。
LVS配置也有兩個配置
n 虛擬主機組配置
n 虛擬主機配置
虛擬主機組配置
這個配置是可選的,可根據需求來配置,這裏配置主要是爲了讓一臺realserver上的某個服務可以屬於多個Virtual Server,並且只做一次健康檢查。
virtual_server_group <STRING> {
# VIP port
<IPADDR> <PORT>
<IPADDR> <PORT>
fwmark <INT>
}
虛擬主機配置
virtual server可以以下面三種的任意一種來配置。這裏主要介紹第一種
1. virtual server IP port
2. virtual server fwmark int
3. virtual server group string
virtual_server 192.168.200.100 443 { #LVS配置段 ,設置LVS的VIP地址和端口
delay_loop #服務輪詢的時間間隔;檢測RS服務器的狀態。
lb_algo rr #調度算法,可選rr|wrr|lc|wlc|lblc|sh|dh。
lb_kind NAT #集羣類型。
nat_mask 255.255.255.0 #子網掩碼,可選項。
persistence_timeout 50 #是否啓用持久連接,連接保存時長
protocol TCP #協議,只支持TCP
sorry_server <IPADDR> <PORT> #備用服務器地址,可選項。
real_server 192.168.201.100 443 { #配置RS服務器的地址和端口
weight 1 #權重
SSL_GET { #檢測RS服務器的狀態,發送請求報文
url {
path / #請求的URL
digest ff20ad2481f97b1754ef3e12ecd3a9cc #對請求的頁面進行hash運算,然後和這個hash碼進行比對,如果hash碼一樣就表示狀態正常
status_code <INT> #判斷上述檢測機制爲健康狀態的響應碼,和digest二選一即可。
} #這個hash碼可以使用genhash命令請求這個頁面生成
connect_timeout 3 #連接超時時間
nb_get_retry 3 #超時重試次數
delay_before_retry 3 #每次超時過後多久再進行連接
connect_ip <IP ADDRESS> #向當前RS的哪個IP地址發起健康狀態檢測請求
connect_port <PORT> #向當前RS的哪個PORT發起健康狀態檢測請求
bindto <IP ADDRESS> #發出健康狀態檢測請求時使用的源地址;
bind_port <PORT> #發出健康狀態檢測請求時使用的源端口;
}
}
}
健康狀態檢查
1. HTTP_GET
2. SSL_GET
3. TCP_CHECK
4. SMTP_CHECK
5. MISS_CHECK #調用自定義腳本進行檢測
TCP_CHECK {
connect_ip <IP ADDRESS> #向當前RS的哪個IP地址發起健康狀態檢測請求;
connect_port <PORT> #向當前RS的哪個PORT發起健康狀態檢測請求; bindto <IP ADDRESS> #發出健康狀態檢測請求時使用的源地址; bind_port <PORT> #發出健康狀態檢測請求時使用的源端口; connect_timeout <INTEGER> #連接請求的超時時長; }
實例
CentOS7 haproxy+keepalived實現高可用集羣搭建