利用 KeepAlived 实现 3CX 高可用

简介

Keepalived 是基于 vrrp 协议的一款高可用软件。Keepailived 有一台主服务器和多台备份服务器,在主服务器和备份服务器上面部署相同的服务配置,使用一个虚拟 IP 地址对外提供服务,当主服务器出现故障时,虚拟IP地址会自动漂移到备份服务器。

大致流程图如上图所示。

由于 3CX 的高可用方案需要使用域名注册,而且在切换时需要修改用户的 DNS 记录值。有很多客户是不允许我们有修改 DNS 服务器的权限。所以这也是我们今天介绍这套 Keepalived 高可用方案的原因。

Keepalived 会创建一个虚拟 IP 地址,话机都注册到这个虚拟 IP 下。虚拟 IP 一般是挂在 3CX1 的网卡上,当主机挂掉以后,虚拟 IP 会挂载到 3CX2 的网卡上,对于话机来说它们注册的 IP 依然是保持不变的,这也保证了话机的使用是无缝切换的。

环境

我们的测试环境:

  • Debian 12.10
  • Linux Kernel 6.1.0-32-amd64
  • Keepalived 1:2.2.7-1+b2
  • 3CX 版本 20.0.5.551
  • 3CX1 IP地址:192.168.2.201
  • 3CX2 IP 地址:192.168.202
  • 虚拟 IP:10.168.1.20

安装

我们需要在两台服务器上都安装 keepalived,所以下面的步骤需要在两台服务器上各自进行:

在这里我们将主机称为 3CX1,备机称为 3CX2。

在安装 Keepalived 之前,我们需要先安装一些依赖库文件:

apt install linux-headers-$(uname -r)

装完依赖库后我们就安装 Debian 库里的 Keepalived :

apt install keepalived 

配置 3CX1

安装后我们需要在 3CX1 上创建 /etc/keepalived/keepalived.conf 文件:

vim /etc/keepalived/keepalived.conf

接着我们填入配置文件:

vrrp_instance 3cx {
	state                MASTER
	interface            ens18
	virtual_router_id    150
	priority             101
	advert_int           1
	unicast_src_ip       192.168.2.201
	unicast_peer {
		192.168.2.202
	}
	authentication {
		auth_type        PASS
		auth_pass        1212
	}

	virtual_ipaddress {
		192.168.2.200/24
	}
}
  • state: MASTER
  • interface:网卡名称
  • virtual_router_id:所有服务器需要配置成一样
  • priority:虚拟 IP 会在优先级最高的服务器上,推荐每台服务器间隔为 50。
  • advert_int:查询时间(秒)
  • unicast_src_ip:本地 IP。
  • unicast_peer:备机 IP。
  • authentication/auth_type:密码验证
  • auth_pass:密码
  • virtual_ipaddress:虚拟 IP 和子网掩码。

配置 3CX2

接着我们到 3CX2 上同样创建 /etc/keepalived/keepalived.conf 文件。配置文件与 3CX1 上大致相同,不同点会在配置下方说明:

vrrp_instance 3cx {
	state                MASTER
	interface            ens18
	virtual_router_id    150
	priority             51
	advert_int           1
	unicast_src_ip       192.168.2.202
	unicast_peer {
		192.168.2.201
	}
	authentication {
		auth_type        PASS
		auth_pass        1212
	}

	virtual_ipaddress {
		192.168.2.200/24
	}
}
  • priority:MASTER 服务器优先级。如果两台服务器配置的都是 MASTER,那么优先级低的会变成 BACKUP 服务器。所以 3CX2 上的 priority 要比 3CX1 设置的低。 推荐间隔为 50
  • virtual_router_id:这个值要和 3CX1 上保持一致。

启动 KeepAlived 服务

需要在两台服务器上都运行该命令:

service keepalived start

我们可以运行以下命令查看服务是否正常运行:

service keepalived status

如下图所示说明是运行正常的:

确认虚拟 IP

一般虚拟 IP 是挂在 MASTER 服务器上的,也就是 3CX1。我们运行下列命令可以看到:

ip addr | grep 192.168

可以看到虚拟 IP 已经挂载在了 3CX1 的网卡上。我们进 3CX 的设置 – 网络中也可以看到。

测试

这个时候我们将 3CX1 服务关掉(模拟服务器宕机),这时候我们去看 3CX2 的网卡,可以看到虚拟 IP 挂在 3CX2 上面了。切换非常迅速。

清空 Nftable 防火墙

由于防火墙的限制,媒体流无法送达。这里我们做简单演示,把 nftable 防火墙列表清空。

sudo nft flush ruleset

已知问题

话机使用 UDP 无法成功注册。需要修改模板,使用 TCP 协议注册。不同话机如何修改模板请咨询话机厂家,并修改 3CX 模板。

信令协商的时候,SDP 信息里会携带服务器的实际 IP 地址,比如 192.168.2.201,如果搭配语音网关使用,配置路由的时候把虚拟 IP 和实际 IP 都加上。

尾巴

由于 3CX 的 Failover 必须保持 Active-standby 模式。使用备机检测到主机服务挂掉的时候,执行脚本,可以实现更丰富的功能。