centso 7 Keepalived 配置腳本

#!/bin/bash
#This is keepalived bashshell.
#MASTER/BACKUP
yum install -y openssl openssl-devel keepalived
vim /etc/keepalived/keepalived.conf
sed -i 's/MASTER/BACKUP/g' /etc/keepalived/keepalived.conf
sed -i 's/eth0/ens33/g' /etc/keepalived/keepalived.conf
sed -i 's/priority 100/priority 80/' /etc/keepalived/keepalived.conf
sudo systemctl start keepalived
sudo systemctl enable keepalived

#!/bin/bash

while true
do
if [ `ip a show eth0 |grep 10.0.0.3|wc -l` -ne 0 ]
then
    echo "keepalived is error!"
else
    echo "keepalived is OK !"
fi
done

 

Keepalived  官網地址:https://www.keepalived.org/manpage.htmlhtml

源碼二進制包地址:https://www.keepalived.org/software/linux

keepalived-2.0.18.tar.gz:https://www.keepalived.org/software/keepalived-2.0.18.tar.gzgit

Keepalived for Linux - Version 2.0.18 - July 26, 2019 - MD5SUM:={9d1dc77a0e4c628daf9fe453701b54be}github

官網文檔閱讀:https://www.keepalived.org/doc/算法

什麼是Keepalived?

Keepalived是用C語言編寫的路由軟件。該項目的主要目標是爲Linux系統和基於Linux的基礎結構提供負載均衡和高可用性的簡單而強大的功能。 shell

負載平衡框架依賴於提供第4層負載平衡的著名且普遍使用的Linux虛擬服務器(IPVS)內核模塊。vim

Keepalived實現了一組檢查器,以根據其運行情況動態,自適應地維護和管理負載平衡的服務器池。另外一方面,VRRP實現了高可用性 協議。安全

VRRP是路由器故障轉移的基礎磚。bash

此外,Keepalived還實現了一組VRRP有限狀態機的掛鉤,從而提供了低級和高速協議交互。爲了提供最快的網絡故障檢測,Keepalived實施BFD協議。服務器

VRRP狀態轉換能夠考慮BFD提示來驅動快速狀態轉換。Keepalived框架能夠獨立使用,也能夠一塊兒使用以提供彈性基礎架構。

Keepalived是免費軟件;您能夠根據自由軟件基金會發布的GNU通用公共許可證的條款從新分發和/或修改它;許可的版本2,或(由您選擇)任何更高的版本。

介紹

負載平衡是一種在實際服務器羣集之間分配IP流量的方法,可提供一個或多個高可用性虛擬服務。

在設計負載平衡拓撲時,重要的是要考慮負載平衡器自己以及其背後的真實服務器的可用性。

 

Keepalived提供了用於負載平衡和高可用性的框架。負載平衡框架依賴於廣爲人知的Linux虛擬服務器(IPVS)內核模塊,該模塊提供第4層負載平衡。

Keepalived實施一組運行情況檢查器,以根據其運行情況動態,自適應地維護和管理負載平衡的服務器池。虛擬冗餘路由協議(VRRP)實現了高可用性。

VRRP是路由器故障轉移的基礎磚。此外,keepalived還實現了一組VRRP有限狀態機的掛鉤,從而提供了低級和高速協議交互。

每一個Keepalived框架能夠獨立使用,也能夠一塊兒使用以提供彈性基礎架構。

 

在這種狀況下,負載均衡器也能夠稱爲導向器或LVS路由器。

 

簡而言之,Keepalived提供兩個主要功能:

  • LVS系統的運行情況檢查
  • VRRPv2堆棧的實施以處理負載均衡器故障轉移

軟件設計

Keepalived用純ANSI/ISO C編寫。
該軟件圍繞提供實時網絡設計的中央I/O多路複用器進行鏈接。主要設計重點是在全部元素之間提供同質的模塊化。
這就是建立核心庫以刪除代碼重複的緣由。目的是產生安全可靠的代碼,以確保生產的魯棒性和穩定性。

爲了確保健壯性和穩定性,守護程序分爲三個不一樣的進程:

一個簡約的父進程,負責分叉子進程的監視。
兩個子進程,一個負責VRRP框架,另外一個負責健康檢查。

