一、HA Cluster基礎
系統可用性A=MTBF/(MTBF+MTTR)
MTBF:平均無故障時間
MTTR:平均修復時間
降低MTTR的方式:冗余(redundent)
衡量標準:幾個9 90%、99%、99.9%…
提升系統可用性的辦法之一:降低MTTR
通過冗余(redundant)的方式能夠避免單點故障(SPoF),從而降低MTTR。
冗余方式:
一主一備
一主多備
多主多備:此時,各主節點提供的服務不應該是同一個服務
主節點:active
備用節點:passive
主節點通過多播的方式以一定的頻率發送HeartBeat信息,告知其他備用節點自己仍在提供服務。一旦其他備用節點在一定時長之內沒有收到主節點的HeartBeat信息,會認為其發生故障,這時備用節點會基于優先級來搶占提供服務的IP地址,并把服務啟動向外提供。
當由多個節點構成一個高可用集群時,若出現某主節點與其他節點互相之間不能通信,但主節點還在正常提供服務,此時,其他節點會與主節點爭搶資源,這種情況被稱之為Networl Partition(也被稱之為腦裂brain split)。出現此情況時,節點數量大于半數的節點將接手服務。
構建集群時,一般使用奇數個節點。當出現網絡分區情況時能夠選舉出新的主節點。
二、HA CLuster的實現方案
vrrp協議的實現:keepalived
ais:完備的HA集群
heartbeat
corosync
三、VRRP協議簡介
VRRP全稱 Virtual Router Redundancy Protocol,即虛擬路由冗余協議??梢哉J為它是實現路由器高可用的容錯協議,即將N臺提供相同功能的路由器組成一個路由器組(Router Group),這個組里面有一個master和多個backup,但在外界看來就像一臺一樣,構成虛擬路由器。擁有一個虛擬IP(vip,也就是路由器所在局域網內其他機器的默認路由),占有這個IP的master實際負責ARP相應和轉發IP數據包,組中的其它路由器作為備份的角色處于待命狀態。master會發組播消息,當backup在超時時間內收不到vrrp包時就認為master宕掉了,這時就需要根據VRRP的優先級來選舉一個backup當master,保證路由器的高可用。
在VRRP協議實現里,虛擬路由器使用 00-00-5E-00-01-XX 作為虛擬MAC地址,XX就是唯一的 VRID (Virtual Router IDentifier),這個地址同一時間只有一個物理路由器占用。在虛擬路由器里面的物理路由器組里面通過多播IP地址 224.0.0.18 來定時發送通告消息。每個Router都有一個 1-255 之間的優先級別,級別最高的(highest priority)將成為主控(master)路由器。通過降低master的優先權可以讓處于backup狀態的路由器搶占(pro-empt)主路由器的狀態,兩個backup優先級相同的IP地址較大者為master,接管虛擬IP
VRRP協議術語
虛擬路由器:由一個 Master 路由器和多個 Backup 路由器組成。主機將虛擬
路由器當作默認網關。
VRID:虛擬路由器的標識。有相同 VRID 的一組路由器構成一個虛擬路由器。
Master 路由器:虛擬路由器中承擔報文轉發任務的路由器。
Backup 路由器:Master 路由器出現故障時,能夠代替 Master 路由器工作的路由器。
虛擬 IP 地址:虛擬路由器的 IP 地址。一個虛擬路由器可以擁有一個或多個IP地址。
IP 地址擁有者:接口 IP 地址與虛擬 IP 地址相同的路由器被稱為 IP 地址擁有者。
虛擬 MAC 地址:一個虛擬路由器擁有一個虛擬 MAC 地址。虛擬 MAC 地址的格式為 00-00-5E-00-01-{VRID}。通常情況下,虛擬路由器回應 ARP 請求使用的是虛擬 MAC 地址,只有虛擬路由器做特殊配置的時候,才回應接口的真實 MAC 地址。
優先級:VRRP 根據優先級來確定虛擬路由器中每臺路由器的地位。
非搶占方式: 如果 Backup 路由器工作在非搶占方式下,則只要 Master 路由器沒有出現故障,Backup 路由器即使隨后被配置了更高的優先級也不會成為Master 路由器。
搶占方式:如果 Backup 路由器工作在搶占方式下,當它收到 VRRP 報文后,會將自己的優先級與通告報文中的優先級進行比較。如果自己的優先級比當前的 Master 路由器的優先級高,就會主動搶占成為 Master 路由器;否則,將保持 Backup 狀態。
四、keepalived體系結構及簡單配置
4.1、keepalived是什么及其功能
keepalived是VRRP協議的軟件實現,原生設計的目的為了高可用ipvs服務。其功能如下:
1)、基于VRRP協議完成地址流動;
2)、為VIP地址所在的節點生成ipvs規則(定義在配置文件中);
3)、為各RS做健康狀態檢測;
4)、基于腳本調用接口通過執行腳本完成腳本中定義的功能;
4.2、keepalived體系結構
keepalived是高度模塊化的軟件,其由核心模塊、內存管理、I/O復用、配置文件分析器四個模塊構成。
keepalived采用了多進程的設計模式,每個進程負責不同的功能。
父進程:內存管理,子進程管理等
子進程:VRRP子進程
子進程:healthchecker子進程
Keeplived的體系結構分兩層:內核空間(Kernel Spase)和用戶空間(User Spase)。
1)、內核空間層包括兩個模塊:
IPVS:IPVS模塊是Keepalived引入的一個第三方模塊,通過IPVS可以實現基于IP的負載均衡集群。IPVS默認包含在LVS集群軟件中。在Keepalived中,IPVS模塊是可配置的,如果需要負載均衡功能,可以在編譯Keepalived時打開負載均衡功能,也可以通過配置編譯參數關閉。
NETLINK:主要用于實現一些高級路由框架和一些相關的網絡功能,完成用戶空間層Netlink Reflector模塊發來的各種網絡請求。
2)、用戶空間層分為4個部分:
Scheduler – I/O Multiplexer : I/O復用分發調度器,負責安排Keepalived所有內部的任務請求。
Memory Management:內存管理機制,這個框架提供了訪問內存的一些通用方法。
Control Plane:Keepalived的控制面板,實現對配置文件進行編譯和解析,Keepalived的配置文件解析比較特殊,不是一次解析所有模塊的配置,而是在用到某個模塊時才解析相應的配置。
Core components:Keepalived的核心組件,包含了一系列功能模塊,主要有WatchDog、Checkers、VRRP Stack、IPVS wrapper和Netlink Reflector。
3)、Core components的5個主要功能模塊:
WatchDog:負責監控Checkers和VRRP進程。
Checkers:負責對服務器運行狀態檢測和故障隔離
VRRP Stack:負責HA集群中失敗切換(Failover)。
IPVS wrapper:負責將設置好的IPVS規則發送到內核空間并提交給IPVS模塊,最終實現IPVS模塊的負載均衡功能。
Netlink Reflector:負責高可用集群中Failover時虛擬IP(VIP)的設置和切換。Netlink Reflector的所有請求最后都發送到內核空間層的NETLINK模塊來完成。
4.3、keepalived程序環境
配置文件:/etc/keepalived/keepalived.conf
主程序:/usr/sbin/keepalived
配置文件組成部分:
全局配置(GLOBAL CONFIGURATION):
Global definations
static routes
VRRPD CONFIGURATION
VRRP synchronization group(s)
VRRP instance(s)
LVS CONFIGURATION
Virtual server group(s)
Virtual server(s)
4.4、keepalived配置文件詳解之全局配置&vrrp instance配置
1)全局配置
global_defs {
notification_email { #當keepalieved發生切換等操作時,需要通知的收件人
acassen@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc#通知郵件的發件人
smtp_server 192.168.200.1 #郵件服務器地址
smtp_connect_timeout 30 #郵件服務器連接超時時長
router_id LVS_DEVEL #當前路由器的標識符
vrrp_mcast_group4 224.0.0.18 #發送多播的多播地址。當局域網中存在多個keepalived集群時,建議將其地址修改為各自獨立。
}
要能發送多播信息,網卡必須支持MULTICAST。使用ip link show可以查看是否支持
如果查看到不支持,可以通過ip link set dev ifname multicast on來啟用支持
~]# ip link set dev eth0 multicast on
2)虛擬路由器配置
vrrp_instance instance_name { #一個vrrp_instance定義一個虛擬路由器,instance_name不能重復。
state MASTER |BACKUP #定義當前節點在此虛擬路由器的初始狀態。只能有一個MASTER。注:初識狀態是通過優先級的比對來最終決定的
interface interface_name #當前虛擬路由器使用的物理接口,即Vip配置在哪個網卡的別名上
virtual_router_id VRID #虛擬路由器的唯一標識符,不能重復,范圍0-255
priority 100 #當前節點在此虛擬路由器中的優先級,范圍1-254。優先級高的為MASTER
advert_int 1 #主加點向備用節點通告自己heartbeat信息的時間間隔,默認1秒。
authentication { #認證方式和密碼,主從必須一樣。
auth_type AH|PASS #推薦使用簡單字符認證,不能超過8個字符
auth_pass 1111 #認證密碼,最好使用隨機數。openssl rand -hex 4
}
virtual_ipaddress { #設定虛擬路由器IP地址,可以指定配置在哪個物理接口上,也可以指定標簽。其隨著state的變化而增加或刪除,state為MASTER時增加,BACKUP時刪除。state由priority決定。
192.168.200.17/24 dev eth1
192.168.200.18/24 dev eth2 label eth2:1
}
track_interface { #當虛擬路由器配置在某物理接口上時,此配置用于定義當該物理接口發生故障時,則轉為FAULT狀態,重新觸發選舉。
eth0
eth1
…
}
nopreempt #定義為非搶占模式,默認為搶占模式
preempt_delay #搶占模式下節點上線后觸發新選舉操作的延時時長
#在實例中,可以自定義通知方式,而不使用全局通知方式,配置如下
notify_master <STRING>|<QUOTED-STRING> #當前節點為主節點時觸發的腳本
notify_backup <STRING>|<QUOTED-STRING> #當前節點為備節點時觸發的腳本
notify_fault <STRING>|<QUOTED-STRING>#當前節點轉為失敗狀態時觸發的腳本
notify <STRING>|<QUOTED-STRING>#通用格式的通知觸發機制,能完成上述三種狀態切換的通知,不能與上述通知配置同時使用。
}
keepalived服務啟動日志信息:保存于/var/log/messages
4.5、keepalived配置示例之vrrp instance實現:
配置前提:
(1) 各節點時間必須同步; 使用ntp或 chrony服務進行同步。
(2) 確保iptables及selinux不會成為阻礙;
(3) 各節點之間可通過主機名互相通信(非必須);
(4) 各節點之間的root用戶 可以基于密鑰認證的ssh互相通信;
實驗環境:
node1 CentOS6.8 192.168.154.127
node2 CentOS6.8 192.168.154.128
虛擬路由器1:名稱 testone ip:192.168.154.220
虛擬路由器2:名稱 testtwo ip:192.168.154.230
node1為虛擬路由器1 testone的主節點,虛擬路由器2 testtwo的備節點
node2為虛擬路由器2 testtwo的主節點,虛擬路由器1 testone的備節點
1)單主配置。以配置testone為例
a)在node1上配置,其為主節點
global_defs {
notification_email {
root@localhost
}
notification_email_from keepalived@localhost
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id 121
vrrp_mcast_group4 224.0.54.154
}
vrrp_instance testone {
state MASTER
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 797fea91
}
virtual_ipaddress {
192.168.154.220/24 dev eth1
}
}
b)在node2上配置,其為備用節點。
備用節點配置文件在主節點配置文件的基礎上修改state為BACKUP和priority低于主節點即可
global_defs {
notification_email {
root@localhost
}
notification_email_from keepalived@localhost
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id 121
vrrp_mcast_group4 224.0.54.154
}
vrrp_instance testone {
state BACKUP #在備節點上state改為BACKUP
interface eth0
virtual_router_id 51
priority 95 #備節點上的priority低于主節點的priority
advert_int 1
authentication {
auth_type PASS
auth_pass 797fea91
}
virtual_ipaddress {
192.168.154.220/24 dev eth1
}
}
之后,分別在主節點和備節點啟動keepalived服務。
c)在主節點上查看配置
查看網卡信息
d)查看備節點配置及網卡信息
2)主主配置。
配置2個虛擬路由器,一個節點為虛擬路由器1的主節點,虛擬路由器2的備節點;另一個節點為虛擬路由器2的主節點,虛擬路由器1的備節點。
a)在node1上新增虛擬路由器2 testtwo的配置,其為testtwo的備節點
vrrp_instance testtwo {
state BACKUP
interface eth0
virtual_router_id 52 #注:虛擬路由器之間的ID不能重復
priority 97
advert_int 1
authentication {
auth_type PASS
auth_pass fe9f18a0 #注:虛擬路由器之間的認證密碼不能重復
}
virtual_ipaddress {
192.168.154.230/24 dev eth1 #注:虛擬路由器之間的虛擬IP互相獨立
}
}
b)在node2上新增以下配置,其為testtwo的主節點
vrrp_instance testtwo {
state MASTER
interface eth0
virtual_router_id 52
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass fe9f18a0
}
virtual_ipaddress {
192.168.154.230/24 dev eth1
}
}
c)先啟動node1上的keepalived,查看主節點日志及網卡信息
發現,此時,由于node2上沒有啟動keepalived,所以node1既是testone的主節點,也是testtwo的主節點
d)啟動node2上的keepalived,查看備節點日志及網卡信息。發現對于testtwo實例,其收到一個低優先級的組播信息,因此發起新的選舉,成為testtwo的主節點。
e)此時,在查看node1上日志。發現對于testtwo實例,其受到一個更高優先級的組播,因此其轉換為BACKUP模式,并且移除testtwo的虛擬IP
配置郵件通知。當主備節點之間發生切換時,系統管理員能查看到相應的信息,對系統的健康狀態做出判斷。
1)在node1上,編輯/etc/keepalived/notify.sh
#!/bin/bash
#
contact=’root@localhost’
notify() {
mailsubject=”$(hostname) to be testone $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
2)修改/etc/keepalived/notify.sh權限,增加可執行權限
3)vim /etc/keepalived/keepalived.conf。在testone實例中增加以下內容
notify_master “/etc/keepalived/notify.sh master”
notify_backup “/etc/keepalived/notify.sh backup”
notify_fault “/etc/keepalived/notify.sh fault”
如下圖:
4)將腳本文件拷貝至其他備節點中,此處僅有node2節點。
5)同樣也需要編輯/etc/keepalived/keepalived.conf。在testone實例中增加以下內容
notify_master “/etc/keepalived/notify.sh master”
notify_backup “/etc/keepalived/notify.sh backup”
notify_fault “/etc/keepalived/notify.sh fault”
6)測試。分別停掉node1、node2上的keepalived服務做測試。皆可看到
4.6、keepalived配置文件詳解之virtual server配置
virtual_server VIP VPORT { #設置虛擬服務器,指定虛擬IP及服務端口,用空格分開
delay_loop 6 #設置服務輪詢的時間間隔,單位秒
b_algo rr|wrr|lc|wlc|lblc|sh|dh #集群調度算法
lb_kind NAT|DR|TUN #集群類型
persistence_timeout 50 #持久連接時長。
protocol TCP #集群服務通過哪個協議提供
sorry_server 192.168.200.200 1358 #定義當整個集群不能正常提供服務時,由誰來對客戶請求進行響應,而不是直接返回拒絕鏈接等錯誤信息。
real_server 192.168.201.100 443 { #集群服務器的Real Server IP及其端口
weight 1 #定義權重,數值越大,權重越高。性能較高的服務器建議設置較高的權重,能合理利用資源
notify_up <STRING>|<QUOTED-STRING> #定義RS狀態改變腳本
notify_down <STRING>|<QUOTED-STRING> #定義RS狀態改變腳本
#健康狀態檢測機制,支持應用層檢測HTTP_GET、SSL_GET;傳輸層檢測TCP_CHECK,使用一種即可。注:在做健康狀態檢測時,有三種方式:1、icmp ping;2、掃描tcp|udp服務端口;3、通過應用層協議直接請求關鍵資源,以判斷服務是否可用。通常而言,使用應用層檢測能精準定位服務是否可用。
HTTP_GET|SSL_GET {
url {
path <STRING> #定義要監控的URL
digest <STRING> #判斷上述檢測機制為健康狀態的響應的內容的校驗碼
status_code <INT> #判斷上述檢測機制為健康狀態的響應碼。兩種判斷方式選擇其一即可。也可一起使用。
}
connect_timeout <INTEGER> #連接超時時長
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> #源端口
}
TCP_CHECK {
connect_timeout <INTEGER> #連接超時時長
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> #源端口
}
}
}
4.7、keepalived配置示例之keepalive + LVS DR的實現
環境: http server通過lvs DR實現負載均衡,director service通過keepalived保證高可用。如下圖所示
為了以示區別,http server1上的index頁面內容為“this is RS1 website”; http server2上的index頁面內容為“this is RS2 website”
配置步驟:
1)配置http server
a)在http server1上配置
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
ifconfig lo:0 192.168.154.168 netmask 255.255.255.255 up
route add -host 192.168.154.168 dev lo:0
之后:安裝http程序,配置站點內容為“this is RS1 website”,并啟動httpd服務,具體配置略。
b)在http server2上的配置類似http server1,不再贅述。
2)配置keepalived。
a)keepalived的主節點配置如下。編輯/etc/keepalived/keepalived.conf。配置內容如下:
! 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 121
vrrp_mcast_group4 224.0.54.154
}
vrrp_instance testone {
state MASTER
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 797fea91
}
virtual_ipaddress {
192.168.154.168/24 dev eth1
}
notify_master “/etc/keepalived/notify.sh master”
notify_backup “/etc/keepalived/notify.sh backup”
notify_fault “/etc/keepalived/notify.sh fault”
}
virtual_server 192.168.154.168 80 {
delay_loop 6
lb_algo rr
lb_kind DR
protocol TCP
real_server 192.168.154.129 80 {
weight 1
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 1
nb_get_retry 3
delay_before_retry 1
}
}
real_server 192.168.154.130 80 {
weight 1
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 1
nb_get_retry 3
delay_before_retry 1
}
}
}
b)將主節點上/etc/keepalived/keepalived.conf配置文件拷貝至BACKUP上。
修改vrrp instance配置上的state 為BACKUP及priority低于MASTER的priority 100即可。
3)啟動主節點及備節點上的keepalived服務。
4)模擬http server服務故障
在主節點上使用watch ipvsadm -Ln實時監控RS的健康狀況。
停止http server1上的http服務:service httpd stop
5)當兩個http server都出現故障時,即集群不能正常提供服務時。此時在請求http服務,會提示錯誤信息。但此錯誤信息并不能給予用戶判斷請求錯誤的原因提供幫助。通過配置sorry server可以讓用戶或系統管理員了解服務故障的部分原因。sorry server配置步驟如下:
a)在keepalived的MASTER和BACKUP節點上,配置http服務。在master上提供的頁面內容為”http cluster with some wrong,this is sorry server 1″,backup上提供的頁面內容為”http cluster with some wrong,this is sorry server 2″。
http服務配置完成之后,啟動服務。
b)編輯主節點的/etc/keepalived/keepalived.conf配置文件。在virtual_server中增加以下內容:
sorry_server 127.0.0.1 80
在備節點上操作相同。
之后,在主、備節點上使用service keepalived reload重載配置。
c)在http server的http服務都停止時,再去訪問。測試結果如下
測試命令:for i in {1..10};do curl http://192.168.154.168;done
此時,停止192.168.154.127上的keepalived服務,再次測試,結果為
6)從測試結果判斷,keepalived + lvs DR工作正常。將停掉的keepalived服務恢復啟動,確保http server及keepalived節點上的http服務為啟動即可,至此,keepalived + lvs DR配置完成。
附:快速部署LVS DR的示例腳本。
#!/bin/bash
#
vip=”192.168.154.168″
vport=”80″
netmask=”255.255.255.255″
iface=”lo:0″
case $1 in
start)
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
ifconfig $iface $vip netmask $netmask broadcast $vip up
route add -host $vip dev $iface
;;
stop)
ifconfig $iface down
echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce
esac
原創文章,作者:M20-1鐘明波,如若轉載,請注明出處:http://www.www58058.com/57040