天天看點

LVS 和 Keepalived 介紹與實戰操作示範

作者:大資料老司機

一、LVS 概述

LVS是Linux Virtual Server的縮寫,是一種基于Linux核心實作的高可用性、高性能的負載均衡技術。它可以将來自用戶端的請求分發到多台伺服器上,實作多台伺服器的負載均衡,提高整個系統的性能和可用性。

LVS技術主要包括以下幾個元件:

  1. LVS排程器:負責接收用戶端請求并将其分發到後端的真實伺服器上,根據不同的負載均衡算法進行分發。
  2. 真實伺服器:處理來自排程器的請求并傳回響應,提供實際的服務。
  3. Keepalived:LVS的高可用元件,用于監控LVS排程器的狀态并在發生故障時自動切換到備用排程器,以保證服務的高可用性。
  4. IPVS:核心中實作LVS技術的子產品,實作負載均衡算法和請求分發等功能。

LVS技術廣泛應用于網際網路服務、網絡遊戲、資料中心等領域,能夠提高系統的性能和可用性,降低系統的維護成本。

二、LVS 基本操作

1)基本指令操作

1、添加規則

ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p timeout] [-M netmast] [--pepersistence_engine] [-b sched-flags] 
           

2、删除規則

ipvsadm -D -t|u|f service-address
           

3、清空定義的所有内容

ipvsadm -C
           

4、重載

ipvsadm -R
           

6、儲存

ipvsadm -S [-n]
           

7、增、改RS規則

ipvsadm -a|e -t|u|f service-address -r server-address [-g|i|m] [-w weight]
           

8、删除RS規則

ipvsadm -d -t|u|f service-address -r server-address
           

9、檢視規則清單

ipvsadm -Ln|l [options]
 --numeric, -n: 以數字形式輸出位址和端口号
 --exact: 擴充資訊,精确值
 --stats: 統計資訊
 --rate: 輸出速率資訊
           

10、清空計數器

ipvsadm -Z [-t|u|f service-address]
           

11、ipvs規則

/proc/net/ip_vs
           

12、ipvs連接配接

/proc/net/ip_vs_conn
           

2)儲存及重載規則

1、儲存

建議儲存至 /etc/sysconfig/ipvsadm

ipvsadm-save -n > /PATH/TO/IPVSADM_FILE
ipvsadm -Sn > /PATH/TO/IPVSADM_FILE
systemctl stop ipvsadm.service
           

2、重載

ipvsadm-restore < /PATH/TO/IPVSADM_FILE
ipvsadm -R < /PATH/TO/IPVSADM_FILE
systemctl restart ipvsadm.service
           

三、LVS 四種模式實戰操作講解

1)NAT 模式

LVS 和 Keepalived 介紹與實戰操作示範

1、設計要點

  • RIP與DIP在同一IP網絡,RIP的網關要指向DIP
  • 支援端口映射
  • Director要打開核心轉發功能

2、配置

1、管理叢集服務:增,改,删

  • 增、改
ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p timeout]
           
  • 删除:
ipvsadm -D -t|u|f service-address
           
  • service-address:
-t|u|f:
-t:TCP協定的端口,VIP:TCP_PORT
-u:UDP協定的端口,VIP:UDP_PORT
-f:firewall MARK,标記,一個數字
[-s scheduler]:指定叢集的排程算法:預設為wlc
           

2、管理叢集上的RS:增、改、删

  • 增、改:ipvsadm -a|e -t|u|f service-address -r server-address [-g|i|m] [-w weight]
  • server-address:

    rip[:port] 如省略port,不作端口映射

  • 選項:lvs類型:
-g:gateway, dr類型,預設
-i:ipip, tun類型
-m:masquerade,nat類型
-w weight:權重
           

3、ipvs scheduler

  • ipvs scheduler:根據其排程是否考慮各RS目前的負載狀态

    兩種:靜态方法和動态方法

  • 靜态方法:僅根據算法本身進行排程
