實現Keepalived高可用項目架構


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 StackCheackers,實現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都可實現高可用,區別是什么?  

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM