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

做者:Greyhtml

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

環境

  • VMware 16
  • CentOS8

相關軟件

  • keepalived
  • ipvsadm
  • httpd

準備工做

準備四個節點,如上圖,Node01 ~ Node04, 本文默認你會在VMWare上安裝Linux並配置相關信息,若是這塊內容不清楚,能夠參考Linux學習筆記後端

實驗效果

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

示例圖bash

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文件,且文件內容爲:curl

<h>from node04</h>

能夠經過以下方式快速將Node03的index.html複製到Node04, 在Node03的tcp

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

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

參考資料

集羣內併發

相關文章
相關標籤/搜索