zoukankan      html  css  js  c++  java
  • 使用KeepAlived来实现高可用的DR模型

    作者:Grey

    原文地址:使用KeepAlived来实现高可用的DR模型

    环境

    • VMware 16
    • CentOS8

    相关软件

    • keepalived
    • ipvsadm
    • httpd

    准备工作

    准备四个节点,如上图,Node01 ~ Node04, 本文默认你会在VMWare上安装Linux并配置相关信息,如果这块内容不清楚,可以参考Linux安装,快照,克隆(基于CentOS 8)

    实验效果

    我们会在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

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

    参考资料

    集群内并发

  • 相关阅读:
    CF1264E Beautiful League 解题报告
    CF1411G No Game No Life 解题报告
    Data structure on Bitcoin
    bitcoin Cryptography
    弹性布局Flex的基本语法
    Linq操作list
    dt某字段赋值
    List 添加数据
    dt 转 json 转实体
    队列
  • 原文地址:https://www.cnblogs.com/greyzeng/p/14623965.html
Copyright © 2011-2022 走看看