1、軟件介紹
①Keepalived
keepalive是一個用c語言編寫的路由軟件,這個項目的主要目標是為Linux系統和基于Linux的基礎設施提供簡單而健壯的負載平衡和高可用性設施。負載均衡框架依賴于眾所周知且廣泛使用的Linux Virtual Server (IPVS)內核模塊提供第4層負載均衡。keepalive實現了一組檢查器,可以根據負載均衡服務器池的運行狀況動態地、自適應地維護和管理它們。另一方面,通過VRRP協議實現高可用性。VRRP是路由器故障轉移的基本組件。此外,keepalive實現了一組到VRRP有限狀態機的鉤子,提供低級和高速的協議交互。為了提供最快的網絡故障檢測,keepalive實現了BFD協議。VRRP狀態轉換可以利用BFD提示實現狀態快速轉換。keepalive框架可以單獨使用,也可以一起使用,以提供彈性基礎設施。
keepalive是一款免費軟件;您可以根據自由軟件基金會發布的GNU通用公共許可證條款重新發布和/或修改它;許可證的版本2,或者(根據您的選擇)任何更新的版本。(Keepalived for Linux 官方定義)
Keepalived是Linux下一個輕量級別的高可用解決方案,它基于VRRP(虛擬路由冗余協議)實現,能夠避免單點故障導致的系統不可用問題。Keepalived的作用是檢測服務器的狀態,如果有一臺web服務器宕機,或工作出現故障,Keepalived將檢測到,并將有故障的服務器從系統中剔除,同時使用其他服務器代替該服務器的工作,當服務器工作正常后Keepalived自動將服務器加入到服務器群中,這些工作全部自動完成,不需要人工干涉,需要人工做的只是修復故障的服務器。
②HAProxy
HAProxy是一款開源的高性能負載均衡器和代理服務器。它可以將傳入的請求分發到多臺后端服務器上,以提高系統的負載能力和可用性。HAProxy支持多種負載均衡算法,如輪詢、加權輪詢、源IP哈希等,可以根據實際需求選擇合適的算法。
HAProxy不僅僅是一個負載均衡器,它還提供了許多其他功能。它可以進行SSL終端代理,實現HTTPS的負載均衡;還可以進行內容轉換和過濾,并提供高級的HTTP請求和響應管理功能。HAProxy還支持健康檢查,可以自動剔除故障的后端服務器,并動態調整請求的分發策略。
HAProxy具有高性能和低延遲的優勢,可以處理大量的并發請求。它支持多線程和多進程模型,可以利用多核處理器的性能。此外,HAProxy還提供了詳細的統計信息和日志記錄,以便進行分析和監控。
由于其可靠性和靈活性,HAProxy被廣泛應用于各種場景,包括Web應用程序、API網關、數據庫負載均衡、云服務等。它是一個強大而可靠的負載均衡解決方案,為系統的可擴展性和可靠性提供了重要支持。
HAProxy提供了L4(TCP)和L7(HTTP)兩種負載均衡能力,具備豐富的功能。HAProxy具備媲美商用負載均衡器的性能和穩定性。
2、實驗環境
準備4臺Linux 服務器,分別作為 負載均衡器 和web服務器。 虛擬機及IP規劃如下:
序號 | 主機名 | IP |
1 | LB-01 | RIP:192.168.56.2 |
2 | LB-01 | RIP:192.168.56.3 |
3 | VIP: 192.168.56.4 | |
4 | Web-01 | RIP:192.168.56.5 |
5 | Web-02 | RIP:192.168.56.6 |
2、底層原理
Linux VIP(Virtual IP)原理:
VIP原理基于Linux內核和網絡子系統。它利用了Linux內核網絡層的能力來攔截網絡數據包,然后將他們重定向到多個系統共享的一個虛擬IP上。這里的虛擬IP地址是一個不是分配給任何特定系統的IP地址,而是分配給一個虛擬網絡接口。
具體來說,VIP技術的實現需要以下步驟:
①創建虛擬網絡接口:在Linux系統中,可以使用ifconfig,ip等命令來創建虛擬網絡接口。該接口會被分配一個新的IP地址,但實際上并不會連接到任何實際的網絡設備上,它只是一個普通的網絡接口。
②綁定真實IP地址到虛擬網絡接口上
③配置ARP協議:為了讓其他系統知道這個虛擬IP地址的存在,需要配置ARP協議。他可以通過向網絡中的其他系統發送ARP廣播包來實現。當其他系統收到這個ARP廣播包時,他們會更新他們的ARP緩存表,將虛擬IP地址映射到此廣播包所在的實際系統的MAC地址上。
Linux VIP(Virtual IP)漂移原理:
是指在一個Linux集群中,當主節點(Primary)故障或不可用時,集群中的備用節點(Secondary)會接管主節點的VIP地址,以保證服務的高可用性。
漂移原理包括以下幾個步驟:
①心跳檢測:集群中的主節點和備用節點之間通過心跳檢測來確認主節點的狀態。一般使用專門的心跳設備或網絡連接來實現心跳檢測
②主節點失效檢測:當備用節點無法通過心跳檢測到主節點時,會判斷主節點已經失效。
③VIP漂移:備用節點檢測到主節點失效后,會接管主節點的VIP地址,并將其綁定到自己的網絡接口上。這樣,客戶端訪問VIP地址時就會被轉發到備用節點上。
④服務接管:備用節點接管VIP地址后,會啟動并運行主節點上的服務,以保證服務的連續性。
對于實現VIP漂移,常見的工具有keepalived,他提供了一系列用于自動檢測和控制VIP的功能,通過心跳檢測、狀態切換等機制,實現Linux集群中VIP的漂移。
3、Keepalived 安裝配置
HAProxy作為負載均衡器,Keepalived則作為兩臺負載均衡器的高可用組件,其原理就是VRRP協議。 打開IP轉發: 首先,Linux默認只會處理目標IP地址為自己的數據包,否則會丟棄。服務器作為反向代理/負載均衡器需要打開IP轉發功能,才能處理轉發目標地址非自己的數據包。
# 修改/etc/sysctl.conf配置文件
vim /etc/sysctl.conf
net.ipv4.ip_forward
=1
# 使生效
sysctl -p
cat /proc/sys/net/ipv4/ip_forward
安裝Keepalived: 通過源碼的方式進行安裝。
# 先安裝依賴
yum install gcc gcc-c++ make zlib-devel bzip2-devel openssl-devel -y
cd /usr/local/src
wget
https://www.keepalived.org/software/keepalived-2.3.0.tar.gz
tar -zxvf keepalived-2.3.0.tar.gz
# 編譯及安裝
cd /usr/local/src/keepalived-2.3.0
./configure --prefix
=/usr/local/keepalived-2.3.0
make
&& make install
將Keepalived注冊為系統服務:
# 拷貝啟動文件到/etc/rc.d/init.d目錄中
cp /usr/local/src/keepalived-2.3.0/keepalived/etc/init.d/keepalived /etc/rc.d/init.d/
# 拷貝環境變量文件
cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
# 在bash中使用keepalived命令
cp /usr/local/keepalived/sbin/keepalived? /usr/local/sbin/
接下來就可以編輯Keepalived的配置文件:
cd /usr/local/keepalived/etc/keepalived
vim keepalived.conf
# MASTER配置:
! Configuration File for keepalived
global_defs {
?? notification_email {
???? root@localhost
?? }
?? notification_email_from keepalived@localhost
?? smtp_server 127.0.0.1
?? smtp_connect_timeout 30
?? router_id HAProxy_DEVEL_1
}
vrrp_script chk_haproxy {
?? script "/usr/local/keepalived/etc/keepalived/check_haproxy.sh"? #
用shell命令檢查haproxy服務是否運行
??? interval 1??????? ??????????????????#
時間間隔為1秒檢測一次
??? weight -2?????????????????????????? #
當haproxy的服務不存在了,就把當前的權重-2
??? fall 2????????????????????????????? #
測試失敗的次數
??? rise 1????????????????????????????? #
測試成功的次數
}
vrrp_instance VI_1 {
??? state MASTER??????????? #
實例狀態,只有MASTER 和 BACKUP兩種狀態,并且需要全部大寫。搶占模式下,其中MASTER為工作狀態,BACKUP為備用狀態。
??? interface enp0s8??????? #
指定綁定虛擬IP的網絡接口
??? virtual_router_id 51??? #VRRP
組名,兩個節點的設置必須一樣,以指明各個節點屬于同一個VRRP組
??? priority 101??????????? #
主節點的優先級(1--255),備節點必須比主節點優先級低
??? advert_int 1??????????? #
組播信息發送間隔,兩個節點設置必須一樣
??? authentication {??????? #
設置驗證信息,兩個節點設置必須一樣
??????? auth_type PASS
??????? auth_pass 1111
??? }
?? track_script {
????? chk_haproxy
?? }
?? virtual_ipaddress {? #
指定虛擬IP(VIP),兩個節點設置必須一樣,虛擬IP地址池,可以有多個IP,每個IP占一行,不需要指定子網掩碼。注意:這個IP必須與我們的設定的vip保持一致
??????? 192.168.56.4
?? }
}
# BACKUP配置
! Configuration File for keepalived
global_defs {
?? notification_email {
???? root@localhost
?? }
?? notification_email_from keepalived@localhost
?? smtp_server 127.0.0.1
?? smtp_connect_timeout 30
?? router_id HAProxy_DEVEL_2
}
vrrp_script chk_haproxy
{
?? script "/usr/local/keepalived/etc/keepalived/check_haproxy.sh"? #
用shell命令檢查haproxy服務是否運行
??? interval 1??????? ??????????????????#
時間間隔為1秒檢測一次
??? weight -2?????????????????????????? #
當haproxy的服務不存在了,就把當前的權重-2
??? fall 2????????????????????????????? #
測試失敗的次數
??? rise 1????????????????????????????? #
測試成功的次數
}
vrrp_instance VI_1 {
??? state MASTER??????????? #實例狀態,只有MASTER 和 BACKUP兩種狀態,并且需要全部大寫。搶占模式下,其中MASTER為工作狀態,BACKUP為備用狀態。
??? interface enp0s8??????? #指定綁定虛擬IP的網絡接口
??? virtual_router_id 51??? #VRRP組名,兩個節點的設置必須一樣,以指明各個節點屬于同一個VRRP組
??? priority 100??????????? #主節點的優先級(1--255),備節點必須比主節點優先級低
??? advert_int 1??????????? #組播信息發送間隔,兩個節點設置必須一樣
??? authentication {??????? #設置驗證信息,兩個節點設置必須一樣
??????? auth_type PASS
??????? auth_pass 1111
??? }
?? track_script {
????? chk_haproxy
?? }
?? virtual_ipaddress {? #指定虛擬IP(VIP),兩個節點設置必須一樣,虛擬IP地址池,可以有多個IP,每個IP占一行,不需要指定子網掩碼。注意:這個IP必須與我們的設定的vip保持一致
??????? 192.168.56.4
?? }
}
vim /usr/local/keepalived/etc/keepalived/check_haproxy.sh
#!/bin/bash
A=`ps -C haproxy --no-header |wc -l`
if [ $A -eq 1 ];then
? exit 0
else
? exit 1
fi
配置文件里優先級(priority)高的那臺服務器會正為主,較低的會成為備。
以下是對部分參數的說明:
router-id
,唯一,自定義
vrrp_instance VI_1
,一個VRRP組
virtual_router_id 51
,一個組內的路由器的值要一樣
advert_int 1
,每隔一秒發一次包
priority
,優先級高的為主
virtual_ipaddress
,虛擬的IP地址,也就是我們實際發布服務的IP地址
啟動Keepalived:
systemctl
enable keepalived
systemctl start keepalived
systemctl status keepalived
正常啟動后,可以通過ip addr查看VIP地址是否已在MASTER節點的網卡顯示。
4、HAProxy 安裝配置
下載及安裝:
yum install gcc gcc-c++ make zlib-devel bzip2-devel openssl-devel -y
yum install lua -y
cd /usr/local/src
wget
https://www.haproxy.org/download/2.9/src/haproxy-2.9.9.tar.gz
tar -zxvf haproxy-2.9.9.tar.gz
# 編譯安裝
cd haproxy-2.9.9
make TARGET=linux-glibc? PREFIX=/usr/local/haproxy-2.9.9
make install PREFIX=/usr/local/haproxy-2.9.9
編寫HAProxy的配置文件:
mkdir /etc/haproxy
vim /etc/haproxy/haproxy.cfg
# 兩臺負載均衡服務器配置需要一致
global
????? maxconn 4096???????????????????? #默認最大連接數
????? pidfile /var/run/haproxy.pid???? #haproxy的pid存放路徑
????? daemon?????????????????????????? #以后臺形式運行haproxy
defaults
??????? log global
??????? mode http????????????????????? #所處理的類別 (#7層 http;4層tcp? )
??????? retries 3????????????????????? #三次連接失敗就認為是服務器不可用
??????? option abortonclose??????????? #當服務器負載很高的時候,自動結束掉當前隊列處理比較久的連接
??????? maxconn 4096?????????????????? #最大連接數
??????? timeout connect 50000????????? #連接超時
??????? timeout client 50000?????????? #客戶端超時
??????? timeout server 50000?????????? #服務器超時
??????? balance roundrobin???????????? #默認的負載均衡的方式,輪詢方式
listen web_proxy
??????? bind *:18080?????????????????? #監聽端口
??????? mode http????????????????????? #http的7層模式
??????? balance roundrobin
??????? option httpclose
??????? server web01 192.168.56.5:8080 check inter 3000 fall 3 rise 5
??????? server web02 192.168.56.6:8080 check inter 3000 fall 3 rise 5
???
listen stats
?????? bind *:8888
?????? mode http
?????? maxconn 10
?????? balance roundrobin
?????? stats refresh 5s
?????? stats uri /???????????????????? #網站健康檢測URL,用來檢測HAProxy管理的網站是否可以用,正常返回200,不正常返回503
?????? stats realm Haproxy\ Statistics
?????? stats auth admin:admin????????? #賬號密碼
defaults塊里配置的參數是默認參數,如web_proxy未配置相關參數則會繼承defaults里的。如果web_proxy里對相關參數進行了重新配置,則web_proxy里的配置會優先于defaults的配置。
啟動HAProxy
systemctl
enable haproxy
systemctl start haproxy
systemctl stauts haproxy
另外,haproxy自帶了監控頁面,非常詳細好用。已經在配置文件中配置,可以通過訪問http://192.168.56.2:8888/status查看。
5、高可用測試
1)Keepalived節點本身網絡故障倒換測試
默認的keepalived配置,MASTER節點在LB-01上,BACKUP節點在LB-02上。所以訪問VIP地址192.168.56.4都由LB-01這臺服務器轉發。
為了驗證keepalived的可用性,我們測試將LB-01這臺服務器的網卡連接給斷開,模擬網絡或服務器故障的場景,驗證VIP是否能自動切換到LB-02這個節點上。
由于實驗環境為虛擬機,把虛擬網卡連接斷開即可。在斷開之前,在物理機上發起一個長ping 192.168.56.4,觀察節點切換的情況。?ping 192.168.56.4 -t
可以看到,在斷開LB-01的網卡連接后,此時可以查看VIP 192.168.56.4已經漂移到了LB-02上。
接下來恢復LB-01的網絡,由于沒有配置搶占,所以MASTER節點仍然會在LB-02上。不配置搶占的好處是當故障節點恢復后不會導致抖動。
2)HAProxy進程故障倒換測試
除了Keepalived本身的故障外,HAProxy進程可能也會出現故障,如果keepalived無法判斷haproxy是否異常,那么就無法進行故障切換。
因此,需要增加一個探測腳本,以判斷haproxy服務是否正常。當退出碼為0,keepalived就會認為探測成功,如退出碼為1,keepalived就會認為探測失敗,就會進入FAULT狀態并把VIP給移除。
vim /usr/local/keepalived/etc/keepalived/check_haproxy.sh
#!/bin/bash
A=`ps -C haproxy --no-header |wc -l`
if [ $A -eq 1 ];then
? exit 0
else
? exit 1
fi
在keepalived配置文件中,加入以下腳本檢測
vrrp_script chk_http_port {
?? script "/usr/local/keepalived/etc/keepalived/check_haproxy.sh"? #
用shell命令檢查haproxy服務是否運行
??? interval 1??????? ??????????????????#
時間間隔為1秒檢測一次
??? weight -2?????????????????????????? #
當haproxy的服務不存在了,就把當前的權重-2
??? fall 2????????????????????????????? #
測試失敗的次數
??? rise 1????????????????????????????? #
測試成功的次數
}
vrrp_instance VI_1
{
??? track_script
{
??????? chk_haproxy
???
}
}
然后停掉haproxy的進程,模擬進程故障。?systemctl stop haproxy
?此時LB-01節點的keepalived進入FAULT狀態,VIP被移除,備機接管了VIP。
3)后端服務器故障倒換測試
接下來模擬一下當web01故障能否重新把請求分發到web02上。 直接通過停止web01的運行,再通過瀏覽器發起請求,可以看到已經切換到web02上了。
通過登錄HAProxy自帶的監控頁面,可以看到健康檢查web01已經down掉,所以負載均衡直接把web01剔除了。
6、小結
通過實驗可以基本驗證到基于HAProxy的七層負載均衡的功能,以及通過Keepalived搭建的高可用集群,還是非常好用的。
另外一個問題就是,通過keepalived實現的高可用,MASTER節點只能在一臺服務器上,即同時只能一個節點工作,如果需要橫向擴展,需要另外一種實現高可用的方案:比如說不采用Keepalived的方式,在HAPorxy前面再部署LVS或者硬件F5,用這種L4+L7的架構來實現L7負載均衡的橫向擴展和高可用。