部署在AWS Ubuntu EC2上的FreeSwitch如何实现高可用?
AWS环境下FreeSWITCH高可用落地方案
你之前尝试的两个方案踩坑是AWS环境的固有特性导致的:VPC二层网络不支持VRRP组播报文,传统keepalived浮动IP方案天然跑不通;EFS是共享文件存储,仅适合非实时文件读写,无法承载FreeSWITCH运行时的会话注册、通话状态这类强一致性实时数据同步,用来做高可用核心组件必然失败。
目前生产验证过的可行方案有三类,按落地复杂度从低到高排序:
方案1:Route53故障转移 + 跨AZ多实例(最易落地)
- 至少部署2台同规格Ubuntu EC2实例承载FreeSWITCH,分布在同一区域的不同可用区,避免单AZ故障。EFS可以保留使用,仅用来存静态拨号计划、网关配置、IVR素材、录音文件、日志这类非实时数据,两台实例开机自动挂载EFS读取静态配置即可,不要用EFS同步运行时状态。
- 每台实例绑定独立的弹性公网IP(EIP),在Route53为SIP服务域名配置故障转移路由策略:主实例对应主记录,备实例对应辅助记录。
- 配置Route53健康检查,探测目标设为FreeSWITCH的SIP 5060端口,或自定义ESL健康检查接口,收到正常响应判定节点健康。主节点故障时Route53自动将域名解析切到备节点EIP,建议把域名解析TTL设为60秒,降低缓存导致的切流延迟。
- 跨节点状态同步:两台节点开启
mod_sofia的注册同步、mod_hash会话数据同步,通过ESL集群同步实时通话状态;对通话中断要求高的场景开启媒体旁路,RTP流量直接在终端之间传输,不经过FreeSWITCH节点,切换时不会中断正在进行的通话。
方案2:Global Accelerator流量调度(切流速度最快)
- 跨AZ部署2台以上FreeSWITCH实例,全部加入AWS Global Accelerator的端点组,由加速器提供固定的任播IP作为SIP服务统一入口,不需要给每个节点单独绑EIP。
- Global Accelerator自带四层健康检查,自动将SIP信令、RTP流量转发到健康的后端节点,故障切换时间在10-30秒,不受本地DNS缓存影响,切流速度远快于DNS方案。
- 注意在FreeSWITCH的
sofia配置里把Global Accelerator的IP段加入SIP ACL白名单,正确配置NAT映射规则,避免信令Contact地址携带内网IP导致单通、注册失败问题。
方案3:Pacemaker + API自动飘EIP(适配固定IP接入场景)
- 同VPC跨AZ部署2台FreeSWITCH实例,仅主节点绑定服务用EIP,两台节点部署Corosync做跨节点心跳,Pacemaker做集群资源管理。
- 自定义集群资源脚本:主节点心跳中断判定故障时,备节点自动调用AWS CLI执行命令完成EIP切换:
# 解绑故障节点上的EIP aws ec2 disassociate-address --association-id <当前EIP绑定关联ID> --region <实例所在区域> # 将EIP绑定到当前备节点 aws ec2 associate-address --instance-id <本节点实例ID> --allocation-id <EIP分配ID> --region <实例所在区域> - EIP切换完成后,备节点自动触发本地FreeSWITCH服务重载,拉取全量用户注册数据,整个切换过程耗时30秒左右,适合SIP终端不支持域名解析、只能配置固定IP接入的场景。
注意:不要尝试在AWS VPC内通过VRRP/keepalived配置二层虚拟IP,VPC虚拟交换机会直接丢弃目标IP未在EC2网卡元数据中登记的流量,属于底层架构限制,没有绕过方法。也不要把FreeSWITCH运行时的socket文件、内存快照、实时会话数据存在EFS上,会触发文件锁冲突、状态不一致问题,直接导致服务异常。
内容的提问来源于stack exchange,提问作者thilip an
相关产品推荐
相关产品推荐

