前言
在業務量達到一定量的時候,往往單機的服務是會出現瓶頸的。此時最常見的方式就是通過負載均衡來進行橫向擴充套件。其中我們最常用的軟體就是 Nginx。通過其反向代理的能力能夠輕鬆實現負載均衡,當有服務出現異常,也能夠自動剔除。但是負載均衡服務自身也可能出現故障,因此需要引入其他的軟體來實現負載均衡服務的高可用。本文就介紹了一種基於 LVS+Keepalived 的方式,來實現高可用 Web 叢集。
LVS 與 Keepalived
LVS 是一種預裝在 Linux 系統中,基於四層、具有強大效能的反向代理伺服器。ipvsadm 是 LVS 的命令列管理工具。
LVS 特點是:
- 首先它是基於 4 層的網路協議的,抗負載能力強,對於伺服器的硬體要求除了網路卡外,其他沒有太多要求;
- 配置性比較低,這是一個缺點也是一個優點,因為沒有可太多配置的東西,大大減少了人為出錯的機率;
- 應用範圍比較廣,不僅僅對 web 服務做負載均衡,還可以對其他應用(mysql)做負載均衡;
- LVS 架構中存在一個虛擬 IP 的概念,需要向 IDC 多申請一個 IP 來做虛擬 IP。
Keepalived 是一個基於 VRRP 協議來實現的服務高可用方案,可以利用其來避免 IP 單點故障,一般與其它負載均衡技術(如 LVS 、HAProxy 、Nginx)一起工作來達到叢集的高可用。Keepalived 是 LVS 的擴充套件專案, 因此它們之間具備良好的相容性,可直接通過 Keepalived 的配置檔案來配置 LVS。
LVS 的工作原理可見參考文獻
關於 LVS 和 Keepalived 詳細的結構和原理,以及 LVS 和我們常用的 LB 軟體 Nginx 的異同,可以閱讀末尾提供的參考文獻。接下來將介紹如何部署一個高可用的負載均衡叢集。
相關術語
- LB (Load Balancer 負載均衡)
- HA (High Available 高可用)
- Failover (失敗切換)
- Cluster (叢集)
- LVS (Linux Virtual Server Linux 虛擬伺服器)
- DS (Director Server),指的是前端負載均衡器節點
- RS (Real Server),後端真實的工作伺服器
- VIP (Virtual IP),虛擬的 IP 地址,向外部直接面向使用者請求,作為使用者請求的目標的 IP 地址
- DIP (Director IP),主要用於和內部主機通訊的 IP 地址
- RIP (Real Server IP),後端伺服器的 IP 地址
- CIP (Client IP),訪問客戶端的 IP 地址
測試環境
軟體環境:CentOS7、Keepalived1.3.5、ipvsadm1.27
DS1(MASTER):172.17.13.120
DS1(BACKUP):172.17.13.123
RS1:172.17.13.142:80 Nginx
RS1:172.17.13.173:80 Nginx
VIP:172.17.13.252
|
+----------------+-----------------+
| |
172.17.13.120|---- VIP:172.17.13.252 ----|172.17.13.123
+-------+--------+ +--------+-------+
| DS1 | | DS2 |
| LVS+Keepalived | | LVS+Keepalived |
+-------+--------+ +--------+-------+
| |
+----------------+-----------------+
|
+------------+ | +------------+
| RS1 |172.17.13.142 | 172.17.13.173| RS2 |
| Web Server +--------------+---------------+ Web Server |
+------------+ +------------+
叢集的架構圖如上圖所示。DS1、DS2 為兩個 LB 節點,RS1、RS2 為兩個真實的服務節點,通過一個虛擬的 IP 地址對外提供服務。
最終我們要達到的目標為:
- Client 通過 VIP 訪問服務能夠將請求根據配置的規則進行分發(LB)
- 當 MATSER 的 LB 節點故障時,自動切換到 BACKUP 的 LB 節點上,保證服務正常訪問;MASTER 恢復後,再次作為主 LB 負載節點
- 當某個 RS 節點故障時,自動剔除該節點;恢復後,再次加入叢集
詳細配置流程
安裝相關軟體
[root@localhost ~]# yum install ipvsadm keepalived -y
配置 Keepalived
- DS1(MASTER) 節點
[root@localhost ~]# vi /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id LVS_DEVEL
}
vrrp_instance VI_1 {
state MASTER # 兩個 DS,一個為 MASTER 一個為 BACKUP
interface enp1s0 # 當前 IP 對應的網路介面,通過 ifconfig 查詢
virtual_router_id 62 # 虛擬路由 ID(0-255),在一個 VRRP 例項中主備伺服器 ID 必須一樣
priority 200 # 優先順序值設定:MASTER 要比 BACKUP 的值大
advert_int 1 # 通告時間間隔:單位秒,主備要一致
authentication { # 認證機制,主從節點保持一致即可
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.17.13.252 # VIP,可配置多個
}
}
# LB 配置
virtual_server 172.17.13.252 80 {
delay_loop 3 # 設定健康狀態檢查時間
lb_algo rr # 排程演算法,這裡用了 rr 輪詢演算法
lb_kind DR # 這裡測試用了 Direct Route 模式
persistence_timeout 50 # 持久連線超時時間
protocol TCP
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 172.17.13.142 80 {
weight 1
TCP_CHECK {
connect_timeout 10
retry 3
delay_before_retry 3
connect_port 80
}
}
}
- DS2(BACKUP) 節點
複製之前的配置檔案,修改 vrrp_instance VI_1
中的 state
為 BACKUP
。
配置完成後,分別重啟 Keepalived 服務。
[root@localhost ~]# systemctl restart keepalived
配置 RS
RS 配置主要分兩部分,一部分是 web 服務,另一部分是網路轉發配置。
web 服務部署不多展開了,根據實際情況來,可以是 Tomcat 也可以是 Nginx,只要能通過 ip:port 能訪問到即可。
在網路轉發配置上,LVS 支援多種通訊模型(NAT、DR、TUN),本文采用 DR 模型來進行通訊,大致的流程如下圖所示。請求資料包從到達 LB 後,LVS 會將這個資料包的 MAC 地址改成輪詢到的 RS 的 MAC 地址,並丟給交換機;RS 收到後進行處理並從網路卡的 lo 埠傳送出去,響應報文到達交換機後直接轉發給 Client。
因此,我們需要在 RS 的網路卡上配置 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
/sbin/route add -host $SNS_VIP dev lo:0
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 "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
本地建立完後,並執行。
[root@localhost ~]# chmod a+x lvs-web.sh
[root@localhost ~]# ./lvs-web.sh start
配置完成後,通過 VIP 就可以訪問到 RS 上的服務了。
HA 測試
配置完雙機熱備後,我們就可以測試下,節點發生故障後以及 LB 切換失敗後,能否保證服務的 HA。
在 LB 的主節點上輸入 ip a
,可以看到 VIP 目前已經正確配置在網路卡上。
輸入 watch ipvsadm -Ln --stats
可實時看到負載均衡的結果,正常。
接下面我們試著訪問一下 VIP。
[root@localhost ~]# while true ; do curl 172.17.13.252; sleep 1;done
看到服務可正常輪詢。
此時手動停止一個 RS,再次訪問 VIP,LVS 會自動剔除無法訪問的服務,重啟後,服務會被自動新增。
如果此時,手動停止 MASTER 上的 Keepalived,模擬 LB MASTER 節點掛了,VIP 會自動飄到 BACKUP LB 上。
此時,如果重啟 MASTER 後,VIP 又會飄回去。MASTER 的優先順序高於 BACKUP,從而實現 HA。
總結
本文介紹了使用 LVS+Keepalived 來實現高可用負載均衡,這能使得我們的服務能夠更加的穩定。Keepalived 預設是執行在 LVS 之上的,有較好的相容性,當然我們也可以使使用者 Nginx 作為 LB 的軟體,可根據業務和兩者的異同進行選擇。