LVS_DR+keepalived(內涵理論與實驗)

前言:

上篇博客介紹了LVS負載均衡羣集的理論,並以其中NAT模式爲例做了實驗,具體可觀看:https://blog.csdn.net/weixin_45726050/article/details/103993089,本篇將延續上篇內容,着重介紹LVS-DR、keepalived理論,並進行搭建部署以LVS-DR模式爲基礎加上keepalived輔助工具的實驗。

一、LVS-DR工作原理

1.1 DR模式概述
  • 負載均衡羣集工作模式-直接路由(Direct Routing)

    簡稱DR模式,採用半開放式的網絡結構,與TUN模式的結構類似,但各節點並不是分散在各地,而是與調度器位於同一個物理網絡

    負責調度器與各節點服務器通過本地網絡連接,不需要建立專用的IP隧道

在這裏插入圖片描述

DR模式存在於私網,所有服務器都使用私有IP

負責調度器與各節點服務器通過本地網絡連接,不需要建立專用的IP隧道

1.2 LVS-DR數據包流向分析
  • 爲方便進行原理分析,將client與羣集機器放在同一網絡種,數據包流經的路線爲1-2-3-4
    在這裏插入圖片描述

  • ① Client向目標VIP發出請求,Director (負載均衡器)接收。此時IP包頭及數據幀頭信息爲
    在這裏插入圖片描述

  • ② Director根據負載均衡算法選擇 Realserver_1,不修改也不封裝IP報文,而是將數據幀的MAC地址改爲RealServer_1的MAC地址,然後再局域網上發送。IP包頭及數據幀頭信息如下:
    在這裏插入圖片描述

  • ③ RealServer_1收到這個幀,解封裝後發現目標IP與本機匹配(RealServer事先綁定了VIP),於是處理這個報文。隨後重新封裝報文,發送到局域網。此時IP包頭及數據幀頭信息爲
    在這裏插入圖片描述

  • ④ Client將收到恢復報文。Client認爲得到正常的服務,而不會知道是哪一臺服務器處理的

    需注意:如果跨網段,那麼報文通過路由器經由internet返回給用戶

1.3 LVS-DR種的APR問題
  • 在LVS-DR負載均衡集羣種,負載均衡器與節點服務器都要配置相同的VIP地址

  • 在局域網中具有相同的IP,勢必會造成個服務器ARP通信的紊亂

    當一個ARP廣播發送到LVS-DR集羣時,因爲負載均衡器和節點服務器都是連接到相同的網絡上的,它們都會收到ARP廣播

    此時只有前端的負載均衡器進行響應,其他節點服務器不應該響應ARP廣播

  • 對節點服務器進行處理,使其不響應針對VIP的ARP請求

    使用虛接口 lo:承載VIP地址

    設置內核參數 arp_ignore=1:系統只響應目的IP爲本地IP的ARP請求

  • RealServer返回報文(源IP是VIP)經路由器轉發,在重新封裝報文時,需要先獲取路由器的MAC地址

在這裏插入圖片描述

  • 發送ARP請求時,Linux默認使用IP包的源IP地址 (即VIP) 作爲ARP請求包種的源IP地址,而不適用發送接口(例如ens33)的IP地址
    在這裏插入圖片描述

  • 路由器收到ARP請求後,將更新ARP表項

  • 原有的VIP對於 Director的MAC地址會被更新爲VIP對於RealServer的MAC地址
    在這裏插入圖片描述

  • 此時新來的請求報文,路由器根據ARP表項,會將該報文轉給RealServer,從而導致Director的VIP失效
    在這裏插入圖片描述
    在這裏插入圖片描述

  • 解決辦法

    對節點服務器進行處理,設置內核參數 arp_announce=2:系統不使用IP包的源地址來設置ARP請求的源地址,而選擇發送接口的IP地址

