🙈 By 洪昕 2023-12-27
利用 OpenNJet HA Copilot 实现高可用部署 (一)
NGINX 向云原生演进,All in OpenNJet
1. HA 简介
在部署服务端应用时,为了实现服务的高可用,常见的一种方案是额外安装 Keepalived, 通过 Keepalived 来监控服务端应用的运行状态,并设置虚拟 IP (VIP), 客户端通过 VIP 访问服务端实例。以开源 Nginx 为例,示意图如下:
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 并提供相应的配置文件,即可实现高可用功能,示意图如下:
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 分别是:
- 192.168.40.157
- 192.168.40.158
- 192.168.40.149
- 使用虚拟 IP:
- 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:
停止 40.157 主机上的 NJet 实例后,由于 40.158 主机的优先级 priority 较高,40.158 将获得 VIP:
重新启动 40.157 主机上的 NJet 实例后,40.157 将重新获得 VIP。