利用 OpenNJet HA Copilot 实现高可用部署 (一)

🙈 By 洪昕 2023-12-27

利用 OpenNJet HA Copilot 实现高可用部署 (一)

NGINX 向云原生演进,All in OpenNJet

1. HA 简介

在部署服务端应用时,为了实现服务的高可用,常见的一种方案是额外安装 Keepalived, 通过 Keepalived 来监控服务端应用的运行状态,并设置虚拟 IP (VIP), 客户端通过 VIP 访问服务端实例。以开源 Nginx 为例,示意图如下:

img

Keepalived 是以 VRRP 协议为实现基础的,VRRP 全称 Virtual Router Redundancy Protocol,即虚拟路由冗余协议。虚拟路由冗余协议,可以认为是实现路由器高可用的协议,即将 N 台提供相同功能的路由器组成一个路由器组,这个组里面有一个 master 和多个 backup,master 上面有一个对外提供服务的 VIP (Virtual IP Address)(该路由器所在局域网内其他机器的默认路由为该 vip),master 会发组播,当 backup 收不到 根据 VRRP 包时就认为 master 宕掉了,这时就需要根据 VRRP 的优先级来选举一个 backup 当 master。这样的话就可以保证路由器的高可用了。

为了简化部署及配置,NJet 通过 Copilot 扩展机制实现了 VRRP 协议的 HA 模块,只要加载 HA Copilot 并提供相应的配置文件,即可实现高可用功能,示意图如下:

img

2. 配置说明

开启 HA 功能需在 njet.conf 的 main block 中添加如下指令

helper ha modules/njt_helper_ha_module.so conf/vrrp.conf;

并在 conf 目录下提供 vrrp 配置文件,配置项的说明如下。

配置项 必填 配置说明
vrrp_instance vrrp_instance 的 string 为设置的 VRRP 的实例名。
state 设置当前节点的初始化状态,状态为 MASTER 或者 BACKUP
interface 可以绑定 vip 的接口名称,比如 eth0,bond0,br0。 通过 IP -a 查看自己的网卡信息
nopreempt 设置是否抢占虚拟 IP,添加即为不抢占
virtual_router_id 设置虚拟路由器惟一标识,范围:0-255,同属一个集群的多个 njet 节点该 id 相同,不同的 njet 集群该值必须不同,务必要确认在同一网络中此值必须唯一。
priority 设置当前 njet 节点的优先级,范围:[1-254],值越大优先级越高
virtual_ipaddress 设置虚拟 IP 对应的子网掩码

配置样例文件参见下文中的测试验证章节。

3. 测试验证

  • 配置三台服务器测试机,IP 分别是:
  1. 192.168.40.157
  2. 192.168.40.158
  3. 192.168.40.149
  • 使用虚拟 IP:
  1. 192.168.40.50

192.168.40.157 服务器 vrrp.conf 配置如下:

vrrp_instance m{
    state MASTER
    interface eth192
    virtual_router_id 32 
    priority 200 
    virtual_ipaddress {
         192.168.40.50/24 
    }
}

192.168.40.158 服务器 vrrp.conf 配置如下:

vrrp_instance m{
    state BACKUP
    interface eth192
    virtual_router_id 32 
    priority 100 
    virtual_ipaddress {
          192.168.40.50/24 
    }
}

192.168.40.149 服务器 vrrp.conf 配置如下:

vrrp_instance m{
    state BACKUP
    interface eth192
    virtual_router_id 32 
    priority 10 
    virtual_ipaddress {
        192.168.40.50/24 
    }
}

三台服务器上的 NJet 都启动时,由于 40.157 是 MASTER,该主机将获取到 VIP:

img

img

img

停止 40.157 主机上的 NJet 实例后,由于 40.158 主机的优先级 priority 较高,40.158 将获得 VIP:

img

img

重新启动 40.157 主机上的 NJet 实例后,40.157 将重新获得 VIP。