使用KeepAlived來實現高可用的DR模型

Grey Zeng發表於2021-04-06

作者:Grey

原文地址:使用KeepAlived來實現高可用的DR模型

環境

  • VMware 16
  • CentOS8

相關軟體

  • keepalived
  • ipvsadm
  • httpd

準備工作

準備四個節點,如上圖,Node01 ~ Node04, 本文預設你會在VMWare上安裝Linux並配置相關資訊,如果這塊內容不清楚,可以參考Linux學習筆記

實驗效果

我們會在Node01和Node02上配置LVS,且Node01和Node02是主備關係,Node01是主,Node02是備,Node01掛了,Node02可以自動頂上。Node01和Node02是接收請求的入口,接下來,會將請求以負載均衡的方式請求後端的Node04和Node05服務。

示例圖

image

操作步驟

準備Node03和Node04的服務

在Node03和Node04上分別執行如下命令:

yum install -y httpd

安裝好httpd以後,在Node03上的如下位置

/var/www/html

新建一個名為index.html頁面,並且在index.html中輸入如下內容:

<h>from node03</h>

在Node04同樣的位置,也建立一個index.html檔案,且檔案內容為:

<h>from node04</h>

可以通過如下方式快速將Node03的index.html複製到Node04, 在Node03的

var/www/html

目錄下,執行

scp index.html root@192.168.98.139:`pwd`

其中

root@192.168.98.139

是對應你的node03的資訊,然後就可以把node03的index.html複製到node04的對應位置了。

然後改一下Node04的index.html資訊即可。

準備好index.html頁面後,因為httpd服務的預設埠是80,所以我們需要開啟Node03和Node04上的80埠的訪問許可權,在Node03和Node04上分別執行如下的兩條命令:

firewall-cmd --permanent --add-port=80/tcp
firewall-cmd --reload

我們可以啟動Node04和Node03上的httpd服務,在Node03和Node04上分別執行:

systemctl start httpd

驗證是否啟動成功

image

配置Node03和Node04核心引數

arp_ignore和arp_announce兩個核心引數的配置說明如下:

arp_ignore

定義接收到ARP請求時的響應級別

  • 0:只要本地配置的有相應地址,就給予響應;
  • 1:僅在請求的目標(MAC)地址配置請求到達的介面上的時候,才給予響應;

arp_announce

定義將自己地址向外通告時的通告級別

  • 0:將本地任何介面上的任何地址向外通告;
  • 1:試圖僅向目標網路通告與其網路匹配的地址;
  • 2:僅向與本地介面上地址匹配的網路進行通告;

由於,Node03和Node04上要實現對IP的對外隱藏和對內可見,所以我們需要在Node03和Node04上配置如下引數:

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

PS:CentOS8的預設網路卡名稱是 ens33

可以通過ifconfig命令檢視到

image

配置Node03和Node04的環路介面

要實現IP的對內可見,對外隱藏,還需要在Node03和Node04上配置環路介面, 在Node04和Node03上分別執行

ifconfig lo:3 192.168.98.100 netmask 255.255.255.255

然後在Node03和Node04分別執行

ifconfig

檢視是否新增成功
image

自此,Node03和Node04上的所有東西都配置好了。

接下來開始配置Node01和Node02。

安裝ipvsadm

在Node01和Node02上執行如下命令

yum install -y ipvsadm

安裝keepalived

在CentOS8下,我嘗試用yum安裝keepalived,配置完畢後,啟動了keepalived,但是客戶端始終無法請求過來。

無奈,嘗試編譯安裝keepalived,問題解決。

步驟如下,在Node01和Node02上分別執行, 安裝一些前置工具

yum install curl gcc openssl-devel libnl3-devel net-snmp-devel make tar ipvsadm -y

然後下載最新的keepalived原始碼

curl --progress https://www.keepalived.org/software/keepalived-2.2.2.tar.gz | tar xz
cd keepalived-2.2.2
./configure --prefix=/usr/local/keepalived-2.2.2
make
make install

修改keepalived配置

在Node01上,先備份預設的keepalived配置,執行如下命令

