LVS+Keepalive雙機熱備


一、概述

本實驗基於CentOS7.6 操作系統,總共5台設備,兩台做后端web服務器,兩台做lvs和keepalived,一台做客戶機,實驗以LVS(DR)+Keepalived和LVS(NAT)+Keepalived兩種模式來做雙機熱備份,實驗環境拓撲如下圖所示:

 

 

從架構可以看出來,從用戶的角度來說,會直接訪問192.168.31.200,也就是說不管系統如何設計要保證此ip的可用性,

從架構師的角度考慮:

   用戶訪問192.168.31.200,這是一個虛擬iP,用戶不關心內部如何協調。

我們使用 192.168.31.54 作為主機 Master機器,然后使用keepalived 技術配置 HA(high avilable)配置高可用行,也就是說如果 分發的機器Master宕機了,keepalive會自動轉到 backup機器,

這就是HA配置,保證master即使宕機了,也不影響轉發;

master機器負責把用戶的請求轉發到  真實的機器, web1和web2,他們會按照一定的輪訓機制,訪問,如果web1宕機,master會自動轉發到web2;

我們在兩台負載均衡的機器上面,配置keepalived保證分發機器的高可用行HA;

環境說明

系統的 IP配置如下:

服務器名   主機名 IP地址 虛擬設備名 虛擬IP
Director Server  lvs1 192.168.31.54 enp0s3:0  192.168.31.200
Backup Server  lvs2 192.168.31.51 enp0s3:0 192.168.31.200
Real Server1 web1 192.168.31.113 lo:0  192.168.31.200
Real Server2 web2 192.168.31.150 lo:0  192.168.31.200

 

 

 

 

 

 

 

請確保4台服務器關閉了防火牆

systemctl stop firewalld
setenforce 0

 

二、web服務器配置

安裝nginx

登錄主機web1和web2

安裝nginx

# 安裝Nginx源
yum -y install epel-release
# 安裝Nginx
yum -y install nginx
# 啟動Nginx服務
systemctl start nginx
# 加入開機自啟
systemctl enable nginx
# 備份原有默認頁面
mv /usr/share/nginx/html/index.html /usr/share/nginx/html/index.html_bak

 

登錄主機web1,修改默認頁面

vi /usr/share/nginx/html/index.html

清空內容,完整內容如下:

This is Server 111

 

登錄主機web2,修改默認頁面

vi /usr/share/nginx/html/index.html

清空內容,完整內容如下:

This is Server 222

 

訪問頁面

訪問web1

 

 

訪問web2

三、LVS+Keepalive

安裝

登錄主機lvs1和lvs2

安裝keepalived和lvs管理工具

yum -y install keepalived* ipvsadm

加載內核模塊

modprobe ip_vs

備份配置文件

mv /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf_bak

 

配置

登錄主機lvs1

vi /etc/keepalived/keepalived.conf

內容如下:

global_defs {
    router_id LVS_TEST    #服務器名字
}

vrrp_instance VI_1 {
    state MASTER    #配置主備,備用機此配置項為BACKUP
    interface enp0s3    #指定接口
    virtual_router_id 51    #指定路由ID,主備必須一樣
    priority 101    #設置優先級,主略高於備份
    advert_int 1    #設置檢查時間
    authentication {
        auth_type PASS    #設置驗證加密方式
        auth_type 1234    #設置驗證密碼
    }
    virtual_ipaddress {
        192.168.31.200
    }
}

virtual_server 192.168.31.200 80 {
    delay_loop 3    #健康檢查時間
    lb_algo rr    #LVS調度算法
    lb_kind DR   #LVS工作模式
    !persistence 60    #是否保持連接,!不保持
    protocol TCP    #服務采用TCP協議
    real_server 192.168.31.113 80 {
        weight 1    #權重
        TCP_CHECK {    #TCP檢查
            connect_port 80   #檢查端口80
            connect_timeout 3    #超時時間3秒
            nb_get_retry 3    #重試次數3次
            delay_before_retry 4    #重試間隔4秒
        }
    }
    real_server 192.168.31.150 80 {
        weight 1
        TCP_CHECK {
            connect_port 80
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 4
        }
    }
}

請根據實際情況修改紅色部分

說明:

interface enp0s3 表示本地網卡為enp0s3

192.168.31.200 表示虛擬ip

 

重啟keepalived服務

systemctl restart keepalived
systemctl enable keepalived

 

驗證虛擬IP是否生效

# ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 08:00:27:04:34:88 brd ff:ff:ff:ff:ff:ff
    inet 192.168.31.54/24 brd 192.168.31.255 scope global noprefixroute dynamic enp0s3
       valid_lft 31218sec preferred_lft 31218sec
    inet 192.168.31.200/32 scope global enp0s3
       valid_lft forever preferred_lft forever
    inet6 fe80::a66d:efde:f19f:9882/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever

可以發現虛擬ip已經有了

 

登錄主機lvs2

vi /etc/keepalived/keepalived.conf

LVS2的配置同LVS1,只需將配置文件中下面兩處修改即可

內容如下:

global_defs {
    router_id LVS_TEST    #服務器名字
}

vrrp_instance VI_1 {
    state BACKUP    #配置主備,備用機此配置項為BACKUP
    interface enp0s3    #指定接口
    virtual_router_id 51    #指定路由ID,主備必須一樣
    priority 100    #設置優先級,主略高於備份
    advert_int 1    #設置檢查時間
    authentication {
        auth_type PASS    #設置驗證加密方式
        auth_type 1234    #設置驗證密碼
    }
    virtual_ipaddress {
        192.168.31.200
    }
}

