歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> 關於Linux >> LVS-NAT模型實現負載均衡

LVS-NAT模型實現負載均衡

日期:2017/3/1 11:47:13   编辑:關於Linux

前言

前篇文章我們主要講解了LVS的理論知識,包括LVS來源、宗旨、三種模型的架構以及LVS內核空間的十種算法,今天我們來進行實踐的LVS中三種模型中的NAT模型的架構以及實現方式。(實驗環境以Web集群作為實驗對象)

環境

此處我們LVS-NAT模型環境架構為三台Linux服務器,都有以下配置。

環境架構圖:

LVS-NAT

工作原理:

基於NAT機制實現。當用戶請求到達director之後,director將請求報文的目標地址(即VIP)改成選定的realserver地址,同時將報文的目標端口也改成選定的realserver的相應端口,最後將報文請求發送到指定的realserver。在服務器端得到數據後,realserver將數據返給director,而director將報文的源地址和源端口改成VIP和相應端口,然後把數據發送給用戶,完成整個負載調度過程。

特點:

所有的realserver和director要在同一個網段內 RIP是私有地址,僅用於集群節點之間進行通信 director同時處理請求和應答數據包 realserver的網關要指向DIP 可以實現端口映射 readlserver可以是任意操作系統 director很可能成為系統性能瓶頸

硬件環境:

使用軟件VMware WorkStation 11,Director的DIP和RealServer的RS1、RS2的RIP為僅主機模式,讓其在同一個局域網內,Direcotr橋接宿主機模式,方便我們後邊的測試。

一台Director:

版本:Red Hat Enterprise Linux Server release 6.4 雙網卡:
eth1: VIP:172.16.21.110/24(真實生產環境下一定將網關指向運營商的公網IP) eth2: DIP:192.168.91.70/24(此IP必須和後台的RealSever在同一個網段內)

兩台RealServer:

版本:Red Hat Enterprise Linux Server release 6.4 單網卡:
RealServer1:RIP1:192.168.91.80/24(網關必須指向Director的DIP) RealServer2: RIP2:192.168.91.90/24(網關必須執行Director的DIP)

軟件環境:

搭建LVS集群只需要在Director服務器上安裝ipvsadmin工具,此處我們使用RedHat自帶的rpm包進行安裝

版本:ipvsadm-1.25-10.el6.x86_64.rpm

安裝前准備

現在LVS已經是Linux標准內核的一部分,在Linux2.4內核以前,使用LVS時必須要重新編譯內核以支持LVS功能模塊,但是從Linux2.4內核以後,已經完全內置了LVS的各個功能模塊,無需給內核打任何補丁,可以直接使用LVS提供的各種功能。

注意

LVS-NAT模型的實現方式和iptables的DNAT相似,所以你懂的,Director節點不能和iptables同時使用,那麼會有沖突,這就是我們後面為什麼要將iptables的規則清空的目的之一。

查看內核版本

[root@Director Packages]# uname -r  # 此處我們環境內核版本為2.6.32-358.el6.x86_64,所以不需要再打補丁,如果你的內核低於2.4那麼則需要提前打補丁
2.6.32-358.el6.x86_64

查看內核是否支持ipvs

[root@Director ~]# modprobe -l | grep ipvs  # 以下有之前所解釋的十個內核所支持的算法(如果能有以下搜索到那麼你的內核就支持ipvs)
kernel/net/netfilter/ipvs/ip_vs.ko
kernel/net/netfilter/ipvs/ip_vs_rr.ko
kernel/net/netfilter/ipvs/ip_vs_wrr.ko
kernel/net/netfilter/ipvs/ip_vs_lc.ko
kernel/net/netfilter/ipvs/ip_vs_wlc.ko
kernel/net/netfilter/ipvs/ip_vs_lblc.ko
kernel/net/netfilter/ipvs/ip_vs_lblcr.ko
kernel/net/netfilter/ipvs/ip_vs_dh.ko
kernel/net/netfilter/ipvs/ip_vs_sh.ko
kernel/net/netfilter/ipvs/ip_vs_sed.ko
kernel/net/netfilter/ipvs/ip_vs_nq.ko
kernel/net/netfilter/ipvs/ip_vs_ftp.ko

配置本地YUM源