每一個子進程都有本身的調度I/O多路複用器,因爲VRRP調度比運行情況檢查程序更明智/更關鍵,所以能夠優化VRRP調度抖動。
這種拆分設計最大程度地減小了對外部庫的使用情況進行健康檢查的可能性,並最大程度地減小了直到主線程並使其空閒的自身操做,從而避免了由自身引發的故障。

父進程監視框架稱爲看門狗,其設計是每一個子進程打開一個接受unix域套接字,而後在守護程序引導時,父進程鏈接到那些unix域套接字並向子進程發送按期(5s)的hello數據包。
若是父級沒法將hello數據包發送到遠程鏈接的Unix域套接字,則只需重啓子級進程便可。

這種看門狗設計具備2個好處,首先,經過I / O複用器調度程序完成從父進程發送到遠程鏈接的子進程的hello數據包,從而能夠檢測子調度程序框架中的死循環。
第二個好處是經過使用sysV信號檢測死亡的孩子而帶來的。運行時,您將在進程列表中看到:

PID 111 Keepalived <-- Parent process monitoring children
112 \_ Keepalived <-- VRRP child
113 \_ Keepalived <-- Healthchecking child


內核組件
Keepalived使用四個Linux內核組件:

1.LVS框架:使用getsockopt和setsockopt調用來獲取和設置套接字上的選項。
2.Netfilter框架:支持NAT和假裝的IPVS代碼。
3.Netlink接口:設置和刪除網絡接口上的VRRP虛擬IP。
4.組播:將VRRP通告發送到保留的VRRP MULTICAST組(224.0.0.18)。

原子元素

 

 

控制平面
經過文件keepalived.conf完成Keepalived配置。
編譯器設計用於解析。解析器與關鍵字樹層次結構配合使用,以將每一個配置關鍵字與特定處理程序進行映射。
中央多級遞歸函數讀取配置文件並遍歷關鍵字樹。解析期間,配置文件被轉換爲內部存儲器表示。

調度程序-I/O多路複用器
全部事件都安排在同一過程當中。Keepalived是一個單一的過程。
Keepalived是一種網絡路由軟件,對I/O如此封閉。這裏使用的設計是一箇中央選擇(...),負責安排全部內部任務。
不使用POSIX線程庫。該框架提供了針對網絡目的而優化的本身的線程抽象。

內存管理
該框架提供對某些通用內存管理功能的訪問,例如分配,從新分配,發佈等。
此框架能夠在兩種模式下使用:normal_mode和debug_mode。使用debug_mode時,它提供了一種強大的方法來消除和跟蹤內存泄漏。
此低級環境經過跟蹤內存的分配和釋放來提供緩衝區運行不足保護。全部使用的緩衝區都是固定長度的,以防止最終出現緩衝區溢出。

核心組件
該框架定義了全部代碼中都使用的一些通用和全局庫。
這些庫是:html解析,連接列表,計時器,向量,字符串格式,緩衝區轉儲,網絡實用程序,守護程序管理,pid處理,低級TCP layer4。
此處的目標是將代碼分解爲最大,以限制儘量多的代碼重複以增長模塊化。

看門狗
該框架提供子進程監控(VRRP和運行情況檢查)。
每一個孩子都接受與其本身的看門狗unix域套接字的鏈接。
父進程將「 hello」消息發送到此子unix域套接字。Hello消息在父端使用I/O複用器發送,並在子端使用I/O複用器接受/處理。
若是父級檢測到管道損壞,則它使用sysV信號測試子級是否仍然存在並從新啓動它。

跳棋
這是Keepalived的主要功能之一。檢查人員負責realserver的運行情況檢查。
一個檢查器測試realserver是否還活着,該測試以二進制決定結束:從/向LVS拓撲中刪除或添加realserver。
內部檢查器設計是實時網絡軟件,它使用徹底多線程的FSM設計(有限狀態機)。該檢查器堆棧根據第4層到第5/7層測試結果提供LVS拓撲操做。它在由父進程監視的獨立進程中運行。

VRRP協議棧
另外一個最重要的Keepalived功能。VRRP(虛擬路由器冗餘協議:RFC2338)專一於導演接管,它爲路由器備份提供了低級設計。
它實現了完整的IETF RFC2338標準,併爲LVS和防火牆設計提供了一些規定和擴展。它實現了vrrp_sync_group擴展,該擴展可確保協議接管後的持久路由路徑。
它使用MD5-96位密碼提供來實現IPSEC-AH,以確保協議廣告交換的安全。有關VRRP的更多信息,請閱讀RFC。重要事項:VRRP代碼無需LVS支持便可使用,它是爲獨立使用而設計的。
它在由父進程監視的獨立進程中運行。

系統調用
該框架提供了啓動額外系統腳本的功能。它主要用於MISC檢查器。在VRRP框架中,它提供了在協議狀態轉換期間啓動額外腳本的功能。系統調用完成到一個分叉的過程當中,以不影響全局調度計時器。

Netlink反射器
與IPVS包裝器相同。Keepalived具備其本身的網絡接口表示形式。IP地址和接口標誌是經過內核Netlink通道設置和監視的。Netlink消息傳遞子系統用於設置VRRP VIP。
另外一方面,Netlink內核消息傳遞廣播功能用於將與接口相關的任何事件反映到咱們的用戶空間Keepalived內部數據表示中。
所以,任何其餘用戶空間(其餘程序)的網絡連接操做都會經過網絡連接內核廣播(RTMGRP_LINK和RTMGRP_IPV4_IFADDR)反映到咱們的Keepalived數據表示中。

SMTP
SMTP協議用於管理通知。它使用多線程FSM設計實現IETF RFC821。發送有關健康檢查程序活動和VRRP協議狀態轉換的管理通知。SMTP是經常使用的,能夠與任何其餘通知子系統(例如GSM-SMS,尋呼機等)接口。

IPVS包裝器
該框架用於將規則發送到內核IPVS代碼。它提供了Keepalived內部數據表示和IPVS rule_user表示之間的轉換。它使用IPVS libipvs保持與IPVS代碼的通用集成。

IPVS
由LinuxVirtualServer.org開源項目的Wensong提供的Linux內核代碼。IPVS(IP虛擬服務器)在Linux內核內部實現了傳輸層負載平衡,也稱爲第4層交換。

網通
Alexey Kuznetov提供的Linux Kernel代碼具備很是好的高級路由框架和子系統功能。Netlink用於在內核和用戶空間進程之間傳輸信息。
它由一個用於用戶空間進程的基於套接字的標準接口和一個用於內核模塊的內部內核API組成。

系統日誌
全部keepalived守護程序通知消息都是使用syslog服務記錄的。

健康檢查框架
每一個健康檢查都註冊到全局調度框架。這些運行情況檢查工做程序線程實現如下類型的運行情況檢查:

TCP_CHECK
在第4層工做。爲了確保此檢查,咱們使用TCP Vanilla檢查,該檢查使用無阻塞/超時的TCP鏈接。若是遠程服務器未回覆此請求(超時),則測試錯誤,而且該服務器已從服務器池中刪除。
HTTP_GET
在第5層工做。對指定的URL執行HTTP GET。而後,使用MD5算法對HTTP GET結果進行求和。若是該總和與指望值不匹配,則測試是錯誤的,並將服務器從服務器池中刪除。
該模塊對同一服務實現多URL獲取檢查。若是您使用的服務器託管多個應用程序服務器,則此功能頗有用。此功能使您可以檢查應用程序服務器是否正常運行。
MD5摘要是使用genhash實用程序(包含在keepalived軟件包中)生成的。
SSL_GET
與HTTP_GET相同,但使用到遠程Web服務器的SSL鏈接。
MISC_CHECK
經過此檢查,能夠將用戶定義的腳本做爲運行情況檢查器運行。結果必須爲0或1。腳本在目錄框上運行,這是測試內部應用程序的理想方法。
可使用完整路徑(即/path_to_script/script.sh)調用能夠在不帶參數的狀況下運行的腳本。須要參數的變量須要用雙引號引發來(即「 /path_to_script/script.sh arg 1 ... arg n」)
Keepalived的目標是定義一個易於擴展的通用框架,以添加新的Checkers模塊。若是您對現有或新檢查器的開發感興趣,請查看源代碼中的keepalived / check目錄:

https://github.com/acassen/keepalived/tree/master/keepalived/check

