概略:在做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