Opensips + FreeSwitch 负载均衡

Stella981
• 阅读 874

概略:在做Opensips + FreeSwitch 负载均衡的过程中,遇到的关键问题汇总记录。

基本配置

请参考:https://blog.51cto.com/908405/2235934   比我整理的好,请详细阅读。

几个问题

1、load_balancer表配置

  字段:dst_uri ,值:sip:fs_ip_addr:fs_port
  1)fs_ip_addr:fs_port 如果有错误,实际不存在,会报错
    opensips报错:
      DBG:load_balancer:lb_route: sequential call of LB - skipping destination 1 sip:172.18.198.123:9060 (filtered=1 , disabled=0)
DBG:load_balancer:lb_route: sequential call of LB - no destination found

    UAC报错:All GW Are Down.

  2)fs_ip_addr:fs_port 要配置fs的公网ip,否则接听后双方都没声音

2、CODEC NEGOTIATION ERROR问题
  fs日志
    Audio Codec Compare [PCMA:8:8000:20:64000:1] ++++ is saved as a match       #有这行说明语音编码匹配上了。
    Hangup sofia/external/_msisdn_@ip:port [CS_CONSUME_MEDIA] [INCOMPATIBLE_DESTINATION]
  官网说明:
    488 INCOMPATIBLE_DESTINATION incompatible destination [Q.850] This cause indicates that the equipment sending this cause has received a request to establish a call which has low layer compatibility, high layer compatibility or other compatibility attributes (e.g. data rate) which cannot be accommodated.

  解决:Microsip软件的账号登录信息有一项 “Media Encryption”,选择“禁用”就好了。
  原理:谁知道谁讲讲,我也不懂。

3、自动挂断的问题
  现象:大概32秒或者36秒自动挂断,抓包发现FS发出的消息里包含“ACK Timeout”
  原因:183后,fs --(200 OK)--> ops --(200 OK)--> UAC,此时UAC应该回复ops ACK,ops转发给FS,但是UAC把ACK发错地方了。
    因为ops监听的是所在服务器的内网ip:port,就把内网ip在200 OK包里给了UAC,UAC会ACK时用的是ops的内网ip,所以到不了ops。
  解决:https://blog.csdn.net/commander\_officer/article/details/16946781 这里有两个方法解决这个问题。
    在opensips.cfg中增加两个变量:
      advertised_address="public_ip"
      alias="public_ip"
    或者
      listen=udp:private_ip:5060 as public_ip:5060 (留意as后边没有udp,否则启动报错)

4、登录到ops还是fs的问题
  opensips.cfg 配置决定uac的登录实际发生在哪里
    if(is_method("REGISTER")) {          ##这样登录到ops上
      if (!www_authorize("", "subscriber")) {
        www_challenge("", "0");
        exit;
      }
      save("location");
      exit;
    }

  ------------------------------------------------------------------------------
    if(is_method("REGISTER")) {          ##这样是登录到FS上
      if (!ds_select_dst("1", "0")) {
        send_reply("503","Service Unavailable");
      }
    }

  (登录与负载均衡的关系,个人理解:既然是负载均衡,就应该比较平均的负载大量呼叫的压力。如果在登录阶段,就确定登录到FS1上,那么通话也必然走FS1。那么,比如100个用户,分别登录到fs1和fs2上各50个。fs1上45个在通话,fs2上2个在通话,那就压力悬殊了。所以个人理解应该登录到ops上。)
 (疑问:既然登录到ops上能通过fs进行呼叫,那登录到fs1上,呼叫不能走fs2吗?尚未验证!)

总结:基本上很多问题都是网络NAT导致的,比如rtp建立的问题,没声音的问题,ACK超时自动挂断等等。需要细心的在所有环节进行抓包,分析。(wireshark软件的Telephony菜单里有一个VoIP Call菜单项,可以自动发现sip呼叫,可以整理出呼叫过程中,所有消息的流程图。) 分析流程图可以找到问题所在,然后去搜索解决方案,就比较容易了。

参考资料:

https://www.oschina.net/translate/tutorials-loadbalancing-1-9?lang=chs&p=1

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
3个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Stella981 Stella981
3年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
9个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这