Keepalived的作用是檢測服務器 的狀態,如果有一台web服務器宕機 ,或工作出現故障,Keepalived將檢 測到,並將有故障的服務器從系統中 剔除,同時使用其他服務器代替該服 務器的工作,當服務器工作正常后 Keepalived自動將服務器加入到服務 器群中,這些工作全部自動完成,不 需要人工干涉,需要人工做的只是修 復故障的服務器。
Keepalived基礎
Keepalived基本概念和技術概括
高可用(High Availability )高可用集群,英文原文為High Availability Cluster,簡稱HA Cluster,簡單的說,集群(cluster)就是 一組計算機,它們作為一個整體向用戶提供一組網絡資源。這些單個的計算 機系統 就是集群的節點(node)。高可用性集群(HA cluster)是指如單系統一樣地運行並支持(計算機)持續正常運行的一個主機群。 高可用集群的出現是為了使集群的整體服務盡可能可用,從而減少由計算機 硬件和軟件易錯性所帶來的損失。如果某個節點失效,它的備援節點將在幾 秒鍾的時間內接管它的職責。因此,對於用戶而言,集群永遠不會停機。高可用集群軟件的主要作用就是實現故障檢查和業務切換的自動化。
高可用(High Availability ) HA(High Available), 高可用性群集是通過系統的可靠性(reliability)和可維護性(maintainability)來度量的。工程上,通常用平均無故障時間(MTTF) 來度量系統的可靠性,用平均維修時間(MTTR)來度量系統的可維護性。於 是可用性被定義為:
HA=MTTF/(MTTF+MTTR)*100%
具體HA(可用性)衡量標准:
99% 一年宕機時間不超過4天
99.9% 一年宕機時間不超過10小時
99.99% 一年宕機時間不超過1小時
99.999% 一年宕機時間不超過6分鍾
高可用工作方式: 主從方式 (非對稱方式)、雙機雙工方式(互備互 援)、集群工作方式(多服務器互備方式)
高可用的資源分類:網絡高可用、服務器高可用、存儲高可用、服務 高可用等
開源高可用解決方案:
- keepalived:通過實現vrrp協議來實現地址 漂移;
- heartbeat(開源社區項目),cman+rgmanager (RHCS: redhat cluster suite);
- corosync+pacemaker(大型解決方案, 一個用於心跳檢測,一個用於資源轉移。兩個結合起來使用,可以實現對高可用架構的自動管理。)
Keepalived的原理和配置
配置文件簡單:配置文件比較簡單,可通過簡單配置實現高可用功能
穩定性強:keepalived是一個類似於layer3, 4 & 7交換機制的軟件 ,具備我們平時說的第3層、第4層和第7層交換機的功能,常用於前端負載均衡器的高可用服務,當主服務器出現故障時,可快速進 行切換,監測機制靈活,成功率高。
成本低廉:開源軟件,可直接下載配置使用,沒有額外費用。
應用范圍廣:因為keepalived可應用在多個層面,所以它幾乎可以對所有應用做高可用,包括LVS、數據庫、http服務、nginx負載均衡等等
支持多種類型:支持主從模式、主主模式高可用,可根據業務場景 靈活選擇。
Keepalived工作流程圖
如上圖,keepalived主要是模塊是VRRP Stack和Cheackers,實現HA集群中失敗切換(Failover)功能。
Keepalived通過VRRP功能能再結合LVS負載均 衡軟件即可部署一個高性能的負載均衡集群系統。Cheackers主要實現可 實現對服務器運行狀態檢測和故障隔離。,其中ipvs和realserver健康狀態檢 查通過配置文件配置就可以實現,而其他服務高可用則需要通過自己編寫腳本,然后配置keepalived調用來實現。
Keepalived運行有3個守護進程。父進程主要負責讀取配置文件初始化 、監控2個子進程等;然后兩個子進程,一個負責VRRP,另一個負責 Cheackers健康檢查。其中父進程監控模塊為WacthDog,工作實現:每個子進程打開一個接受unix域套接字,父進程連接到那些unix域套接字並向子 進程發送周期性(5s)hello包。
上圖是Keepalived的功能體系結構,大致分兩層:用戶空間(user space) 和內核空間(kernel space)。 內核空間:主要包括IPVS(IP虛擬服務器,用於實現網絡服務的負載均衡) 和NETLINK(提供高級路由及其他相關的網絡功能)兩個部份。
VRRP(Virtual Router Redundancy Protocol,虛擬路由冗余協議) 可以認為是實現路由器高可用的協議,簡單的說,當一個路由器故障時可以 由另一個備份路由器繼續提供相同的服務。 VRRP根據優先級來確定虛擬路由器中每台路由器的角色(Master路由 器或Backup路由器)。VRRP優先級的取值范圍為0到255(數值越大表明 優先級越高),可配置的范圍是1到254,優先級0為系統保留給路由器放棄 Master位置時候使用,255則是系統保留給IP地址擁有者使用。優先級越高 ,則越有可能成為Master路由器。當兩台優先級相同的路由器同時競爭 Master時,比較接口IP地址大小。接口地址大者當選為Master。
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、HTTP、DNS等各種不同類型的高層協議, Keepalived的運行方式也更加全面化和復雜化,用戶可以通過自定義Keepalived的工作方式;例如:用戶可以通過編寫程序來運行keepalived。而keepalived將根據用戶的設 定檢測各種程序或服務是否運行正常,如果Keepalived的檢測結果與用戶設定不一致時 ,Keepalived將把對應的服務從服務器中移除。
Keepalived軟件包組成
程序包:Keepalived可直接yum安裝
/etc/keepalived/keepalived.conf #主配置文件
/etc/rc.d/init.d/keepalived #啟動腳本
/etc/sysconfig/keepalived #啟動時的添加參數
/usr/sbin/keepalived #啟動程序
Keepalived配置文件講解
global_defs { #全局配置 notification_email { #realserver故障時通知郵件的收件人地址,可 以多個 root@localhost } notification_email_from root_keepalived #發件人信息(可以隨意偽裝,因為郵件系統不會驗證處理發件人信息) smtp_server 127.0.0.1 #發郵件的服務器(一定不可為外部地址) smtp_connect_timeout 30 #連接超時時間 router_id KEEPALIVED #路由器的標識(可以隨便改動) } vrrp_instance VI_1 { #配置虛擬路由器的實例,VI_1是自定義的實例名稱 state MASTER #初始狀態,當state指定的instance的初始化狀態,兩台服務器都啟動后,優先級高的成為MASTER, 這里的MASTER並不是表示此台服務器一直是MASTER interface eth0 #通告選舉所用端口 virtual_router_id 51 #虛擬路由的ID號(一般不可大於255) priority 101 #優先級信息 #備節點必須更低 advert_int 1 #VRRP通告間隔,秒 authentication { auth_type PASS #認證機制 auth_pass 5344 #密碼(盡量使用隨機) } nopreempt #非搶占模式(NOTE: For this to work, the initial state of this entry must be BACKUP.) virtual_server 192.168.18.240 80 { #設置一個virtual server:VIP:Vport delay_loop 3 # service polling的delay時間,即服務輪詢的時間間隔 lb_algo rr #LVS調度算法:rr|wrr|lc|wlc|lblc|sh|dh lb_kind DR #LVS集群模式:NAT|DR|TUN #persistence_timeout 120 #會話保持時間(持久連接,秒),即以用戶在120秒內被分配到同一個后端 realserver nat_mask 255.255.255.255 protocol TCP #健康檢查用的是TCP還是UDP real_server 192.168.18.251 80 { #后端真實節點主機的權重等設置, 主要,后端有幾台這里就要設置幾個 weight 1 #給每台的權重,rr無效 # inhibit_on_failure #表示在節點失敗后,把他權重設置成0,而不是IPVS中刪除 url { path / status_code 200 } TCP_CHECK { connect_timeout 2 #連接超時時間 nb_get_retry 3 #重連次數 delay_before_retry 1 #重連間隔 } } }
Keepalived進階
實現keepalived企業級高可用基於LVS-DR模式的應用實戰
lvs-server-master VIP:172.18.64.7 DIP:172.18.64.100 開啟路由功能配置,
keepalived lvs-server-backup VIP:172.18.64.107 DIP:172.18.64.100 開啟路由功能配置
keepalived rs01 RIP:172.18.64.17 VIP:172.18.64.100
keepalived rs02 RIP:172.18.64.106 VIP:172.18.64.100
master和backup端只需配置配置文件和路由功能即可,rip端需要手動加lo:0的IP、廣播、路由等(參見lvs)
實現keeaplived故障通知機制
在企業中,高可用服務,是保證整個系統穩定性的重要前提,確 保高可用服務能正常工作和運轉,也是非常重要的工作。 除了服務上線前的充分測試之外,也需要確保對高可用服務的監 控機制,keepalived自身具備監控和通知機制,可在發生主從切換 、故障轉移時,通過自定義命令或者腳本,實現通知功能,從而讓 管理員在第一時間得知系統運行狀態,確保整個服務的穩定性和可 用性。
可在配置文件中,在instance配置中,通過keepalived通知功能notify,可 實現定制化腳本功能,如下所示:
notify_backup "/etc/keepalived/notify.sh
backup" notify_master "/etc/keepalived/notify.sh
master" notify_fault "/etc/keepalived/notify.sh fault"
實現keeaplived故障通知機制腳本:
#!/bin/bash contact='root@localhost' notify() { mailsubject="$(hostname) to be $1: vip floating" mailbody="$(date +'%F %H:%M:%S'): vrrp transition, $(hostname) changed to be $1"
echo $mailbody | mail -s "$mailsubject" $contact } case $1 in master) notify master exit 0 ;; backup) notify backup exit 0 ;; fault) notify fault exit 0 ;;*) echo "Usage: $(basename $0) {master|backup|fault}" exit 1 ;; esa
實現keeaplived自定義腳本功能
vrrp_script chk_down {
script “[[ -f /etc/keepalived/down ]] && exit 1 || exit 0 ”
interval 2 # check every 2 seconds
weight -5
}
track_script {
chk_down
}
在配置文件中,可實現以下配置,定義一個腳本,並在對應的實例中調用, 也可以用於檢測服務是否有異常,異常的話進行切換
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
}
track_script {
chk_sshd
}
實現keepalived主主架構和主從模式基本相同,就是多加一對instance而已,且互為主從。
思考問題:
1、keepalived是做什么用的?
2、如何實現keepalived高可用功能?
3、keepalived的搶占模式和非搶占模式區別?
4、keepalived實現高可用是基於什么協議的?
5、如何寫keepalived狀態切換腳本?
6、keepalived如何實現基於lvs的高可用功能?
7、keepalived和heartbeat都可實現高可用,區別是什么?