前篇文章我們主要講解了LVS的理論知識,包括LVS來源、宗旨、三種模型的架構以及LVS內核空間的十種算法,今天我們來進行實踐的LVS中三種模型中的NAT模型的架構以及實現方式。(實驗環境以Web集群作為實驗對象)
此處我們LVS-NAT模型環境架構為三台Linux服務器,都有以下配置。
基於NAT機制實現。當用戶請求到達director之後,director將請求報文的目標地址(即VIP)改成選定的realserver地址,同時將報文的目標端口也改成選定的realserver的相應端口,最後將報文請求發送到指定的realserver。在服務器端得到數據後,realserver將數據返給director,而director將報文的源地址和源端口改成VIP和相應端口,然後把數據發送給用戶,完成整個負載調度過程。
使用軟件VMware WorkStation 11,Director的DIP和RealServer的RS1、RS2的RIP為僅主機模式,讓其在同一個局域網內,Direcotr橋接宿主機模式,方便我們後邊的測試。
一台Director:
版本:Red Hat Enterprise Linux Server release 6.4 雙網卡:兩台RealServer:
版本:Red Hat Enterprise Linux Server release 6.4 單網卡:版本:ipvsadm-1.25-10.el6.x86_64.rpm搭建LVS集群只需要在Director服務器上安裝ipvsadmin工具,此處我們使用RedHat自帶的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在同一個網段,那麼真實環境你就只要將網關指向運營商給的公網地址就可以了。
測試結果為刷新一次,那麼就會換成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集群服務的實現過程。