1.4 解決ARP的兩個問題的設置方法
  • 修改 /etc/sysctl.conf文件

    對節點服務器進行處理,使其不響應針對VIP的ARP請求

    net.ipv4.conf.lo.arp_ignore = 1

    net.ipv4.conf.lo.arp_announce = 2

系統不使用IP包的地址來設置ARP請求的源地址,而選擇發送接口的IP地址

net.ipv4.conf.all.arp_ignore = 1

net.ipv4.conf.all.arp_announce = 2

二、部署LVS-DR+keepalived實驗

環境:五臺虛擬機,2臺作爲LVS-DR+keepalived架構,2臺作爲web服務器,並使用win10模擬客戶機訪問

定位

centos7-4 (LVS1)IP=192.168.100.100

centos7-5 (LVS2) IP=192.168.100.110

Web1:192.168.100.200

Web2:192.168.100.222

VIP:IP=192.168.100.10

Win10 :192.168.100.50

拓撲圖

在這裏插入圖片描述

2.1 配置LVS調度器
  • 兩臺調度器安裝keepalived和ipvsadm
[root@lvs1 ~]# yum install keepalived ipvsadm -y
2.1.1 修改路由配置文件
  • 在兩臺LVS服務器上修改內核參數文件
[root@lvs1 ~]# vim /etc/sysctl.conf
net.ipv4.ip_forward=1						#開啓路由轉發功能
net.ipv4.conf.all.send_redirects = 0		#關閉重定向功能
net.ipv4.conf.default.send_redirects = 0	#關閉重定向功能
net.ipv4.conf.ens33.send_redirects = 0		#關閉重定向功能
#啓用重定向功能
[root@lvs1 ~]# sysctl -p     
net.ipv4.ip_forward = 1						
net.ipv4.conf.all.send_redirects = 0		
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.ens33.send_redirects = 0
2.1.2 設置虛擬網卡

虛擬網卡有兩種啓用形式

第一種是ifcfg ens33:0 (跟ip地址):此方式是臨時定義,重啓後不生效

第二種是定義一個配置文件,通過配置文件啓動虛擬網卡

  • 修改兩臺服務器的虛擬網卡配置文件
[root@lvs1 etc]# cd /etc/sysconfig/network-scripts/
[root@lvs1 network-scripts]# cp -p ifcfg-ens33 ifcfg-ens33:0
[root@lvs1 network-scripts]# vim ifcfg-ens33
DEVICE=ens33:0
ONBOOT=yes
IPADDR=192.168.100.10
NETMASK=255.255.255.0
#清除原內容,添加以上內容
  • 在兩臺LVS服務器上定義啓動腳本
[root@lvs2 network-scripts]# cd /etc/init.d/
[root@lvs2 init.d]# vim dr.sh
#!/bin/bash
GW=192.168.100.1
VIP=192.168.100.10
RIP1=192.168.100.200
RIP2=192.168.100.222
case "$1" in
start)
          /sbin/ipvsadm --save > /etc/sysconfig/ipvsadm
          systemctl start ipvsadm
          /sbin/ifconfig ens33:0 $VIP broadcast $VIP netmask 255.255.255.255 broadcast $VIP up
          /sbin/route add -host $VIP dev ens33:0
          /sbin/ipvsadm -A -t $VIP:80 -s rr
          /sbin/ipvsadm -a -t $VIP:80 -r $RIP1:80 -g
          /sbin/ipvsadm -a -t $VIP:80 -r $RIP2:80 -g
          echo "ipvsadm starting-----------------------[ok]"
          ;;
          stop)
          /sbin/ipvsadm -C
          systemctl stop ipvsadm
          ifconfig ens33:0 down
          route del $VIP
          echi "ipvsamd stoped--------------------------[ok]"
          ;;
          status)
          if [ ! -e /var/lock/subsys/ipvsadm ];then
          echo "ipvsadm stoped ---------------------"
          exit 1
                    else
                    echo "ipvsadm Runing ----------[ok]"
          fi
          ;;
          *)
          echo "Usage: $0  {start|stop|status}"
          exit 1
          esac
          exit 0