我們使用本地光盤來作為YUM源

掛載本地光盤

[root@Director ~]# mount /dev/sr0 /media  # 掛載本地光盤到本地目錄
mount: block device /dev/sr0 is write-protected, mounting read-only

配置編輯YUM源的配置文件

三台服務器我們都需要配置,因為後面兩台RealServer我們還需要安裝web服務來作為集群服務。

[root@Director ~]# vim /etc/yum.repos.d/rhel-source.repo   
[localhost]   # 庫名稱(可隨意)
name=localhost # 名稱描述 (自定義)
baseurl=file:///media  # yum源目錄,源地址
enabled=1   # 是否用該yum源,0為禁用,1為使用
gpgcheck=0 # 檢查GPG-KEY,0為不檢查,1為檢查

到此我們安裝前准備就做好了,來下面進行下一步

配置DirectorServer

安裝ipvsadm工具

[root@Director Packages]# yum install -y ipvsadm-1.25-10.el6.x86_64.rpm

配置網卡,並設置IP

配置外網網卡VIP

[root@Director ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth1  # 此處我們不指定GATEWAY(真實生產一定要指向SP給的公網IP)
DEVICE=eth1
TYPE=Ethernet
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=static
IPADDR=172.16.21.110
NETMASK=255.255.255.0

配置內網網卡DIP

[root@Director ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth2  # 此內網網卡可不指定GATEWAY,因為和後台RealServer在同一個局域網(但也要根據真實環境而定)
DEVICE=eth2
TYPE=Ethernet
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=static
IPADDR=192.168.91.70
NETMASK=255.255.255.0

重啟網卡服務

[root@Director ~]# service network restart
Shutting down interface eth1:                              [  OK  ]
Shutting down interface eth2:                              [  OK  ]
Shutting down loopback interface:                          [  OK  ]
Bringing up loopback interface:                            [  OK  ]
Bringing up interface eth1:                                [  OK  ]
Bringing up interface eth2:                                [  OK  ]

[root@Director ~]# ifconfig  # 查看配置是否生效
eth1      Link encap:Ethernet  HWaddr 00:0C:29:E5:9A:47  
          inet addr:172.16.21.110  Bcast:172.16.21.255  Mask:255.255.255.0
          inet6 addr: fe80::20c:29ff:fee5:9a47/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:6126 errors:0 dropped:0 overruns:0 frame:0
          TX packets:4370 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:524154 (511.8 KiB)  TX bytes:753784 (736.1 KiB)

eth2      Link encap:Ethernet  HWaddr 00:0C:29:E5:9A:51  
          inet addr:192.168.91.70  Bcast:192.168.91.255  Mask:255.255.255.0
          inet6 addr: fe80::20c:29ff:fee5:9a51/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:28 errors:0 dropped:0 overruns:0 frame:0
          TX packets:36 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:4146 (4.0 KiB)  TX bytes:2160 (2.1 KiB)

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:822 errors:0 dropped:0 overruns:0 frame:0
          TX packets:822 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:93120 (90.9 KiB)  TX bytes:93120 (90.9 KiB)

打開本機的路由轉發功能

[root@Director ~]# cat /proc/sys/net/ipv4/ip_forward   # 查看本地路由功能是否打開(1 開啟 0 關閉)
0 
[root@Director ~]# vim /etc/sysctl.conf   # 開啟本地路由轉發
net.ipv4.ip_forward = 1    將0更改為1即可
[root@Director ~]# sysctl -p  # 重新加載配置文件
net.ipv4.ip_forward = 1
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.default.accept_source_route = 0
kernel.sysrq = 0
kernel.core_uses_pid = 1
net.ipv4.tcp_syncookies = 1
kernel.msgmnb = 65536
kernel.msgmax = 65536
kernel.shmmax = 68719476736
kernel.shmall = 4294967296

配置RealServer服務器

配置RealServer1網卡,並設置IP

[root@RS1 ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth1
DEVICE=eth1
TYPE=Ethernet
ONBOOT=yes
BOOTPROTO=static
IPADDR=192.168.91.80
NETMASK=255.255.255.0
GATEWAY=192.168.91.70
NM_CONTROLLED=yes

重啟網卡配置

[root@RS1 ~]# service network restart
Shutting down interface eth1:                              [  OK  ]
Shutting down loopback interface:                          [  OK  ]
Bringing up loopback interface:                            [  OK  ]
Bringing up interface eth1:                                [  OK  ]
[root@RS1 ~]# ifconfig  # 查看配置是否生效
eth1      Link encap:Ethernet  HWaddr 00:0C:29:41:4A:CC  
          inet addr:192.168.91.80  Bcast:192.168.91.255  Mask:255.255.255.0
          inet6 addr: fe80::20c:29ff:fe41:4acc/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:5212 errors:0 dropped:0 overruns:0 frame:0
          TX packets:3586 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:435875 (425.6 KiB)  TX bytes:252327 (246.4 KiB)

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:129 errors:0 dropped:0 overruns:0 frame:0
          TX packets:129 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:13806 (13.4 KiB)  TX bytes:13806 (13.4 KiB)

安裝Web服務

[root@RS1 ~]# yum install -y httpd
[root@RS1 ~]# service httpd start   # 啟動httpd服務
Starting httpd: httpd: apr_sockaddr_info_get() failed for RS1
httpd: Could not reliably determine the server's fully qualified domain name, using 127.0.0.1 for ServerName
                                                           [  OK  ]
[root@RS1 ~]# service httpd status   # 查看httpd是否啟動
httpd (pid  14114) is running...
[root@RS1 ~]# netstat -an | grep :80  # 查看web服務80端口是否監聽
tcp        0      0 :::80                       :::*                        LISTEN    
[root@RS1 ~]# echo "RS1.xuxingzhuang.com" > /var/www/html/index.html  # 給web服務提供網頁界面  
[root@RS1 ~]# curl http://localhost # 訪問本地web是否可以正常訪問
RS1.xuxingzhuang.com

清空本地防火牆策略

[root@RS1 ~]# iptables -F  

配置RealServer2網卡,並配置IP

[root@RS2 ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth1
DEVICE=eth1
TYPE=Ethernet
ONBOOT=yes
BOOTPROTO=static
IPADDR=192.168.91.90
NETMASK=255.255.255.0
GATEWAY=192.168.91.70
NM_CONTROLLED=yes

重啟網卡配置

[root@RS2 ~]# service network restart
Shutting down interface eth1:                              [  OK  ]
Shutting down loopback interface:                          [  OK  ]
Bringing up loopback interface:                            [  OK  ]
Bringing up interface eth1:                                [  OK  ]
[root@RS2 ~]# ifconfig  # 查看配置是否生效
eth1      Link encap:Ethernet  HWaddr 00:0C:29:9A:31:FB  
          inet addr:192.168.91.90  Bcast:192.168.91.255  Mask:255.255.255.0
          inet6 addr: fe80::20c:29ff:fe9a:31fb/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:5749 errors:0 dropped:0 overruns:0 frame:0
          TX packets:4646 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:457342 (446.6 KiB)  TX bytes:1052880 (1.0 MiB)

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:167 errors:0 dropped:0 overruns:0 frame:0
          TX packets:167 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:17790 (17.3 KiB)  TX bytes:17790 (17.3 KiB)

安裝Web服務

[root@RS2 ~]# yum install -y httpd
[root@RS2 ~]# service httpd start   # 啟動httpd服務
Starting httpd: httpd: apr_sockaddr_info_get() failed for RS1
httpd: Could not reliably determine the server's fully qualified domain name, using 127.0.0.1 for ServerName
                                                           [  OK  ]
[root@RS2 ~]# service httpd status  # 查看httpd是否啟動
httpd (pid  2069) is running...
[root@RS1 ~]# netstat -an | grep :80  # 查看web服務80端口是否監聽
tcp        0      0 :::80                       :::*                        LISTEN    
[root@RS2 ~]# echo "RS2.xuxingzhuang.com" > /var/www/html/index.html  # 給web服務提供網頁界面  
[root@RS2 ~]# curl http://localhost # 訪問本地web是否可以正常訪問
RS2.xuxingzhuang.com

清空本地防火牆策略

[root@RS2 ~]# iptables -F

配置Director,並將RealServer加入集群服務

ipvsadm命令的用法

管理集群服務

添加:
-A -t|u|f service-address [-s scheduler] -t: TCP協議的集群 -u: UDP協議的集群
service-address: IP:PORT -f: FWM: 防火牆標記
service-address: Mark Number 修改:
-E 刪除:
-D -t|u|f service-address

管理集群服務中的RealServer

添加:
-a -t|u|f service-address -r server-address [-g|i|m] [-w weight] -t|u|f service-address:事先定義好的某集群服務 -r server-address: 某RS的地址,在NAT模型中,可使用IP:PORT實現端口映射; [-g|i|m]: LVS類型 -g: DR -i: TUN -m: NAT [-w weight]: 定義服務器權重 修改:
-e 刪除:
-d -t|u|f service-address -r server-address

集群服務後續管理

查看
-L|l -n: 數字格式顯示主機地址和端口 –stats:統計數據 –rate: 速率 –timeout: 顯示tcp、tcpfin和udp的會話超時時長 -c: 顯示當前的ipvs連接狀況
例:ipvsadm -L -n –stats 刪除所有集群服務
-C:清空ipvs規則
例:ipvsadm -C 保存規則
-S
例: ipvsadm -S > /etc/sysconfig/ipvsadm 載入此前的規則:
-R
例:ipvsadm -R < /etc/sysconfig/ipvsadm

測試Director是否可以正常訪問Realserver的服務

注意問題

訪問後台的RealServer服務我們此時使用的為Driector的DIP進行訪問的,當我們將RealServer加入集群服務後,我們clent要實現訪問Driector的VIP來進行訪問RealServer的服務,務必要明白此問題。
[root@Director ~]# curl http://192.168.91.80  #看來我們Driector訪問後台web服務都正常
RS1.xuxingzhuang.com
[root@Director ~]# curl http://192.168.91.90
RS2.xuxingzhuang.com

將RealServer加入Web集群服務

我們本次使用LVS內核rr調度算法來作為實驗方式,還不明白LVS的內核調度算法的小伙伴,請查看我們上一篇LVS集群服務詳解

使用rr調度算法(輪叫)

[root@Director ~]# ipvsadm -A -t 172.16.21.110:80 -s rr
[root@Director ~]# ipvsadm -a -t 172.16.21.110:80 -r 192.168.91.80 -m -w 2   # 此處的-w指定權重是沒有意義的,因為我們使用的為rr調度算法(輪叫),不過你也可以指定,後邊我們改變算法時就不用重新定義了,省去了時間
[root@Director ~]# ipvsadm -a -t 172.16.21.110:80 -r 192.168.91.90 -m -w 1
[root@Director ~]# ipvsadm -L -n   # 查看集群服務
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  172.16.21.110:80 rr
  -> 192.168.91.80:80             Masq    2      0          0         
  -> 192.168.91.90:80             Masq    1      0          0         
測試web集群服務rr算法

使用本機進web測試,要和Director的VIP在同一個網段,那麼真實環境你就只要將網關指向運營商給的公網地址就可以了。

LVS-NAT rr算法測試網頁

測試結果為刷新一次,那麼就會換成RS2,明白rr(輪叫)算法的小伙伴你懂的,這裡就不多少了

更改為wrr調度算法(加權循環算法)

[root@Director ~]# ipvsadm -E -t 172.16.21.110:80 -s wrr  #那麼此處我們使用-E選項來修改為調度算法為wrr,那麼前邊-w選項指定RealServer的權重就生效了,那麼我們就不用再對RealServer重新指定了
[root@Director ~]# ipvsadm -L -n  
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  172.16.21.110:80 wrr
  -> 192.168.91.80:80             Masq    2      0          0         
  -> 192.168.91.90:80             Masq    1      0          0         
測試web集群服務wrr算法

此處訪問那麼算法就根據我們指定了RS1權重為2,RS2的權重為1,那麼最後我們訪問的結果為刷新兩次訪問RS1,一個訪問RS2。

END

到這裡我們就基於LVS-NAT模型搭建了一個web集群服務,這裡我們就測試了兩種LVS的內核調度算法,對於其他的八種算法配置基本一樣,主要是看我們是否可以進行理解,配置都一樣,後邊我們將講解LVS-DR模型的LVS集群服務的實現過程。

Copyright © Linux教程網 All Rights Reserved