標籤:

keepalived學習總結

「Keepalived是一個C語言寫的路由軟體,它的主要目標是向linux系統和基礎組件提供簡單而健壯的負載均衡和高可用設施。負載均衡框架依賴於廣泛使用的LVS(IPVS)內核,它提供了layer4(傳輸層)負載均衡。keepalived實現了一組檢測器(checkers),根據負載均衡器的健康狀態,動態的、自適應的維護管理它們。另一方面,高可用性是通過VRRP協議實現,VRRP協議是路由器(router,具有路由功能的軟硬體,比如LVS)failover的基石。此外,keepalived實現了一組hooks,hooks關係到一些VRRP狀態機,這些狀態機提供了底層的、高速的協議交互。Keepalived框架能夠獨立使用(LVS不是必須的),或者與其他系統一起來提供彈性的基礎架構。」

簡單而言,keepalived基於VRRP協議,實現了路由器故障轉移,解決了負載均衡器的單點故障問題,實現了高可用性。我們需要首先簡單了解一下VRRP協議的基本工作原理。

VRRP,全稱「Virtual Router Redundancy Protocol」,即虛擬路由器冗餘協議。路由器將會把接收到的數據包發送給目標伺服器,如果目標地址不在本網段,則路由給下一個路由器;當路由器故障時,那麼本網段內所有以此路由器作為默認路由的下一跳的主機將無法與外部通訊,即單點問題。VRRP就是為了解決此問題而提出的,它為具有多播組播或者廣播能力的區域網設計。

VRRP將區域網中的一組路由器組成一個虛擬路由器,它包括一個Master(活躍的)和多個Backup(備份)路由器,為了便於理解,這裡的路由器,我們暫且認為是部署keepalived的伺服器節點。每個路由器都有自己的IP,此外還有一個VIP,此IP由Master持有,網路主機與持有VIP的路由器通訊。如果Master故障,那麼backup將通過選舉策略選出一個新的Master,重新持有此虛擬IP,繼續向網路內的主機提供路由服務,從而避免了路由器的單點問題。

VRRP路由器組中,按照優先順序選擇Master,優先順序為0~255,0表示VIP持有者主動放棄Master角色;優先順序較高的路由器將會綁定到VIP上,此後Master將周期性的發送VRRP通知報文(廣播),如果backup在連續三個通知間隔時間內收不到VRRP或者收到優先順序為0的通知,則啟動新一輪的VRRP選舉。

為了安全,VRRP路由器組中的路由器,都需要明確指定VRID和報文加密的密碼,以避免惡意修改VRRP通知信息。這些我們都可以在keepalived配置方式中得以體現。

一、Keepalived簡介

Keepalived由原生的ANS/IOS C編寫,此軟體圍繞一個中央IO復用器,以提供實時的網路設計;設計的重點就是在各個元素之間提供模塊化,這就是創建一個核心libary的原因,以移除重複的代碼。另一方面,主要目標就是創建一個安全、穩定的代碼,以確保產品的健壯性和穩定性。

為了確保其健壯性和穩定性,守護進程(daemon)被拆分為3個不同的進程;整體設計是一個輕量級的父進程負責監控2個forked子進程。這兩個子進程,一個負責VRRP框架,另一負責健康監測(healthchecking);每個子進程都有自己的調度IO復用器,這樣VRRP調度的抖動(jitter)進行了優化,因為VRRP調度,比healthcheckers更加合理和重要;同時這種設計,最小化了健康監測進程對外部librairies的使用,最小化了子進程自己的操作和空主輪詢(idle mainloop)以避免內部故障。父進程監控框架稱之為watchdog,設計方式為:每個子進程打開一個accpet unix domain socket,父進程與這些socket建立鏈接,並間歇性發送「hello」數據包,如果父進程不能通過鏈接將hello數據包發給子進程,那麼它只需簡單的重啟子進程即可。watchdog的這種設計有2個好處,首先所有的hello數據包均是由父進程通過IO復用器調度器(scheduler)發送給子進程,這樣它可以檢測到子進程調度框架的死鎖(然後重啟它們),此外可以通過「sysV」信號檢測死的子進程。

Keepalived可以不需要LVS的支持,即可單獨使用。

二、安裝與配置

