遊戲速通大會AGDQ將於本週末線上舉行
叢集分類
負載均衡叢集LB:客戶端負載在叢集中儘量平均分攤,減少伺服器壓力
高可用叢集HA:避免單點故障,當一個系統發生故障時,能夠快速遷移(主備)
高效能運算叢集:通過以叢集開發的並行應用程式,解決複雜的科學問題
LVS叢集的組成
-
前端:負載均衡層
由一臺或多臺負載均衡排程器構成
-
中間:伺服器群組層
由一組實際執行的應用服務的伺服器組成
-
低端:資料共享儲存層
提供共享儲存空間的儲存區域
LVS術語
-
Director Server:排程伺服器
將負載分發到Real Server的伺服器
-
Real Server:真實伺服器
真正提供應用服務的伺服器
-
VIP:虛擬IP地址
公佈給使用者訪問的虛擬IP地址
-
DIP:排程器連線後端節點伺服器的IP地址
-
RIP:真實IP地址
叢集節點上使用的IP地址
負載均衡排程演算法
-
LVS目前實現了10種排程演算法
-
常用排程演算法有4種
-
輪詢rr(Round Robin)
-
加權輪詢wrr(Weighted Round Robin)
-
最少連線lc(Least Connections)
-
加權最少連線wlc(Weighted Least Connections)
-
-
其他排程演算法
-
源地址雜湊
-
目標地址雜湊
-
基於區域性性的最少連結
-
帶複製的基於區域性性的最少連結
-
最短的期望的延遲
-
最少佇列排程
-
ipvsadm命令用法
-
ipvsadm命令選項
命令選項 | 含義 |
---|---|
ipvsadmin -A | (add)新增虛擬伺服器 |
ipvsadmin -E | (edit)修改虛擬伺服器的排程演算法 |
ipvsadmin -D | (delete)刪除虛擬伺服器 |
ipvsadmin -C | (clear)清空所有 |
ipvsadmin -a | (add)新增真實伺服器 |
ipvsadmin -e | (edit)修改真實伺服器 |
ipvsadmin -d | (delete)刪除真實伺服器 |
ipvsadmin -L |
(list)檢視LVS規則表 |
-s (rr|wrr|lc|wlc|sh) | (scheduler)叢集排程演算法 |
-
ipvsadm語法案例
命令 | 含義 |
---|---|
ipvsadm -A -t|u 192.168.4.5:80 -s 【演算法】 | 新增虛擬伺服器,協議為tcp(-t)或者udp(-u) |
ipvsadm -E -t|u 192.168.4.5:80 -s 【演算法】 | 修改虛擬伺服器,協議為tcp或udp |
ipvsadm -D -t|u 192.168.4.5:80 | 刪除虛擬伺服器,協議為tcp或udp |
ipvsadm -C | 清空所有 |
ipvsadm -a -t|u 192.168.4.5:80 -r 192.168.2.100 【-g|i|m】 【-w 權重】 | 新增真實伺服器 -g(DR模式),-i(隧道模式),-m(NAT模式) |
ipvsadm -e -t|u 192.168.4.5:80 -r 192.168.2.100 【-g|i|m】 【-w 權重】 | 修改真實伺服器 |
ipvsadm -d -t|u 192.168.4.5:80 -r 192.168.2.100 | 刪除真實伺服器 |
ipvsadm -Ln | 檢視LVS規則表 |
使用命令增、刪、改LVS叢集規則
建立LVS虛擬叢集伺服器(演算法為加權輪詢:wrr)
[root@proxy ~]# yum -y install ipvsadm
[root@proxy ~]# ipvsadm -A -t 192.168.4.5:80 -s wrr
[root@proxy ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.4.5:80 wrr
為叢集新增若干real server
[root@proxy ~]# ipvsadm -a -t 192.168.4.5:80 -r 192.168.2.100
[root@proxy ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.4.5:80 wrr
-> 192.168.2.100:80 router 1 0 0
[root@proxy ~]# ipvsadm -a -t 192.168.4.5:80 -r 192.168.2.200 -m -w 2
[root@proxy ~]# ipvsadm -a -t 192.168.4.5:80 -r 192.168.2.201 -m -w 3
[root@proxy ~]# ipvsadm -a -t 192.168.4.5:80 -r 192.168.2.202 -m -w 4
修改叢集伺服器設定(修改排程器演算法,將加權輪詢修改為輪詢)
[root@proxy ~]# ipvsadm -E -t 192.168.4.5:80 -s rr
[root@proxy ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.4.5:80 rr
-> 192.168.2.100:80 router 1 0 0
-> 192.168.2.200:80 masq 2 0 0
-> 192.168.2.201:80 masq 2 0 0
-> 192.168.2.202:80 masq 1 0 0
修改real server(使用-g選項,將模式改為DR模式)
[root@proxy ~]# ipvsadm -e -t 192.168.4.5:80 -r 192.168.2.202 -g
檢視LVS規則
[root@proxy ~]# ipvsadm -Ln
建立另一個叢集(演算法為最少連線演算法;使用-m選項,設定工作模式為NAT模式)
[root@proxy ~]# ipvsadm -A -t 192.168.4.5:3306 -s lc
[root@proxy ~]# ipvsadm -a -t 192.168.4.5:3306 -r 192.168.2.100 -m
[root@proxy ~]# ipvsadm -a -t 192.168.4.5:3306 -r 192.168.2.200 -m
注意:永久規則需要確保ipvsadm服務為開機啟動服務才可以。
(systemctl enable ipvsadm)。
清空所有規則
[root@proxy ~]# ipvsadm -C
LVS工作模式
-
VS/NAT
-
通過網路地址轉換實現的虛擬伺服器
-
大併發訪問時,排程器的效能成為瓶頸
-
-
VS/DR
-
直接使用路由技術實現虛擬伺服器
-
節點伺服器需要配置VIP,注意MAC地址廣播
-
-
VS/TUN
-
通過隧道方式實現虛擬伺服器
-
NAT模式
使用LVS實現NAT模式的叢集排程伺服器,為使用者提供Web服務:
-
叢集對外公網IP地址為192.168.4.5
-
排程器內網IP地址為192.168.2.5
-
真實Web伺服器地址分別為192.168.2.100、192.168.2.200
-
使用加權輪詢排程演算法,真實伺服器權重任意
環境準備:
主機 | 網路配置 |
---|---|
client | eth0:192.168.4.10/24 |
lvs(閘道器裝置) | eth0:192.168.4.5/24 eth1:192.168.2.5/24 |
web1 | eth0:192.168.2.100/24 閘道器:192.168.2.5 |
web2 | eth0:192.168.2.200/24 閘道器:192.168.2.5 |
配置後端web環境
1)設定Web伺服器
[root@web1 ~]# yum -y install httpd #安裝軟體
[root@web1 ~]# echo "192.168.2.100" > /var/www/html/index.html #建立網頁檔案
[root@web1 ~]# firewall-cmd --set-default-zone=trusted #設定防火牆
[root@web1 ~]# setenforce 0
[root@web1 ~]# sed -i '/SELINUX/s/enforcing/permissive/' /etc/selinux/config
[root@web2 ~]# yum -y install httpd #安裝軟體
[root@web2 ~]# echo "192.168.2.200" > /var/www/html/index.html #建立網頁檔案
[root@web2 ~]# firewall-cmd --set-default-zone=trusted #設定防火牆
[root@web2 ~]# setenforce 0
[root@web2 ~]# sed -i '/SELINUX/s/enforcing/permissive/' /etc/selinux/config
2)啟動Web伺服器軟體
[root@web1 ~]# systemctl restart httpd
[root@web2 ~]# systemctl restart httpd
3)配置閘道器,將web1和web2的閘道器設定為192.168.2.5(不能照抄網絡卡名稱)
如果有4網段的IP,則臨時將該網絡卡關閉nmcli con down 網絡卡名稱
[root@web1 ~]# nmcli connection modify eth1 \
ipv4.method manual ipv4.gateway 192.168.2.5
#備註:網絡卡名稱不能照抄,需要自己檢視下2.100的網絡卡名稱
[root@web1 ~]# nmcli connection up eth1
[root@web1 ~]# ip route show #檢視預設閘道器
default via 192.168.2.5 dev eth1 #提示:這裡default後面的IP就是預設閘道器
#英語詞彙:default(預設,預設值)
… …
[root@web2 ~]# nmcli connection modify eth1 \
ipv4.method manual ipv4.gateway 192.168.2.5
#備註:網絡卡名稱不能照抄,需要自己檢視下2.200的網絡卡名稱
[root@web2 ~]# nmcli connection up eth1
[root@web2 ~]# ip route show #檢視預設閘道器,default後面的IP就是預設閘道器
部署LVS-NAT模式排程器
1)確認排程器的路由轉發功能(如果已經開啟,可以忽略)
[root@proxy ~]# echo 1 > /proc/sys/net/ipv4/ip_forward #開啟路由轉發,臨時有效
[root@proxy ~]# cat /proc/sys/net/ipv4/ip_forward #檢視效果
1
[root@proxy ~]# echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
#修改配置檔案,設定永久規則,英語詞彙:forward(轉寄,轉發,傳送,向前)
[root@proxy ~]# sysctl -p #立即生效
[root@proxy ~]# sysctl -a | grep ip_for #檢視是否生效
2)建立叢集伺服器
[root@proxy ~]# yum -y install ipvsadm
[root@proxy ~]# ipvsadm -A -t 192.168.4.5:80 -s wrr
# -A(add)是建立新增虛擬伺服器叢集
# -t(tcp)後面指定叢集VIP的地址和埠,協議是tcp協議
# -s後面指定排程演算法,如rr(輪詢)、wrr(加權輪詢)、lc(最少連線)、wlc(加權最少連線)等等
3)新增真實伺服器
[root@proxy ~]# ipvsadm -a -t 192.168.4.5:80 -r 192.168.2.100 -w 1 -m
[root@proxy ~]# ipvsadm -a -t 192.168.4.5:80 -r 192.168.2.200 -w 1 -m
#-a(add)往虛擬伺服器叢集中新增後端真實伺服器IP,指定往-t 192.168.4.5:80這個叢集中新增
#-r(real)後面跟後端真實伺服器的IP和埠,這裡不寫埠預設是80埠
#-w(weight)指定伺服器的權重,權重越大被訪問的次數越多,英語詞彙:weight(重量,分量)
#-m指定叢集工作模式為NAT模式,如果是-g則代表使用DR模式,-i代表TUN模式
4)檢視規則列表(L是list檢視,n是number數字格式顯示)
[root@proxy ~]# ipvsadm -Ln
5)設定防火牆,SELinux
[root@proxy ~]# firewall-cmd --set-default-zone=trusted
[root@proxy ~]# setenforce 0
[root@proxy ~]# sed -i '/SELINUX/s/enforcing/permissive/' /etc/selinux/config
客戶端測試
客戶端client主機使用curl命令反覆連線http://192.168.1.30,檢視訪問的頁面是否會輪詢到不同的後端真實伺服器。
DR模式
使用LVS實現DR模式的叢集排程伺服器,為使用者提供Web服務:
-
客戶端IP地址為192.168.4.10
-
LVS排程器VIP地址為192.168.4.15
-
LVS排程器DIP地址設定為192.168.4.5
-
真實Web伺服器地址分別為192.168.4.100、192.168.4.200
-
使用加權輪詢排程演算法,權重可以任意
說明:
CIP是客戶端的IP地址;
VIP是對客戶端提供服務的IP地址;
RIP是後端伺服器的真實IP地址;
DIP是排程器與後端伺服器通訊的IP地址(VIP必須配置在虛擬介面)。
環境準備:
主機 | 網路配置 |
---|---|
client | eth0:192.168.4.10/24 |
lvs(閘道器裝置) | eth0:192.168.4.5/24 eth0:0:192.168.4.15/24 |
web1 | eth0:192.168.4.100/24 lo:0:192.168.4.15/32(子網掩碼必須為32) |
web2 | eth0:192.168.4.200/24 lo:0:192.168.4.15/32 |
配置實驗網路環境
1)設定Proxy伺服器的VIP和DIP
注意:為了防止衝突,VIP必須要配置在網絡卡的虛擬介面,網絡卡名稱不能照抄!!!
[root@proxy ~]# cd /etc/sysconfig/network-scripts/
[root@proxy ~]# cp ifcfg-eth0 ifcfg-eth0:0
[root@proxy ~]# vim ifcfg-eth0:0
TYPE=Ethernet
#網絡卡型別為:乙太網卡
BOOTPROTO=none
#none手動配置IP,或者dhcp自動配置IP
NAME=eth0:0
#網絡卡名稱
DEVICE=eth0:0
#裝置名稱
ONBOOT=yes
#開機時是否自動啟用該網絡卡
IPADDR=192.168.4.15
#IP地址
PREFIX=24
#子網掩碼
[root@proxy ~]# systemctl restart network #重啟網路服務
[root@proxy ~]# ip a s #會看到一個網絡卡下面有兩個IP地址
常見問題:RHEL7和Centos7系統中有兩個管理網路的服務,有可能衝突?
解決方法:關閉NetworkManager服務後重啟network即可。
2)設定Web1伺服器網路引數(不能照抄網絡卡名稱)
[root@web1 ~]# nmcli connection modify eth0 ipv4.method manual \
ipv4.addresses 192.168.4.100/24 connection.autoconnect yes
[root@web1 ~]# nmcli connection up eth0
接下來給web1配置VIP地址。
注意:這裡的子網掩碼必須是32(也就是全255),網路地址與IP地址一樣,廣播地址與IP地址也一樣。
[root@web1 ~]# cd /etc/sysconfig/network-scripts/
[root@web1 ~]# cp ifcfg-lo ifcfg-lo:0
[root@web1 ~]# vim ifcfg-lo:0
DEVICE=lo:0
#裝置名稱
IPADDR=192.168.4.15
#IP地址
NETMASK=255.255.255.255
#子網掩碼
NETWORK=192.168.4.15
#網路地址
BROADCAST=192.168.4.15
#廣播地址
ONBOOT=yes
#開機是否啟用本網絡卡
NAME=lo:0
#網絡卡名稱
防止地址衝突的問題:
這裡因為web1也配置與排程器一樣的VIP地址,預設肯定會出現地址衝突;
sysctl.conf檔案寫入這下面四行的主要目的就是訪問192.168.4.15的資料包,只有排程器會響應,其他主機都不做任何響應,這樣防止地址衝突的問題。
[root@web1 ~]# vim /etc/sysctl.conf
#檔案末尾手動寫入如下4行內容,英語詞彙:ignore(忽略、忽視),announce(宣告、廣播通知)
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_announce = 2
#當有arp廣播問誰是192.168.4.15時,本機忽略該ARP廣播,不做任何迴應(防止進站衝突)
#本機不要向外宣告自己的lo迴環地址是192.168.4.15(防止出站衝突)
[root@web1 ~]# sysctl -p
重啟網路服務
[root@web1 ~]# systemctl restart network #重啟網路服務
[root@web1 ~]# ip a s #會看到一個網絡卡下面有兩個IP地址
常見錯誤:如果重啟網路後未正確配置lo:0,有可能是NetworkManager和network服務有衝突,關閉NetworkManager後重啟network即可。(非必須的操作)
[root@web1 ~]# systemctl stop NetworkManager
[root@web1 ~]# systemctl restart network
3)設定Web2伺服器網路引數(不能照抄網絡卡名稱)
[root@web2 ~]# nmcli connection modify eth0 ipv4.method manual \
ipv4.addresses 192.168.4.200/24 connection.autoconnect yes
[root@web2 ~]# nmcli connection up eth0
接下來給web2配置VIP地址
注意:這裡的子網掩碼必須是32(也就是全255),網路地址與IP地址一樣,廣播地址與IP地址也一樣。
[root@web2 ~]# cd /etc/sysconfig/network-scripts/
[root@web2 ~]# cp ifcfg-lo ifcfg-lo:0
[root@web2 ~]# vim ifcfg-lo:0
DEVICE=lo:0
#裝置名稱
IPADDR=192.168.4.15
#IP地址
NETMASK=255.255.255.255
#子網掩碼
NETWORK=192.168.4.15
#網路地址
BROADCAST=192.168.4.15
#廣播地址
ONBOOT=yes
#開機是否啟用該網絡卡
NAME=lo:0
#網絡卡名稱
防止地址衝突的問題:
這裡因為web1也配置與排程器一樣的VIP地址,預設肯定會出現地址衝突;
sysctl.conf檔案寫入這下面四行的主要目的就是訪問192.168.4.15的資料包,只有排程器會響應,其他主機都不做任何響應,這樣防止地址衝突的問題。
[root@web2 ~]# vim /etc/sysctl.conf
#手動寫入如下4行內容,英語詞彙:ignore(忽略、忽視),announce(宣告、廣播通知)
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_announce = 2
#當有arp廣播問誰是192.168.4.15時,本機忽略該ARP廣播,不做任何迴應(防止進站衝突)
#本機不要向外宣告自己的lo迴環地址是192.168.4.15(防止出站衝突)
[root@web2 ~]# sysctl -p
重啟網路服務
[root@web2 ~]# systemctl restart network #重啟網路服務
[root@web2 ~]# ip a s #會看到一個網絡卡下面有兩個IP地址
常見錯誤:如果重啟網路後未正確配置lo:0,有可能是NetworkManager和network服務有衝突,關閉NetworkManager後重啟network即可。(非必須的操作)
[root@web1 ~]# systemctl stop NetworkManager
[root@web1 ~]# systemctl restart network
proxy排程器安裝軟體並部署LVS-DR模式排程器
1)安裝軟體(如果已經安裝,此步驟可以忽略)
[root@proxy ~]# yum -y install ipvsadm
2)清理之前實驗的規則,建立新的叢集伺服器規則
[root@proxy ~]# ipvsadm -C #清空所有規則
[root@proxy ~]# ipvsadm -A -t 192.168.4.15:80 -s wrr
## -A(add)是建立新增虛擬伺服器叢集
# -t(tcp)後面指定叢集VIP的地址和埠,協議是tcp協議
# -s後面指定排程演算法,如rr(輪詢)、wrr(加權輪詢)、lc(最少連線)、wlc(加權最少連線)等等
3)新增真實伺服器(-g引數設定LVS工作模式為DR模式,-w設定權重)
[root@proxy ~]# ipvsadm -a -t 192.168.4.15:80 -r 192.168.4.100 -g -w 1
[root@proxy ~]# ipvsadm -a -t 192.168.4.15:80 -r 192.168.4.200 -g -w 1
#-a(add)往虛擬伺服器叢集中新增後端真實伺服器IP,指定往-t 192.168.4.15:80這個叢集中新增
#-r(real)後面跟後端真實伺服器的IP和埠,這裡不寫埠預設是80埠
#-w(weight)指定伺服器的權重,權重越大被訪問的次數越多,英語詞彙:weight(重量,分量)
#-m指定叢集工作模式為NAT模式,如果是-g則代表使用DR模式,-i代表TUN模式
4)檢視規則列表(L代表list檢視規則,n代表number數字格式顯示)
[root@proxy ~]# ipvsadm -Ln
TCP 192.168.4.15:80 wrr
-> 192.168.4.100:80 Route 1 0 0
-> 192.168.4.200:80 Route 1 0 0
客戶端測試
客戶端使用curl命令反覆連線http://192.168.4.15,檢視訪問的頁面是否會輪詢到不同的後端真實伺服器。
注意:本實驗不可以在proxy主機(LVS排程器)使用curl訪問網頁驗證!!!
[root@proxy ~]# vim check.sh