1、RR: roundrobin, 輪訓
2、WRR: Weighted RR, 權重輪訓
3、SH: Source Hashing, 實作session sticky, 源IP位址hash; 将來自同一個IP位址的請求始終發往第一次挑中的RS,進而實作會話綁定
4、DH: Destination Hashing; 目标位址哈希,将發往同一個目标位址的請求始終轉發至第一次挑中的RS, 典型使用場景是正向代理緩存場景中的負載均衡,如:帶寬營運商
           

4、實驗:實作NAT模式的LVS(必須原路傳回)

ip_forward=1
route add default gw 192.168.0.201
# -t:tcp, -s wrr:權重 輪訓
ipvsadm -A -t 172.20.0.200:80 -s wrr

# -m: NAT模式;預設:DR模式,不支援映射到不同端口;-w:權重,預設是1
ipvsadm -a -t 172.20.0.200:80 -r 192.168.30.17:8080 -m -w 3
ipvsadm -a -t 172.20.0.200:80 -r 192.168.30.27:8080 -m

2.router:路由器配置
ip_forward=1
route add default gw 192.168.0.200
           

2)DR 模式

LVS 和 Keepalived 介紹與實戰操作示範
LVS 和 Keepalived 介紹與實戰操作示範

1、DR模型中各主機上均需要配置VIP,解決位址沖突的方式有三種:

  1. 在前端網關做靜态綁定
  2. 在各RS使用arptables
  3. 在各RS修改核心參數,來限制arp響應和通告的級别

2、限制響應級别:arp_ignore

  • 0:預設值,表示可使用本地任意接口上配置在任意位址響應
  • 1:僅在請求目标IP配置在本地主機的接收到請求封包的接口上時,才給予響應

3、限制通告級别:arp_announce

  • 0:預設值,把本機所有接口的所有資訊向每個接口的網絡進行通知
  • 1:盡量避免将接口資訊向非直接連接配接網絡進行通知
  • 2:必須避免将接口資訊向非網絡進行通告

4、實驗:實作DR模式的LVS(不原路傳回)

  • 步驟一:準備3台虛拟機
  • 步驟二:先配置3台虛拟機的網絡
eth0 配置在一個網段
DIP,RIP配置在一個網段
           
  • 步驟三:配置lvs的VIP
ifconfig ens33:0 192.168.182.100/24
echo "1" > /proc/sys/net/ipv4/ip_forward
           
  • 步驟四(RS):調整RS的響應,通告級别(每一台RS都配)
echo 1 > /proc/sys/net/ipv4/conf/ens33/arp_ignore
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/ens33/arp_announce
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce           
  • 步驟五:在RS上配置VIP
ifconfig lo:8 192.168.182.100 netmask 255.255.255.255
           
  • 步驟六:啟動RS上的httpd服務
yum install httpd -y
cd /var/www/html
vi index.html

service httpd start
用戶端驗證:RIP:80能顯示
VIP:80不能顯示
           
  • 步驟七:安裝 LVS---ipvsadm
yum install ipvsadm -y
# -t:tcp, -s rr:輪訓
ipvsadm -A -t 192.168.182.100:80 -s rr
# -m: NAT模式;預設:DR模式,不支援映射到不同端口;-w:權重,預設是1;-g:DR模型,-m:NET模型
ipvsadm -a -t 192.168.182.128:80 -r 192.168.182.129 -g
ipvsadm -a -t 192.168.182.128:80 -r 192.168.182.130 -g

ipvsadm -ln
# 浏覽器重新整理:通路vip
ipvsadm -lnc
netstat -natp
           

3)TUN模式

LVS 和 Keepalived 介紹與實戰操作示範

4)FULL-NAT模式

LVS 和 Keepalived 介紹與實戰操作示範

四、Keepalived + LVS 實戰操作

Keepalived 是一個用于 Linux 平台的高可用性軟體。它實作了虛拟路由器備援協定 (VRRP) 和健康檢查功能,可以用于確定在多台伺服器之間提供服務的高可用性。Keepalived 可以檢測伺服器的故障,并在主伺服器當機時,自動将備份伺服器提升為主伺服器,確定服務的持續性和可用性。

Keepalived 可以在主備伺服器之間動态配置設定虛拟 IP 位址,使用戶端能夠在主備伺服器之間無縫切換,提高服務的可用性。此外,Keepalived 還支援基于文本檔案的配置和基于 SNMP 的監控。它可以與常用的負載均衡器配合使用,如 HAProxy、Nginx 等。

總的來說,Keepalived 是一個功能強大的工具,可用于提供高可用性服務。它是一個免費的開源軟體,廣泛應用于企業和個人伺服器環境中。

架構圖如下:

LVS 和 Keepalived 介紹與實戰操作示範

1) keepalived 安裝以及基本操作

# 安裝
yum install keepalived -y
# 啟動
service keepalived start
# 配置檔案位置
/etc/keepalived/keepalived.conf
# 檢視日志
tail -f /var/log/message
           

2)具體配置步驟

  • 【步驟一】至少準備四台虛拟機
  • 【步驟二】調整RS的響應,通告級别(每一台RS都配)
echo 1 > /proc/sys/net/ipv4/conf/ens33/arp_ignore
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/ens33/arp_announce
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
           
  • 步驟三:在RS上配置VIP,切記(DR模式)不要忘了在RS配置VIP,要不然資料包會被丢棄
ifconfig lo:8 192.168.182.100 netmask 255.255.255.255
           
  • 步驟四:在RS安裝啟動httpd服務
yum install httpd -y
cd /var/www/html
echo "from ooxxip" > index.html
service httpd start
           
  • 步驟五:給兩台keepalived機子安裝keepalived(一主一備)
yum -y install keepalived
yum -y install ipvsadm
           
  • 步驟六:配置keepalived配置檔案

主節點配置:

# /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 192.168.200.1
       smtp_connect_timeout 30
       router_id LVS_DEVEL
       vrrp_skip_check_adv_addr
       # vrrp_strict 如果還是通路不了VIP,可以把這行注釋掉
       vrrp_garp_interval 0
       vrrp_gna_interval 0
    }

    vrrp_instance VI_1 {
        # 主
        state MASTER
        # 備
        # state BACKUP
        interface ens33
        virtual_router_id 51
        # 主
        priority 100
        # 備
        # priority 50
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass 1111
        }
        virtual_ipaddress {
            192.168.182.100/32 dev ens33 label ens33:7
        }
    }

    virtual_server 192.168.182.100 80 {
        delay_loop 6
        lb_algo rr
        lb_kind DR     nat_mask 255.255.255.0
        persistence_timeout 0
        protocol TCP

        real_server 192.168.182.130 80 {
            weight 1
            HTTP_GET {
                url {
                  path /
                  status_code 200
                }
                connect_timeout 3
                nb_get_retry 3
                delay_before_retry 3
            }
        }
        real_server 192.168.182.131 80 {
            weight 1
            HTTP_GET {
                url {
                  path /
                  status_code 200
                }
                connect_timeout 3
                nb_get_retry 3
                delay_before_retry 3
            }
        }
    }
           

從節點配置:

# 複制一份修改好的配置到從主機,修改 1、state BACKUP,2、priority 50

cd /etc/keepalived/ && scp ./keepalived.conf [email protected]:`pwd`


# 啟動

/bin/systemctl start keepalived.service

# RS切記關閉防火牆,如果web也通路不了,lvs也可以關閉防火牆試試

systemctl stop firewalld

# 檢視是否配置了VIP

#檢視是否配置了規則

 
# 主未挂,備則會自動配置規則,但是不會配置VIP,保證隻有一個VIP對外提供服務

 
# 一旦主挂了,則備接管(測試,down掉主網卡:ifconfig ens33 down)
           

缺點:腦裂問題

【分析原因】:keepalived自身不是高可用,主程序可能會被殺死,但是程序殺死後,沒有回收VIP,導緻主keepalived無法廣播,備keepalived得不到主的廣播信号,導緻備也會配上VIP,使得主備都有VIP,最後CIP通路VIP的三次握手可能會被打散到主備keepalived上,無法建立連接配接,導緻無法通路。

