1. 程式人生 > 其它 >LVS-DR群集

LVS-DR群集

LVS-DR群集

目錄

一、LVS-DR的工作原理

1. LVS-DR資料包流向分析

為方便進行原理分析,將Client與群集機器放在同一網路中,資料包流經的路線為1-2-3-4

  1. 客戶端傳送請求到Director Server(負載均衡器),請求的資料報文(源IP是CIP,目標IP是VIP)到達核心空間。
  2. Director Server和Real Server在同一個網路中,資料通過二層資料鏈路層來傳輸。
  3. 核心空間判斷資料包的目標IP是本機VIP,此時IPVS(IP虛擬伺服器)比對資料包請求的服務是否是叢集服務,是叢集服務就重新封裝資料包。修改源MAC地址Director Server的MAC地址,修改目標MAC地址為Real Server的MAC地址,源IP地址與目標IP地址沒有改變,然後將資料包傳送給Real Server。
  4. 到達Real Server的請求報文的MAC地址是自身的MAC地址,就接收此報文。資料包重新封裝報文(源IP地址為VIP,目標IP為CIP),將響應報文通過lo介面傳送給物理網絡卡然後向外發出。
  5. Real Server直接將響應報文傳送到客戶端。

2. IP包頭及資料幀頭資訊的變化

  1. Client向目標VIP發出請求,Director(負載均衡器)接收
  2. Director根據負載均衡演算法選擇Real Sever_1,不修改也不封裝IP報文,而是將資料幀的MAC地址改為Real Server_1的MAC地址,然後在區域網上傳送
  3. Real Server_1收到這個資料幀,解封裝後發現目標IP與本機匹配(Real Server事先綁定了VIP),於是處理這個報文。隨後重新封裝報文,將響應報文通過lo介面傳送給物理網絡卡然後向外發出
  4. Client將收到回覆報文。Client認為得到正常的服務,而不會知道是哪一臺伺服器處理的。
    注意:如果跨網段,則報文通過路由器經由Internet返回給使用者。

3. DR模式的特點

  1. Director Server和Real Server必須在同一個物理網路中。
  2. Real Server可以使用私有地址,也可以使用公網地址。如果使用公網地址,可以通過網際網路對RIP進行直接訪問。
  3. Director Server作為群集的訪問入口,但不作為閘道器使用。
  4. 所有的請求報文經由Real Server,但回覆響應報文不能經過Director Server。
  5. Real Server的閘道器不允許指向Director Server IP,即Real Server傳送的資料包不允許經過Director Server。
  6. Real Server上的lo介面配置VIP的IP地址、

4.LVS-DR中的ARP問題

(1)ARP問題1-相同IP

在LVS-DR負載均衡叢集中,負載均衡器與節點伺服器都要配置相同的VIP地址。
在區域網中具有相同的IP地址,勢必會造成各伺服器ARP通訊的紊亂。

(2)ARP問題1的解決思路及方法

當ARP廣播發送到LVS-DR叢集時,因為負載均衡器和節點伺服器都是連線到相同的網路上,它們都會接收到ARP廣播。
只有前端的負載均衡器進行響應,其他節點伺服器不應該響應ARP廣播。
對節點伺服器進行處理,使其不響應針對VIP的ARP請求。

  1. 使用虛介面lo:0承載VIP地址;
  2. 設定核心引數arp_ignore=1(系統只響應目的IP為本地IP的ARP請求)。

(3)ARP問題2-響應報文的源IP

Real Server返回報文(源IP是VIP)經由路遊記轉發,重新封裝報文時,需要先獲取路由器的MAC地址。
傳送ARP請求時,Linux預設使用IP包的源IP地址(即VIP)作為ARP請求包中的源IP地址,而不使用傳送介面的IP介面,如ens33介面。

路由器根據ARP表項,會將新來的請求報文轉發給Real Server,導致Director的VIP失效。

(4)ARP問題2的解決方法

對節點伺服器進行處理,設定核心引數arp_announce=2(系統不使用IP包的源地址來設定ARP請求的源地址,而選擇傳送介面的IP地址)

(5)解決ARP兩個問題的設定方法

修改/etc/sysctl.conf檔案,末行新增如下內容:

net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
  1. arp_ignore = 1
    防止閘道器路由器傳送ARP廣播時,排程器和節點伺服器都進行相應,導致ARP快取表的紊亂,不對非本地物理網絡卡IP的ARP請求進行響應,又因為VIP是承載在lo:0。
  2. arp_announce = 2
    系統不使用響應資料包的源IP地址(VIP)來作為本機進行ARP請求報文的源IP地址,而使用傳送報文的物理網絡卡IP地址作為ARP請求報文的源IP地址,這樣可以防止閘道器路由器接收到源IP地址為VIP的ARP請求報文後又更新ARP快取表,導致外網再發送請求時,資料包到不了排程器。

二、LCS-DR的部署過程

1. 案例環境

為了進一步提高公司的負載能力,公司決定擴充套件現有的網站平臺,基於LVS構築負載均衡群集。考慮到群集的訪問效率,管理員準備採用LVS群集的DR模式,共享儲存裝置存放在內部專有網路中。

2. 伺服器IP配置

DR伺服器:192.168.122.10
Web伺服器1:192.168.122.100
Web伺服器2:192.168.122.101
VIP伺服器:192.168.122.188
nfs伺服器:192.168.122.88

3. 配置負載排程器(192.168.122.10)

  1. 關閉防火牆,安裝ipvsadm
[root@director ~]# systemctl stop firewalld
[root@director ~]# setenforce 0
setenforce: SELinux is disabled
[root@director ~]# modprobe ip_vs
[root@director ~]# yum install -y ipvsadm
  1. 配置虛擬IP地址
[root@director ~]# cd /etc/sysconfig/network-scripts
[root@director network-scripts]# cp ifcfg-ens33 ifcfg-ens33:0
#若是隧道模式,複製為ifcfg-tun10
[root@director network-scripts]# vim ifcfg-ens33:0

DEVICE=ens33:0
ONBOOT=yes
IPADDR=192.168.122.188
NETMASK=255.255.255.255

[root@director network-scripts]# ifconfig ens33:0
ens33:0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.122.188  netmask 255.255.255.255  broadcast 192.168.122.188
        ether 00:0c:29:59:be:be  txqueuelen 1000  (Ethernet)
  1. 調整proc響應系統
    由於LVS負載排程器和各節點需要共用VIP地址,需要關閉icmp的重定向,不充當路由器。
[root@director network-scripts]# vim /etc/sysctl.conf
#末行寫入以下內容
net.ipv4.ip_forward = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.ens33.send_redirects = 0

[root@director network-scripts]# sysctl -p
net.ipv4.ip_forward = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.ens33.send_redirects = 0
  1. 配置負載分配策略
[root@director network-scripts]# ipvsadm-save >/etc/sysconfig/ipvsadm
[root@director network-scripts]# systemctl start ipvsadm
[root@director network-scripts]# ipvsadm -C
[root@director network-scripts]# ipvsadm -A -t 192.168.122.188:80 -s rr
[root@director network-scripts]# ipvsadm -a -t 192.168.122.188:80 -r 192.168.122.100:80 -g
#若隧道模式,-g替換為-i
[root@director network-scripts]# ipvsadm -a -t 192.168.122.188:80 -r 192.168.122.101:80 -g
[root@director network-scripts]# ipvsadm
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  director:http rr
  -> 192.168.122.100:http         Route   1      0          0         
  -> 192.168.122.101:http         Route   1      0          0         
[root@director network-scripts]# ipvsadm -ln
#檢視節點狀態,Route代表DR模式
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.122.188:80 rr
  -> 192.168.122.100:80           Route   1      0          0         
  -> 192.168.122.101:80           Route   1      0          0     

4. 部署共享儲存(192.168.122.88)

[root@nfs_server ~]# systemctl stop firewalld
[root@nfs_server ~]# setenforce 0
[root@nfs_server ~]# yum install -y nfs-utils rpcbind
[root@nfs_server ~]# mkdir /opt/test1 /opt/test2
[root@nfs_server ~]# chmod 777 /opt/test1 /opt/test2
[root@nfs_server ~]# echo "This is test1 web" > /opt/test1/index.html
[root@nfs_server ~]# echo "This is test2 web" > /opt/test2/index.html
[root@nfs_server ~]# vim /etc/exports

/usr/share *(ro,sync)
/opt/test1 192.168.122.0/24(rw,sync)
/opt/test2 192.168.122.0/24(rw,sync)

[root@nfs_server ~]# systemctl start rpcbind
[root@nfs_server ~]# systemctl start nfs
[root@nfs_server ~]# showmount -e
Export list for nfs_server:
/usr/share *
/opt/test2 192.168.122.0/24
/opt/test1 192.168.122.0/24

5. 配置節點伺服器(192.168.122.100/192.168.122.101)

(1)web_server1(192.168.122.100)

  1. 關閉防火牆
[root@web_server1 ~]# systemctl stop firewalld
[root@web_server1 ~]# setenforce 0
setenforce: SELinux is disabled
  1. 配置虛擬IP地址(VIP:192.168.122.188)
    此地址僅用作傳送Web響應資料包的源地址,並不需要監聽客戶機的訪問請求(改由排程器監聽並分發)。因此使用虛介面lo:0來承載VIP地址,併為本機新增一條路由記錄,將訪問VIP的資料限制在本地,以避免通訊紊亂。
[root@web_server1 ~]# cd /etc/sysconfig/network-scripts
[root@web_server1 network-scripts]# cp ifcfg-lo ifcfg-lo:0
[root@web_server1 network-scripts]# vim ifcfg-lo:0

DEVICE=lo:0
ONBOOT=yes
IPADDR=192.168.122.188
NETMASK=255.255.255.255
#注意:子網掩碼必須全為1

[root@web_server1 network-scripts]# ifup lo:0
[root@web_server1 network-scripts]# ifconfig lo:0
lo:0: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 192.168.122.188  netmask 255.255.255.255
        loop  txqueuelen 1  (Local Loopback)