------------wq
[root@lvs2 init.d]# chmod +x dr.sh

上述配置完成後,即可便於service管理,同時將兩臺centos設置爲僅主機模式

dr.sh腳本主要內容含義

start)

GW=192.168.100.1 :GW網關 因爲四臺服務器沒有做網關,但是連接了裏面的路由器,做了NAT,所以需要網關

VIP=192.168.100.10:VIP 浮動IP 訪問私有網段的唯一入口,定位web羣集的關鍵,VIP的浮動地址由虛擬網卡ens33:0定義

RIP1=192.168.100.201、RIP2=192.168.100.202:2臺RIP 節點服務器各自IP,需要保證在同一網段,或者保證和VIP能連通的網段

/sbin/ipvsadm --save > /etc/sysconfig/ipvsadm:匹配start (爲了防止出問題,需要保存配置,所以用–save > /etc/sysconfig/ipvsadm)

/sbin/ifconfig ens33:0 $VIP broadcast $VIP netmask 255.255.255.255 broadcast $VIP up:通過ens33:0設定VIP的廣播地址並開啓 (設置IP地址信息)

/sbin/route add -host $VIP dev ens33:0:添加網段信息 通過ens33:0訪問VIP網段

/sbin/ipvsadm -A -t $VIP:80 -s rr、/sbin/ipvsadm -a -t $VIP:80 -r $RIP1:80 -g、/sbin/ipvsadm -a -t $VIP:80 -r $RIP2:80 -g:使用ipvsadm工具開啓調度算法:“輪詢” 訪問兩臺節點服務器

stop)

/sbin/ipvsadm -C:清除所有緩存

systemctl stop ipvsadm:停止服務

ifconfig ens33:0 down:關閉虛擬網卡

route del $VIP:刪除路由段

status)

if [ ! -e /var/lock/subsys/ipvsadm ];then:(布爾值:真/假判斷)【判斷ipvsadm文件不存在】,如判斷成立則輸出服務停止,因爲服務只有在開啓時纔會產生ipvsamd 如果判斷不成立則輸出服務爲開啓狀態

  • 修改兩臺服務器網卡、啓動LVS服務

直接使用正則表達式修改網卡

cd /etc/sysconfig/network-scripts/
sed -i '4s/dhcp/static/' ifcfg-ens33
cat >> /etc/sysconfig/network-scripts/ifcfg-ens33 <<-EOF
IPADDR=192.168.100.100
NETMASK=255.255.255.0
GATEWAY=192.168.100.1
EOF
service network restart
  • 啓動LVS服務
#LVS1服務器
[root@lvs1 network-scripts]# service dr.sh start
ipvsadm starting-----------------------[ok]
#LVS2服務器
[root@lvs1 network-scripts]# service dr.sh start
ipvsadm starting-----------------------[ok]
  • 關閉防火牆、增強性安全功能
[root@lvs1 network-scripts]# systemctl stop firewalld.service
[root@lvs1 network-scripts]# setenforce 0
  • 開啓網卡與虛擬網卡
[root@lvs2 network-scripts]# systemctl restart network
[root@lvs2 network-scripts]# ifup ens33:0

注意:如果ens33:0虛擬網卡開啓報錯,重新開啓網卡,然後再次嘗試

2.2 配置web服務器
2.2.1 安裝apache
[root@web1 ~]# yum install httpd -y
........省略部分內容
[root@web1 ~]# systemctl start httpd.service
[root@web1 ~]# systemctl stop firewalld.service 
[root@web1 ~]# setenforce 0
  • 在兩臺web服務器創建站點首頁
[root@web1 ~]# cd /var/www/html
[root@web1 html]# echo "<h1>this is taob web</h1>" > index.html
[root@web2 ~]# cd /var/www/html
[root@web2 html]# echo "<h1>this is jingd web</h1>" > index.html
  • 創建虛擬網卡

