上篇文章講述了LVS負載均衡相關理論知識,今天主要來詳細地來對LVS工做模式之一的NAT模式進行實驗配置。html
詳細原理能夠參考:http://www.javashuo.com/article/p-mukrrwyv-bb.html
首先咱們要明確的是NAT模式的最大特色是什麼?linux
能夠這樣概述:LVS負載均衡之NAT模式(NAT充當網關)是一種基於網絡地址轉換技術,經過負載均衡器實現高併發的數據請求和使用調度算法實現優化服務響應的進出口相同的架構,具有高可用高安全性能。web
而其最大劣勢在於數據的出入口都是在負載均衡器(NAT服務器上),這樣所形成的的後果就是沒法支持高併發的數據請求(巨量),而且數據的響應回傳過程加重了這一弊病。因此纔有了後續的改進。算法
首先咱們須要四臺服務器:一臺負載均衡調度器、兩臺web(這裏使用兩個Apache)服務器、一臺存儲服務器(NFS方式)。使用一臺Windows做爲外網客戶主機進行模擬。shell
架構以下:4臺Centos7和一臺win10構成vim
網段ip地址分配以下表所示:centos
設備 | ip地址 |
---|---|
win10客戶機 | 10.0.0.10/24 |
負載調度器 | 外網卡:10.0.0.1/24 內網卡:192.168.10.1/24 |
HTTP服務器1 | 192.168.10.10/24 |
HTTP服務器2 | 192.168.10.20/24 |
NFS存儲服務器 | 192.168.10.100/24 |
那麼咱們從外網的一臺客戶機進行網站訪問,實際上訪問的是負載均衡器的外網卡地址,而對於服務器端客戶機是一無所知的。那麼咱們須要進行內網與外網的互通,那麼就可使用NAT方式實現互通。從而將服務請求發送給真實服務器,獲取所需資源後再返回給負載均衡器進行NAT網絡地址轉換後將資源返回給客戶機。在生產環境中通常後臺的存儲服務器都是有多個備份的,而且資源都是一致的,不過咱們爲了驗證調度算法輪循訪問的機制,咱們就須要在兩個網站寫入不一樣的的內容加以區分驗證該調度算法。瀏覽器
下面請看具體的配置:安全
根據上面的架構圖和地址分配咱們完成這個實驗須要進行以下的步驟配置。bash
1.查看相關軟件包nfs服務
[root@nfs ~]# rpm -q nfs-utils nfs-utils-1.3.0-0.48.el7.x86_64 [root@nfs ~]# rpm -q rpcbind rpcbind-0.2.0-42.el7.x86_64 [root@nfs ~]# mkdir /opt/ll /opt/cc #建立站點文件存儲目錄
2.掛載兩塊新的磁盤而且進行設置
sdb磁盤配置:
[root@nfs ~]# fdisk /dev/sdb 歡迎使用 fdisk (util-linux 2.23.2)。 更改將停留在內存中,直到您決定將更改寫入磁盤。 使用寫入命令前請三思。 Device does not contain a recognized partition table 使用磁盤標識符 0x400f42da 建立新的 DOS 磁盤標籤。 命令(輸入 m 獲取幫助):n Partition type: p primary (0 primary, 0 extended, 4 free) e extended Select (default p): Using default response p 分區號 (1-4,默認 1): 起始 扇區 (2048-41943039,默認爲 2048): 將使用默認值 2048 Last 扇區, +扇區 or +size{K,M,G} (2048-41943039,默認爲 41943039): 將使用默認值 41943039 分區 1 已設置爲 Linux 類型,大小設爲 20 GiB 命令(輸入 m 獲取幫助):w The partition table has been altered! Calling ioctl() to re-read partition table. 正在同步磁盤。 [root@nfs ~]# mkfs.xfs /dev/sdb1 meta-data=/dev/sdb1 isize=512 agcount=4, agsize=1310656 blks = sectsz=512 attr=2, projid32bit=1 = crc=1 finobt=0, sparse=0 data = bsize=4096 blocks=5242624, imaxpct=25 = sunit=0 swidth=0 blks naming =version 2 bsize=4096 ascii-ci=0 ftype=1 log =internal log bsize=4096 blocks=2560, version=2 = sectsz=512 sunit=0 blks, lazy-count=1 realtime =none extsz=4096 blocks=0, rtextents=0
sdc磁盤配置:
[root@nfs ~]# fdisk /dev/sdc 歡迎使用 fdisk (util-linux 2.23.2)。 更改將停留在內存中,直到您決定將更改寫入磁盤。 使用寫入命令前請三思。 Device does not contain a recognized partition table 使用磁盤標識符 0x1ef07039 建立新的 DOS 磁盤標籤。 命令(輸入 m 獲取幫助):n Partition type: p primary (0 primary, 0 extended, 4 free) e extended Select (default p): Using default response p 分區號 (1-4,默認 1): 起始 扇區 (2048-41943039,默認爲 2048): 將使用默認值 2048 Last 扇區, +扇區 or +size{K,M,G} (2048-41943039,默認爲 41943039): 將使用默認值 41943039 分區 1 已設置爲 Linux 類型,大小設爲 20 GiB 命令(輸入 m 獲取幫助):w The partition table has been altered! Calling ioctl() to re-read partition table. 正在同步磁盤。 [root@nfs ~]# mkfs.xfs /dev/sdc1 meta-data=/dev/sdc1 isize=512 agcount=4, agsize=1310656 blks = sectsz=512 attr=2, projid32bit=1 = crc=1 finobt=0, sparse=0 data = bsize=4096 blocks=5242624, imaxpct=25 = sunit=0 swidth=0 blks naming =version 2 bsize=4096 ascii-ci=0 ftype=1 log =internal log bsize=4096 blocks=2560, version=2 = sectsz=512 sunit=0 blks, lazy-count=1 realtime =none extsz=4096 blocks=0, rtextents=0
3.對兩塊磁盤進行掛載設置——使用永久掛載
[root@nfs ~]# vim /etc/fstab #在該文件最後添加掛載信息,以下所示 [root@nfs ~]# tail /etc/fstab # # Accessible filesystems, by reference, are maintained under '/dev/disk' # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info # UUID=3f9b526a-3a51-4f87-b68a-37292b4e2e59 / xfs defaults 0 0 UUID=33d508c7-a776-4d6a-9c9b-a51bf3855004 /boot xfs defaults 0 0 UUID=90be4302-e340-4fe3-9ed2-3c40e346979e /home xfs defaults 0 0 UUID=09112ee8-0d24-4c5e-83d2-08c1f16bc738 swap swap defaults 0 0 /dev/sdb1 /opt/ll xfs defaults 0 0 /dev/sdc1 /opt/cc xfs defaults 0 0 [root@nfs ~]# mount -a [root@nfs ~]# df -hT 文件系統 類型 容量 已用 可用 已用% 掛載點 /dev/sda2 xfs 15G 3.7G 12G 25% / devtmpfs devtmpfs 898M 0 898M 0% /dev tmpfs tmpfs 912M 0 912M 0% /dev/shm tmpfs tmpfs 912M 9.0M 903M 1% /run tmpfs tmpfs 912M 0 912M 0% /sys/fs/cgroup /dev/sda5 xfs 11G 33M 11G 1% /home /dev/sda1 xfs 30G 174M 30G 1% /boot tmpfs tmpfs 183M 4.0K 183M 1% /run/user/42 tmpfs tmpfs 183M 16K 183M 1% /run/user/0 /dev/sdb1 xfs 20G 33M 20G 1% /opt/ll /dev/sdc1 xfs 20G 33M 20G 1% /opt/cc #編輯/etc/exports文件 [root@nfs network-scripts]# vim /etc/exports [root@nfs network-scripts]# cat /etc/exports /opt/ll 192.168.10.0/24(rw,sync,no_root_squash) /opt/cc 192.168.10.0/24(rw,sync,no_root_squash)
4.關閉防火牆配置網卡爲僅主機模式而且設置靜態ip地址
[root@nfs ~]# systemctl stop firewalld.service [root@nfs ~]# setenforce 0 [root@nfs ~]# cd /etc/sysconfig/network-scripts/ [root@nfs network-scripts]# vim ifcfg-ens33 [root@nfs network-scripts]# systemctl restart network [root@nfs network-scripts]# ifconfig ens33 ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.10.100 netmask 255.255.255.0 broadcast 192.168.10.255 inet6 fe80::9be8:a170:f918:1f5 prefixlen 64 scopeid 0x20<link> ether 00:0c:29:0b:d9:36 txqueuelen 1000 (Ethernet) RX packets 1151 bytes 685357 (669.2 KiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 444 bytes 39849 (38.9 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
5.啓動服務
[root@nfs network-scripts]# systemctl start nfs [root@nfs network-scripts]# systemctl start rpcbind [root@nfs network-scripts]# showmount -e #查看掛載狀況信息 Export list for nfs: /opt/cc 192.168.10.0/24 /opt/ll 192.168.10.0/24
1.在兩臺Centos7虛擬機上安裝httpd網站服務
[root@localhost ~]# hostnamectl set-hostname web1 [root@localhost ~]# su [root@web1 ~]# yum install -y httpd ...//省略部份內容 [root@localhost ~]# hostnamectl set-hostname web2 [root@localhost ~]# su [root@web2 ~]# yum install -y httpd ...//省略部份內容
2.關閉兩個web網站服務器防火牆
[root@web1 ~]# systemctl stop firewalld.service [root@web1 ~]# setenforce 0 [root@web2 ~]# systemctl stop firewalld.service [root@web2 ~]# setenforce 0
3.配置網卡
#web1配置 [root@web1 ~]# cd /etc/sysconfig/network-scripts/ [root@web1 network-scripts]# vim ifcfg-ens33 [root@web1 network-scripts]# systemctl restart network [root@web1 network-scripts]# ifconfig ens33 ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.10.10 netmask 255.255.255.0 broadcast 192.168.10.255 inet6 fe80::bdab:b59b:d041:d8b0 prefixlen 64 scopeid 0x20<link> ether 00:0c:29:e6:6d:eb txqueuelen 1000 (Ethernet) RX packets 726004 bytes 1067841474 (1018.3 MiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 345476 bytes 21387015 (20.3 MiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 #web2配置 [root@web2 ~]# cd /etc/sysconfig/network-scripts/ [root@web2 network-scripts]# vim ifcfg-ens33 [root@web2 network-scripts]# systemctl restart network [root@web2 network-scripts]# ifconfig ens33 ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.10.20 netmask 255.255.255.0 broadcast 192.168.10.255 inet6 fe80::bdab:b59b:d041:d8b0 prefixlen 64 scopeid 0x20<link> ether 00:0c:29:e6:6d:eb txqueuelen 1000 (Ethernet) RX packets 726004 bytes 1067841474 (1018.3 MiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 345476 bytes 21387015 (20.3 MiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
4.啓動兩個web網站服務而且驗證掛載狀況
#web1 [root@web1 network-scripts]# systemctl start httpd [root@web1 network-scripts]# netstat -natp | grep 80 tcp6 0 0 :::80 :::* LISTEN 59242/httpd [root@web1 network-scripts]# showmount -e 192.168.10.100 Export list for 192.168.10.100: /opt/cc 192.168.10.0/24 /opt/ll 192.168.10.0/24 #web2 [root@web2 network-scripts]# netstat -natp | grep 80 [root@web2 network-scripts]# systemctl start httpd.service [root@web2 network-scripts]# netstat -natp | grep 80 tcp6 0 0 :::80 :::* LISTEN 54271/httpd [root@web2 network-scripts]# showmount -e 192.168.10.100 Export list for 192.168.10.100: /opt/cc 192.168.10.0/24 /opt/ll 192.168.10.0/24
5.兩個服務器上分別提供站點,寫入測試信息
#web1 [root@web1 network-scripts]#vim /etc/fstab 192.168.10.100:/opt/ll /var/www/html nfs defaults._netdev 0 0 [root@web1 network-scripts]# cd /var/www/html/ [root@web1 html]# ls [root@web1 html]# vim index.html [root@web1 html]# cat index.html <head>this is ll web</head> #web2 [root@web2 network-scripts]#vim /etc/fstab 192.168.10.100:/opt/cc /var/www/html nfs defaults._netdev 0 0 [root@web2 network-scripts]# cd /var/www/html/ [root@web2 html]# ls [root@web2 html]# vim index.html [root@web2 html]# cat index.html <head>this is cc web</head>
1.安裝環境包
[root@localhost ~]# hostnamectl set-hostname lvs [root@localhost ~]# su [root@lvs ~]# yum install -y ipvsadm 已加載插件:fastestmirror, langpacks Loading mirror speeds from cached hostfile * base: mirrors.aliyun.com * extras: mirrors.163.com * updates: mirrors.tuna.tsinghua.edu.cn 正在解決依賴關係 --> 正在檢查事務 ---> 軟件包 ipvsadm.x86_64.0.1.27-7.el7 將被 安裝 --> 解決依賴關係完成 依賴關係解決 ======================================================================================= Package 架構 版本 源 大小 ======================================================================================= 正在安裝: ipvsadm x86_64 1.27-7.el7 base 45 k 事務概要 ======================================================================================= 安裝 1 軟件包 總下載量:45 k 安裝大小:75 k Downloading packages: 警告:/var/cache/yum/x86_64/7/base/packages/ipvsadm-1.27-7.el7.x86_64.rpm: 頭V3 RSA/SHA256 Signature, 密鑰 ID f4a80eb5: NOKEY ipvsadm-1.27-7.el7.x86_64.rpm 的公鑰還沒有安裝 ipvsadm-1.27-7.el7.x86_64.rpm | 45 kB 00:00:00 從 file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7 檢索密鑰 導入 GPG key 0xF4A80EB5: 用戶ID : "CentOS-7 Key (CentOS 7 Official Signing Key) <security@centos.org>" 指紋 : 6341 ab27 53d7 8a78 a7c2 7bb1 24c6 a8a7 f4a8 0eb5 軟件包 : centos-release-7-4.1708.el7.centos.x86_64 (@anaconda) 來自 : /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7 Running transaction check Running transaction test Transaction test succeeded Running transaction 正在安裝 : ipvsadm-1.27-7.el7.x86_64 1/1 驗證中 : ipvsadm-1.27-7.el7.x86_64 1/1 已安裝: ipvsadm.x86_64 0:1.27-7.el7 完畢!
2.配置雙網卡
添加網卡,而後進行設置
[root@lvs ~]# cd /etc/sysconfig/network-scripts/ [root@lvs network-scripts]# ls ifcfg-ens33 ifdown-isdn ifup ifup-plip ifup-tunnel ifcfg-lo ifdown-post ifup-aliases ifup-plusb ifup-wireless ifdown ifdown-ppp ifup-bnep ifup-post init.ipv6-global ifdown-bnep ifdown-routes ifup-eth ifup-ppp network-functions ifdown-eth ifdown-sit ifup-ib ifup-routes network-functions-ipv6 ifdown-ib ifdown-Team ifup-ippp ifup-sit ifdown-ippp ifdown-TeamPort ifup-ipv6 ifup-Team ifdown-ipv6 ifdown-tunnel ifup-isdn ifup-TeamPort [root@lvs network-scripts]# vim ifcfg-ens33 [root@lvs network-scripts]# cp -p ifcfg-ens33 ifcfg-ens36 #配置網卡後重啓網絡 [root@lvs network-scripts]# systemctl restart network
兩個網卡信息以下:
[root@lvs network-scripts]# ifconfig ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 10.0.0.1 netmask 255.255.255.0 broadcast 10.0.0.255 inet6 fe80::7eb1:2dde:8a54:6927 prefixlen 64 scopeid 0x20<link> ether 00:0c:29:56:d3:4a txqueuelen 1000 (Ethernet) RX packets 397693 bytes 574961333 (548.3 MiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 92656 bytes 5683776 (5.4 MiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 ens36: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.10.1 netmask 255.255.255.0 broadcast 192.168.10.255 inet6 fe80::e638:fc7c:8a5b:dc5d prefixlen 64 scopeid 0x20<link> ether 00:0c:29:56:d3:54 txqueuelen 1000 (Ethernet) RX packets 51 bytes 6809 (6.6 KiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 83 bytes 13712 (13.3 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
3.測試是否互通
root@lvs network-scripts]# ping 192.168.10.10 PING 192.168.10.10 (192.168.10.10) 56(84) bytes of data. 64 bytes from 192.168.10.10: icmp_seq=1 ttl=64 time=0.552 ms 64 bytes from 192.168.10.10: icmp_seq=2 ttl=64 time=0.299 ms 64 bytes from 192.168.10.10: icmp_seq=3 ttl=64 time=0.255 ms ^C --- 192.168.10.10 ping statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 2001ms rtt min/avg/max/mdev = 0.255/0.368/0.552/0.132 ms [root@lvs network-scripts]# ping 192.168.10.20 PING 192.168.10.20 (192.168.10.20) 56(84) bytes of data. 64 bytes from 192.168.10.20: icmp_seq=1 ttl=64 time=0.536 ms 64 bytes from 192.168.10.20: icmp_seq=2 ttl=64 time=0.340 ms ^C --- 192.168.10.20 ping statistics --- 2 packets transmitted, 2 received, 0% packet loss, time 1000ms rtt min/avg/max/mdev = 0.340/0.438/0.536/0.098 ms
4.開啓路由轉發功能
[root@lvs network-scripts]# vim /etc/sysctl.conf #末尾加上 root@lvs network-scripts]# cat /etc/sysctl.conf # sysctl settings are defined through files in # /usr/lib/sysctl.d/, /run/sysctl.d/, and /etc/sysctl.d/. # # Vendors settings live in /usr/lib/sysctl.d/. # To override a whole file, create a new file with the same in # /etc/sysctl.d/ and put new settings there. To override # only specific settings, add a file with a lexically later # name in /etc/sysctl.d/ and put new settings there. # # For more information, see sysctl.conf(5) and sysctl.d(5). net.ipv4.ip_forward=1
5.設置防火牆及其規則
[root@lvs network-scripts]# systemctl status firewalld.service ● firewalld.service - firewalld - dynamic firewall daemon Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled) Active: active (running) since 四 2020-02-20 09:34:20 CST; 8min ago Docs: man:firewalld(1)
此時防火牆是開啓狀態,不須要將其關閉,咱們可使用iptables進行設置
#清空轉發表 [root@lvs network-scripts]# iptables -F #清空nat地址轉發表 [root@lvs network-scripts]# iptables -t nat -F #配置轉發規則(四表五鏈) [root@lvs network-scripts]# iptables -t nat -A POSTROUTING -o ens33 -s 192.168.10.0/24 -j SNAT --to-source 10.0.0.1 #加載路由轉發功能 [root@lvs network-scripts]# sysctl -p net.ipv4.ip_forward = 1
6.加載LVS內核模塊
[root@lvs network-scripts]# modprobe ip_vs #加載命令 [root@lvs network-scripts]# cat /proc/net/ip_vs #查看 IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn [root@lvs network-scripts]# systemctl start ipvsadm Job for ipvsadm.service failed because the control process exited with error code. See "systemctl status ipvsadm.service" and "journalctl -xe" for details. #Centos7系統須要使用--save保存 [root@lvs network-scripts]# ipvsadm --save > /etc/sysconfig/ipvsadm [root@lvs network-scripts]# systemctl start ipvsadm
7.定義腳本
[root@lvs network-scripts]# cd /opt/ [root@lvs opt]# vim nat.sh [root@lvs opt]# chmod 777 nat.sh [root@lvs opt]# ./nat.sh IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP lvs:http rr -> 192.168.10.10:http Masq 1 0 0 -> 192.168.10.20:http Masq 1 0 0
nat.sh的腳本以下:
#!/bin/bash #echo "1" > /proc/sys/net/ipv4/ip_forward 這裏以前設置過,因此註釋了 ipvsadm -C #初始化 ipvsadm -A -t 10.0.0.1:80 -s rr #指定訪問入口,rr指定的是輪循算法 ipvsadm -a -t 10.0.0.1:80 -r 192.168.10.10:80 -m #創建ip地址映射關係 ipvsadm -a -t 10.0.0.1:80 -r 192.168.10.20:80 -m ipvsadm #開啓
咱們能夠用win10虛擬機或者一臺Centos7客戶機測試
可是都須要進行網卡設置,設置爲僅主機模式且ip地址爲10.0.0.10(10.0.0.0網段就行),網關爲lvs負載均衡器外網口ip地址,在客戶端的瀏覽器中訪問的也是這個地址;測試結果的圖以下所示:
1.網卡和網絡測試
2.測試網站服務及輪循機制
訪問lvs外網網關,lvs做爲中間件或者說橋樑的角色,其實本質上是訪問網站和存儲服務器
刷新訪問切換服務器
這邊在線網上實際上兩個存儲的頁面內容是保持一致的,這裏主要是爲了測試輪循機制的效果,你們須要注意一下。
至此就是lvs負載均衡NAT模式的配置流程和測試方法,謝謝閱讀!