關註上方 浩道Linux ,回復 資料 ,即可獲取海量 L inux 、 Python 、 網路通訊、網路安全 等學習資料!
前言
大家好,這裏是 浩道Linux ,主要給大家分享 L inux 、 P ython 、 網路通訊、網路安全等 相關的IT知識平台。
今天浩道跟大家分享LVS高可用負載均衡方案相關的硬核幹貨,作為一名Linux運維人員,建議大家都將此方案玩一遍!
文章來源:https://www.cnblogs.com/Sinte-Beuve/p/13392747.html
背景
在業務量達到一定量的時候,往往單機的服務是會出現瓶頸的。此時最常見的方式就是透過負載均衡來進行橫向擴充套件。其中我們最常用的軟體就是 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 的軟體,可根據業務和兩者的異同進行選擇。
更多精彩
關註公眾號 「 浩道Linux 」
浩道Linux ,專註於 Linux系統 的相關知識、 網路通訊 、 網路安全 、 Python相關 知識以及涵蓋IT行業相關技能的學習, 理論與實戰結合,真正讓你在學習工作中真正去用到所學。同時也會分享一些面試經驗,助你找到高薪offer,讓我們一起去學習,一起去進步,一起去漲薪!期待您的加入~~~ 關註回復「資料」可 免費獲取學習資料 (含有電子書籍、視訊等)。
喜歡的話,記得 點「贊」 和 「在看」 哦