宿主機器:Centos 2.6.32 64位。(通過「uname -r」指令查看)

1、下載最新版keepalived,解壓。

2、執行「./configure --prefix=/usr/local/keepalived」,此處最好指定prefix的路徑,以便維護。如果此指令正常執行,應該輸出如下信息

Java代碼

  1. Keepalivedconfiguration
  2. ------------------------
  3. Keepalivedversion:1.2.19
  4. Compiler:gcc
  5. Compilerflags:-g-O2-DFALLBACK_LIBNL1
  6. ExtraLib:-lssl-lcrypto-lcrypt-lnl
  7. UseIPVSFramework:Yes
  8. IPVSsyncdaemonsupport:Yes
  9. IPVSuselibnl:Yes
  10. fwmarksocketsupport:Yes
  11. UseVRRPFramework:Yes
  12. UseVRRPVMAC:Yes
  13. SNMPsupport:No
  14. SHA1support:No
  15. UseDebugflags:No

其中「IPVS」和「VRRP」相關的配置必須為「YES」,如果你在此過程中出現錯誤,極有可能時缺少必要的lib,請你按需安裝,如下為參考列表:popt-devel(解析命令行選項),openssl、openssl-devel,libssl-dev,libnl-devel,ipvsadm,還有「gcc」(編譯C文件,需要首先安裝);對於linux系統,通常上述lib都已經安裝,不過libnl-devel可能需要手動安裝。

如果上述一切正常則繼續執行「make && make install」,安裝完畢。那麼我們將會在「/usr/local/keepalived」目錄中得到keepalived安裝後的配置文件和執行bin。

配置文件在「/usr/local/keepalived/etc/keepalived」目錄下,同時在samples目錄下還有一些可以參考的例子。可執行文件在「/usr/local/keepalived/sbin」目錄下。大部分運維人員比較傾向於使用service方式啟動這些比較常用的服務。接下來我們只需簡單的操作幾個文件可以:

Java代碼

  1. cp/usr/local/keepalived/sbin/keepalived/usr/sbin/
  2. cp/usr/local/keepalived/etc/rc.d/init.d/keepalived/etc/init.d/
  3. #可以通過service啟動keepalived服務
  4. cp/usr/local/keepalived/etc/sysconfig/keepalived/etc/sysconfig/
  5. mkdir-p/etc/keepalived/
  6. cp/usr/local/keepalived/etc/keepalived/keepalived.conf/etc/keepalived/
  7. ##配置文件路徑,可以通過在/etc/init.d/keepalived文件中修改

3、接下來我們測試一種場景:我們有一個web站點,使用nginx做負載均衡,2個nginx一主一備,它們之間使用keepalived來監控健康狀況並支持自動切換。

集群部署拓撲結構:

1)nginx_1,內網IP:192.168.1.100,外網IP為61.172.xxx.10

2)nginx_2,內網IP:192.168.1.101,外網IP為61.172.xxx.11

3)虛擬IP:61.172.xxx.231,需要注意,虛擬IP也需要向運營商申請,只是這個IP暫且不需要映射到具體的物理機器罷了(無MAC映射)。不過,如果你的VIP不需要對外部訪問可用,完全可以使用區域網IP作為VIP。

在上述兩個節點上都部署keepalived。

我們的站點域名解析到了虛擬IP上,根據Keepalived工作原理,那麼其中一個keepalived節點(俗稱router)持有VIP,即為Master,另一個keepalived為backup;web流量將會轉發到Master節點上的nginx上,如果此上的nginx(或者keepalived)故障失效,那麼另一個節點接管(takeover)為Master並持有VIP,那麼web流量也會轉發到此節點,這樣就達成了「nginx」故障轉移的設計要求。

4、nginx安裝:參見其他文檔,核心配置摘要如下:

Java代碼

  1. server{
  2. listen80;
  3. server_namelocalhost;
  4. location/{
  5. roothtml;
  6. indexindex.htmlindex.html;##一個靜態資源服務。
  7. }
  8. }

5、keepalived Master配置:

Java代碼

  1. global_defs{
  2. #通知email,根據實際情況配置
  3. notification_email{
  4. #收件人
  5. admin@example.com
  6. }
  7. #發信人,可以偽裝任意地址
  8. notification_email_fromadmin@example.com
  9. #server地址,保持不變
  10. smtp_server127.0.0.1
  11. stmp_connect_timeout30
  12. #節點名標識,好像並沒有太大意義,建議和backup保持一致
  13. router_idNGINX_DEVEL
  14. }
  15. vrrp_scriptchk_http_port{
  16. script"/usr/local/keepalived/chk_nginx.sh"
  17. #執行腳本的間隔時間
  18. interval3
  19. weight2
  20. }
  21. vrrp_instanceVI_NGINX{
  22. #標記為master,其實選舉並不根據此值,而是根據權重。
  23. stateMASTER
  24. #選擇網卡,如果你的VIP是外網,就選擇外網網卡介面,否則就選擇內網。
  25. #本次測試,eth0為外網網卡
  26. interfaceeth0
  27. #虛擬路由ID,小於255,最終用於構成虛擬MAC地址
  28. #必須與backup一致
  29. virtual_router_id100
  30. #優先順序,0-254
  31. priority200
  32. #通知間隔,單位:秒
  33. advert_int5
  34. authentication{
  35. auth_typePASS
  36. #通知使用的秘鑰,backup保持一致。
  37. auth_pass123456
  38. }
  39. track_script{
  40. chk_http_port#添加腳本執行
  41. }
  42. virtual_ipaddress{
  43. #虛擬IP,backup保持一致,可以有多個。
  44. 61.172.xxx.231
  45. }
  46. }

6、keepalived Backup配置:

Java代碼

  1. global_defs{
  2. notification_email{
  3. admin@example.com
  4. }
  5. notification_email_fromadmin@example.com
  6. smtp_server127.0.0.1
  7. stmp_connect_timeout30
  8. router_idNGINX_DEVEL
  9. }
  10. vrrp_scriptchk_http_port{
  11. script"/usr/local/keepalived/chk_nginx.sh"
  12. #執行腳本的間隔時間
  13. interval3
  14. weight2
  15. }
  16. vrrp_instanceVI_NGINX{
  17. stateBACKUP
  18. interfaceeth0
  19. virtual_router_id100
  20. priority200
  21. advert_int5
  22. authentication{
  23. auth_typePASS
  24. auth_pass123456
  25. }
  26. track_script{
  27. chk_http_port
  28. }
  29. virtual_ipaddress{
  30. 61.172.xxx.231
  31. }
  32. }

7、配置文件中,有一個track_script,此腳本將會間歇性被調用。我們可以在此腳本中執行一些探測程序,比如檢測nginx的活性:

Java代碼

  1. #!/bin/bash
  2. A=`ps-Cnginx–no-header|wc-l`
  3. if[$A-eq0];then
  4. /usr/local/nginx/sbin/nginx#nginx命令的路徑
  5. sleep3
  6. if[`ps-Cnginx--no-header|wc-l`-eq0];then
  7. killallkeepalived
  8. fi
  9. fi

腳本的意思為:檢測nginx進程是否已經啟動,如果沒有啟動(或者已經失效)則立即啟動,如果啟動失敗,則關閉keepalived;關閉的keepalived節點為Master,那麼VIP會被釋放,通過VRRP觸發新一輪選舉,最終backup接管VIP並繼續服務。

nginx進程失效,keepalived會負責重啟它,如果keepalived節點失效,則需要人工啟動。

8、啟動keepalived:

如果你執行的是默認安裝,則可以到「/usr/local/keepalived/sbin」,執行「./keepalived」。如果基於service方式啟動,則「service keepalived start」即可。我們可以看到,啟動了三個keepalived進程。關閉keeaplived,可以直接使用「killall keepalived」。

我們還可以使用「./keepalived -h」查看其他幫助指令。

9、其他:

開發可以通過「ifconfig」指令查看伺服器各個網路介面的信息,不要配置錯了網路介面,否則VIP無法綁定。當然也可以通過此指令來查看VIP是否綁定到了指定的網卡上。


推薦閱讀:

初二地理會考總結
絲語:馬盤金星總結
最主要的幾種私家庭院景觀設計風格總結
工作寫作總結範文
全!神經內科臨床經驗總結

TAG:學習 | live | 總結 |