Loading

使用 KeepAlived 来实现高可用的 DR 模型

使用 KeepAlived 来实现高可用的 DR 模型

作者:Grey

原文地址:

博客园:使用 KeepAlived 来实现高可用的 DR 模型

CSDN:使用 KeepAlived 来实现高可用的 DR 模型

操作系统

  • CentOS 8

相关工具

  • keepalived

  • ipvsadm

  • httpd

准备工作

准备四个节点,Node01 ~ Node04, 本文默认你会在 VMware Workstation 上安装 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 页面,并输入如下内容:

<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

说明主节点已经恢复正常。

参考资料

集群内并发

posted @ 2021-04-06 21:58  Grey Zeng  阅读(393)  评论(0编辑  收藏  举报