由於實驗室擬態存儲的項目需要通過NAT模式來映射NFS伺服器已實現負載均衡的目的,通過調研了多種負載均衡機制,筆者最終選擇了 LVS的NAT模式 來實現需求,接下來通過博客來記錄一下LVS NAT模式的配置流程。 1.LVS服務的簡介: LVS 是 Linux Virtual Server 的簡寫, ...
由於實驗室擬態存儲的項目需要通過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系列的發行版也是大同小異。這裡調試一定需要有足夠的耐心和毅力,需要去細緻的排查,否則很容易出現問題。若有疏漏,望各位指點斧正。