cd /usr/local/keepalived-2.2.2/etc/keepalived
cp keepalived.conf keepalived.conf.bak

然後開始編輯keepalived.conf檔案, 將其配置成如下資訊

Node01上:

! Configuration File for keepalived

global_defs {
   notification_email {
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
   vrrp_skip_check_adv_addr
   vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

vrrp_instance VI_1 {
    state MASTER
    interface ens33
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
       192.168.98.100/24 dev ens33 label ens33:3
    }
}

virtual_server 192.168.98.100 80 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    persistence_timeout 0
    protocol TCP

    real_server 192.168.98.138 80 {
        weight 1
        HTTP_GET {
            url {
              path /
              status_code 200
            }
            connect_timeout 3
            retry 3
            delay_before_retry 3
        }
    }
    real_server 192.168.98.139 80 {
        weight 1
        HTTP_GET {
            url {
              path /
              status_code 200
            }
            connect_timeout 3
            retry 3
            delay_before_retry 3
        }
    }
}

Node02上

! Configuration File for keepalived

global_defs {
   notification_email {
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
   vrrp_skip_check_adv_addr
   vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

vrrp_instance VI_1 {
    state BACKUP
    interface ens33
    virtual_router_id 51
    priority 50
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
       192.168.98.100/24 dev ens33 label ens33:3
    }
}

virtual_server 192.168.98.100 80 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    persistence_timeout 0
    protocol TCP

    real_server 192.168.98.138 80 {
        weight 1
        HTTP_GET {
            url {
              path /
              status_code 200
            }
            connect_timeout 3
            retry 3
            delay_before_retry 3
        }
    }
    real_server 192.168.98.139 80 {
        weight 1
        HTTP_GET {
            url {
              path /
              status_code 200
            }
            connect_timeout 3
            retry 3
            delay_before_retry 3
        }
    }
}

指定keepalived配置檔案,在Node01和Node02上分別執行:

cd /usr/local/keepalived-2.2.2/etc/sysconfig

修改keepalived檔案

# Options for keepalived. See `keepalived --help' output and keepalived(8) and
# keepalived.conf(5) man pages for a list of all options. Here are the most
# common ones :
#
# --vrrp               -P    Only run with VRRP subsystem.
# --check              -C    Only run with Health-checker subsystem.
# --dont-release-vrrp  -V    Dont remove VRRP VIPs & VROUTEs on daemon stop.
# --dont-release-ipvs  -I    Dont remove IPVS topology on daemon stop.
# --dump-conf          -d    Dump the configuration data.
# --log-detail         -D    Detailed log messages.
# --log-facility       -S    0-7 Set local syslog facility (default=LOG_DAEMON)
#

KEEPALIVED_OPTIONS="-D -f /usr/local/keepalived-2.2.2/etc/keepalived/keepalived.conf"

在KEEPALIVED_OPTIONS中增加了-f選項,指定了keepalived.conf的位置

然後開啟Node01和Node02的80埠訪問許可權,分別在Node01和Node02上執行如下命令

firewall-cmd --permanent --add-port=80/tcp
firewall-cmd --reload

啟動keepalived

在Node01上執行

systemctl start keepalived

驗證:通過瀏覽器訪問:http://192.168.98.100

並且時不時重新整理以下頁面,可以顯示如下結果:

image

在Node01上執行

ipvsadm -lnc

可以看到
image

在Node02上執行

systemctl start keepalived

然後在Node02上執行

ipvsadm -lnc

內容是空的,說明Node02是備用節點

此時,我們停掉Node01,在Node01上,執行

systemctl stop keepalived

繼續訪問瀏覽器,服務依舊可以訪問
image

驗證了主節點(Node01)掛了,備用節點(Node02)頂上這個情況

此時,在Node02上執行

ipvsadm -lnc

可以看到連線情況
image

說明備機正常提供了服務。

此時,再把主節點(Node01)啟動起來,在Node01上執行:

systemctl restart keepalived

服務正常
image

在主節點(Node01)上執行

ipvsadm -lnc

顯示出了連線
image

說明主節點已經恢復正常。

參考資料

叢集內併發

相關文章