基於lvs中的 NAT full_NAT 實現均衡負載

基於lvs中的NAT full_NAT實現均衡負載

Virtual Server via NAT

VS/NAT的優點是服務器可以運行任何支持TCP/IP的操作系統,它只需要一個IP地址配置在調度器上,服務器組可以用私有的IP地址。缺點是它的伸縮能力有限,當服務器結點數目升到20時,調度器本身有可能成爲系統的新瓶頸,因爲在VS/NAT中請求和響應報文都需要通過負載調度器。在Pentium 166 處理器的主機上測得重寫報文的平均延時爲60us,性能更高的處理器上延時會短一些。假設TCP報文的平均長度爲536 Bytes,則調度器的最大吞吐量爲8.93 MBytes/s. 再假設每臺服務器的吞吐量爲800KBytes/s,這樣一個調度器可以帶動10臺服務器。
基於VS/NAT的集羣系統可以適合許多服務器的性能要求。如果負載調度器成爲系統新的瓶頸,可以有三種方法解決這個問題:混合方法、VS/TUN和 VS/DR。在DNS混合集羣系統中,有若干個VS/NAT負載調度器,每個負載調度器帶自己的服務器集羣,同時這些負載調度器又通過RR-DNS組成簡單的域名。但VS/TUN和VS/DR是提高系統吞吐量的更好方法。
對於那些將IP地址或者端口號在報文數據中傳送的網絡服務,需要編寫相應的應用模塊來轉換報文數據中的IP地址或者端口號。這會帶來實現的工作量,同時應用模塊檢查報文的開銷會降低系統的吞吐率。
VS/NAT 的優點是服務器可以運行任何支持 TCP/IP 的操作系統,它只需要一個 IP 地址配置在調度器上,服務器組可以用私有的 IP 地址。缺點是它的伸縮能力有限, 當服務器結點數目升到 20 時,調度器本身有可能成爲系統的新瓶頸,因爲在 VS/NAT 中請求和響應報文都需要通過負載調度器。

Load Balance 雙網卡 eth0: 172.25.64.1 (對內) eth1: 172.25.64.100 (對外)
如果只有一塊網卡可用以下方式:
Load Balance:172.15.64.1
Virtual IP: 172.25.64.100
Gateway: 172.25.64.1
Realserver1: 172.25.64.2
Realserver1: 172.25.64.2開啓路由機制
vi /etc/sysctl.conf
net.ipv4.ip_forward = 1
sysctl -p
加載 nat 模塊
modprobe iptable_nat
注:如果不加載此模塊,也可以在第一次訪問時成功,但是會在再次訪問時出現延遲過長,或訪問超時現象
Load Balance加載 rule

   1   ifconfig eth1 up
   2  ip addr add 172.25.64.100/24 dev eth1
   3  ip addr
   4  ipvsadm -A -t 172.25.64.100:80 -s rr
   5  ipvsadm -a -t 172.25.64.100:80 -r 172.25.64.2:80 -m
   6  ipvsadm -a -t 172.25.64.100:80 -r 172.25.64.3:80 -m
   7  /etc/init.d/ipvsadm save 保存 rule
   8  vim /etc/sysctl.conf
   9  sysctl -p  #路由轉換
   10  /etc/init.d/ipvsadm start
   11   modprobe iptable_nat
   12  vim /etc/keepalived/keepalived.conf
virtual_server 172.25.64.100 80 {
    delay_loop 3
    lb_algo rr
    lb_kind NAT
    #persistence_timeout 50
    protocol TCP
  13  /etc/init.d/keepalived restart
  14 綁定 vip
    ifconfig eth0:0 172.25.64.100 netmask 255.255.255.0 up


RealServer 設置
Default Gateway 指向 Director 的 LAN IP 即 172.25.64.1
echo hostname > /var/www/html/index.html
service httpd start
測試
選擇一臺172.25.64.1網段主機訪問 http:// 172.25.64.1 反覆刷新網頁,每次出現的網頁不同則表示成功。

lvs中 無論是DR 還是 NAT 模式,不可避免的都有一個問題:LVS 和 RS 必須在同一個 VLAN 下,否則 LVS 無法作爲 RS 的網關。
這引發的兩個問題是:
同一個 VLAN 的限制導致運維不方便,跨 VLAN 的 RS 無法接入。
LVS 的水平擴展受到制約。當 RS 水平擴容時,總有一天其上的單點 LVS 會成爲瓶頸。
Full-NAT 由此而生,解決的是 LVS 和 RS 跨 VLAN 的問題,而跨 VLAN 問題解決後,LVS 和 RS 不再存在 VLAN 上的從屬關係,可以做到多個 LVS 對應多個 RS,解決水平擴容的問題。
Full-NAT 相比 NAT 的主要改進是,在 SNAT/DNAT 的基礎上,加上另一種轉換,轉換過程如下:full_NAT工作原理和nat模式相似:
nat模式原理圖:

full_NAT數據包走向如下圖:

我們發現FULLNAT有一個問題是:RealServer無法獲得用戶IP;淘寶通過叫TOA的方式解決的,主要原理是:將client address放到了TCP Option裏面帶給後端RealServer,RealServer收到後保存在socket的結構體裏並通過toa內核模塊hook了getname函數,這樣當用戶調用getname獲取遠端地址時,返回的是保存在socket的TCPOption的IP. 百度的BVS是通過叫ttm模塊實現的,其實現方式跟toa基本一樣。
首先我們需要配置full_NAT的環境將虛擬機運行內存設置爲2048MB

在實驗中需要把虛擬機內存設置爲2048否則會會因內存過小導致lvs出現丟包情況
Lvs_fullnat官網鏈接:http://kb.linuxvirtualserver.org/wiki/IPVS_FULLNAT_and_SYNPROXY#Introduction
安裝:

yum install rpm-build -y #編譯源碼文件
rpm -ivh kernel-2.6.32-220.23.1.el6.src.rpm #src基於linux內核開發的源程序
ls
cd rpmbuild/SOURCES/
yum install redhat-rpm-config patchutils  xmlto  asciidoc elfutils-libelf-devel binutils-devel newt-devel python-devel perl-ExtUtils-Embed -y
# 解決rpmbuild重構過程中的依賴性
yum install newt-devel-0.52.11-3.el6.x86_64.rpm asciidoc-8.4.5-4.1.el6.noarch.rpm slang-devel-2.2.1-1.el6.x86_64.rpm  hmaccalc  rng-tools -y
rngd -r /dev/urandom #生成隨機數中途需要在移動鍵盤的過程中生成


添加lvs補丁:

tar zxf Lvs-fullnat-synproxy.tar.gz
cd rpmbuild/SPECS/
rpmbuild -bp kernel.spec  # -bp 從<specfile>文件的%prep段開始建立(解開源碼包並打補丁)
cd rpmbuild/BUILD/kernel-2.6.32-220.23.1.el6/linux-2.6.32-220.23.1.el6.x86_64/
cp /root/lvs-fullnat-synproxy/lvs-2.6.32-220.23.1.el6.patch  .
#/root/rpmbuild/BUILD/kernel-2.6.32-220.23.1.el6/linux-2.6.32-220.23.1.el6.x86_64
patch -p1 < lvs-2.6.32-220.23.1.el6.patch 
cat .config|grep IP_VS
vim makefile #添加版本後綴名
compile and install: #編譯安裝
make #-j4表用4核cpu來運行,但在虛擬機中環境限制只可以用默認1來編譯,在此過程中可能會用是比較長
make modules_install
make install
yum remove ipvsadm
# 修改內核引導程序不使用默認引導
vim /boot/grub/grub.conf
Default=0
Reboot


重新啓動之後如果虛擬機up了說明設置沒有問題

uname -r #查看內核版本
cd lvs-fullnat-synproxy/ 
tar zxf lvs-tools.tar.gz 
cd tools/keepalived/
yum install  popt-devel -y
./configure --with-kernel-dir="/lib/modules/`uname -r`/build" #靜態安裝激活keepalived
make
make install 

cd lvs-fullnat-synproxy/ tools/ipvsadm
make #靜態激活ipvsadm
make install
Ipvsadm -l #查看lvs是否變大2^22

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章