【解決方案】:

  1. 寫一個自動腳本,定時巡檢主keepalived程序是否還存活,如果被殺死,則重新開機主keepalived服務
  2. 換用更進階的高可用技術(zookeeper),後續會有zookeeper相應的文章

最後附上keepalived配置檔案說明:

! Configuration File for keepalived
global_defs {                                     #全局定義部分
    notification_email {                          #設定報警郵件位址,可設定多個
        [email protected]                      #接收通知的郵件位址
    }                        
    notification_email_from [email protected]         #設定 發送郵件通知的位址
    smtp_server smtp.163.com                      #設定 smtp server 位址,可是ip或域名.可選端口号 (預設25)
    smtp_connect_timeout 30                       #設定 連接配接 smtp server的逾時時間
    router_id LVS_DEVEL                           #主機辨別,用于郵件通知
    vrrp_skip_check_adv_addr                   
    vrrp_strict                                   #嚴格執行VRRP協定規範,此模式不支援節點單點傳播
    vrrp_garp_interval 0                       
    vrrp_gna_interval 0     
    script_user keepalived_script                 #指定運作腳本的使用者名群組。預設使用使用者的預設組。如未指定,預設為keepalived_script 使用者,如無此使用者,則使用root
    enable_script_security                        #如過路徑為非root可寫,不要配置腳本為root使用者執行。
}       

vrrp_script chk_nginx_service {                   #VRRP 腳本聲明
    script "/etc/keepalived/chk_nginx.sh"         #周期性執行的腳本
    interval 3                                    #運作腳本的間隔時間,秒
    weight -20                                    #權重,priority值減去此值要小于備服務的priority值
    fall 3                                        #檢測幾次失敗才為失敗,整數
    rise 2                                        #檢測幾次狀态為正常的,才确認正常,整數
    user keepalived_script                        #執行腳本的使用者或組
}                                             

vrrp_instance VI_1 {                              #vrrp 執行個體部分定義,VI_1自定義名稱
    state MASTER                                  #指定 keepalived 的角色,必須大寫 可選值:MASTER|BACKUP
    interface ens33                               #網卡設定,lvs需要綁定在網卡上,realserver綁定在回環口。差別:lvs對通路為外,realserver為内不易暴露本機資訊
    virtual_router_id 51                          #虛拟路由辨別,是一個數字,同一個vrrp 執行個體使用唯一的辨別,MASTER和BACKUP 的 同一個 vrrp_instance 下 這個辨別必須保持一緻
    priority 100                                  #定義優先級,數字越大,優先級越高。
    advert_int 1                                  #設定 MASTER 與 BACKUP 負載均衡之間同步檢查的時間間隔,機關為秒,兩個節點設定必須一樣
    authentication {                              #設定驗證類型和密碼,兩個節點必須一緻
        auth_type PASS                        
        auth_pass 1111                        
    }                                         
    virtual_ipaddress {                           #設定虛拟IP位址,可以設定多個虛拟IP位址,每行一個
        192.168.119.130                       
    }
    track_script {                                #腳本監控狀态
        chk_nginx_service                         #可權重重,但會覆寫聲明的腳本權重值。chk_nginx_service weight -20
    }
        notify_master "/etc/keepalived/start_haproxy.sh start"  #目前節點成為master時,通知腳本執行任務
        notify_backup "/etc/keepalived/start_haproxy.sh stop"   #目前節點成為backup時,通知腳本執行任務
        notify_fault  "/etc/keepalived/start_haproxy.sh stop"   #當目前節點出現故障,執行的任務; 
}                                             

