前言
在業(yè)務(wù)量達(dá)到一定量的時候,往往單機(jī)的服務(wù)是會出現(xiàn)瓶頸的。此時最常見的方式就是通過負(fù)載均衡來進(jìn)行橫向擴(kuò)展。其中我們最常用的軟件就是 Nginx。通過其反向代理的能力能夠輕松實(shí)現(xiàn)負(fù)載均衡,當(dāng)有服務(wù)出現(xiàn)異常,也能夠自動剔除。但是負(fù)載均衡服務(wù)自身也可能出現(xiàn)故障,因此需要引入其他的軟件來實(shí)現(xiàn)負(fù)載均衡服務(wù)的高可用。本文就介紹了一種基于 LVS+Keepalived 的方式,來實(shí)現(xiàn)高可用 Web 集群。
LVS 與 Keepalived
LVS 是一種預(yù)裝在 Linux 系統(tǒng)中,基于四層、具有強(qiáng)大性能的反向代理服務(wù)器。ipvsadm 是 LVS 的命令行管理工具。
LVS 特點(diǎn)是:
首先它是基于 4 層的網(wǎng)絡(luò)協(xié)議的,抗負(fù)載能力強(qiáng),對于服務(wù)器的硬件要求除了網(wǎng)卡外,其他沒有太多要求;
配置性比較低,這是一個缺點(diǎn)也是一個優(yōu)點(diǎn),因?yàn)闆]有可太多配置的東西,大大減少了人為出錯的幾率;
應(yīng)用范圍比較廣,不僅僅對 web 服務(wù)做負(fù)載均衡,還可以對其他應(yīng)用(mysql)做負(fù)載均衡;
LVS 架構(gòu)中存在一個虛擬 IP 的概念,需要向 IDC 多申請一個 IP 來做虛擬 IP。
Keepalived 是一個基于 VRRP 協(xié)議來實(shí)現(xiàn)的服務(wù)高可用方案,可以利用其來避免 IP 單點(diǎn)故障,一般與其它負(fù)載均衡技術(shù)(如 LVS 、HAProxy 、Nginx)一起工作來達(dá)到集群的高可用。Keepalived 是 LVS 的擴(kuò)展項(xiàng)目, 因此它們之間具備良好的兼容性,可直接通過 Keepalived 的配置文件來配置 LVS。
LVS 的工作原理可見參考文獻(xiàn)
關(guān)于 LVS 和 Keepalived 詳細(xì)的結(jié)構(gòu)和原理,以及 LVS 和我們常用的 LB 軟件 Nginx 的異同,可以閱讀末尾提供的參考文獻(xiàn)。接下來將介紹如何部署一個高可用的負(fù)載均衡集群。
相關(guān)術(shù)語
LB (Load Balancer 負(fù)載均衡)
HA (High Available 高可用)
Failover (失敗切換)
Cluster (集群)
LVS (Linux Virtual Server Linux 虛擬服務(wù)器)
DS (Director Server),指的是前端負(fù)載均衡器節(jié)點(diǎn)
RS (Real Server),后端真實(shí)的工作服務(wù)器
VIP (Virtual IP),虛擬的 IP 地址,向外部直接面向用戶請求,作為用戶請求的目標(biāo)的 IP 地址
DIP (Director IP),主要用于和內(nèi)部主機(jī)通訊的 IP 地址
RIP (Real Server IP),后端服務(wù)器的 IP 地址
CIP (Client IP),訪問客戶端的 IP 地址
測試環(huán)境
軟件環(huán)境: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 | +------------+ +------------+
集群的架構(gòu)圖如上圖所示。DS1、DS2 為兩個 LB 節(jié)點(diǎn),RS1、RS2 為兩個真實(shí)的服務(wù)節(jié)點(diǎn),通過一個虛擬的 IP 地址對外提供服務(wù)。
最終我們要達(dá)到的目標(biāo)為:
Client 通過 VIP 訪問服務(wù)能夠?qū)⒄埱蟾鶕?jù)配置的規(guī)則進(jìn)行分發(fā)(LB)
當(dāng) MATSER 的 LB 節(jié)點(diǎn)故障時,自動切換到 BACKUP 的 LB 節(jié)點(diǎn)上,保證服務(wù)正常訪問;MASTER 恢復(fù)后,再次作為主 LB 負(fù)載節(jié)點(diǎn)
當(dāng)某個 RS 節(jié)點(diǎn)故障時,自動剔除該節(jié)點(diǎn);恢復(fù)后,再次加入集群
詳細(xì)配置流程
安裝相關(guān)軟件
[root@localhost ~]# yum install ipvsadm keepalived -y
配置 Keepalived
DS1(MASTER) 節(jié)點(diǎn)
[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 # 當(dāng)前 IP 對應(yīng)的網(wǎng)絡(luò)接口,通過 ifconfig 查詢 virtual_router_id 62 # 虛擬路由 ID(0-255),在一個 VRRP 實(shí)例中主備服務(wù)器 ID 必須一樣 priority 200 # 優(yōu)先級值設(shè)定:MASTER 要比 BACKUP 的值大 advert_int 1 # 通告時間間隔:單位秒,主備要一致 authentication { # 認(rèn)證機(jī)制,主從節(jié)點(diǎn)保持一致即可 auth_type PASS auth_pass 1111 } virtual_ipaddress { 172.17.13.252 # VIP,可配置多個 } } # LB 配置 virtual_server 172.17.13.252 80 { delay_loop 3 # 設(shè)置健康狀態(tài)檢查時間 lb_algo rr # 調(diào)度算法,這里用了 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) 節(jié)點(diǎn)
復(fù)制之前的配置文件,修改vrrp_instance VI_1中的state為BACKUP。
配置完成后,分別重啟 Keepalived 服務(wù)。
[root@localhost ~]# systemctl restart keepalived
配置 RS
RS 配置主要分兩部分,一部分是 web 服務(wù),另一部分是網(wǎng)絡(luò)轉(zhuǎn)發(fā)配置。
web 服務(wù)部署不多展開了,根據(jù)實(shí)際情況來,可以是 Tomcat 也可以是 Nginx,只要能通過 ip:port 能訪問到即可。
在網(wǎng)絡(luò)轉(zhuǎn)發(fā)配置上,LVS 支持多種通信模型(NAT、DR、TUN),本文采用 DR 模型來進(jìn)行通信,大致的流程如下圖所示。請求數(shù)據(jù)包從到達(dá) LB 后,LVS 會將這個數(shù)據(jù)包的 MAC 地址改成輪詢到的 RS 的 MAC 地址,并丟給交換機(jī);RS 收到后進(jìn)行處理并從網(wǎng)卡的 lo 端口發(fā)送出去,響應(yīng)報文到達(dá)交換機(jī)后直接轉(zhuǎn)發(fā)給 Client。
因此,我們需要在 RS 的網(wǎng)卡上配置 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
本地創(chuàng)建完后,并執(zhí)行。
[root@localhost ~]# chmod a+x lvs-web.sh [root@localhost ~]# ./lvs-web.sh start
配置完成后,通過 VIP 就可以訪問到 RS 上的服務(wù)了。
HA 測試
配置完雙機(jī)熱備后,我們就可以測試下,節(jié)點(diǎn)發(fā)生故障后以及 LB 切換失敗后,能否保證服務(wù)的 HA。
在 LB 的主節(jié)點(diǎn)上輸入ip a,可以看到 VIP 目前已經(jīng)正確配置在網(wǎng)卡上。
輸入watch ipvsadm -Ln --stats可實(shí)時看到負(fù)載均衡的結(jié)果,正常。
接下面我們試著訪問一下 VIP。
[root@localhost ~]# while true ; do curl 172.17.13.252; sleep 1;done
看到服務(wù)可正常輪詢。
此時手動停止一個 RS,再次訪問 VIP,LVS 會自動剔除無法訪問的服務(wù),重啟后,服務(wù)會被自動添加。
如果此時,手動停止 MASTER 上的 Keepalived,模擬 LB MASTER 節(jié)點(diǎn)掛了,VIP 會自動飄到 BACKUP LB 上。
此時,如果重啟 MASTER 后,VIP 又會飄回去。MASTER 的優(yōu)先級高于 BACKUP,從而實(shí)現(xiàn) HA。
總結(jié)
本文介紹了使用 LVS+Keepalived 來實(shí)現(xiàn)高可用負(fù)載均衡,這能使得我們的服務(wù)能夠更加的穩(wěn)定。Keepalived 默認(rèn)是運(yùn)行在 LVS 之上的,有較好的兼容性,當(dāng)然我們也可以使用戶 Nginx 作為 LB 的軟件,可根據(jù)業(yè)務(wù)和兩者的異同進(jìn)行選擇。
審核編輯:黃飛
-
Web
+關(guān)注
關(guān)注
2文章
1262瀏覽量
69440 -
服務(wù)器
+關(guān)注
關(guān)注
12文章
9123瀏覽量
85322 -
網(wǎng)絡(luò)協(xié)議
+關(guān)注
關(guān)注
3文章
267瀏覽量
21534 -
數(shù)據(jù)包
+關(guān)注
關(guān)注
0文章
260瀏覽量
24385 -
負(fù)載均衡
+關(guān)注
關(guān)注
0文章
110瀏覽量
12364
原文標(biāo)題:你必須會的LVS高可用負(fù)載均衡方案
文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運(yùn)維】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論