keepalive学习之软件设计
軟件架構(gòu)如下圖所示:
?
Keepalived 完全使用標準的ANSI/ISO C寫出. 該軟件主要圍繞一個中央I/O復用分發(fā)器而設(shè)計,這個I/O復用分發(fā)器提供網(wǎng)絡(luò)實時功能. 主要設(shè)計目標著重于從所有的模塊抽取一個公共模塊,所有模塊衍生于公共模塊, 這是核心庫產(chǎn)生的意義所在———降低代碼的重復.?另一方面,設(shè)計目標是使用安全和有保障的的代碼來保證生產(chǎn)的穩(wěn)定性和健壯性。
為了保證的穩(wěn)定性和健壯性, 后臺程序被分解為3個不同的進程. 全局設(shè)計思想是一個簡約的父進程來負責監(jiān)控它創(chuàng)建的子進程。父進程創(chuàng)建了2個子進程,一個負責VRRP框架,一個負責健康檢查。每個子進程都有自己調(diào)度的I/O復用分發(fā)器,注意VRRP調(diào)用器Jitter的優(yōu)先級高,因為VRRP調(diào)度比健康檢查更重要和敏感。 On the other hand this split design minimalize for healthchecking the usage of foreign librairies and minimalize its own action down to and idle mainloop in order to avoid malfunctions caused by itself. 父進程監(jiān)控框架被稱為看門狗, 設(shè)計思路如下 : 每個子進程打開一個unix監(jiān)聽套接字,當后臺程序啟動后,父進程連接到字進程的監(jiān)聽套接字,然后周期的(5s)發(fā)送hello報文包給子進程。如果父進程不能發(fā)送hello報文包到已經(jīng)建立連接的字進程監(jiān)聽套接字,就直接重啟子進程。這種看門狗設(shè)計方式主要有兩個好處: 第一,所有從父進程發(fā)送到遠程連接到子進程的hello報文包都是通過I/O復用分發(fā)調(diào)度器來完成,這樣做的好處是它可以檢測到子進程調(diào)度框架的死循環(huán)。第二個好處是由使用sysV信號檢測子進程存活狀態(tài)帶來的。 keepalived運行時,可以查看到如下進程 :
| ? | PID | ? | ? |
| ? | 111 | Keepalived | <-- Parent process monitoring children |
| ? | 112 | \_ Keepalived | <-- VRRP child |
| ? | 113 | \_ Keepalived | <-- Healthchecking child |
所有的原子模塊如下面介紹所示:
控制面板 :
Keepalived的配置通過keepalived.conf文件來完成. 一個編譯器用來解析這個文件.編譯器讀取關(guān)鍵字層次樹,關(guān)鍵字層次樹將配置文件中的關(guān)鍵字和響應(yīng)的處理方法映射到一起。 一個中央、多級、遞歸函數(shù)讀取配置文件,轉(zhuǎn)換為關(guān)鍵字樹。在解析過程中,讀取配置文件到內(nèi)存中。
內(nèi)存管理 :
這個框架提供了一些通用的存儲器存取管理功能如分配,再分配,釋放,…等等。可以工作在兩種模式:normal_mode和debug_mode。當使用debug_mode提供強有力的辦法消除和跟蹤內(nèi)存泄漏。這種底層環(huán)境級別通過追蹤內(nèi)存的分派和釋放來提供低運行緩存保護。這些使用的緩存的長度是固定,原因是為了防止事件性的緩存泄露。
WatchDog :
這個框架提供了子進程的監(jiān)控(VRRP和健康檢查)。每一個子進程打開自己的看門狗unix域套接字連接,父進程發(fā)送hello消息到子進程unix域套接字,hello消息經(jīng)由父進程的I/O復用分發(fā)器發(fā)送到子進程的I/O復用分發(fā)器接受處理。如果子進程仍然存活,但父進程使用sysV系統(tǒng)監(jiān)測到管道破壞時,就重啟子進程。
VRRP 棧:
keepalived另一個最重要功能。VRRP(虛擬路由冗余協(xié)議:?RFC2338)是一種選擇協(xié)議,它可以把一個虛擬路由器的責任動態(tài)分配到局域網(wǎng)上的?vrrp?路由器中的一臺。它為路由備份提供了底層設(shè)計。它不但完整實現(xiàn)了RFC2338得標準,還為lvs及防火墻提供了一些準備和擴展設(shè)計。它實現(xiàn)了vrrp_sync_group擴展來保證協(xié)議接管后的路由保持。它使用MD5-96位密碼設(shè)置實現(xiàn)了IPSEC-AH來保證廣告交換的安全性。VRRP更多消息請閱讀RFC.提醒:VRRP代碼可以單獨使用而不需要LVS支持,這個特性為獨立用戶設(shè)計。它運行在一個父進程監(jiān)控的獨立子進程中。
Netlink 反射器:
類似于IPVS包裝器。keepalived有自己的網(wǎng)絡(luò)接口結(jié)構(gòu),核心netlink通道設(shè)置ip地址和接口標志和監(jiān)控。netlink消息子系統(tǒng)用來設(shè)置VRRP的vip。netlink 核心消息廣播用來映射成事件相關(guān)接口的keepalived自定義用戶空間的數(shù)據(jù)結(jié)構(gòu)。因此通過netlink核心廣播(RTMGRP_LINK & RTMGRP_IPV4_IFADDR),可以將任意的用戶空間(別的程序)的netlink操作映射到keeaplived 數(shù)據(jù)結(jié)構(gòu)。
IPVS :
linux核心代碼,貢獻者 Wensong,LinuxVirtualServer.org?開源工程
NETLINK :
linux核心代碼,貢獻者Alexey Kuznetov,它擁有優(yōu)美、先進的路由框架和子系統(tǒng)能力。
調(diào)度器 - I/O 復用器 :
所有的事件被調(diào)度到同一個進程進行處理。keepalive是單進程的。它是一個網(wǎng)絡(luò)路由軟件,和I/O密切相關(guān)。這里的設(shè)計方式是中央select(...),它負責調(diào)度所有內(nèi)部task。沒有使用POSIX線程庫。因網(wǎng)絡(luò)原因,這個框架提供了自己的線程抽象優(yōu)化。
核心組件 :
這個框架定義了可以在所有代碼中用到的一些通用的及一些全局庫,這些庫有:html解析,link-list,定時器,向量,字符串格式,buffer dump,網(wǎng)絡(luò)工具類,后臺程序管理,pid處理,底層4層tcp層。這里的全局庫通過工廠化方式盡量減少代碼的重復來提高系統(tǒng)的模塊性。
Checkers :
這是keepalived最重要的功能點之一。檢查器對真實服務(wù)器進行健康檢測。只要真實服務(wù)器存活著,一個檢測器就一直進行檢測,當從LVS拓撲結(jié)構(gòu)中移除或者加入一個真實服務(wù)器時該檢測器停止工作。內(nèi)部檢測器設(shè)計成一個網(wǎng)絡(luò)實時軟件,它完全使用多線程FSM(有限狀態(tài)機)設(shè)計。這個檢測器棧根據(jù)四層或者5/7層測試結(jié)果對LVS拓撲進行操作。?它運行在一個獨立的進程中,該進程被父進程所監(jiān)控。
系統(tǒng)調(diào)用:
該框架提供啟動額外的系統(tǒng)腳本的能力。主要是用在MISC?檢查器。在VRRP框架協(xié)議狀態(tài)轉(zhuǎn)換中,提供執(zhí)行額外的腳本的能力。系統(tǒng)調(diào)用通過生成一個子進程完成的,不干擾全局調(diào)度計時器。
SMTP :
SMTP協(xié)議用來管理通知,使用多線程有限狀態(tài)機設(shè)計,滿足IETF?RFC821?標準. 管理通知用來發(fā)送健康檢測活動和VRRP協(xié)議狀態(tài)轉(zhuǎn)換信息。SMTP非常通用,它也可以和其他通知子系統(tǒng)進行交互,如GSM短消息接口,尋呼機,…等等
IPVS 包裝器 :
該框架用來發(fā)送規(guī)則到IPVS核心代碼. 它作為keepalived內(nèi)部數(shù)據(jù)結(jié)構(gòu)和IPVS 規(guī)則_用戶結(jié)構(gòu)的轉(zhuǎn)換橋梁。使用IPVS?libipvs和IPVS代碼保持通用的集成。
?
官方文檔地址:http://www.keepalived.org/documentation.html
以上翻譯以官方為準,如翻譯不當,請輕拍。
?
轉(zhuǎn)載于:https://www.cnblogs.com/davidwang456/p/3540285.html
總結(jié)
以上是生活随笔為你收集整理的keepalive学习之软件设计的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux服务器性能评估与优化--转
- 下一篇: VRRP协议介绍--转