一、Keepalived簡介
1、什么是keepalived?
Keepalived是用C語言編寫的路由軟件。該項目的主要目標是為Linux系統和基於Linux的基礎結構提供負載均衡和高可用性的簡單而強大的功能。
負載平衡框架依賴於提供第4層負載平衡的著名且廣泛使用的Linux虛擬服務器(IPVS)內核模塊。Keepalived實現了一組VIP功能,以根據其運行狀況動態,自適應地維護和管理負載平衡的服務器池。
VRRP實現了高可用性 協議,VRRP是路由器故障轉移的基礎。
Keepalived 是一個基於 VRRP 協議來實現的服務高可用方案,可以利用其來避免 IP 單點故障,一般與其它負載均衡技術(如 LVS 、HAProxy 、Nginx)一起工作來達到集群的高可用。
2、keepalived原理介紹
VRRP (Virtual Router Redundancy Protocol,虛擬路由器冗余協議): 在現實的網絡環境中,主機之間的通信都是通過配置靜態路由(默認網關)完成的, 而主機之間的路由器一旦出現故障,通信就會失敗,
因此,在這種通信模式中,路由器就成了一個單點瓶頸,為了解決這個問題,就引入了 VRRP 協議。
VRRP 可以將兩台或多台物理路由器設備虛擬成一個虛擬路由器,每個虛擬路由器都有一個唯一標識,稱為 VRID,一個 VRID 與一組 IP 地址構成了一個虛擬路由器。
這個虛擬路由器通過虛擬IP(一個或多個)對外提供服務。而在虛擬路由器內部,同一時間只有一台物理路由器對外提供服務,這台物理路由器被稱為主路由器(處於 MASTER 角色)。
而其他物理路由器不擁有對外的虛擬 IP,也不提供對外網絡功能,僅僅接收 MASTER 的 VRRP 狀態通告信息,這些路由器被統稱為備份路由器(處於 BACKUP 角色)。
當主路由器失效時,處於 BACKUP 角色的備份路由器將重新進行選舉,產生一個新的主路由器進入 MASTER 角色繼續提供對外服務,整個切換過程對用戶來說完全透明。
3、keepalive使用場景
-
LVS和keepalived可以說是天然的集成, 因為LVS已經集成到linux內核系統中,LVS+keepalived的集成,,只需要在keepalived的配置文件中增加配置就可以;
-
keepalive提供了主從切換的功能, 主從之間有心跳檢測, 如果發現主從掛掉, keepalived會自動進行主從的切換;
-
單體架構中, 我們最常使用lvs+keepalived的功能。
4、keepalive運行原理
keepalived 通過選舉(看服務器設置的權重)挑選出一台熱備服務器做 MASTER 機器,MASTER 機器會被分配到一個指定的虛擬 ip,即VIP,外部程序可通過該 VIP 訪問這台服務器。
如果這台服務器出現故障(斷網,重啟,或者本機器上的 keepalived crash 等),keepalived 會從其他的備份機器上重選(還是看服務器設置的權重)一台機器做 MASTER 並分配同樣的虛擬 IP,充當前一台 MASTER 的角色。
權重越高,備用機器被拉起來的占比就越大,一般的主備就可以滿足我們的需求。
5、keepalive選舉策略
選舉策略是根據 VRRP 協議,完全按照權重大小,權重最大的是 MASTER 機器,下面幾種情況會觸發選舉:
-
keepalived 啟動的時候
-
master 服務器出現故障(斷網,重啟,或者本機器上的 keepalived crash 等,而本機器上其他應用程序 crash 不算)
-
有新的備份服務器加入且權重最大
6、keepalive狀態監控和檢測
Keepalived 工作在 TCP/IP 參考模型的第三、第四和第五層,也就是網絡層、傳輸層和應用層。根據 TCP/IP 參考模型各層所能實現的功能,Keepalived運行機制如下:
- 在網絡層,運行着四個重要的協議:互連網協議 IP、互連網控制報文協議 ICMP、地址轉換協議 ARP 以及反向地址轉換協議 RARP。
Keepalived 在網絡層采 用的最常見的工作方式是通過ICMP協議向服務器集群中的每個節點發送一個 ICMP 的數據包(類似於 ping 實現的功能),
如果某個節點沒有返回響應數據包,那么 就認為此節點發生了故障,Keepalived 將報告此節點失效,並從服務器集群中剔除故障節點。
-
在傳輸層,提供了兩個主要的協議:傳輸控制協議 TCP 和用戶數據協議 UDP。傳輸控制協議 TCP 可以提供可靠的數據傳輸服務,IP 地址和端口,代表一個 TCP 連接的 一個連接端。
要獲得 TCP 服務,須在發送機的一個端口上和接收機的一個端口上建立連接,而 Keepalived 在傳輸層就是利用 TCP 協議的端口連接和掃描技術來 判斷集群節點是否正常的。
比如,對於常見的 Web 服務默認的 80 端口、SSH 服務默認的 22 端口等,Keepalived 一旦在傳輸層探測到這些端口沒有響應數據返回, 就認為這些端口發生異常,然后強制將此端口對應的節點從服務器集群組中移除。
-
在應用層,可以運行 FTP、TELNET、SMTP、DNS 等各種不同類型的高層協議,Keepalived 的運行方式也更加全面化和復雜化,用戶可以通過自定義 Keepalived 的工作方式,
例如用戶可以通過編寫程序來運行 Keepalived,而 Keepalived 將根據用戶的設定檢測各種程序或服務是否允許正常,如果 Keepalived 的檢測結果 與用戶設定不一致時,Keepalived 將把對應的服務從服務器中移除。
二、LVS簡介
1、什么是LVS?
LVS 是一個開源的軟件,可以實現 LINUX 平台下的簡單負載均衡。 LVS 是 Linux Virtual Server 的縮寫,意思是 Linux 虛擬服務器。
LVS 已經集成到Linux內核系統中,ipvsadm 是 LVS 的命令行管理工具。目前有三種 IP 負載均衡技術( VS/NAT 、 VS/TUN 和 VS/DR );八種調度算法( rr,wrr,lc,wlc,lblc,lblcr,dh,sh )。
2、LVS 的組成
-
負載均衡層(load balance): 位於整個集群的最前端,由一台或多台負載調度器(Director Server)組成。 其上安裝了 LVS 的核心模塊 IPVS,負責把用戶請求分發給服務器群組層的應用服務器(Real Server),
同時還有監控模塊(Ldirectord),用於監測各個 Real Server 服務的健康情況,當 real server 不可用時, 將其從路由表中剔除,待主機恢復后重新加入。
-
服務器群組(Server Array): 由一組實際運行應用服務的主機組成。每個 Real Server 之間通過高速 LAN 相連。
-
數據共享存儲(Shared Storage): 為所有 Real Server 提供共享存儲空間和內容一致性的存儲區域,一般由磁盤陣列設備組成。
3、IPVS 簡單介紹
IPVS: 安裝於 Director Server 上,並在 Director Server 上虛擬出一個 VIP(Virtual IP)。 用戶的訪問請求通過 VIP 到達負載調度器,然后由負載調度器從 Real Server 列表中選取一個服務節點響應用戶的請求。
IPVS 轉發請求的 3 種方式:
-
VS/NAT(Virtual Server via Network Address Translation): 當用戶請求到達調度器時,調度器將請求報文的目標地址和端口地址改寫 成選定的 Real Server 的相應地址和端口,並將請求報文發送給選定的 Real Server。當 Real Server 返回數據時,還需要再次將報文的源地址和端口更改為 VIP 和相應的端口后,再發送給用戶。 因為請求和響應報文都需要經過 Director Server 重寫,所以當高並發時,調度器的處理能力將會成為瓶頸。
-
VS/TUN (Virtual Server via IP Tunneling): 也就是 IP 隧道技術實現虛擬服務器。調度器采用 IP 隧道技術將用戶請求轉發到某個 Real Server,而這個 Real Server 將直接響應用戶的請求,不再經過前端調度器,此外,對 Real Server 的地域位置沒有要求,可以和 Director Server 位於同一個網段,也可以是獨立的一個網絡。由於在 TUN 方式中,調度器將只處理用戶的報文請求,集群系統的吞吐量大大提高。
-
VS/DR(Virtual Server via Direct Routing): 也就是用直接路由技術實現虛擬服務器。VS/DR 通過改寫請求報文的 MAC 地址,將請求發送到 Real Server,而 Real Server 將響應直接返回給客戶,免去了 VS/TUN 中的 IP 隧道開銷。這種方式是三種負載調度機制中性能最高、最好的,但是必須要求 Director Server 與 Real Server 都有一塊網卡連在同一物理網段上。
IPVS 的負載調度算法:
上面我們談到,負載調度器是根據各個服務器的負載情況,動態地選擇一台 Real Server 響應用戶請求,那么動態選擇是如何實現呢,其實也就是我們這里要說的負載調度算法,
根據不同的網絡服務需求和服務器配置,IPVS 實現了如下八種負載調度算法,這里我們詳細講述最常用的四種調度算法,剩余的四種調度算法請參考其它資料。
-
輪詢調度(Round Robin)
“輪詢”調度也叫1:1調度,調度器通過“輪詢”調度算法將外部用戶請求按順序1:1的分配到集群中的每個 Real Server 上,這種算法平等地對待每一台 Real Server, 而不管服務器上實際的負載狀況和連接狀態。
-
加權輪詢調度(Weighted Round Robin)
“加權輪詢”調度算法是根據 Real Server 的不同處理能力來調度訪問請求。可以對每台 Real Server 設置不同的調度權值,對於性能相對較好的 Real Server 可以設置較高的權值,而對於處理能力較弱的 Real Server,可以設置較低的權值,這樣保證了處理能力強的服務器處理更多的訪問流量,充分合理的利用了服務器資源。 同時,調度器還可以自動查詢 Real Server 的負載情況,並動態地調整其權值。
-
最少鏈接調度(Least Connections)
“最少連接”調度算法動態地將網絡請求調度到已建立的鏈接數最少的服務器上。如果集群系統的真實服務器具有相近的系統性能,采用“最小連接”調度算法可以較好地均衡負載。
-
加權最少鏈接調度(Weighted Least Connections)
“加權最少鏈接調度”,每個服務節點可以用相應的權值表示其處理能力,而系統管理員可以動態的設置相應的權值,缺省權值為1,加權最小連接調度在分配新連接請求時盡可能使服務節點的已建立連接數和其權值成正比。
-
其它四種調度算法分別為:
- 基於局部性的最少鏈接(Locality-Based Least Connections)
- 帶復制的基於局部性最少鏈接(Locality-Based Least Connections with Replication)
- 目標地址散列(Destination Hashing)
- 源地址散列(Source Hashing)
三、Keepalived+LVS搭建高可用負載均衡
測試環境
- 軟件環境:CentOS7、Keepalived1.3.5、ipvsadm1.27
- Keepalived+Lvs(MASTER):172.17.13.120
- Keepalived+Lvs(BACKUP):172.17.13.123
- Real Server1:172.17.13.142:80 Nginx
- Real Server2:172.17.13.173:80 Nginx
- VIP:172.17.13.252
架構圖
詳細配置流程
- 安裝相關軟件
yum install ipvsadm keepalived -y
- 配置 Keepalived+Lvs
1、Keepalived+Lvs(MASTER)節點
vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived global_defs{ notification_email{ ******@163.com #報警接收人,多個寫多行(需要開啟本機的sendmail服務) } notification_email_from ******@163.com #報警發件人 smtp_server smtp.163.com #發送email時使用的smtp服務器地址 smtp_connect_timeout 30 #smtp超時時間 router_id LVS1 #表示運行keepalived服務器的一個標識,發郵件時顯示在郵件主題的信息 }
# Keepalived的VRRR 實例配置 vrrp_instance VI_1 { state MASTER # 如果使用主/備,另外一台機器需要設置為BACKUP interface enp1s0 # 當前 IP 對應的網絡接口,通過 ifconfig 查詢 virtual_router_id 62 # 虛擬路由 ID(0-255),在一個 VRRP 實例中主備服務器 ID 必須一樣(主備的虛擬機路由ID必須一致) priority 100 # 優先級值設定:MASTER 要比 BACKUP 的值大 advert_int 1 # VRRP Multicast廣播周期秒數:單位秒,主備要一致 authentication { # 認證機制,主從節點保持一致即可 auth_type PASS auth_pass 1111 } virtual_ipaddress { 172.17.13.252 # VIP,可配置多個(換行填寫) } } # 虛擬服務器(LVS)的配置,主要實現LVS的ip包轉發功能 virtual_server 172.17.13.252 80 { delay_loop 3 # 設置健康狀態檢查時間(每隔3秒查詢Real Server狀態) lb_algo rr # 調度算法,這里用了 rr 輪詢算法 lb_kind DR # 轉發請求方式,這里用了 Direct Route 模式 persistence_timeout 50 # 持久連接超時時間(會話保持時間),這段時間內,同一ip發起的請求將被轉發到同一個Real Server protocol TCP # 用TCP協議檢查Real Server狀態
# 第一台Real Server物理環境 real_server 172.17.13.173 80 { weight 1 # 權重 TCP_CHECK { # 健康檢查 connect_timeout 10 # 無響應超時時間,單位是秒 retry 3 # 重試次數(舊版本為 nb_get_retry ) delay_before_retry 3 # 重試間隔 connect_port 80 # 端口 } }
# 第二台Real Server物理環境 real_server 172.17.13.142 80 { weight 1 TCP_CHECK { connect_timeout 10 retry 3 delay_before_retry 3 connect_port 80 } } }
注:健康檢查有多種檢查方式,常見的有,HTTP_GET,SSL_GET,TCP_CHECK,SMTP_CHECK,MISC_CHECK.
2、Keepalived+Lvs(BACKUP)節點
基本都和主一樣,只需要修改幾處:
state BACKUP priority 99 router_id LVS2
3、在兩台 Keepalived+Lvs 服務器上開啟路由轉發功能
# vim/etc/sysctl.conf net.ipv4.ip_forward= 1 # sysctl-p
4、配置完成后,分別重啟 Keepalived 服務
systemctl restart keepalived
5、此時查看路由配置
ipvsadm
IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP localhost:http wrr persistent 50 -> localhost:http Route 1 0 0 -> localhost:http Route 1 0 0
- 配置 Real Server
1、在 Real Server 2台服務器的網卡上配置 lo 為 VIP。配置腳本如下:
#!/bin/bash SNS_VIP=172.17.13.252 case "$1" in start) ifconfig lo:0 $SNS_VIP netmask 255.255.255.255 broadcast $SNS_VIP #配置虛擬IP地址(臨時添加) /sbin/route add -host $SNS_VIP dev lo:0 #配置路由(臨時添加) echo "0" > /proc/sys/net/ipv4/ip_forward echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore #修改內核參數 echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce #修改內核參數 echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore #修改內核參數 echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce #修改內核參數 sysctl -p >/dev/null 2>&1 echo "RealServer Start OK" ;; stop) ifconfig lo:0 down route del $SNS_VIP >/dev/null 2>&1 echo "1" > /proc/sys/net/ipv4/ip_forward echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignore echo "0" >/proc/sys/net/ipv4/conf/lo/arp_announce echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce echo "RealServer Stoped" ;; *) echo "Usage: $0 {start|stop}" exit 1 esac exit 0
2、本地創建完后,並執行
[root@localhost ~]# chmod a+x lvs-web.sh
[root@localhost ~]# ./lvs-web.sh start
配置完成后,通過 VIP 就可以訪問到 Real Server 上的服務了。
測試驗證
配置完雙機熱備后,我們就可以測試下,節點發生故障后以及 LB 切換失敗后,能否保證服務的 HA。
1、在 LB 的主節點上輸入 ip a
,可以看到 VIP 目前已經正確配置在網卡上。
2、輸入 watch ipvsadm -Ln --stats
可實時看到負載均衡的結果,正常。
3、接下面我們試着訪問一下 VIP。
while true ; do curl 172.17.13.252; sleep 1;done
看到服務可正常輪詢:
4、此時手動停止一個 RS,再次訪問 VIP,LVS 會自動剔除無法訪問的服務,重啟后,服務會被自動添加。
5、如果此時,手動停止 MASTER 上的 Keepalived,模擬 LB MASTER 節點掛了,VIP 會自動飄到 BACKUP LB 上。
6、此時,如果重啟 MASTER 后,VIP 又會飄回去。MASTER 的優先級高於 BACKUP,從而實現 HA。
命令說明
查看日志信息:
tail-f /var/log/messages
查看 LVS 當前設置:
watch ipvsadm -Ln
查看轉發情況:
watch ipvsadm -Lnc
清除路由設置:
ipvsadm -C
引用: