LVS-NAT模式的配置詳解

happenlee發表於2018-03-14

由於實驗室擬態儲存的專案需要通過NAT模式來對映NFS伺服器已實現負載均衡的目的,通過調研了多種負載均衡機制,筆者最終選擇了LVS的NAT模式來實現需求,接下來通過部落格來記錄一下LVS-NAT模式的配置流程。

1.LVS服務的簡介:

LVSLinux 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模式下的系統結構圖:
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配置好的轉發機制:
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伺服器路由轉發配置的結果:
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來提供的:
掛載了遠端的NFS伺服器

小結:梳理了一下在LVS-NAT模式之下的安裝與配置。RedHat系列的發行版也是大同小異。這裡除錯一定需要有足夠的耐心和毅力,需要去細緻的排查,否則很容易出現問題。若有疏漏,望各位指點斧正。

相關文章