使用docker构建可动态启动的FreeSWITCH实例
操作系统 :CentOS 7.6_x64
FreeSWITCH版本 :1.10.9
Docker版本:23.0.6
使用docker打包FreeSWITCH可以极大简化部署环节,但针对高可用场景的故障恢复来说,仅实现docker打包是不够的,打包的docker镜像需要支持”根据提供的参数动态启动FreeSWITCH实例“,至少完成如下动作:
- 根据提供的IP、端口等信息启动服务
- 访问指定的数据库,获取信息并进行通话恢复
今天记录下CentOS 7环境下使用docker构建可动态启动FreeSWITCH实例的过程。本文涉及源码和文件,可以从如下途径获取:
关注微信公众号(聊聊博文,文末可扫码)后回复 20230716 获取。
如何使用docker构建FreeSWITCH编译环境及打包,可以参考我之前的文章:
一、整体结构
这里提供一个FreeSWICH高可用实例的结构图,其中数据库使用的是MySQL数据库,整体结构如下:
说明:
1)打包的docker镜像具备通用性,可根据不同的参数启动不同的FreeSWITCH实例,其中启动参数存储在环境参数里面;
2)主机、备机通过VIP对外提供服务,VIP在同一时刻只在一台机器上,可通过keepalived等工具实现VIP漂移(也可自己写脚本实现,具体实现这里就不展开了);
3)主机、备机连接同一个MySQL库,共享数据库信息(配置数据、运行数据);
4)主机、备机具备同样的环境参数(fs-env文件);
5)主机、备机具备同样的配置文件(conf、scripts等);
二、具体实现
1、FreeSWICH支持MySQL
MySQL版本:5.7.38
1)安装odbc驱动
apt install unixodbc unixodbc-dev
找不到debian11的驱动,下载debian10的驱动实测也可以使用。
安装命令如下:
cd mysql-connector-odbc-5.3.14-linux-debian10-x86-64bit/lib cp libmyodbc5* /usr/local/lib/ ./myodbc-installer -d -a -n "MYSQL" -t "DRIVER=/usr/local/lib/libmyodbc5w.so;SETUP=/usr/lib/libmyodbc5w.so"
/ect/odbcinst.ini 内容如下:
[MYSQL] Driver=/usr/local/lib/libmyodbc5w.so SETUP=/usr/local/lib/libmyodbc5w.so UsageCount=1
/ect/odbc.ini文件内容如下:
[fsdb] Driver=MYSQL Description=database for mysql SERVER=192.168.137.1 CHARSET=UTF8 PORT=3306 USER=root PASSWORD=123456 Database=fsdb OPTION=67108864
2)配置odbc及测试连接
isql -v fsdb
3)编译、安装及配置odbc-dsn
需要开启odbc支持:
./configure --enable-core-odbc-support
需要修改odbc-dsn信息:
对应变量:
odbc-dsn
core-db-dsn --- 仅switch.conf.xml
示例:
<param name="odbc-dsn” value=”fsdb:root:123456”/> <param name="core-db-dsn” value=”fsdb:root:123456”/>
对应文件:
/usr/local/freeswitch/conf/autoload_configs/switch.conf.xml
/usr/local/freeswitch/conf/autoload_configs/db.conf.xml
/usr/local/freeswitch/conf/autoload_configs/callcenter.conf.xml
/usr/local/freeswitch/conf/autoload_configs/voicemail.conf.xml
/usr/local/freeswitch/conf/sip_profiles/internal.xml
/usr/local/freeswitch/conf/sip_profiles/external.xml
/usr/local/freeswitch/conf/autoload_configs/fifo.conf.xml
/usr/local/freeswitch/conf/vars.xml的配置:
<X-PRE-PROCESS cmd="set" data="json_db_handle=odbc://fsdb:root:123456"/>
2、docker容器支持绑定非本机ip地址
vip同一时刻只能在一台机器上,docker容器所使用的vip可能没有漂过来,需要开启非本机绑定。
临时生效:
sysctl -w net.ipv4.ip_nonlocal_bind=1
永久生效:
echo net.ipv4.ip_nonlocal_bind=1 >> /etc/sysctl.conf
说明:
1)vip切换
可以使用keepalived等工具,具体细节这里不展开了。
2)arp广播
如果使用keepalived等工具,该部分忽略。
切换vip后,需要发送arp广播,以便vip实时生效
arping -U 192.168.137.201 -I eth0 -w 2
3、配置文件动态获取运行参数
整体流程如下:
生成env文件及odbc文件 =》 docker设置env信息 -》 fs读取env配置
3.1 xml关键变量需要通过环境变量设置
可通过freeswitch提供的env-set命令获取linux系统环境变量,示例如下:
<X-PRE-PROCESS cmd="env-set" data="force_local_ip_v4=$docker_fs_local_ip_v4"/>
其中,docker_fs_local_ip_v4是Linux系统环境变量。
具体使用方法可参考freeswitch官方wiki:
var.xml是最先加载,可以在该文件设置全局参数,示例如下:
3.2 设置启动映射conf目录
可通过docker启动参数设置:
-v /app/conf:/usr/local/freeswitch/conf
其中, /app/conf 为宿主机的目录,/usr/local/freeswitch/conf 为docker容器的目录。
3.3 动态生成odbc配置信息
odbc.ini文件里面有mysql的ip地址等信息,该部分需要动态生成:
1)动态生成odbc.ini文件;
2)将odbc.ini文件放在freeswitch的conf目录;
3)将/etc/odbc.ini链接到 /usr/local/freeswitch/conf/odbc.ini
xml文件的odbc配置示例如下:
3.4、lua脚本动态获取全局变量
示例如下:
my_globalvar = freeswitch.getGlobalVariable("varname")
运行效果如下:
可参考wiki:
4、Dockerfile及启动脚本
1)需要在Dockefile中安装依赖文件并进行打包;
2)启动时需要指定docker的环境信息;
具体实现可以从如下途径获取:
关注微信公众号(聊聊博文,文末可扫码)后回复 20230716 获取。
三、运行效果
需要设置env文件,示例如下:
docker_fs_local_ip_v4=192.168.137.201 docker_fs_external_ip_v4=192.168.137.201 docker_fs_internal_sip_port=15060 docker_fs_external_sip_port=15080 docker_fs_rtp_start_port=20000 docker_fs_rtp_end_port=30000 docker_fs_odbc_dsn=fsdb docker_fs_odbc_dsn_full=fsdb:root:123456 docker_fs_odbc_ip=192.168.137.1 docker_fs_odbc_port=3306 docker_fs_switch_name=fstest1
需要映射目录,app目录结构如下:
启动效果如下:
运行效果视频可以从如下途径获取:
关注微信公众号(聊聊博文,文末可扫码)后回复 2023071601 获取。
四、资源下载
文涉及源码和文件,可以从如下途径获取:
关注微信公众号(聊聊博文,文末可扫码)后回复 20230716 获取。