使用迴環網卡作爲模板創建虛擬網卡

[root@web1 html]# cd /etc/sysconfig/network-scritps
[root@web1 network-scripts]# vim ifcfg-lo:0
DEVICE=lo:0
ONBOOT=yes
IPADDR=192.168.100.10
NETMASK=255.255.255.0
ONBOOT=yes
  • 在兩臺web服務器上定義腳本,設置ARP忽略
[root@web1 network-scripts]# cd /etc/init.d/
[root@web1 init.d]# cat >> web.sh <<-EOF
> #!/bin/bash
> VIP=192.168.100.10
>           case "$1" in
>           start)
>                     ifconfig lo:0 $VIP netmask 255.255.255.255 broadcast $VIP   #開啓虛擬IP
>                     /sbin/route add -host $VIP dev     #開啓網段訪問 -host $VIP 能通過指定的虛擬IP,綁定在dev lo:0綁定執行的虛擬網卡上s
>                     echo "1" > /proc/sys/net/ipv4/conf/lo/arp_ignore       
>                     echo "2" > /proc/sys/net/ipv4/conf/lo/arp_announce 
>                     echo "1" > /proc/sys/net/ipv4/conf/all/arp_ignore
>                     echo "2" > /proc/sys/net/ipv4/conf/all/arp_announce
	#以上四段都是定義ARP忽略
>                     sysctl -p > /dev/null 2>&1   #刷新啓動
>                     echo "RealServer Start OK "
>                     ;;
>           stop)
>                     ifconfig lo:0 down
>                     route del $VIP /dev/null 2>&1
>                     echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignore
>                     echo "0" >/proc/sys/net/ipv4/conf/lo/arp_announce
>                     echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore
>                     echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce
>                     ;;
>           *)
>                     echo "Usage: $0 {start | stop}"
>                     exit 1
>           esac
>           exit 0
> EOF
[root@web1 init.d]# chmod +x web.sh 

第二臺可直接遠程推送過去

格式:scp /etc/init.d/web.sh [email protected]. 222:/etc/init.d/

  • 修改兩臺web服務器網卡
#web1節點服務器
[root@web1 init.d]# cd /etc/sysconfig/network-scripts/
[root@web1 network-scripts]# sed -i '4s/dhcp/static/' ifcfg-ens33
[root@web1 network-scripts]# cat >> /etc/sysconfig/network-scripts/ifcfg-ens33 <<-EOF
> IPADDR=192.168.100.200
> NETMASK=255.255.255.0
> GATEWAY=192.168.100.1
> EOF
[root@web1 network-scripts]# ifup lo:0
[root@web1 network-scripts]# systemctl restart network
#web2節點服務器
[root@web2 init.d]# cd /etc/sysconfig/network-scripts/
[root@web2 network-scripts]# sed -i '4s/dhcp/static/' ifcfg-ens33
[root@web2 network-scripts]# cat >> /etc/sysconfig/network-scripts/ifcfg-ens33 <<-EOF
> IPADDR=192.168.100.222
> NETMASK=255.255.255.0
> GATEWAY=192.168.100.1
> EOF
[root@web2 network-scripts]# ifup lo:0
[root@web2 network-scripts]# systemctl restart network  
  • 開啓服務
#web1節點服務器
[root@web1 network-scripts]# service web.sh start
RealServer Start OK 
#web2節點服務器
[root@web2 network-scripts]# service web.sh start
RealServer Start OK 

以上DR模式節點部署完成,下面開始設置keepalived

2.3 部署keepalived
2.3.1 修改兩臺LVS調取器配置

在LVS1上配置

