文章目錄
- 一、lvs概述
-
- (一)LVS簡介
- (二)LVS基本原理
- (三)LVS工作模式
-
- 1. NAT模式
- 2. DR模式
- 3. FULLNAT模式
- 4. Tunnel模式
- (四)LVS的排程算法
- 二、用法
-
-
- (一)lvs依賴的子產品
- (二)ipvsadm用法
-
- 三、lvs執行個體
一、lvs概述
(一)LVS簡介
LVS,是Linux Virtual Server的簡稱,也就是Linux虛拟伺服器, 是一個由章文嵩博士發起的自由軟體項目。LVS由使用者空間的ipvsadm和核心空間的IPVS組成,ipvsadm用來定義規則,IPVS利用ipvsadm定義的規則工作。現在LVS已經是 Linux标準核心的一部分,在Linux2.4核心以前,使用LVS時必須要重新編譯核心以支援LVS功能子產品,但是從Linux2.4核心以後,已經完全内置了LVS的各個功能子產品,無需給核心打任何更新檔,可以直接使用LVS提供的各種功能。
LVS特點
通過LVS提供的負載均衡技術和Linux作業系統實作一個高性能、高可用的伺服器群集,它具有良好可靠性、可擴充性和可操作性。進而以低廉的成本實作最優的服務性能。LVS的主要特點有以下幾個方面:
- 高并發連接配接:LVS基于核心網絡層面工作,有超強的承載能力和并發處理能力。單台LVS負載均衡器,可支援上萬并發連接配接。穩定性強:是工作在網絡4層之上僅作分發之用,這個特點也決定了它在負載均衡軟體裡的性能最強,穩定性最好,對記憶體和cpu資源消耗極低。
- 成本低廉:硬體負載均衡器少則十幾萬,多則幾十萬上百萬,LVS隻需一台伺服器和就能免費部署使用,成本效益極高。
- 配置簡單:LVS配置非常簡單,僅需幾行指令即可完成配置,也可寫成腳本進行管理。
- 支援多種算法:支援多種論調算法,可根據業務場景靈活調配進行使用
- 支援多種工作模型:可根據業務場景,使用不同的工作模式來解決生産環境請求處理問題。
- 應用範圍廣:因為LVS工作在4層,是以它幾乎可以對所有應用做負載均衡,包括http、資料庫、DNS、ftp服務等等
- 缺點:工作在4層,不支援7層規則修改,機制過于龐大,不适合小規模應用。
LVS常見術語
名稱 | 解釋 |
---|---|
ipvsadm | 使用者空間的指令行工具,用于管理叢集服務及叢集服務上的RS等; |
IPVS | 工作于核心上的netfilter INPUT HOOK之上的程式,可根據使用者定義的叢集實作請求轉發; |
VS | Virtual Server ,虛拟服務 |
Director, Balancer | 負載均衡器、分發器 |
RS | Real Server 後端請求處理伺服器 |
CIP | Client IP,用戶端IP |
VIP | Director Virtual IP,負載均衡器虛拟IP |
DIP | Director IP,負載均衡器IP |
RIP | Real Server IP,後端請求處理伺服器IP |
LVS組成
LVS 由2部分程式組成,包括 ipvs 和 ipvsadm。
- IPVS(ip virtual server):一段代碼工作在核心空間,叫IPVS,是真正生效實作排程的代碼。IPVS的總體結構主要由IP包處理、負載均衡算法、系統配置與管理三個子產品及虛拟伺服器與真實伺服器連結清單組成。
- ipvsadm:另外一段是工作在使用者空間,叫ipvsadm,即IPVS管理器,負責為ipvs核心架構編寫規則,定義誰是叢集服務,而誰是後端真實的伺服器(Real Server)。
(二)LVS基本原理
- 當使用者向負載均衡排程器(Director Server)發起請求,排程器将請求發往至核心空間。
- PREROUTING鍊首先會接收到使用者請求,判斷目标IP确定是本機IP,将資料包發往INPUT鍊。
- IPVS是工作在INPUT鍊上的,當使用者請求到達INPUT時,IPVS會将使用者請求和自己已定義好的叢集服務進行比對,如果使用者請求的就是定義的叢集服務,那麼此時IPVS會強行修改資料包裡的目标IP位址及端口,并将新的資料包發往POSTROUTING鍊。
- POSTROUTING連結收資料包後發現目标IP位址剛好是自己的後端伺服器,那麼此時通過選路,将資料包最終發送給後端的伺服器
(三)LVS工作模式
1. NAT模式
- 當使用者請求到達Director Server,此時請求的資料封包會先到核心空間的PREROUTING鍊。 此時封包的源IP為CIP,目标IP為VIP。
- PREROUTING檢查發現資料包的目标IP是本機,将資料包送至INPUT鍊。
- IPVS比對資料包請求的服務是否為叢集服務,若是,修改資料包的目标IP位址為後端伺服器IP,然後将資料包發至POSTROUTING鍊。 此時封包的源IP為CIP,目标IP為RIP。
- POSTROUTING鍊通過選路,将資料包發送給Real Server
- Real Server比對發現目标為自己的IP,開始建構響應封包發回給Director Server。 此時封包的源IP為RIP,目标IP為CIP。
- Director Server在響應用戶端前,此時會将源IP位址修改為自己的VIP位址,然後響應給用戶端。 此時封包的源IP為VIP,目标IP為CIP。
NAT模式特性
- RIP最好是内網IP
- RS的網關必須指向DIP。
- DIP和RIP必須在同一個網段内。
- 請求和回應的封包都必須經過director,director容易成為瓶頸。
- nat支援端口轉發。
2. DR模式
- 首先使用者用CIP請求VIP。
- 根據上圖可以看到,不管是Director Server還是Real Server上都需要配置相同的VIP,那麼當使用者請求到達我們的叢集網絡的前端路由器的時候,請求資料包的源位址為CIP目标位址為VIP,此時路由器會發廣播問誰是VIP,那麼我們叢集中所有的節點都配置有VIP,此時誰先響應路由器那麼路由器就會将使用者請求發給誰,這樣一來我們的叢集系統是不是沒有意義了,那我們可以在網關路由器上配置靜态路由指定VIP就是Director Server,或者使用一種機制不讓Real Server 接收來自網絡中的ARP位址解析請求,這樣一來使用者的請求資料包都會經過Director Servrer。
- 當使用者請求到達Director Server,此時請求的資料封包會先到核心空間的PREROUTING鍊。 此時封包的源IP為CIP,目标IP為VIP。
- PREROUTING檢查發現資料包的目标IP是本機,将資料包送至INPUT鍊。
- IPVS比對資料包請求的服務是否為叢集服務,若是,将請求封包中的源MAC位址修改為DIP的MAC位址,将目标MAC位址修改RIP的MAC位址,然後将資料包發至POSTROUTING鍊。 此時的源IP和目的IP均未修改,僅修改了源MAC位址為DIP的MAC位址,目标MAC位址為RIP的MAC位址
- 由于DS和RS在同一個網絡中,是以是通過二層來傳輸。POSTROUTING鍊檢查目标MAC位址為RIP的MAC位址,那麼此時資料包将會發至Real Server。
- RS發現請求封包的MAC位址是自己的MAC位址,就接收此封包。處理完成之後,将響應封包通過lo接口傳送給eth0網卡然後向外發出。 此時的源IP位址為VIP,目标IP為CIP
- 響應封包最終送達至用戶端。
配置DR有三種方式:
- 第一種方式:
在路由器上明顯說明vip對應的位址一定是Director上的MAC,隻要綁定,以後再跟vip通信也不用再請求了,這個綁定是靜态的,是以它也不會失效,也不會再次發起請求,但是有個前提,我們的路由裝置必須有操作權限能夠綁定MAC位址,萬一這個路由器是運作商操作的,我們沒法操作怎麼辦?第一種方式固然很簡便,但未必可行。
- 第二種方式:
在一些主機上(例如:紅帽),它們引進的有一種程式arptables,它有點類似于iptables,它肯定是基于arp或基于MAC做通路控制的,很顯然我們隻需要在每一個real server上定義arptables規則,如果使用者arp廣播請求的目标位址是本機的vip則不予相應,或者說相應的封包不讓出去,很顯然網關(gateway)是接受不到的,也就是director相應的封包才能到達gateway,這個也行。第二種方式我們可以基于arptables。
- 第三種方式:
在相對較新的版本中新增了兩個核心參數(kernelparameter),第一個是arp_ignore定義接受到ARP請求時的相應級别;第二個是arp_announce定義将自己位址向外通告時的通告級别。【提示:很顯然我們現在的系統一般在核心中都是支援這些參數的,我們用參數的方式進行調整更具有樸實性,它還不依賴于額外的條件,像arptables,也不依賴外在路由配置的設定,反而通常我們使用的是第三種配置】
arp_ignore:定義接受到ARP請求時的相應級别:
0: 隻要本地配置的有相應位址,就給予響應。(預設)
1: 僅回應目标IP位址是本地的入網位址的arp請求。
2: 僅回應目标IP位址是本地的入網位址,而且源IP和目标IP在同一個子網的arp請 求。
3: 不回應該網絡界面的arp請求,而隻對設定的唯一和連接配接位址做出回應
4-7:保留未使用
8: 不回應所有的arp請求。
arp_announce:定義将自己位址向外通告是的通告級别:
0: 将本地任何接口上的任何位址向外通告
1: 試圖僅向目标網絡通告與其網絡比對的位址
2: 僅向與本地接口上位址比對的網絡進行通告
DR模式特性
- 保證前端路由将目标位址為VIP封包統統發給Director Server,而不是RS。
- Director和RS的VIP為同一個VIP。
- RS可以使用私有位址;也可以是公網位址,如果使用公網位址,此時可以通過網際網路對RIP進行直接通路。
- RS跟Director Server必須在同一個實體網絡中。
- 所有的請求封包經由Director Server,但響應封包必須不能進過Director Server。
- 不支援位址轉換,也不支援端口映射
- RS可以是大多數常見的作業系統
- RS的網關絕不允許指向DIP(因為我們不允許他經過director)
- RS上的lo接口配置VIP的IP位址
- DR模式是市面上用得最廣的。
- 缺陷:RS和DS必須在同一機房中
3. FULLNAT模式
無論是 DR 還是 NAT 模式,不可避免的都有一個問題:LVS 和 RS 必須在同一個 VLAN 下,否則 LVS 無法作為 RS 的網關。
Full-NAT 相比 NAT 的主要改進是,在 SNAT/DNAT 的基礎上,加上另一種轉換,轉換過程如下:
- 在包從 LVS 轉到 RS 的過程中,源位址從用戶端 IP 被替換成了 LVS 的内網 IP。
- 内網 IP 之間可以通過多個交換機跨 VLAN 通信。
- 當 RS 處理完接受到的包,傳回時,會将這個包傳回給 LVS 的内網 IP,這一步也不受限于 VLAN。
- LVS 收到包後,在 NAT 模式修改源位址的基礎上,再把 RS 發來的包中的目标位址從 LVS 内網 IP 改為用戶端的 IP。
Full-NAT 主要的思想是把網關和其下機器的通信,改為了普通的網絡通信,進而解決了跨 VLAN 的問題。采用這種方式,LVS 和 RS 的部署在 VLAN 上将不再有任何限制,大大提高了運維部署的便利性。
fullnat模式和nat模式相似,但是與nat不同的是nat模式隻做了兩次位址轉換,fullnat模式卻做了四次
4. Tunnel模式
- 當使用者請求到達Director Server,此時請求的資料封包會先到核心空間的PREROUTING鍊。 此時封包的源IP為CIP,目标IP為VIP 。
- PREROUTING檢查發現資料包的目标IP是本機,将資料包送至INPUT鍊。
- IPVS比對資料包請求的服務是否為叢集服務,若是,在請求封包的首部再次封裝一層IP封包,封裝源IP為為DIP,目标IP為RIP。然後發至POSTROUTING鍊。 此時源IP為DIP,目标IP為RIP。
- POSTROUTING鍊根據最新封裝的IP封包,将資料包發至RS(因為在外層封裝多了一層IP首部,是以可以了解為此時通過隧道傳輸)。 此時源IP為DIP,目标IP為RIP。
- RS接收到封包後發現是自己的IP位址,就将封包接收下來,拆除掉最外層的IP後,會發現裡面還有一層IP首部,而且目标是自己的lo接口VIP,那麼此時RS開始處理此請求,處理完成之後,通過lo接口送給eth0網卡,然後向外傳遞。 此時的源IP位址為VIP,目标IP為CIP
- 響應封包最終送達至用戶端
Tunnel模式特性
- RIP、VIP、DIP全是公網位址。
- RS的網關不會也不可能指向DIP
- 所有的請求封包經由Director Server,但響應封包必須不能進過Director Server
- 不支援端口映射
- RS的系統必須支援隧道
(四)LVS的排程算法
固定排程算法:rr,wrr,dh,sh
動态排程算法:wlc,lc,lblc,lblcr
固定排程算法:即排程器不會去判斷後端伺服器的繁忙與否,一如既往得将請求派發下去。
動态排程算法:排程器會去判斷後端伺服器的繁忙程度,然後依據排程算法動态得派發請求。
rr:輪詢(round robin)
這種算法是最簡單的,就是按依次循環的方式将請求排程到不同的伺服器上,該算法最大的特點就是簡單。輪詢算法假設所有的伺服器處理請求的能力都是一樣的,排程器會将所有的請求平均配置設定給每個真實伺服器,不管後端 RS 配置和處理能力,非常均衡地分發下去。這個排程的缺點是,不管後端伺服器的繁忙程度是怎樣的,排程器都會講請求依次發下去。如果A伺服器上的請求很快請求完了,而B伺服器的請求一直持續着,将會導緻B伺服器一直很忙,而A很閑,這樣便沒起到均衡的左右。
wrr:權重輪詢(weight round robin)
這種算法比 rr 的算法多了一個權重的概念,可以給 RS 設定權重,權重越高,那麼分發的請求數越多,權重的取值範圍 0 – 100。主要是對rr算法的一種優化和補充, LVS 會考慮每台伺服器的性能,并給每台伺服器添加要給權值,如果伺服器A的權值為1,伺服器B的權值為2,則排程到伺服器B的請求會是伺服器A的2倍。權值越高的伺服器,處理的請求越多。
dh:目标位址散列排程算法 (destination hash)
簡單的說,即将同一類型的請求配置設定給同一個後端伺服器,例如将以 .jgp、.png等結尾的請求轉發到同一個節點。這種算法其實不是為了真正意義的負載均衡,而是為了資源的分類管理。這種排程算法主要應用在使用了緩存節點的系統中,提高緩存的命中率。
sh:源位址散列排程算法(source hash)
即将來自同一個ip的請求發給後端的同一個伺服器,如果後端伺服器工作正常沒有超負荷的話。這可以解決session共享的問題,但是這裡有個問題,很多企業、社群、學校都是共用的一個IP,這将導緻請求配置設定的不均衡。
lc:最少連接配接數(least-connection)
這個算法會根據後端 RS 的連接配接數來決定把請求分發給誰,比如 RS1 連接配接數比 RS2 連接配接數少,那麼請求就優先發給 RS1。這裡問題是無法做到會話保持,即session共享。
wlc:權重最少連接配接數(weight least-connection)
這個比最少連接配接數多了一個權重的概念,即在最少連接配接數的基礎上加一個權重值,當連接配接數相近,權重值越大,越優先被分派請求。
lblc:基于局部性的最少連接配接排程算法(locality-based least-connection)
将來自同一目的位址的請求配置設定給同一台RS如果這台伺服器尚未滿負荷,否則配置設定給連接配接數最小的RS,并以它為下一次配置設定的首先考慮。
lblcr:基于位址的帶重複最小連接配接數排程 (Locality-Based Least-Connection with Replication)
這個算法是請求資料包的目标 IP 位址的一種排程算法,該算法先根據請求的目标 IP 位址尋找最近的該目标 IP 位址所有使用的伺服器,如果這台伺服器依然可用,并且有能力處理該請求,排程器會盡量選擇相同的伺服器,否則會繼續選擇其它可行的伺服器
sed:最少期望延遲
不考慮非活動連結,誰的權重大,優先選擇權重大的伺服器來接收請求,但權重大的機器會比較忙
nq:永不排隊
無需隊列,如果有realserver的連接配接數為0就直接配置設定過去
二、用法
(一)lvs依賴的子產品
1.是否加載響應的子產品ip_vs,如果沒有加載,需要加載。如果是lxc虛拟機的話。需要主控端加載相應的子產品
# 列舉系統已經加載的子產品,并查找ip_vs
# lsmod | grep ip_vs
# 加載 ip_vs子產品
# modprobe ip_vs
# modprobe ip_vs_wlc
# lsmod | grep ip_vs
ip_vs_wlc 12519 0
ip_vs 141092 2 ip_vs_wlc
nf_conntrack 133387 1 ip_vs
libcrc32c 12644 3 xfs,ip_vs,nf_conntrack
(二)ipvsadm用法
ipvsadm 是虛拟伺服器管理工具。
用法:
ipvsadm 選項 伺服器位址 -s 算法
ipvsadm 選項 伺服器位址 -r 真實伺服器位址 [工作模式][權重]
ipvsadm參數詳解
選項 | 作用 |
---|---|
-A | 添加一個虛拟服務,使用IP位址、端口号、協定來唯一定義一個虛拟服務 |
-E | 編輯一個虛拟服務 |
-D | 删除一個虛拟服務 |
-C | 清空虛拟服務表 |
-R | 從标準輸入中還原虛拟服務規則 |
-S | 儲存虛拟服務規則值标準輸出,輸出的規則可以使用-R導入還原 |
-a | 在虛拟服務中添加一台真實伺服器 |
-e | 在虛拟服務中編輯一台真實伺服器 |
-d | 在虛拟服務中減少一台真實伺服器 |
-L | 顯示虛拟服務清單 |
-t | 使用TCP服務,該參數後需要跟主機與端口資訊 |
-u | 使用UDP服務,該參數會需要跟主機與端口資訊 |
-s | 指定LVS所采用的的排程算法 |
-r | 設定真實伺服器IP位址與端口資訊 |
-g | 設定LVS工作模式為DR直連路由模式 |
-i | 設定LVS工作模式為TUN隧道模式 |
-m | 設定LVS工作模式為NAT位址轉換模式 |
-w | 設定指定伺服器的權重 |
-c | 連接配接狀态,需要配合-L使用 |
-n | 數字格式輸出 |
【例 】
添加一個虛拟服務,設定排程算法為輪詢,所有使用的TCP協定通路124.126.147.168的80端口的請求,最終被排程器通過NAT模式轉發給192.168.0.1、192.168.0.2、192.168.0.3這三台主機的80端口
ipvsadm -A -t 124.126.147.168:80 -s rr
ipvsadm -a -t 124.126.147.158:80 -r 192.168.0.1:80 -m
ipvsadm -a -t 124.126.147.158:80 -r 192.168.0.2:80 -m
ipvsadm -a -t 124.126.147.158:80 -r 192.168.0.3:80 -m
檢視LVS規則表:
[[email protected] ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 124.126.147.168:80 rr
-> 192.168.0.1:80 Masq 1 0 0
-> 192.168.0.2:80 Masq 1 0 0
-> 192.168.0.3:80 Masq 1 0 0
檢視目前IPVS排程狀态:
[[email protected] ~]# ipvsadm -Lnc
IPVS connection entries
pro expire state source virtual destination
删除為虛拟服務提個Web功能的真實伺服器192.168.0.3
[[email protected] ~]# ipvsadm -d -t 124.126.147.168:80 -r 192.168.0.3
[[email protected] ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 124.126.147.168:80 rr
-> 192.168.0.1:80 Masq 1 0 0
-> 192.168.0.2:80 Masq 1 0 0
虛拟服務規則表備份與還原:
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 124.126.147.168:80 rr
-> 192.168.0.1:80 Masq 1 0 0
-> 192.168.0.2:80 Masq 1 0 0
[[email protected] ~]# ipvsadm -Sn > /tmp/ip_vs.bak #備份至檔案
[[email protected] ~]# ipvsadm -C #清空規則表
[[email protected] ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
[[email protected] ~]# ipvsadm -R < /tmp/ip_vs.bak #從檔案還原
[[email protected] ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 124.126.147.168:80 rr
-> 192.168.0.1:80 Masq 1 0 0
-> 192.168.0.2:80 Masq 1 0 0
修改虛拟服務的排程算法:
[[email protected] ~]# ipvsadm -E -t 124.126.147.168:80 -s wrr
[[email protected] ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 124.126.147.168:80 wrr
-> 192.168.0.1:80 Masq 1 0 0
-> 192.168.0.2:80 Masq 1 0 0
建立一個使用WRR算法的虛拟服務,工作模式為隧道(TUN)模式,在該虛拟服務上添加兩台真實伺服器。
[[email protected] ~]# ipvsadm -A -t 124.126.147.169:80 -s wrr
[[email protected] ~]# ipvsadm -a -t 124.126.147.169:80 -r 192.168.0.1:80 -i -w 1
[[email protected] ~]# ipvsadm -a -t 124.126.147.169:80 -r 192.168.0.2:80 -i -w 2
[[email protected] ~]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 124.126.147.169:80 wrr
-> 192.168.0.1:80 Tunnel 1 0 0
-> 192.168.0.2:80 Tunnel 2 0 0
三、lvs執行個體
LVS(DR模式)+ Nginx + NFS
體系架構
使用LVS架設的伺服器叢集系統有三個部分組成:最前端的負載均衡層(Loader Balancer);中間的伺服器群組層,用Server Array表示;最底層的資料共享存儲層,用Shared Storage表示。在使用者看來所有的應用都是透明的,使用者隻是在使用一個虛拟伺服器提供的高性能服務。
終端網際網路使用者從外部通路公司的外部負載均衡伺服器,終端使用者的Web請求會發送給LVS排程器,排程器根據自己預設的算法決定将該請求發送給後端的某台Web伺服器。
結構 | 說明 |
---|---|
負載均衡層 | 由負載排程器組成,LVS子產品就安裝在負載排程器上,同時也可能是一個真實的server。主要作用類似于一個路由器,含有完成LVS功能所設定的路由表,通過這些路由表把使用者的請求分發給伺服器叢集層的應用伺服器上。在負載均衡器上還要安裝對Real Server服務的監控子產品Ldirectord,此子產品用于監測各個Real Server服務的健康狀況。在Real Server不可用時把它從LVS路由表中剔除,恢複時重新加入。 |
伺服器群組層 | 由一組實際運作應用服務的機器組成,真實伺服器可以是WEB伺服器、MAIL伺服器、FTP伺服器、DNS伺服器、視訊伺服器中的一個或者多個,每個Real Server之間通過高速的LAN或分布在各地的WAN相連接配接。幾乎可以是所有的系統平台,Linux、windows、Solaris、AIX、BSD系列都能很好的支援。 |
共享存儲層 | 是為所有Real Server提供共享存儲空間和内容一緻性的存儲區域,在實體上,一般有磁盤陣列裝置組成,為了提供内容的一緻性,一般可以通過網絡共享檔案系統實作。 |
節點規劃
主機名 | IP | 角色 | 備注 |
---|---|---|---|
DS | IP:192.168.126.90 VIP:192.168.126.100 | LVS負載排程器 | 部署lvs,VIP為浮動IP |
RS1 | 192.168.126.92 | nginx伺服器1 | 提供WEB靜态資源及對動态資源請求轉發至後端tomcat伺服器 |
RS2 | 192.168.126.93 | nginx伺服器2 | 提供WEB靜态資源及對動态資源請求轉發至後端tomcat伺服器 |
NFS | 192.168.126.94 | 資料共享伺服器 | 提供網頁共享靜态WEB資源 |
主機名、防火牆、時鐘源設定
hostnamectl set-hostname xxxx
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
yum install ntpdate -y
ntpdate ntp1.aliyun.com
hwclock -w
NFS配置
安裝服務
[[email protected] ~]# yum -y install nfs-utils rpcbind
[[email protected] ~]# rpm -qa nfs-utils rpcbind
nfs-utils-1.3.0-0.68.el7.1.x86_64
rpcbind-0.2.0-49.el7.x86_64
配置 exports檔案
[[email protected] ~]# mkdir -p /data/
[[email protected] ~]# vim /etc/exports
/data/ 192.168.126.0/24(rw,sync)
[[email protected] ~]# chown -R nfsnobody:nfsnobody /data
drwxr-xr-x. 2 nfsnobody nfsnobody 6 Sep 21 19:03 /data
[[email protected] ~]# systemctl start nfs
[[email protected] ~]# systemctl enable nfs
Created symlink from /etc/systemd/system/multi-user.target.wants/nfs-server.service to /usr/lib/systemd/system/nfs-server.service.
啟動服務
在rs1,rs2上配置nfs用戶端
[[email protected] ~]# yum install nfs-utils -y
[[email protected] ~]# showmount -e 192.168.126.94
Export list for 192.168.126.94:
/data 192.168.126.0/24
在rs2上執行相同的操作
配置rs1、rs2
rs1:
安裝nginx
[[email protected] ~]# vim /etc/yum.repos.d/nginx.repo
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
[[email protected] ~]# yum makecache fast
[[email protected] ~]# yum repolist | grep nginx-stable
nginx-stable/7/x86_64 nginx stable repo 242
[[email protected] ~]# yum install nginx -y
[[email protected] ~]# rpm -qa nginx
nginx-1.20.1-1.el7.ngx.x86_64
[[email protected] ~]# egrep -v '^$|#' /etc/nginx/conf.d/default.conf
server {
listen 80;
server_name localhost;
location ^~ /static/ {
root /usr/share/nginx/html;
index index1.html;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
[[email protected] ~]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[[email protected] ~]# mkdir -p /usr/share/nginx/html/static
[[email protected] ~]# vim /etc/fstab
192.168.126.94:/data /usr/share/nginx/html nfs defaults 0 0
[[email protected] ~]# mount -a
[[email protected] ~]# df -h | grep data
192.168.126.94:/data 9.8G 2.8G 7.1G 29% /usr/share/nginx/html
[[email protected] ~]# echo "It is test from rs1 192.168.126.92" > /usr/share/nginx/html/static/index1.html
[[email protected] ~]# systemctl start nginx
[[email protected] ~]# systemctl enable nginx
Created symlink from /etc/systemd/system/multi-user.target.wants/nginx.service to /usr/lib/systemd/system/nginx.service.
測試:
rs2:
[[email protected] ~]# vim /etc/yum.repos.d/nginx.repo
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
[[email protected] ~]# yum makecache fast
[[email protected] ~]# yum repolist | grep nginx-stable
nginx-stable/7/x86_64 nginx stable repo 242
[[email protected] ~]# yum install nginx -y
[[email protected] ~]# rpm -qa nginx
nginx-1.20.1-1.el7.ngx.x86_64
[[email protected] ~]# egrep -v '^$|#' /etc/nginx/conf.d/default.conf
server {
listen 80;
server_name localhost;
location ^~ /static/ {
root /usr/share/nginx/html;
index index2.html;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
[[email protected] ~]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[[email protected] ~]# vim /etc/fstab
192.168.126.94:/data /usr/share/nginx/html nfs defaults 0 0
[[email protected] ~]# mount -a
[[email protected] ~]# df -h | grep data
192.168.126.94:/data 9.8G 2.8G 7.1G 29% /usr/share/nginx/html
[[email protected] ~]# echo "It is test from rs2 192.168.126.93" > /usr/share/nginx/html/static/index2.html
[[email protected] ~]# systemctl start nginx
[[email protected] ~]# systemctl enable nginx
Created symlink from /etc/systemd/system/multi-user.target.wants/nginx.service to /usr/lib/systemd/system/nginx.service.
測試:
配置LVS
ds配置:
[[email protected] ~]# yum -y install keepalived ipvsadm
[[email protected] ~]# nmcli connection show
NAME UUID TYPE DEVICE
ens32 152beb06-47c5-c5e8-95a9-385590654382 802-3-ethernet ens32
[[email protected] ~]# nmcli con mod ens32 +ipv4.addr 192.168.126.100/24
[[email protected] ~]# systemctl restart network
[[email protected] ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens32: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:a1:54:3f brd ff:ff:ff:ff:ff:ff
inet 192.168.126.90/24 brd 192.168.126.255 scope global ens32
valid_lft forever preferred_lft forever
inet 192.168.126.100/24 brd 192.168.126.255 scope global secondary ens32
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fea1:543f/64 scope link
valid_lft forever preferred_lft forever
[[email protected] ~]# ipvsadm -A -t 192.168.126.100:80 -s rr
[[email protected] ~]# ipvsadm -a -t 192.168.126.100:80 -r 192.168.126.92:80 -g
[[email protected] ~]# ipvsadm -a -t 192.168.126.100:80 -r 192.168.126.93:80 -g
[[email protected] ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.126.100:80 rr
-> 192.168.126.92:80 Route 1 0 0
-> 192.168.126.93:80 Route 1 0 0
[[email protected] ~]# ipvsadm --save > /etc/sysconfig/ipvsadm
[[email protected] ~]# systemctl restart ipvsadm
rs1和rs2配置:
# 把vip綁定在lo上,是為了實作rs直接把結果傳回給用戶端
[[email protected] ~]# vim /etc/sysconfig/network-scripts/ifcfg-lo:0
DEVICE=lo:0
IPADDR=192.168.126.100
NETMASK=255.255.255.255
ONBOOT=yes
[[email protected] ~]# systemctl restart network
[[email protected] ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet 192.168.126.100/32 brd 192.168.126.100 scope global lo:0
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens32: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:2b:48:05 brd ff:ff:ff:ff:ff:ff
inet 192.168.126.92/24 brd 192.168.126.255 scope global ens32
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe2b:4805/64 scope link
valid_lft forever preferred_lft forever
# 以下操作為更改arp核心參數,目的是為了讓rs順利發送mac位址給用戶端
[[email protected] ~]# vim /etc/sysctl.conf
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
[[email protected] ~]# sysctl -p
# 設定靜态路由
[[email protected] ~]# route add -host 192.168.126.100 dev lo:0
[[email protected] ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.126.2 0.0.0.0 UG 100 0 0 ens32
172.17.0.0 0.0.0.0 255.255.0.0 U 0 0 0 docker0
192.168.126.0 0.0.0.0 255.255.255.0 U 100 0 0 ens32
192.168.126.100 0.0.0.0 255.255.255.255 UH 0 0 0 lo
測試
為了便于短時間内觀察效果,需要關閉長連結,禁用浏覽器緩存等操作:
(1)在windows浏覽器中選擇禁用緩存
(2)将ipvs會話保持時間設定小點
[[email protected] ~]# ipvsadm --set 1 1 1
[[email protected] ~]# ipvsadm -L --timeout
Timeout (tcp tcpfin udp): 1 1 1
[[email protected] ~]# systemctl restart ipvsadm
(3)将nginx中的長連接配接設定小點
[[email protected] ~]# vim /etc/nginx/nginx.conf
…………
keepalive_timeout 3;
…………
[[email protected] ~]# nginx -s reload
因為是輪詢算法,是以DS會按依次循環的方式将請求排程到後端的RS伺服器上