在生产环境中,一般会有N台freeswitch 服务器,不同服务器之间的信令和话单的时间不能相差太多,否则对查找和定位问题会造成一定的困扰。
同时,freeswitch的默认运行设置并未直接使用系统时间,而是在fs启动时获取系统时间,并在之后的运行过程中使用内部时钟计算时间。
所以,在fs运行期间的信令和话单中的时间同步就会格外重要,并有特殊之处,需要特别设置。
centos:CentOS release 7.0 (Final)或以上版本
freeswitch:v1.8.7
GCC:4.8.5
首先要说明的是,fs为什么不直接使用系统时间?
根据官方文档介绍,是出于对CDR话单的保护,防止在fs运行过程中,由于系统时间变化的不确定性导致CDR话单计费时长的错误问题。
通常,在fs运行比较长的一段时间之后,从fs的日志、话单等可以看出,fs内部时间和系统时间是不一致的。
这里有一点要注意的是,在自定义的业务模块中,尽量不要使用系统时间,否则当fs内部时间和系统时间出现较大偏差时,会产生莫名其妙的bug。
fs提供了API接口,在运行状态下,同步系统时间到fs内部时间。
fsctl sync_clock
fsctl sync_clock_when_idle
sync_clock模式会马上同步系统时间,可能会造成话单计费时长问题。
sync_clock_when_idle模式更安全,会在系统idle(无呼叫0 channels)的情况下同步系统时间。
安装ntpdate工具。
sudo yum install ntpdate
设置系统定时任务。
sudo crontab -e
30 4 * * * /usr/sbin/ntpdate cn.pool.ntp.org; /sbin/hwclock -w
0 5 * * * /usr/local/freeswitch/bin/fs_cli -x "fsctl sync_clock_when_idle"
每天凌晨4点30分执行ntpdate时间同步,并写入硬件时钟。
每天凌晨5点执行fs的api接口同步系统时间到fs内部时间。
freeswitch多节点串并联之后,信令和话单的时钟同步需要使用fs内部接口刷新。
空空如常
求真得真