1. 程式人生 > 遊戲 >遊戲速通大會AGDQ將於本週末線上舉行

遊戲速通大會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訪問網頁驗證!!!

擴充套件知識:預設LVS不帶健康檢查功能,需要自己手動編寫動態檢測指令碼,實現該功能:(參考指令碼如下,僅供參考)
[root@proxy ~]# vim check.sh
#!/bin/bash
VIP=192.168.4.15:80
RIP1=192.168.4.100
RIP2=192.168.4.200
while :
do
for IP in $RIP1 $RIP2
do
curl -s http://$IP &>/dev/null
if [ $? -eq 0 ];then
ipvsadm -Ln |grep -q $IP || ipvsadm -a -t $VIP -r $IP
else
ipvsadm -Ln |grep -q $IP && ipvsadm -d -t $VIP -r $IP
fi
done
sleep 1
done