負載均衡羣集(Load Balance Cluster)
以提高應用系統的響應能力、儘可能處理更多的訪問請求、減少延遲爲目標,獲得高併發、高負載(LB)的整體性能LB的負載分配依賴於主節點的分流算法
羣集的負載調度技術有三種工作模式
- 地址轉換(本文只介紹NAT模式)
- IP隧道
- 直接路由
NAT模式
地址轉換 (Network AddressTranslation)
- 簡稱NAT模式,類似於防火牆的私有網絡結構,負載調度器作爲所有服務器節點的網關,即作爲客戶機的訪問入口,也是各節點回應客戶機的訪問出口
- 服務器節點使用私有IP地址,與負載調度器位於同一一個物理網絡,安全性要優於其他兩種方式
負載均衡羣集架構
負載均衡的結構
- 第一層,負載調度器(Load Balancer或Director)
- 第二層,服務器池(Server Pool)
- 第三層,共享存儲(Share Storage)
LVS的負載調度算法
輪詢(Round Robin)
將收到的訪問請求按照順序輪流分配給羣集中的各節點(真實服務器)均等地對待每一臺服務器,而不管服務器實際的連接數和系統負載
加權輪詢(Weighted Round Robin)
- 根據真實服務器的處理能力輪流分配收到的訪問請求,調度器可以自動查詢各節點的負載情況,並動態調整其權重
- 保證處理能力強的服務器承擔更多的訪問流量
最少連接(Least Connections)
根據真實服務器已建立的連接數進行分配,將收到的訪問請求優先分配給連接數最少的節點
加權最少連接(Weighted Least Connections)
- 在服務器節點的性能差異較大的情況下,可以爲真實服務器自動調整權重
- 權重較高的節點將承擔更大比例的活動連接負載
實驗操作
實驗環境
調度服務器(centos7):
外(ens36):12.0.0.1
內(ens33):192.168.200.1
web服務器1(centos7):192.168.200.110
web服務器2(centos7):192.168.200.120
存儲服務器(centos7):192.168.200.130
client客戶端(win10):12.0.0.12
1、驗證存儲服務器是否安裝相關服務
[root@localhost ~]# rpm -q nfs-utils
nfs-utils-1.3.0-0.48.el7.x86_64 #已安裝
[root@localhost ~]# rpm -q rpcbind
rpcbind-0.2.0-42.el7.x86_64 #已安裝
[root@localhost ~]#
2、分別驗證兩臺web服務器是否安裝httpd服務,若沒有,則安裝
第一臺:
[root@localhost ~]# rpm -q httpd
未安裝軟件包 httpd
[root@localhost ~]# yum install httpd -y
.................//省略安裝過程
[root@localhost ~]#
第二臺:
[root@localhost ~]# rpm -q httpd
未安裝軟件包 httpd
[root@localhost ~]# yum install httpd -y
.................//省略安裝過程
[root@localhost ~]#
3、驗證調度服務器是否有管理工具,若沒有,則安裝
[root@localhost ~]# rpm -q ipvsadm
未安裝軟件包 ipvsadm
[root@localhost ~]# yum install ipvsadm -y
.................//省略安裝過程
[root@localhost ~]#
一、配置調度服務器
1、將配置服務器的網絡模式改爲僅主機
2、配置存儲服務器,固定IP地址
[root@localhost ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static #dhcp改爲static
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33
UUID=09073596-a7cf-404c-a098-28c3ff58c44b
DEVICE=ens33
ONBOOT=yes
IPADDR=192.168.200.130 #IP地址
NETMASK=255.255.255.0 #子網掩碼
GATEWAY=192.168.200.1 #網關
[root@localhost ~]# systemctl restart network #重啓網絡服務
[root@localhost ~]# ifconfig #查看網卡信息,ip設置成功
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.200.130 netmask 255.255.255.0 broadcast 192.168.200.255
inet6 fe80::5134:22f5:842b:5201 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:0d:f1:75 txqueuelen 1000 (Ethernet)
RX packets 818 bytes 69866 (68.2 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 319 bytes 44103 (43.0 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
3、關閉防火牆,開啓存儲共享服務
[root@localhost ~]# systemctl stop firewalld.service #關閉防火牆
[root@localhost ~]# setenforce 0 #關閉增強性安全功能
[root@localhost ~]#
[root@localhost ~]# systemctl start nfs.service #開啓nfs服務
[root@localhost ~]# systemctl start rpcbind #開啓rpcbind服務
[root@localhost ~]#
4、修改配置文件/etc/exports
[root@localhost ~]# vim /etc/exports
/usr/share *(ro,sync) #共享目錄給所有用戶,權限制度
/opt/abc/ 192.168.200.0/24(rw,sync) #共享目錄到固定網段用戶,權限讀寫
/opt/xyz/ 192.168.200.0/24(rw,sync) #共享目錄到固定網段用戶,權限讀寫
5、創建共享目錄,並授予權限
[root@localhost ~]# cd /opt/
[root@localhost opt]# ls
rh
[root@localhost opt]# mkdir abc xyz #創建目錄
[root@localhost opt]# ll
總用量 0
drwxr-xr-x. 2 root root 6 11月 26 17:33 abc
drwxr-xr-x. 2 root root 6 3月 26 2015 rh
drwxr-xr-x. 2 root root 6 11月 26 17:33 xyz
[root@localhost opt]# chmod 777 abc xyz #授權
[root@localhost opt]# ll
總用量 0
drwxrwxrwx. 2 root root 6 11月 26 17:33 abc
drwxr-xr-x. 2 root root 6 3月 26 2015 rh
drwxrwxrwx. 2 root root 6 11月 26 17:33 xyz
[root@localhost opt]#
6、重新加載配置
[root@localhost opt]# exportfs -rv
exporting 192.168.200.0/24:/opt/xyz
exporting 192.168.200.0/24:/opt/abc
exporting *:/usr/share
[root@localhost opt]#
二、web服務器1的配置
1、修改web服務器1的網絡模式爲僅主機
2、配置固定IP地址
[root@localhost ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static #dhcp改爲static
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33
UUID=3ceed540-b04c-48d6-a4f7-79951f09ea1d
DEVICE=ens33
ONBOOT=yes
IPADDR=192.168.200.110 #IP地址
NETMASK=255.255.255.0 #子網掩碼
GATEWAY=192.168.200.1 #網關
[root@localhost ~]# systemctl restart network #重啓網絡服務
[root@localhost ~]# ifconfig #查看網卡信息,ip設置成功
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.200.110 netmask 255.255.255.0 broadcast 192.168.200.255
inet6 fe80::3e1d:31ba:f66a:6f80 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:27:1c:3f txqueuelen 1000 (Ethernet)
RX packets 12581 bytes 15759224 (15.0 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 6118 bytes 501343 (489.5 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
3、關閉防火牆,並開啓http服務
[root@localhost ~]# systemctl stop firewalld.service #關閉防火牆
[root@localhost ~]# setenforce 0 #關閉增強性安全功能
[root@localhost ~]# systemctl start httpd.service #開啓http服務
[root@localhost ~]# netstat -ntap | grep 80 #查看端口
tcp6 0 0 :::80 :::* LISTEN 50076/httpd
[root@localhost ~]#
4、查看NFS服務共享信息
[root@localhost ~]# showmount -e 192.168.200.130
Export list for 192.168.200.130:
/usr/share *
/opt/xyz 192.168.200.0/24
/opt/abc 192.168.200.0/24
[root@localhost ~]#
5、掛載NFS的共享目錄,並查看是否掛載成功
[root@localhost ~]# mount.nfs 192.168.200.130:/opt/abc /var/www/html/ #掛載
[root@localhost ~]# df -h #查看掛載信息
文件系統 容量 已用 可用 已用% 掛載點
/dev/sda2 20G 3.4G 17G 17% /
devtmpfs 898M 0 898M 0% /dev
tmpfs 912M 0 912M 0% /dev/shm
tmpfs 912M 18M 895M 2% /run
tmpfs 912M 0 912M 0% /sys/fs/cgroup
/dev/sda5 10G 37M 10G 1% /home
/dev/sda1 6.0G 174M 5.9G 3% /boot
tmpfs 183M 4.0K 183M 1% /run/user/42
tmpfs 183M 40K 183M 1% /run/user/0
192.168.200.130:/opt/abc 20G 3.3G 17G 17% /var/www/html #掛載成功
[root@localhost ~]#
6、在掛載目錄創建首頁文件,並在存儲服務器,查看是否創建文件成功
web服務器1:
[root@localhost ~]# echo "this is abc web" > /var/www/html/index.html #創建首頁文件
[root@localhost ~]#
存儲服務器:
[root@localhost opt]# cd abc/
[root@localhost abc]# ls
index.html #創建成功
[root@localhost abc]#
三、web服務器2的配置
1、修改web服務器2的網絡模式爲僅主機
2、配置固定IP地址
[root@localhost ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static #將dhcp改爲static
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33
UUID=8ecd53ce-afdb-46f8-b7ff-b2f428a3bc8f
DEVICE=ens33
ONBOOT=yes
IPADDR=192.168.200.120 #IP地址
NETMASK=255.255.255.0 #子網掩碼
GATEWAY=192.168.200.1 #網關
[root@localhost ~]# systemctl restart network #重啓網絡服務
[root@localhost ~]# ifconfig #查看網卡信息,ip設置成功
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.200.120 netmask 255.255.255.0 broadcast 192.168.200.255
inet6 fe80::c776:9d00:618:88f2 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:eb:34:07 txqueuelen 1000 (Ethernet)
RX packets 13713 bytes 15997026 (15.2 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 5590 bytes 452930 (442.3 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
3、關閉防火牆,並開啓http服務
[root@localhost ~]# systemctl stop firewalld.service #關閉防火牆
[root@localhost ~]# setenforce 0 #關閉增強性安全功能
[root@localhost ~]# systemctl start httpd.service #開啓http服務
[root@localhost ~]# netstat -ntap | grep 80 #查看端口
tcp6 0 0 :::80 :::* LISTEN 50572/httpd
[root@localhost ~]#
4、查看NFS服務共享信息
[root@localhost ~]# showmount -e 192.168.200.130
Export list for 192.168.200.130:
/usr/share *
/opt/xyz 192.168.200.0/24
/opt/abc 192.168.200.0/24
[root@localhost ~]#
5、掛載NFS的共享目錄,並查看是否掛載成功
[root@localhost ~]# mount.nfs 192.168.200.130:/opt/xyz /var/www/html/ #掛載
[root@localhost ~]# df -h #查看掛載信息
文件系統 容量 已用 可用 已用% 掛載點
/dev/sda2 20G 3.4G 17G 17% /
devtmpfs 898M 0 898M 0% /dev
tmpfs 912M 0 912M 0% /dev/shm
tmpfs 912M 18M 895M 2% /run
tmpfs 912M 0 912M 0% /sys/fs/cgroup
/dev/sda5 10G 37M 10G 1% /home
/dev/sda1 6.0G 174M 5.9G 3% /boot
tmpfs 183M 4.0K 183M 1% /run/user/42
tmpfs 183M 40K 183M 1% /run/user/0
192.168.200.130:/opt/xyz 20G 3.3G 17G 17% /var/www/html #掛載成功
[root@localhost ~]#
6、在掛載目錄創建首頁文件,並在存儲服務器,查看是否創建文件成功
web服務器2:
[root@localhost ~]# echo "this is xyz web" > /var/www/html/index.html #創建首頁文件
[root@localhost ~]#
存儲服務器:
[root@localhost abc]# cd ../xyz/
[root@localhost xyz]# ls
index.html #創建成功
[root@localhost xyz]#
四、調度服務器的配置
1、給調度服務器添加一塊網卡,把兩個網卡的網絡模式都改爲僅主機
2、修改ens33網卡配置文件,設置固定IP
[root@localhost ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static #將dhcp改爲static
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33
UUID=c96bc909-188e-ec64-3a96-6a90982b08ad
DEVICE=ens33
ONBOOT=yes
IPADDR=192.168.200.1 #IP地址
NETMASK=255.255.255.0 #子網掩碼
3、修改ens36網卡配置文件,設置固定IP
[root@localhost ~]# cd /etc/sysconfig/network-scripts/
[root@localhost network-scripts]# cp ifcfg-ens33 ifcfg-ens36 #複製一份ens33的配置文件作爲ens36配置文件
[root@localhost network-scripts]# vim ifcfg-ens36
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static #將dhcp改爲static
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens36 #ens33改爲ens36,並刪除UUID
DEVICE=ens36 #ens33改爲ens36
ONBOOT=yes
IPADDR=12.0.0.1 #IP地址
NETMASK=255.255.255.0 #子網掩碼
4、重啓網絡服務,檢查IP配置是否成功
[root@localhost network-scripts]# systemctl restart network #重啓網絡服務
[root@localhost network-scripts]# ifconfig #查看網卡信息
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.200.1 netmask 255.255.255.0 broadcast 192.168.200.255
inet6 fe80::28ad:c7f1:25e8:8708 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:95:9b:1b txqueuelen 1000 (Ethernet)
RX packets 11757 bytes 12899133 (12.3 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 4731 bytes 325771 (318.1 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
ens36: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 12.0.0.1 netmask 255.255.255.0 broadcast 12.0.0.255
inet6 fe80::10ce:358b:94ed:c4e9 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:95:9b:25 txqueuelen 1000 (Ethernet)
RX packets 130 bytes 10117 (9.8 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 178 bytes 30232 (29.5 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
5、修改配置文件/etc/sysctl.conf
[root@localhost ~]# vim /etc/sysctl.conf
net.ipv4.ip_forward=1 #開啓路由功能
[root@localhost ~]# sysctl -p #重新加載/etc/sysctl.conf中配置
net.ipv4.ip_forward = 1
[root@localhost ~]#
6、配置NAT轉換
[root@localhost ~]# iptables -t nat -F #清除nat緩存
[root@localhost ~]# iptables -F #清除規則
[root@localhost ~]# iptables -t nat -A POSTROUTING -o ens36 -s 192.168.200.0/24 -j SNAT --to-source 12.0.0.1
#配置NAT轉換
[root@localhost ~]#
7、開啓ipvsadm服務
[root@localhost ~]# modprobe ip_vs #啓動模塊
[root@localhost ~]# 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@localhost ~]# ipvsadm --save > /etc/sysconfig/ipvsadm #保存服務配置
[root@localhost ~]# systemctl start ipvsadm.service #開啓服務
[root@localhost ~]#
8、添加ipvsadm服務腳本,並執行
[root@localhost ~]# cd /opt/ #切換目錄
[root@localhost opt]# vim nat.sh #編輯腳本
#!/bin/bash
ipvsadm -C #清除內核虛擬服務器表中的所有記錄
ipvsadm -A -t 12.0.0.1:80 -s rr #增加一臺新的虛擬服務器
ipvsadm -a -t 12.0.0.1:80 -r 192.168.200.110:80 -m #在虛擬服務器中增加一臺新的真實服務器。
ipvsadm -a -t 12.0.0.1:80 -r 192.168.200.120:80 -m #在虛擬服務器中增加一臺新的真實服務器。
ipvsadm #開啓服務
[root@localhost opt]# source nat.sh #執行腳本
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP localhost.localdomain:http rr
-> 192.168.200.110:http Masq 1 0 0
-> 192.168.200.120:http Masq 1 0 0
[root@localhost opt]#
ipvsadm相關可選項含義:
-A:在內核的虛擬服務器列表中添加一條新的虛擬服務器記錄。也就是增加一臺新的虛擬服務器。虛擬服務器地址由三元組唯一定義:IP地址,端口號和協議。虛擬服務器也可以由防火牆標記定義。
-C:清除內核虛擬服務器表中的所有記錄。
-a:在內核虛擬服務器表的一條記錄裏添加一條新的真實服務器記錄。也就是在一個虛擬服務器中增加一臺新的真實服務器。
-t:說明虛擬服務器提供的是tcp 的服務。
-s:將TCP連接和UDP數據報分配給真實服務器的算法。
-m:使用僞裝(網絡訪問轉換或NAT)。
rr:輪詢,調度器通過”輪詢”調度算法將外部請求按順序輪流分配到集羣中的真實服務器上,它均等地對待每一臺服務器,而不管服務器上實際的連接數和系統負載。
wrr:加權輪詢,調度器通過”加權輪詢”調度算法根據真實服務器的不同處理能力來調度訪問請求。這樣可以保證處理能力強的服務器處理更多的訪問流量。調度器可以自動問詢真實服務器的負載情況,並動態地調整其權值。
lc:最少連接,當有新的作業到達時,調度器選擇一個當前作業量較少的真實服務器,並把新到達的作業分配給它。如果集羣系統的真實服務器具有相近的系統性能,採用”最小連接”調度算法可以較好地均衡負載。
wlc:加權最小連接,將更多的作業分配給作業較少且相對於權重較高(Ci / Wi)的服務器。這是默認值。