virtual_server 192.168.119.130 80  {          #定義RealServer對應的VIP及服務端口,IP和端口之間用空格隔開
    delay_loop 6                              #每隔6秒查詢realserver狀态
    lb_algo rr                                #後端調試算法(load balancing algorithm)
    lb_kind DR                                #LVS排程類型NAT/DR/TUN
    #persistence_timeout 60                   同一IP的連接配接60秒内被配置設定到同一台realserver
    protocol TCP                              #用TCP協定檢查realserver狀态
    real_server 192.168.119.120 80 {          
        weight 1                              #權重,最大越高,lvs就越優先通路
        TCP_CHECK {                           #keepalived的健康檢查方式HTTP_GET | SSL_GET | TCP_CHECK | SMTP_CHECK | MISC
            connect_timeout 10                #10秒無響應逾時
            retry 3                           #重連次數3次
            delay_before_retry 3              #重連間隔時間
            connect_port 80                   #健康檢查realserver的端口
        }                                     
    }                                         
    real_server 192.168.119.121 80 {          
        weight 1                              #權重,最大越高,lvs就越優先通路
        TCP_CHECK {                           #keepalived的健康檢查方式HTTP_GET | SSL_GET | TCP_CHECK | SMTP_CHECK | MISC
            connect_timeout 10                #10秒無響應逾時
            retry 3                           #重連次數3次
            delay_before_retry 3              #重連間隔時間
            connect_port 80                   #健康檢查realserver的端口
        }                                     
    }                                         
}                                             

vrrp_instance VI_2 {                          #vrrp 執行個體部分定義,VI_1自定義名稱
    state   BACKUP                            #指定 keepalived 的角色,必須大寫 可選值:MASTER|BACKUP 分别表示(主|備)
    interface ens33                           #網卡設定,綁定vip的子接口,lvs需要綁定在網卡上,realserver綁定在回環口。差別:lvs對通路為外,realserver為内不易暴露本機資訊
    virtual_router_id 52                      #虛拟路由辨別,是一個數字,同一個vrrp 執行個體使用唯一的辨別,MASTER和BACKUP 的 同一個 vrrp_instance 下 這個辨別必須保持一緻
    priority 90                               #定義優先級,數字越大,優先級越高。
    advert_int 1                              #設定 MASTER 與 BACKUP 負載均衡之間同步檢查的時間間隔,機關為秒,兩個節點設定必須一樣
    authentication {                          #設定驗證類型和密碼,兩個節點必須一緻
        auth_type PASS                        
        auth_pass 1111                        
    }                                         
    virtual_ipaddress {                       #設定虛拟IP位址,可以設定多個虛拟IP位址,每行一個
        192.168.119.131                       
    }                                         
}                                             

virtual_server 192.168.119.131 80 {           #定義RealServer對應的VIP及服務端口,IP和端口之間用空格隔開
    delay_loop 6                              #每隔6秒查詢realserver狀态
    lb_algo rr                                #後端調試算法(load balancing algorithm)
    lb_kind DR                                #LVS排程類型NAT/DR/TUN
    #persistence_timeout 60                   #同一IP的連接配接60秒内被配置設定到同一台realserver
    protocol TCP                              #用TCP協定檢查realserver狀态
    real_server 192.168.119.120 80 {          
        weight 1                              #權重,最大越高,lvs就越優先通路
        TCP_CHECK {                           #keepalived的健康檢查方式HTTP_GET | SSL_GET | TCP_CHECK | SMTP_CHECK | MISC
            connect_timeout 10                #10秒無響應逾時
            retry 3                           #重連次數3次
            delay_before_retry 3              #重連間隔時間
            connect_port 80                   #健康檢查realserver的端口
        }                                     
    }                                         
    real_server 192.168.119.121 80 {          
        weight 1                              #權重,最大越高,lvs就越優先通路
        TCP_CHECK {                           #keepalived的健康檢查方式HTTP_GET | SSL_GET | TCP_CHECK | SMTP_CHECK | MISC
            connect_timeout 10                #10秒無響應逾時
            retry 3                           #重連次數3次
            delay_before_retry 3              #重連間隔時間
            connect_port 80                   #健康檢查realserver的端口
        }
    }
}
           

LVS + Keepalived 介紹和實戰操作示範就先到這裡了,有任何疑問歡迎給我留言,也可關注我的公衆号【大資料與雲原生技術分享】,後續會持續更新相關技術文章~。