You need to enable JavaScript to run this app.
导航

通过高可用虚拟IP和Keepalived搭建高可用主备集群

最近更新时间2023.11.09 10:56:40

首次发布时间2023.11.09 10:56:40

高可用虚拟IP通常与高可用软件(如Keepalived)配合使用,来帮助您搭建高可用主备服务。
本文介绍了如何通过高可用虚拟IP和Keepalived搭建面向公网的高可用主备集群。

实现原理

同一个高可用虚拟IP绑定到与其处于相同私有网络中的两个边缘实例,并绑定弹性公网IP。边缘实例通过地址解析协议ARP宣告该高可用虚拟IP。在这两个边缘实例上分别部署Keepalived软件,将其中一个边缘实例配置为主实例,另外一个边缘实例配置为备实例。
正常情况下,主实例通过弹性公网IP来对公网提供服务。当主实例出现故障时,备实例自动接管原来的主实例的业务,继续对公网提供服务。
图片

操作场景

本文使用到的资源信息如下表所示。
以下资源的名称、网段、IP地址、镜像版本等均为示例值。在实际配置过程中,请将示例值替换为实际值。

资源

描述

私有网络

网段:192.168.0.0/16

主边缘实例

名称:veEN_01
私网IP地址:192.168.7.8

备边缘实例

名称:veEN_02
私网IP地址:192.168.7.9

高可用虚拟IP

名称:havip_example
私网IP地址:192.168.7.4

弹性公网IP

名称:eip_example
公网IP地址:122.246.xx.xx

镜像

CentOS 7.6 64位

前提条件

  • 已创建两个边缘实例。
  • 已创建一个弹性公网IP。

注意事项

  • 高可用虚拟IP只支持单播。

  • 确保已经配置以下garp信息。Keepalived依赖ARP报文更新IP信息。如果缺少以下参数,在某些场景下,主设备不发送ARP报文、导致通信异常。

    garp_master_delay 1
    garp_master_refresh 5
    
  • 确保为同一私有网络下的每个主备集群配置不同的虚拟路由器ID,即virtual_router_id的值须唯一。

  • 确定没有采用“strict”模式,即需要删除vrrp_strict配置。

  • 合理评估并设置advert_int参数值。当advert_int参数值过小时,容易受网络抖动影响发生频繁主备切换或双主情况。当advert_int参数值过大时,主设备故障后,主备切换耗时较长。

  • track_script脚本的具体执行项(如checkhaproxy)中的interval参数的值请适当提高,避免脚本执行超时导致 FAULT 状态的出现。

操作步骤

步骤一:创建高可用虚拟IP

  1. 登录边缘计算节点控制台

  2. 在左侧导航栏中,选择边缘网络 > 高可用虚拟IP

  3. 高可用虚拟IP页面,单击创建高可用虚拟IP

  4. 创建高可用虚拟IP页面,参照下表配置必填参数。

    配置项

    描述

    名称

    输入高可用虚拟IP的名称。

    节点

    选择高可用虚拟IP所属的节点。

    私有网络

    选择高可用虚拟IP所属的私有网络。

    子网

    选择高可用虚拟IP所属的子网。

    IP分配方式

    选择IP地址的分配方式。

  5. 确认配置无误后,单击提交

步骤二:在边缘实例上安装Keepalived

说明

以下内容以CentOS 7.6 64位操作系统为例进行说明。不同操作系统的配置可能存在差异。

