0x00 前言
傳統的集群方案( 如 lvs ) 在 director 處容易出現單點故障,為了解決此問題,可在 Director 處設立 冗余。當一個出現故障時,另一個可取而代之。
活動節點不但要自己提供服務,而且還將自己的活動信息以固定頻率周期性的同步給備用節點, 備用節點在一個或指定的周期內沒能收到心跳信息時會取而代之。
-
衡量系統可用的指標:
A=MTFB/(MTBF+MTTR)
95%, 99%, …, 99.999%,99.9999%; -
HA Cluster實現方案:
-
vrrp協議的實現 :
keepalived -
ais:完備HA集群 :
RHCS(cman)
heartbeat
corosync
-
vrrp協議的實現 :
0x01 VRRP 協議
VRRP 簡介
-
VRRP : Virtual Router Redundancy Protocol (虛擬路由冗余協議), 是由IETF提出的解決局域網中配置靜態網關出現單點失效現象的路由協議.
-
VRRP廣泛應用在邊緣網絡中
-
VRRP設計目標:
支持特定情況下IP數據流量失敗轉移不會引起混亂,允許主機使用單路由器,以及及時在實際第一跳路由器使用失敗的情形下仍能夠維護路由器間的連通性。
VRRP 工作原理
- 路由器開啟VRRP功能后,會根據優先級確定自己在備份組中的角色。優先級高的路由器成為主用路由器,優先級低的成為備用路由器。主用路由器定期發送VRRP通告報文,通知備份組內的其他路由器自己工作正常;備用路由器則啟動定時器等待通告報文的到來。
-
VRRP在不同的主用搶占方式下,主用角色的替換方式不同
- 在搶占方式下,當主用路由器收到VRRP通告報文后,會將自己的優先級與通告報文中的優先級進行比較。如果大于通告報文中的優先級,則成為主用路由器;否則將保持備用狀態。
- 在非搶占方式下,只要主用路由器沒有出現故障,備份組中的路由器始終保持主用或備用狀態,備份組中的路由器即使隨后被配置了更高的優先級也不會成為主用路由器。
- 如果備用路由器的定時器超時后仍未收到主用路由器發送來的VRRP通告報文,則認為主用路由器已經無法正常工作,此時備用路由器會認為自己是主用路由器,并對外發送VRRP通告報文。備份組內的路由器根據優先級選舉出主用路由器,承擔報文的轉發功能。
VRRP負載分擔方式的特點
- 每個備份組都包括一個主用路由器和若干個備用路由器。
- 各備份組的主用路由器可以不相同
- 同一臺路由器可以加入多個備份組,在不同備份組中有不同的優先級,使得該路由器可以在一個備份組中作為主用路由器,在其他的備份組中作為備用路由器。
VRRP 中的一些術語
- VR: Virtual Router 虛擬路由器
- VRID 虛擬路由器標識:0-255)
-
物理路由器:
master:主設備
backup:備用設備
priority:優先級 - VIP:Virtual IP
- VMAC:Virutal MAC (00-00-5e-00-01-VRID) (一般是固定的)
VRRP 的控制報文機制—— VRRP通告:(advertisement)?
它使用IP多播數據包進行封裝,組地址為224.0.0.18,發布范圍只限于同一局域網內?
VRRP在安全方面:可以采用簡單字符認證,或MD5 認證( 8 位); 也可以使用無認證方式。
0x02 keepalived 功用:
keepalived : vrrp協議的軟件實現,原生設計的目的為了高可用ipvs服務:
- vrrp 協議的軟件實現,完成地址流動
- 根據 讀取配置文件 為 unix主機內核 生成 ipvs 規則, 提供了 高可用ipvs服務
- 為ipvs集群的各RS做健康狀態檢測;
- 基于腳本調用接口通過執行腳本完成腳本中定義的功能,進而影響集群事務;
0x03 keepalived 配置
HA Cluster 的配置前提:
-
各節點時間必須同步
ntp, chony -
確保iptables, selinux 不成為阻礙。
iptables -F && setenforce 0 -
各節點之間可通過主機名互相通信 (對KA并非必須);
建議使用 /etc/hosts 文件實現解析; (不要用DNS 解析) - 各節點之間的root用戶可以基于密鑰認證的ssh服務完成互相通信;(并非必須)
配置文件組件部分:
-
GLOBAL CONFIGURATION
Global definitions
Static routes/addresses -
VRRPD CONFIGURATION
VRRP synchronization group(s):vrrp同步組;
VRRP instance(s):每個vrrp instance相當于一個vrrp路由器; -
LVS CONFIGURATION
Virtual server group(s)
Virtual server(s):ipvs集群的vs和rs;
配置文件解析:
! Configuration File for keepalived ### GLOBAL CONFIGURATION ### global_defs { ## 定義通知接收郵箱 ## notification_email { root@localhost } #- - - - - -# notification_email_from keepalived@localhost # 通知發送郵箱 smtp_server 127.0.0.1 # 郵箱server smtp_connect_timeout 30 router_id node1 # 定義 router_id vrrp_mcast_group4 224.0.100.19 # 組播域 } ### VRRPD CONFIGURATION ### ### vrrp_script ### vrrp_script script_name { script " killall -0 nginx && exit || exit 1" interval 1 # 間隔時間 weight -5 } vrrp_script script_name2 { ... } ### vrrp_instance ### vrrp_instance KA_1 { state MASTER # 主備狀態 MASTER | BACKUP interface ens32 # 定義 網卡接口 virtual_router_id 51 # 虛擬路由 id priority 100 # 優先級 advert_int 1 authentication { auth_type PASS auth_pass qweqwe # 指定 密碼 } ## 定義 virtual_ipaddress ## virtual_ipaddress { 172.18.9.111/16 } track_script { # 調用下面的腳本 # script_name } ## 調用通知腳本 ## 腳本見附錄 notify_master "/etc/keepalived/notify.sh master" notify_backup "/etc/keepalived/notify.sh backup" notify_fault "/etc/keepalived/notify.sh fault" } vrrp_instance KA_2 { ... } ### LVS CONFIGURATION ### virtual_server 192.168.200.100 443 { delay_loop 6 # 服務輪詢的時間間隔 lb_algo rr # 定義調度方法: rr|wrr|lc|wlc|lblc|sh|dh lb_kind NAT # 集群的類型 NAT | DR | TUN nat_mask 255.255.255.0 # 只限于 NAT 類型使用 persistence_timeout 50 # 持久連接時長 protocol TCP # 服務協議,僅支持TCP # sorry_server <IPADDR> <PORT> # 備用服務器地址 ## real_server <IPADDR> <PORT> real_server 192.168.201.100 443 { weight 1 # 定義 weight SSL_GET { # 應用層檢測 HTTP_GET|SSL_GET url { path / # 定義要監控的 URL_PATH # status_code <INT> # 判斷上述檢測機制為健康狀態的響應碼; digest ff20ad2481f97b1754ef3e12ecd3a9cc # 判斷上述檢測機制為健康狀態的響應的內容的校驗碼 } url { ... } 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> # 發出健康狀態檢測請求時使用的源端口; } #TCP_CHECK { #connect_ip <IP ADDRESS> # 向當前RS的哪個IP地址發起健康狀態檢測請求 #connect_port <PORT> # 向當前RS的哪個PORT發起健康狀態檢測請求 #bindto <IP ADDRESS> # 發出健康狀態檢測請求時使用的源地址; #bind_port <PORT> # 發出健康狀態檢測請求時使用的源端口; #connect_timeout <INTEGER> # 連接請求的超時時長; # } } }
附:郵件通知腳本
#!/bin/bash # contact='root@localhost' notify() { mailsubject="$(hostname) to be $1, vip floating" 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
原創文章,作者:Yanglibin,如若轉載,請注明出處:http://www.www58058.com/75916