HA Cluster
-
集群類型:LB(lvs/nginx(http/upstream, stream/upstream))、HA、HP
-
系統可用性的公式:A=MTBF/(MTBF+MTTR)
-
系統故障:
- 硬件故障:設計缺陷、wear out、自然災害
- 軟件故障:設計缺陷
-
提升系統高用性的解決方案之降低MTTR:
-
解決方案:冗余(redundant)
active/passive(主備),active/active(雙主)
-
解決方案:冗余(redundant)
-
在資源級別定義優先級,定義對資源的傾向性
-
Failover:故障切換,即某資源的主節點故障時,將資源轉移至其它節點的操作;
-
Failback:故障移回,即某資源的主節點故障后重新修改上線后,將轉移至其它節點的資源重新切回的過程;
-
-
HA Cluster實現方案:
-
vrrp協議的實現
- keepalived
-
ais:完備HA集群
- RHCS(cman)
- heartbeat
- corosync
-
vrrp協議的實現
keepalived
-
vrrp協議:Virtual Redundant Routing Protocol
-
術語:
- 虛擬路由器:Virtual Router:由一個Master路由器和多個Backup路由器組成。主機將虛擬路由器當作默認網關。
- 虛擬路由器標識:VRID(0-255):有相同VRID的一組物理路由器構成一個虛擬路由器。用來標識路由器
-
物理路由器:
master:主設備 #虛擬路由器中承擔報文轉發任務的路由器。
backup:備用設備 #master路由器出現故障時,能夠代替master路由器工作的路由器。
priority:優先級 #指的是物理節點的優先級,vrrp根據優先級來確定虛擬路由器中每臺路由器的地位。 -
VIP:Virtual IP #虛擬路由器的IP地址。一個虛擬路由器可以擁有一個或多個IP地址。
-
VMAC:Virutal MAC 一個虛擬路由器擁有一個虛擬MAC地址。虛擬MAC地址的格式為(00-00-5e-00-01-VRID)。通常情況下,虛擬路由器回應ARP請求使用的是虛擬MAC地址,只有虛擬路由器做特殊配置的時候,才回應接口的真實MAC地址。
-
非搶占式:只有對方故障了,才可以搶; #如果Backup路由器工作在非搶占方式下,則只要master路由器沒有出現故障,backup路由器即使隨后被配置了更高的優先級也不會成為master路由器。
-
搶占式:只要對方的優先級比自己的低,就搶; #如果backup路由器工作在搶占方式下,當它收到vrrp報文后,會將自己的優先級與通告報文中的優先級進行比較。如果自己的優先級比當前的master路由器的優先級高,就會主動搶占成為master路由器;否則,將保持backup狀態。
-
選舉:比較優先級
-
通告:心跳,優先級等;周期性;
采用組播方式發送心跳,并且對信息進行認證 -
認證:
-
無認證
簡單字符認證
MD5
-
無認證
-
工作模式:
-
主/備:單虛擬路由器;
主/主:主/備(虛擬路由器1),備/主(虛擬路由器2)
-
主/備:單虛擬路由器;
-
-
keepalived:
-
vrrp協議的軟件實現,原生設計的目的為了高可用ipvs服務:
- 基于vrrp協議完成地址流動;
- 為ipvs集群節點生成ipvs規則(在配置文件中預先定義);
- 為ipvs集群的各RS做健康狀態檢測;基于檢測結果完成節點管理;
- 基于腳本調用接口通過執行腳本完成腳本中定義的功能,進而影響集群事務;
-
組件:
-
核心組件:
vrrp stack
ipvs wrapper
checkers -
控制組件:
配置文件分析器
IO復用器
內存管理組件
-
核心組件:
-
-
HA Cluster的配置前提:
-
各節點時間必須同步;
ntp, chrony - 確保iptables及selinux不會成為阻礙;
- 各節點之間可通過主機名互相通信(對keepalived并非必須);建議使用/etc/hosts文件實現;
-
確保各節點的用于集群服務的接口支持MULTICAST通信;
D類:224-239; - 各節點之間的root用戶可以基于密鑰認證的ssh服務完成互相通信;(并非必須)
-
各節點時間必須同步;
-
keepalived安裝配置:
-
程序環境:
- 主配置文件:/etc/keepalived/keepalived.conf
- 主程序文件:/usr/sbin/keepalived
- Unit File:keepalived.service
- Unit File的環境配置文件:/etc/sysconfig/keepalived
-
配置文件組件部分:
-
GLOBAL CONFIGURATION
- Global definitions
- Static routes/addresses
-
VRRPD CONFIGURATION
-
VRRP synchronization group(s):vrrp同步組;把兩個虛擬路由器定義成一個同步組就能確保這兩個必須把vip放在同一個節點上;
nat服務集群時要求使用此功能; - VRRP instance(s):每個vrrp instance即一個vrrp路由器;
- VRRP腳本
-
VRRP synchronization group(s):vrrp同步組;把兩個虛擬路由器定義成一個同步組就能確保這兩個必須把vip放在同一個節點上;
-
LVS CONFIGURATION
- Virtual server group(s)
- Virtual server(s):ipvs集群的vs和rs;
-
GLOBAL CONFIGURATION
-
配置語法:
-
配置虛擬路由器:
vrrp_instance <STRING> { .... }
- state MASTER|BACKUP:當前節點在此虛擬路由器上的初始狀態;只能有一個是MASTER,余下的都應該為BACKUP;
- interface IFACE_NAME:綁定為當前虛擬路由器使用的物理接口;
- virtual_router_id VRID:當前虛擬路由器的惟一標識,范圍是0-255;
- priority 100:當前主機在此虛擬路徑器中的優先級;范圍1-254;
-
advert_int 1:vrrp通告的時間間隔;主備間通告時間檢查的時間間隔,單位為s,默認1s
-
設置認證
authentication { auth_type AH|PASS auth_pass <PASSWORD> }
-
設置VIP即虛擬IP地址
virtual_ipaddress { <IPADDR>/<MASK> brd <IPADDR> dev <STRING> scope <SCOPE> label <LABEL> 192.168.200.17/24 dev eth1 192.168.200.18/24 dev eth2 label eth2:1 }
-
配置要監控的網絡接口,一旦接口出現故障,則轉為FAULT狀態;
track_interface { eth0 eth1 ... }
- nopreempt:定義工作模式為非搶占模式;
-
preempt_delay 300:搶占式模式下,節點上線后觸發新選舉操作的延遲時長;
-
定義通知腳本:
- notify_master |:當前節點成為主節點時觸發的腳本;
- notify_backup |:當前節點轉為備節點時觸發的腳本;
-
notify_fault |:當前節點轉為“失敗”狀態時觸發的腳本;
-
notify |:通用格式的通知觸發機制,一個腳本可完成以上三種狀態的轉換時的通知;
-
-
單主配置示例:
! 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.0.100.19 } vrrp_instance VI_1 { state BACKUP interface eno16777736 virtual_router_id 14 priority 98 advert_int 1 authentication { auth_type PASS auth_pass 571f97b2 } virtual_ipaddress { 10.1.0.91/16 dev eno16777736 } }
-
雙主模型示例:
! 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.0.100.19 } vrrp_instance VI_1 { state MASTER interface eno16777736 virtual_router_id 14 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 571f97b2 } virtual_ipaddress { 10.1.0.91/16 dev eno16777736 } } vrrp_instance VI_2 { state BACKUP interface eno16777736 virtual_router_id 15 priority 98 advert_int 1 authentication { auth_type PASS auth_pass 578f07b2 } virtual_ipaddress { 10.1.0.92/16 dev eno16777736 } }
-
示例通知腳本:
#!/bin/bash # 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
-
腳本的調用方法:
notify_master "/etc/keepalived/notify.sh master" notify_backup "/etc/keepalived/notify.sh backup" notify_fault "/etc/keepalived/notify.sh fault"
-
腳本的調用方法:
-
-
虛擬服務器配置:
virtual_server IP port | virtual_server fwmark int { ... real_server { ... } ... }
-
常用參數:
delay_loop <INT>:服務輪詢的時間間隔; lb_algo rr|wrr|lc|wlc|lblc|sh|dh:定義調度方法; lb_kind NAT|DR|TUN:集群的類型; persistence_timeout <INT>:持久連接時長; protocol TCP:服務協議,僅支持TCP; sorry_server <IPADDR> <PORT>:備用服務器地址; real_server <IPADDR> <PORT> { weight <INT> notify_up <STRING>|<QUOTED-STRING> notify_down <STRING>|<QUOTED-STRING> HTTP_GET|SSL_GET|TCP_CHECK|SMTP_CHECK|MISC_CHECK { ... }:定義當前主機的健康狀態檢測方法; }
-
HTTP_GET|SSL_GET:應用層檢測
HTTP_GET|SSL_GET { url { path <URL_PATH>:定義要監控的URL; status_code <INT>:判斷上述檢測機制為健康狀態的響應碼; digest <STRING>:判斷上述檢測機制為健康狀態的響應的內容的校驗碼; #示例:~]# curl -s http://172.16.250.173 | md5sum } nb_get_retry <INT>:重試次數; delay_before_retry <INT>:重試之前的延遲時長; connect_ip <IP ADDRESS>:向當前RS的哪個IP地址發起健康狀態檢測請求 connect_port <PORT>:向當前RS的哪個PORT發起健康狀態檢測請求 bindto <IP ADDRESS>:發出健康狀態檢測請求時使用的源地址; bind_port <PORT>:發出健康狀態檢測請求時使用的源端口; connect_timeout <INTEGER>:連接請求的超時時長; }
TCP_CHECK { connect_ip <IP ADDRESS>:向當前RS的哪個IP地址發起健康狀態檢測請求 connect_port <PORT>:向當前RS的哪個PORT發起健康狀態檢測請求 bindto <IP ADDRESS>:發出健康狀態檢測請求時使用的源地址; bind_port <PORT>:發出健康狀態檢測請求時使用的源端口; connect_timeout <INTEGER>:連接請求的超時時長; }
-
常用參數:
-
高可用的ipvs集群示例:
! 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.0.100.19 } vrrp_instance VI_1 { state MASTER interface eno16777736 virtual_router_id 14 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 571f97b2 } virtual_ipaddress { 10.1.0.93/16 dev eno16777736 } 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.0.93 80 { delay_loop 3 lb_algo rr lb_kind DR protocol TCP sorry_server 127.0.0.1 80 real_server 10.1.0.69 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.0.71 80 { weight 1 HTTP_GET { url { path / status_code 200 } connect_timeout 1 nb_get_retry 3 delay_before_retry 1 } } }
-
TCP_CHECK使用示例:
TCP_CHECK { nb_get_retry 3 delay_before_retry 2 connect_timeout 3 }
-
TCP_CHECK使用示例:
-
keepalived如果要是高可用其他應用,需調用外部的輔助腳本進行資源監控,并根據監控的結果狀態能實現優先動態調整;
-
腳本的作用:
- 當地址轉移到這個節點的時候,將nginx啟動;
- 當不能啟動時,還可以將IP地址轉移出去,降低優先級,促使其他節點配置此IP地址。
-
分兩步:(1) 先定義一個腳本;(2) 調用此腳本;
vrrp_script <SCRIPT_NAME> { script "" interval INT #此腳本每個多長時間執行一次 weight -INT #萬一失敗了,當前節點的權重減一個數,減過的權重小于備用節點; } track_script { SCRIPT_NAME_1 SCRIPT_NAME_2 ... }
-
示例:高可用nginx服務
! 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.0.100.19 } vrrp_script chk_down { script "[[ -f /etc/keepalived/down ]] && exit 1 || exit 0" interval 1 weight -5 } vrrp_script chk_nginx { script "killall -0 nginx && exit 0 || exit 1" interval 1 weight -5 fall 2 rise 1 } vrrp_instance VI_1 { state MASTER interface eno16777736 virtual_router_id 14 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 571f97b2 } virtual_ipaddress { 10.1.0.93/16 dev eno16777736 } track_script { chk_down chk_nginx } notify_master "/etc/keepalived/notify.sh master" notify_backup "/etc/keepalived/notify.sh backup" notify_fault "/etc/keepalived/notify.sh fault" }
-
原創文章,作者:s,如若轉載,請注明出處:http://www.www58058.com/78617