virtual_server 192.168.31.200 80 {
    delay_loop 3    #健康檢查時間
    lb_algo rr    #LVS調度算法
    lb_kind DR   #LVS工作模式
    !persistence 60    #是否保持連接,!不保持
    protocol TCP    #服務采用TCP協議
    real_server 192.168.31.113 80 {
        weight 1    #權重
        TCP_CHECK {    #TCP檢查
            connect_port 80   #檢查端口80
            connect_timeout 3    #超時時間3秒
            nb_get_retry 3    #重試次數3次
            delay_before_retry 4    #重試間隔4秒
        }
    }
    real_server 192.168.31.150 80 {
        weight 1
        TCP_CHECK {
            connect_port 80
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 4
        }
    }
}

 

重啟keepalived服務

systemctl restart keepalived
systemctl enable keepalived

 

查看虛擬IP

# ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 08:00:27:d4:0e:fb brd ff:ff:ff:ff:ff:ff
    inet 192.168.31.51/24 brd 192.168.31.255 scope global noprefixroute dynamic enp0s3
       valid_lft 31079sec preferred_lft 31079sec
    inet6 fe80::8cdb:32f0:4bbd:9294/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
    inet6 fe80::a66d:efde:f19f:9882/64 scope link tentative noprefixroute dadfailed 
       valid_lft forever preferred_lft forever

注意:此時是沒有的。因為master和bakcup只能同時存在一個。只有當master異常時,bakcup才會出現虛擬ip。

 

登錄主機lvs1,關掉主服務器的keepalived服務

systemctl stop keepalived

 

登錄主機lvs2,驗證備份的keepalived是否生效

# ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 08:00:27:d4:0e:fb brd ff:ff:ff:ff:ff:ff
    inet 192.168.31.51/24 brd 192.168.31.255 scope global noprefixroute dynamic enp0s3
       valid_lft 30713sec preferred_lft 30713sec
    inet 192.168.31.200/32 scope global enp0s3
       valid_lft forever preferred_lft forever
    inet6 fe80::8cdb:32f0:4bbd:9294/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
    inet6 fe80::a66d:efde:f19f:9882/64 scope link tentative noprefixroute dadfailed 
       valid_lft forever preferred_lft forever

 

四、web服務器綁定VIP

 2台web服務器為lo:0綁定VIP地址、抑制ARP廣播

登錄主機web1,web2,編寫以下腳本文件realserver.sh

vi /etc/init.d/realserver.sh 

內容如下:

#!/bin/bash
#description: Config realserver

VIP=192.168.31.200

#/etc/rc.d/init.d/functions

case "$1" in
start)
       /sbin/ifconfig lo:0 $VIP netmask 255.255.255.255 broadcast $VIP
       /sbin/route add -host $VIP dev lo:0
       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
       sysctl -p >/dev/null 2>&1
       echo "RealServer Start OK"
       ;;
stop)
       /sbin/ifconfig lo:0 down
       /sbin/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 "RealServer Stoped"
       ;;
*)
       echo "Usage: $0 {start|stop}"
       exit 1
esac

exit 0

請根據實際情況,修改VIP地址。

 

登錄主機web1,web2分別執行腳本

bash /etc/init.d/realserver.sh

 

執行完了之后,驗證一下 使用ifconfig 你會發現 回環地址的網卡會多出一個lo:0的 網卡;

# ifconfig lo:0
lo:0: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 192.168.31.200  netmask 255.255.255.255
        loop  txqueuelen 1000  (Local Loopback)

 

登錄lvs1,查看VIP是否成功映射

# ipvsadm -L
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  MiWiFi-R3P-srv:http rr
  -> 192.168.31.113:http          Route   1      0          0         
  -> 192.168.31.150:http          Route   1      0          0  

 

 五、測試可用性

測試keepalived的監控檢測

訪問虛擬ip

 

可以看到,現在是訪問的web1 

 

登錄主機web1,關閉nginx進程。

nginx -s stop

 

刷新頁面

 

 可以發現切換到web2了。

 

登錄主機web1,啟動Nginx

nginx

 

刷新頁面

 

 發現切換到web1了。

 

測試 keepalived 的HA特性

登錄主機lvs1,此時的vip是在master節點上的。關閉keepalived服務

systemctl stop keepalived

 

查看vip,發現已經沒有了

# ip addr 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 08:00:27:04:34:88 brd ff:ff:ff:ff:ff:ff
    inet 192.168.31.54/24 brd 192.168.31.255 scope global noprefixroute dynamic enp0s3
       valid_lft 42290sec preferred_lft 42290sec
    inet6 fe80::a66d:efde:f19f:9882/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever

 

登錄主機lvs2,查看vip,發現已經出現了。

# ip addr 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 08:00:27:d4:0e:fb brd ff:ff:ff:ff:ff:ff
    inet 192.168.31.51/24 brd 192.168.31.255 scope global noprefixroute dynamic enp0s3
       valid_lft 42248sec preferred_lft 42248sec
    inet 192.168.31.200/32 scope global enp0s3
       valid_lft forever preferred_lft forever
    inet6 fe80::8cdb:32f0:4bbd:9294/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
    inet6 fe80::a66d:efde:f19f:9882/64 scope link tentative noprefixroute dadfailed 
       valid_lft forever preferred_lft forever

 

此時,刷新頁面,依然訪問正常。

 

 說明keepalived的HA特性是正常的。

 

 

本文參考鏈接:

https://blog.csdn.net/weixin_42342456/article/details/86100090

https://www.cnblogs.com/aspirant/p/6740556.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM