由於實驗室擬態存儲的項目需要通過NAT模式來映射NFS服務器已實現負載均衡的目的,通過調研了多種負載均衡機制,筆者最終選擇了LVS的NAT模式來實現需求,接下來通過博客來記錄一下LVS-NAT模式的配置流程。
1.LVS服務的簡介:
LVS是Linux Virtual Server的簡寫,意即Linux虛擬服務器,是一個虛擬的服務器集群系統,在1998年5月由章文嵩先生主導開發。LVS集群實現了IP負載均衡技術和基於內容請求分發技術。調度器通過將請求均衡地轉移到不同的服務器上執行,且可以屏蔽掉后台故障的服務器,從而將一組服務器構成一個高性能的、高可用的服務器集群,而這樣的結構對客戶端來說是完全透明的,所以無需修改客戶端和服務器端的程序。
LVS服務器可以讓客戶端將LVS服務器作為一個連接的單點,僅僅通過連接LVS服務器便可以得到后端一整個服務器集群的處理與存儲能力,這樣能夠大大提高系統的擴展性與可用性,同時也能夠提供服務的安全性,單一入侵一台服務器並不會破壞其他與該服務器隔離的服務。
LVS的模式
LVS可以支持如下三種模式:
-
Virtual Server via Network Address Translation(VS/NAT)
通過網絡地址轉換,調度器重寫請求報文的目標地址,根據預設的調度算法,將請求分派給后端的真實服務器;真實服務器的響應報文通過調度器時,報文的源地址被重寫,再返回給客戶,完成整個負載調度過程。 -
Virtual Server via IP Tunneling(VS/TUN)
采用NAT技術時,由於請求和響應報文都必須經過調度器地址重寫,當客戶請求越來越多時,調度器的處理能力將成為瓶頸。為了解決這個問題,調度器把請求報 文通過IP隧道轉發至真實服務器,而真實服務器將響應直接返回給客戶,所以調度器只處理請求報文。由於一般網絡服務應答比請求報文大許多,采用 VS/TUN技術后,集群系統的最大吞吐量可以提高10倍。 -
Virtual Server via Direct Routing(VS/DR)
VS/DR通過改寫請求報文的MAC地址,將請求發送到真實服務器,而真實服務器將響應直接返回給客戶。同VS/TUN技術一樣,VS/DR技術可極大地 提高集群系統的伸縮性。這種方法沒有IP隧道的開銷,對集群中的真實服務器也沒有必須支持IP隧道協議的要求,但是要求調度器與真實服務器都有一塊網卡連 在同一物理網段上。
鑒於ip安全的需求,這里我們需要分割LVS服務器與后端負載集群的ip地址,並且對於負載均衡集群的數目沒有太大的需求,所以筆者選用了Virtual Server via Network Address Translation(VS/NAT) 模式。
2.系統環境:
如下圖所示,這是LVS-NAT模式下的系統結構圖:
系統平台:Ubuntu 16.04 LTS
Load Balancer: 雙網卡
- 外網地址:219.223.199.164
- 內網地址:192.168.1.30
Real Server:
- 一共有五台機器,ip地址分別為192.168.1.21~25。這里筆者由於需要掛載NFS服務器並且串聯CephFS集群,所以本身Real Server上已經運行着NFS的服務端,關於NFS服務器的搭建可以參考我之前的博文。
3.Load Balancer服務器的配置:
Load Balancer服務器的配置相對來說較為復雜,我們按部就班的走下這個流程:
-
ipvsadm
LVS依賴於ipvsadm來進行配置,所以我們首先先安裝ipvsadm:sudo apt-get install ipvsadm
-
NAT模式下的ip轉發
之后我們需要配置NAT模式下的ip轉發,讓通過Load Balancer的ip包能夠轉發到真正提供服務的Real Server之上進行處理:echo 1 >> /proc/sys/net/ipv4/ip_forward //在ipv4環境下可以進行ip轉發 sudo iptables -t nat -F //清除之前的iptable的規則 sudo iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o ens160 -j MASQUERADE //這里的網卡需要選擇外網ip,也就是219.223.199.164對應的ip地址
-
LVS-NAT模式的配置
這里我們采取全盤轉發的機制,也就是不指定端口的方式,這種用法可能相對比較少見,但由於NFS服務依賴與rpcbind選擇端口,所以提供的端口是隨機的,為了簡單起見,我們采取全盤轉發的模式。sudo ipvsadm -A -t 219.223.199.164 -s wrr -p 30 //轉發對應的ip,並且采取權重輪詢的策略 sudo ipvsadm -a -t 219.223.199.164 -r 192.168.1.21 -m -w 1 sudo ipvsadm -a -t 219.223.199.164 -r 192.168.1.22 -m -w 1 sudo ipvsadm -a -t 219.223.199.164 -r 192.168.1.23 -m -w 1 sudo ipvsadm -a -t 219.223.199.164 -r 192.168.1.24 -m -w 1 sudo ipvsadm -a -t 219.223.199.164 -r 192.168.1.25 -m -w 1 //依次添加對應的Real Server服務器
下圖是通過ipvsadm配置好的轉發機制:
4.Real Server服務器的配置:
Real Server這里需要配置路由,將默認的網關改為Load Balancer 服務器的內網ip地址,來實現路由轉發的效果。(筆者這里多提一句:這里如果采用雙網卡機制很容易出現,TCP連接問題,也就是syn消息收不到ack響應,所以盡量將無關的網卡警用,以免路由配置的復雜。)
route命令的配置:
sudo route add -net 0.0.0.0 gw 192.168.1.30
這個命令需要在每台Real Server之上執行,否則其他Real Server沒有辦法接受到轉發的ip數據包,會被Load Balance屏蔽,從而沒有辦法實現我們期待的負載均衡的結果。下圖所示的是Real Server服務器路由轉發配置的結果:
5.LVS-NAT模式的測試:
由於實現了LVS全盤的ip地址轉發,所以任何基於TCP的網絡服務都可以通過Load Balancer轉發給后端的Real Server來提供對外的服務,由於筆者主要是測試NFS服務的,所以我們先在Real Server之上啟動對應的NFS服務:
為了使NFS服務器能正常工作,需要啟動rpcbind和nfs-kernel-server兩個服務,並且rpcbind一定要先於nfs-kernel-server啟動。
sudo service rpcbind start
sudo service nfs-kernel-server start
之后我們便可以執行NFS客戶端的掛載工作了,過載工作很簡單,先建立一個掛載目錄,然后通過mount命令掛載Load Balancer的外網ip:
sudo mkdir /mnt/ceph
sudo mount -t nfs 219.223.199.164:/mnt/cephfs /mnt/ceph
之后客戶端對應的文件目錄便掛載上對應Real Server上的文件系統了。(這里的NFS服務是筆者預先搭建好的,讀者可以自行搭建自己所需的網絡服務。)
如下圖所示,我們掛載了遠端219.223.199.164的NFS服務器,而實際的服務是由后端的Real Server來提供的:
小結:梳理了一下在LVS-NAT模式之下的安裝與配置。RedHat系列的發行版也是大同小異。這里調試一定需要有足夠的耐心和毅力,需要去細致的排查,否則很容易出現問題。若有疏漏,望各位指點斧正。