[root@web_server1 network-scripts]# route add -host 192.168.122.188 dev lo:0
#臨時新增
[root@web_server1 network-scripts]# vim /etc/rc.local 
#末行新增,加入開機自啟動
/sbin/route add -host 192.168.122.188 dev lo:0

[root@web_server1 network-scripts]# chmod +x /etc/rc.d/rc.local 
  1. 調整核心的ARP響應引數以組織更新VIP的MAC地址,避免發生衝突
[root@web_server1 network-scripts]# vim /etc/sysctl.conf 

net.ipv4.conf.lo.arp_ignore = 1
#系統只響應目的IP為本地IP的ARP請求
net.ipv4.conf.lo.arp_announce = 2
#系統不使用IP包的源地址來設定ARP請求的源地址,而選擇傳送介面的IP地址
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2

[root@web_server1 network-scripts]# sysctl -p
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2

或者
[root@web_server1 network-scripts]# echo "1" > /proc/sys/net/ipv4/conf/lo/arp_ignore
[root@web_server1 network-scripts]# echo "2" > /proc/sys/net/ipv4/conf/lo/arp_announce
[root@web_server1 network-scripts]# echo "1" > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@web_server1 network-scripts]# echo "2" > /proc/sys/net/ipv4/conf/all/arp_announce
[root@web_server1 network-scripts]# sysctl -p
  1. 安裝服務,進行nfs掛載
[root@web_server1 network-scripts]# yum install -y nfs-utils rpcbind httpd
[root@web_server1 network-scripts]# systemctl start rpcbind
[root@web_server1 network-scripts]# systemctl start nfs
[root@web_server1 network-scripts]# systemctl start httpd
[root@web_server1 network-scripts]# mount.nfs 192.168.122.88:/opt/test1 /var/www/html
[root@web_server1 network-scripts]# cat /var/www/html/index.html 
This is test1 web

(2)web_server2(192.168.122.101)

  1. 關閉防火牆
[root@web_server2 ~]# systemctl stop firewalld
[root@web_server2 ~]# setenforce 0
setenforce: SELinux is disabled
  1. 配置虛擬IP地址(VIP:192.168.122.188)
    此地址僅用作傳送Web響應資料包的源地址,並不需要監聽客戶機的訪問請求(改由排程器監聽並分發)。因此使用虛介面lo:0來承載VIP地址,併為本機新增一條路由記錄,將訪問VIP的資料限制在本地,以避免通訊紊亂。
[root@web_server2 ~]# cd /etc/sysconfig/network-scripts
[root@web_server2 network-scripts]# cp ifcfg-lo ifcfg-lo:0
[root@web_server2 network-scripts]# vim ifcfg-lo:0

DEVICE=lo:0
ONBOOT=yes
IPADDR=192.168.122.188
NETMASK=255.255.255.255
#注意:子網掩碼必須全為1

[root@web_server2 network-scripts]# ifup lo:0
[root@web_server2 network-scripts]# ifconfig lo:0
lo:0: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 192.168.122.188  netmask 255.255.255.255
        loop  txqueuelen 1  (Local Loopback)

[root@web_server2 network-scripts]# route add -host 192.168.122.188 dev lo:0
#臨時新增
[root@web_server2 network-scripts]# vim /etc/rc.local 
#末行新增,加入開機自啟動
/sbin/route add -host 192.168.122.188 dev lo:0

[root@web_server2 network-scripts]# chmod +x /etc/rc.d/rc.local 
  1. 調整核心的ARP響應引數以組織更新VIP的MAC地址,避免發生衝突
[root@web_server2 network-scripts]# vim /etc/sysctl.conf 

net.ipv4.conf.lo.arp_ignore = 1
#系統只響應目的IP為本地IP的ARP請求
net.ipv4.conf.lo.arp_announce = 2
#系統不使用IP包的源地址來設定ARP請求的源地址,而選擇傳送介面的IP地址
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2

[root@web_server2 network-scripts]# sysctl -p
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2

或者
[root@web_server2 network-scripts]# echo "1" > /proc/sys/net/ipv4/conf/lo/arp_ignore
[root@web_server2 network-scripts]# echo "2" > /proc/sys/net/ipv4/conf/lo/arp_announce
[root@web_server2 network-scripts]# echo "1" > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@web_server2 network-scripts]# echo "2" > /proc/sys/net/ipv4/conf/all/arp_announce
[root@web_server2 network-scripts]# sysctl -p
  1. 安裝服務,進行nfs掛載
[root@web_server2 network-scripts]# yum install -y nfs-utils rpcbind httpd
[root@web_server2 network-scripts]# systemctl start rpcbind
[root@web_server2 network-scripts]# systemctl start nfs
[root@web_server2 network-scripts]# systemctl start httpd
[root@web_server2 network-scripts]# mount.nfs 192.168.122.88:/opt/test2 /var/www/html
[root@web_server2 network-scripts]# cat /var/www/html/index.html 
This is test2 web

6. 瀏覽器訪問測試

在客戶端使用瀏覽器訪問 http://192.168.122.188