在边缘实例veEN_01上安装Keepalived

  1. 登录边缘实例veEN_01。

  2. 执行以下命令,查看Keepalived安装包的版本。

    yum list keepalived
    

    CentOS 7.6默认的Keepalived版本如下图所示。以下配置以Keepalived版本1.3.5-19.e17为例进行介绍。
    图片

  3. 执行以下命令安装Keepalived。

    yum install -y keepalived
    
  4. 执行以下命令,进入keepalived.conf文件目录。

    vim /etc/keepalived/keepalived.conf
    
  5. i键进入编辑模式。

  6. 参照以下内容修改Keepalived配置文件。

    ! 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_garp_interval 0
       vrrp_gna_interval 0
    }
      vrrp_script checkhaproxy
    {
         script "/etc/keepalived/do_sth.sh"   # 检测业务进程是否运行正常。“do_sth.sh”是自定义的业务进程检测脚本,请根据业务需要来执行。执行时,“do_sth.sh”须替换为实际的脚本名称。
         interval 5
    }
    
    vrrp_instance VI_1 {
        state MASTER       # 设置Keepalived节点的初始状态。MASTER表示主用状态,BACKUP表示备用状态。本示例中,设置veEN_01为MASTER。
        interface eth0    # 设置绑定高可用虚拟IP的实例网卡。该网卡用于发送VRRP包。本示例中,使用eth0。
        virtual_router_id 51 # 设置集群的虚拟路由器ID。
        nopreempt  # 设置为非抢占模式。当高优先级的边缘实例恢复后,低优先级的边缘实例仍为MASTER。
        preempt_delay 10  # 设置仅state为MASTER时的抢占延迟。
        priority 100   # 设置优先级,数字越大优先级越高。本示例中,veEN_01优先级设置为100。
        advert_int 5
        authentication {
            auth_type PASS
            auth_pass 1111
        }
        unicast_src_ip 192.168.7.8   # 设置边缘实例veEN_01的私网IP地址。本示例中,使用192.168.7.8,您在操作时须替换为实际的私网IP地址。
        unicast_peer {
          192.168.7.9             # 设置对端设备(边缘实例veEN_02)的私网IP地址。本示例中,使用192.168.7.9,您在操作时须替换为实际的私网IP地址。
      }
        virtual_ipaddress {
            192.168.7.4  # 设置高可用虚拟IP的IP地址。本示例中,使用192.168.7.4,您在操作时须替换为实际的高可用虚拟IP的IP地址。   
        }
        notify_master "/etc/keepalived/notify_action.sh MASTER"     # notify_action的示例参见“notify_action配置说明”。
        notify_backup "/etc/keepalived/notify_action.sh BACKUP"   
        notify_fault "/etc/keepalived/notify_action.sh FAULT"  
        notify_stop "/etc/keepalived/notify_action.sh STOP"   
        garp_master_delay 1    # 设置边缘实例切换为主用状态后更新ARP缓存的时间。
        garp_master_refresh 5   # 设置主边缘实例发送ARP报文的时间间隔。
        track_interface {
                    eth0         # 使用绑定了高可用虚拟IP的网卡。本示例中,使用eth0。
            }
        track_script {
         checkhaproxy   
      }
    }   
    

    notify_action配置说明
    Keepalived主要的日志保存在/var/log/messages文件中。此外,您可以通过配置/etc/keepalived/notify_action来实现对Keepalived日志的记录。以下为一个配置示例,请您根据实际情况进行修改。

    #!/bin/bash
    #/etc/keepalived/notify_action.sh
    log_file=/var/log/keepalived.log
    log_write()
    {
        echo "[`date '+%Y-%m-%d %T'`] $1" >> $log_file
    }
    [ ! -d /var/keepalived/ ] && mkdir -p /var/keepalived/
    
    case "$1" in
        "MASTER" )
            # 在这里添加自定义脚本,定义在实例切换到MASTER状态时执行的操作
            ;;
        "BACKUP" )
            # 在这里添加自定义脚本,定义在实例切换到BACKUP状态时执行的操作
            ;;
        "FAULT" )
            # 在这里添加自定义脚本,定义在实例切换到FAULT状态时执行的操作
            ;;
        "STOP" )
            # 在这里添加自定义脚本,定义在实例切换到STOP状态时执行的操作
            ;;
        *)
            log_write "notify_action.sh: STATE ERROR!!!"
            ;;
    esac
    
  7. Esc键后,输入:wq,然后按Enter键来保存设置并退出编辑器。

  8. 执行以下命令,启动veEN_01的Keepalived,使步骤6中的配置生效。

    systemctl start keepalived
    