故障轉移(VRRP)框架
Keepalived實施VRRP協議進行導演故障轉移。在已實現的VRRP堆棧中,VRRP數據包分派器負責爲每一個VRRP實例解複用特定的I/O。

根據RFC2338,VRRP定義爲:

「VRRP specifies an election protocol that dynamically assigns
responsibility for a virtual router to one of the VRRP routers on a LAN.
The VRRP router controlling the IP address(es) associated with a virtual
router is called the Master, and forwards packets sent to these IP
addresses. The election process provides dynamic fail over in the
forwarding responsibility should the Master become unavailable. This allows
any of the virtual router IP addresses on the LAN to be used as the default
first hop router by end-hosts. The advantage gained from using VRRP is a
higher availability default path without requiring configuration of dynamic
routing or router discovery protocols on every end-host.」 [rfc2338]

 

注意

該框架是獨立於LVS的,所以您能夠將其用於LVS Director故障轉移,即便是其餘須要Hot-Standby協議的Linux路由器也是如此。因爲設計和健壯性的緣由,此框架已徹底集成在Keepalived守護程序中。

該框架提供的主要功能是:

故障轉移:基於VRRP VIP漫遊集的原始VRRP協議。
VRRP實例同步:咱們能夠指定2個VRRP實例之間的狀態監視,也稱爲VRRP同步組。它保證2個VRRP實例保持相同狀態。同步的實例相互監視。
不錯的後備
廣告包完整性:使用IPSEC-AH ICV。
系統調用:在VRRP狀態轉換期間,能夠調用外部腳本/程序。


關於將VRRP與虛擬MAC地址一塊兒使用的說明
爲了減小對接管的影響,某些網絡環境將要求使用帶有VMAC地址的VRRP。爲了實現該目標,Keepalived VRRP框架經過調用配置文件中的「 use_vmac」關鍵字來實現VMAC支持。

在內部,Keepalived代碼將啓動虛擬接口,每一個接口專用於特定的virtual_router。Keepalived使用Linux內核macvlan驅動程序來定義這些接口。而後必須使用經過macvlan支持編譯的內核。

此外,咱們能夠提到VRRP VMAC僅適用於包含如下補丁的內核:

http://git.kernel.org/?p=linux/kernel/git/torvalds/linux.git;a=commitdiff;h=729e72a10930ef765c11a5a35031ba47f18221c4

默認狀況下,MACVLAN接口處於VEPA模式,該模式會過濾掉接收到的MAC源地址與MACVLAN接口的地址匹配的數據包。將MACVLAN接口設置爲私有模式將不會基於源MAC地址進行過濾。

或者,您能夠指定「 vmac_xmit_base」,這將致使VRRP消息在基礎接口上發送和接收,而ARP將從VMAC接口發生。

您可能還須要調整物理接口,以解決衆所周知的ARP問題。若是遇到問題,請嘗試如下配置:

1.全局配置:

net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 1
net.ipv4.conf.all.arp_filter = 0


2.物理接口配置

對於運行VRRP實例的物理以太網接口,請使用:

net.ipv4.conf.eth0.arp_filter = 1

3.VMAC接口
考慮如下VRRP配置:

vrrp_instance instance1 {
state BACKUP
interface eth0
virtual_router_id 250
use_vmac
vmac_xmit_base # Transmit VRRP adverts over physical interface
priority 150
advert_int 1
virtual_ipaddress {
10.0.0.254
}
}

該use_vmac關鍵字將驅動器的keepalived代碼來建立一個名爲macvlan接口vrrp.250(默認內部範例VRRP {} virtual_router_id,您只需提供一個參數「use_vmac」關鍵字,如覆蓋此命名:use_vmac vrrp250)。

而後,您須要使用如下命令配置接口:

net.ipv4.conf.vrrp.250.arp_filter = 0
net.ipv4.conf.vrrp.250.accept_local = 1(對於地址全部者,這是必需的)
net.ipv4.conf.vrrp.250.rp_filter = 0

您能夠建立notify_master腳本爲您自動執行此配置步驟:

vrrp_instance instance1 { state BACKUP interface eth0 virtual_router_id 250 use_vmac priority 150 advert_int 1 virtual_ipaddress { 10.0.0.254 } notify_master "/usr/local/bin/vmac_tweak.sh vrrp.250"}

相關文章
相關標籤/搜索