[root@lvs1 ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived

global_defs {
   notification_email {
     [email protected]
     [email protected]
     [email protected]
   }
   notification_email_from [email protected]
   smtp_server 127.0.0.1			#修改郵箱服務,將地址指向本機
   smtp_connect_timeout 30			#連接超時時間
   router_id LVS_01				#router_id標識,不可重複
   vrrp_skip_check_adv_addr
   vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}
    
vrrp_instance VI_1 {
    state MASTER				#主LVS調度器爲MASTER,備LVS調度器爲BACKUP
    interface ens33				#原端口爲ehto,修改爲ens33
    virtual_router_id 10			#虛擬LVS組號,主、備服務器的組號要相同
    priority 100				#優先級,備服務器要小於主服務器
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.100.10				#這裏原有三個IP,刪掉2個並且將第一個修改爲虛擬VIP地址
    }
}

virtual_server 192.168.100.10 80 {  #虛擬服務配置項,將原ip修改爲虛擬VIP地址,同時將端口修改爲80端口(原爲443 https)
    delay_loop 6
    lb_algo rr					#輪詢算法
    lb_kind DR					#將原NAT模式修改爲DR模式
    persistence_timeout 50
    protocol TCP

    real_server 192.168.100.200 80 {	#web1節點配置
        weight 1				#權重爲1 (加權輪詢會使用)
        TCP_CHECK {
            connect_port 80
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
	real_server 192.168.100.222 80 {	#web2節點配置
		weight 1 
		TCP_CHECK { 
			connect_port 80 
			connect_timeout 3  
			nb_get_retry 3
			delay_before_retry 3
		}
	} 
} 

LVS2調度器上與LVS1基本一致,不同處如下

[root@lvs1 ~]# vim /etc/keepalived/keepalived.conf 
........省略內部分容
router_id LVS_02     #router_id不能與LVS1相同
........省略內部分容
vrrp_instance VI_1 {
    state BACKUP	 #在LVS2的狀態配置中修改爲“BACKUP“備服務器
    interface eth0
    virtual_router_id 10c
    priority 95		 #優先級需要低於主服務器,建議修改爲95
........省略內部分容

開啓服務

[root@lvs1 ~]# systemctl start keepalived
[root@lvs2 ~]# systemctl start keepalived
2.4 驗證
  • 開啓一臺win10虛擬機

選擇僅主機模式,同時將ip地址修改如下
在這裏插入圖片描述
使用win10訪問192.168.100.10
在這裏插入圖片描述

此時可以關閉主LVS調度服務器的漂移地址:ifdown ens33:0,模擬故障,同時再次使用win10進行訪問,依然可以正常訪問,此時雙機熱備成功

我們可以多次刷新,會顯示另一臺節點服務器的站點首頁
在這裏插入圖片描述

總結

整體實驗比較簡單,中間有幾個地方需要注意

1、虛擬IP(浮動IP)必須相同(192.168.100.10)

2、在定義dr.sh 腳本時 GW、VIP、RIP1、RIP2等地址要填寫正確(驗證時無法訪問的話,此處是一個檢查點)

3、在修改兩臺LVS服務器keepalived雙機熱備的配置項時,要注意 “{}”的範圍,不能缺少,同時,要注意 “router_id” 號不可重複,“virtual_router_id” 主備號必須相同,否則不在一個集羣中
在修改 priority (優先級)中,備用LVS調度器的優先級建議設置爲95,主LVS調度器的優先級爲100,在默認情況下,在主調度器宕機時,主服務器的優先級會降10,如果與LVS2的優先級相同,也會導致驗證時無法訪問站點,需要重啓服務。

4、因爲虛擬機環境有的功能產生了一定的衝突,在我們完成實驗、所有服務、網卡均開啓、防火牆與增強性安全功能已關閉,同時配置項均正常的情況下出現:四臺服務器無法互相ping 通,客戶機(win10)無法ping通LVS服務器和虛擬IP或無法訪問站點等問題。
遇到以上問題,可以嘗試重啓各項服務、down掉 lo:0嘗試。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章