在边缘实例veEN_02上安装Keepalived

  1. 参照“在边缘实例veEN_01上安装Keepalived”的步骤1~步骤5,安装Keepalived并进入keepalived.conf文件的编辑模式。

  2. 参照以下内容修改Keepalived配置文件。

    ! 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_garp_interval 0
       vrrp_gna_interval 0
    }
      vrrp_script checkhaproxy
    {
         script "/etc/keepalived/do_sth.sh"   # 以检测业务进程是否运行正常。“do_sth.sh”是自定义的业务进程检测脚本,请根据业务需要来执行。执行时,“do_sth.sh”须替换为实际的脚本名称。
         interval 5
    }
    
    vrrp_instance VI_1 {
        state BACKUP      # 设置Keepalived节点的初始状态。MASTER表示主用状态,BACKUP表示备用状态。本示例中,设置veEN_02为BACKUP。
        interface eth0    # 设置绑定高可用虚拟IP的实例网卡。该网卡用于发送VRRP包。本示例中,使用eth0。
        virtual_router_id 51 # 设置集群的虚拟路由器ID。
        nopreempt  # 设置为非抢占模式。当高优先级的边缘实例恢复后,低优先级的边缘实例仍为MASTER。
        preempt_delay 10  # 设置仅state为MASTER时抢占延迟。
        priority 50   # 设置优先级,数字越大优先级越高。本示例中,veEN_02优先级设置为50。
        advert_int 5
        authentication {
            auth_type PASS
            auth_pass 1111
        }
        unicast_src_ip 192.168.7.9   # 设置边缘实例veEN_02的私网IP地址。本示例中,使用192.168.7.9,您在操作时须替换为实际的私网IP地址。
        unicast_peer {
          192.168.7.8             # 设置对端设备(边缘实例veEN_01)的私网IP地址。本示例中,使用192.168.7.8,您在操作时须替换为实际的私网IP地址。
      }
        virtual_ipaddress {
            192.168.7.4  # 设置高可用虚拟IP的IP地址。本示例中,使用192.168.7.4,您在操作时须替换为实际的高可用虚拟IP的IP地址。   
        }
        notify_master "/etc/keepalived/notify_action.sh MASTER"     # notify_action 的示例参见“notify_action配置说明”。
        notify_backup "/etc/keepalived/notify_action.sh BACKUP"   
        notify_fault "/etc/keepalived/notify_action.sh FAULT"  
        notify_stop "/etc/keepalived/notify_action.sh STOP"   
        garp_master_delay 1    # 设置边缘实例切换为主用状态后更新ARP缓存的时间。
        garp_master_refresh 5   # 设置主边缘实例发送ARP报文的时间间隔。
        track_interface {
                    eth0         # 使用绑定了高可用虚拟IP的网卡。本示例中,使用eth0。
            }
        track_script {
         checkhaproxy   
      }
    }   
    
  3. Esc键后,输入:wq,然后按Enter键来保存设置并退出编辑器。

  4. 执行以下命令,启动veEN_02的Keepalived,使步骤6中的配置生效。

    systemctl start keepalived
    

步骤三:将高可用虚拟IP与边缘实例绑定

参照以下步骤分别将高可用虚拟IP绑定到两个边缘实例:

  1. 访问高可用虚拟IP页面。
  2. 在高可用虚拟IP列表中,找到需要绑定到边缘实例的高可用虚拟IP,然后单击边缘实例列的绑定
  3. 绑定边缘实例页面,选择需绑定的边缘实例,然后单击绑定

步骤四:将高可用虚拟IP与弹性公网IP绑定

  1. 访问高可用虚拟IP页面。
  2. 在高可用虚拟IP列表中,找到需要绑定到弹性公网IP的高可用虚拟IP,然后单击弹性公网IP列的绑定
  3. 绑定弹性公网IP页面,选择需绑定的弹性公网IP,然后单击确定

步骤五:模拟主备切换

  • 正常情况:边缘实例_01处于主用状态并提供相关服务,边缘实例_02处于备用状态不提供服务,高可用虚拟IP供边缘实例_01使用。
  • 模拟异常:停止边缘实例_01,模拟边缘实例_01无法正常接收业务流量的情况。
  • 预期结果:主备切换成功,边缘实例_02开始接收业务流量,高可用虚拟IP供边缘实例_02使用。