利用 KeepAlived 实现 3CX 高可用

简介

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

大致流程图如上图所示。

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

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

环境

我们的测试环境:

  • Debian 9.11
  • Linux Kernel 4.9.0-11-amd64
  • Keepalived 1:1.3.2-1
  • 3CX 版本 16.0.2.910
  • 3CX1 IP地址:10.168.1.21
  • 3CX2 IP 地址:10.168.1.22
  • 虚拟 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

接着我们填入配置文件:

! Configuration File for keepalived​
global_defs {   
    notification_email {     
        sysadmin@mydomain.com     
        support@mydomain.com   
    }   
    notification_email_from 
    lb1@mydomain.com   
    smtp_server localhost   
    smtp_connect_timeout 30
}​
vrrp_instance VI_1 {    
    state MASTER    
    interface ens192    
    virtual_router_id 101    
    priority 101    
    advert_int 1    
    authentication {        
    auth_type PASS        
    auth_pass 1111    
    }    
    virtual_ipaddress {        
        10.168.1.20    
    }
}
  • global_defs:这里面配置的都是 SMTP 的设置。当 failover 功能切换后发送邮件。由于 3CX 中也带有此功能,可以不配置
  • vrrp_instance VI_1:关于 vrrp 的一些设置。
    • interface:需要改成这台服务器的网卡名称。
    • 其他可以不改。
  • virtual_ipaddress:虚拟 IP 地址。

配置 3CX2

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

! Configuration File for keepalived
 global_defs {
    notification_email {
      sysadmin@mydomain.com
      support@mydomain.com
    }
    notification_email_from lb2@mydomain.com
    smtp_server localhost
    smtp_connect_timeout 30
 }
 vrrp_instance VI_1 {
     state MASTER
     interface ens192
     virtual_router_id 101
     priority 100
     advert_int 1
     authentication {
         auth_type PASS
         auth_pass 1111
     }
     virtual_ipaddress {
         10.168.1.20
     }
 }
  • priority:MASTER 服务器优先级。如果两台服务器配置的都是 MASTER,那么优先级低的会变成 BACKUP 服务器。所以 3CX2 上的 priority 要比 3CX1 设置的低。
  • virtual_router_id:这个值要和 3CX1 上保持一致。

启动 KeepAlived 服务

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

service keepalived start

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

service keepalived status

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

确认虚拟 IP

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

ip addr

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

测试

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

尾巴

使用 keepalived 的情况下,两台 3CX 可以都保持在 active 状态。话机只要注册到虚拟 IP 上就行了。

我们也可以配合 3CX 的 failover 功能,两台 3CX 保持在 active-standby 状态。备机检测到主机服务挂掉的时候,执行脚本,也可以实现更丰富的功能。