具体来说,我在Heartbeat主/被动集群中使用星号。集群中有2个节点。假设Asterisk1 Asterisk2。在我的集群中,一切都配置得很好。当其中一个节点失去互联网连接,星号服务失败或Asterisk1被关闭时,星号服务和故障转移IP迁移到幸存的节点(Asterisk2)。
问题是,如果我们实际上正在处理一个呼叫,当Asterisk1下降星号停止呼叫,我可以重拨,直到星号服务在asterisk2(5秒,不坏的时间)。
但是,我的问题是:有没有一种方法,使星号工作像skype当它失去连接在一个电话?我的意思是,不停止呼叫并尝试重新连接呼叫,当asterisk服务在Asterisk2中启动时重新连接它?
有一些商业系统支持这种行为。
如果你想在非商业系统上做,有两种方法:
1)强制回呼所有带有自动应答标志的话机。要求:Guru用星号表示。
2)使用xen和内存映射/镜像系统维护具有相同内存状态(相同运行星号)的其他节点vps。要求:精通XEN。例如:http://adrianotto.com/2009/11/remus-project-full-memory-mirroring/
对不起,这两种方法都需要高级知识水平。
注意,如果您通过openvpn隧道进行sip,很可能您不会在隧道内丢失呼叫,如果互联网下降长达20秒。这不是您所要求的,但可以工作。
由于近2年来没有得到公认的答案,我将提供一个:no。这是为什么。
-
如果您从一个Asterisk服务器1故障转移到Asterisk服务器2,那么Asterisk服务器2不知道正在进行哪些调用(即端点到端点)。(即使你共享一个被叫号码数据库,也要使用星号实时等)。如果asterisk试图将呼叫的两个分支都带到相同的号码,则这些可能不是呼叫的相同端点。
-
另一个服务器无法恢复与另一个服务器的SIP TCP会话,因为它已与上一个服务器关闭。
-
MAC源/目的端口可能相同,您的防火墙将不知道您正在尝试继续相同的会话
等等……
如果您的目标是电话服务的高可用性,请查看VoIP信息网站。所有其他的(网络冗余,磁盘冗余,共享块存储设备,路由器故障转移协议等)都是分散注意力的…将重点放在提供电话服务的所有中继/路由/设备的早期故障检测上,然后在不共享任何设备的情况下提供最高程度的恢复。(太多的HA解决方案共享磁盘、通道库等,这会造成单点故障)
您的解决方案需要在两个服务器上实时更新共享数据库。数据库将由事件记录器管理,该记录器将跟踪正在进行的所有调用;可能标记为队列。如果检测到故障,则故障服务器上的所有调用都将标记为DROPPEDCALL。当故障转移服务器启动并接管(使用心跳监视或类似的东西)时,它要做的第一件事是生成一组调用文件,其中包含标记为droppedcall的所有数据库记录。然后,这些呼叫可以一起召开会议。
最困难的部分是事件监视器,确保您不会错过任何RING或HANGUP事件,可能会在系统中留下一个"幽灵"呼叫,在恢复操作中被错误地拨打。
您可能还应该有一种机制来在"管理"机器上构建Asterisk配置,然后将更改推送到您的调用管理器AST框场。这样,任何节点都可以被其他节点替换。
您应该使用复制技术和Linux高可用性(LHA)(1)的2个DB服务器。或者,DNS轮询或带有"公共"IP的负载平衡也会做得很好。这些机器的负载可能足够轻,也可以承载您的配置管理器,并且可以"免费"获得LHA。
则至少有N+1个AST Boxen用于呼叫处理。N是您计划每秒处理的呼叫数除以300。"+1"是故障转移节点。使用节点轮询,您可以设置一种机制,其中故障转移节点通过从配置管理器中提取正确的配置来采用故障机器的标识。
如果硬件便宜/免费,那么1:1 LHA节点冗余总是一个选项。然而,一般来说,你的PC硬件和Asterisk软件的失败率相对较低;从罐子里拿出3到4个"9 "所以,真的,你是在努力保持最后一点距离到"第五个9"。
我希望这能给你一些关于该走哪条路的想法。如果你有任何问题,请告诉我,请花时间"接受"你所需要的答案。
(1) http://www.linuxjournal.com/content/ahead-pack-pacemaker-high-availability-stack