I’m doing some testing on Dispatcher in order to prepare it for HA setups with floating IPs on Kamailio version 5.4.1.
In this scenario my calls must be sent to SET with the ID 2 :
SET: {
ID: 2 TARGETS: { DEST: { URI: sip:GW_IP:5061 FLAGS: AX PRIORITY: 0 ATTRS: { BODY: duid=TB_MG03;socket=SOCKET_IP_1:5060 DUID: TB_MG03 MAXLOAD: 0 WEIGHT: 0 RWEIGHT: 0 SOCKET: SOCKET_IP_1:5060 SOCKNAME: OBPROXY: } RUNTIME: { DLGLOAD: 0 } } DEST: { URI: sip:GW_IP:5061 FLAGS: AX PRIORITY: 0 ATTRS: { BODY: duid=TB_MG02;socket=SOCKET_IP_2:5060 DUID: TB_MG02 MAXLOAD: 0 WEIGHT: 0 RWEIGHT: 0 SOCKET: SOCKET_IP_2:5060 SOCKNAME: OBPROXY: } RUNTIME: { DLGLOAD: 0 } } } }
As you can see, both gateways have the same URI but they have different sockets. In this scenario i tried to make a bunch of calls with this set as destination but all calls ended being delivered with socket "SOCKET_IP_2:5060" as oposed to doing a load balancing. This isn’t a real scenario since i wouldn’t want load balance for the same destination, but the objective is to show you the balance feature failing in this conditions, in order to help you debug the issue.
After that i tried a different scenario. This time i disabled the destination with DUID TB_MG02 and socket SOCKET_IP_2:5060 and made the same test.
SET: {
ID: 2 TARGETS: { DEST: { URI: sip:GW_IP:5061 FLAGS: AX PRIORITY: 0 ATTRS: { BODY: duid=TB_MG03;socket=SOCKET_IP_1:5060 DUID: TB_MG03 MAXLOAD: 0 WEIGHT: 0 RWEIGHT: 0 SOCKET: SOCKET_IP_1:5060 SOCKNAME: OBPROXY: } RUNTIME: { DLGLOAD: 0 } } DEST: { URI: sip:GW_IP:5061 FLAGS: DX PRIORITY: 0 ATTRS: { BODY: duid=TB_MG02;socket=SOCKET_IP_2:5060 DUID: TB_MG02 MAXLOAD: 0 WEIGHT: 0 RWEIGHT: 0 SOCKET: SOCKET_IP_2:5060 SOCKNAME: OBPROXY: } RUNTIME: { DLGLOAD: 0 } } } }
In this test all the calls ended up being delivered with SOCKET_IP_2 as the socket. This time no load balance was made and a disabled destination was used.
I’ve tried reversing the order of the destinations in the configuration and it now chooses socket SOCKET_IP_1 all the time.
If both destinations have different URIs none of this problems happen, only with two destinations with same address but different sockets.
Here are my dispatcher parameters, let me know if there is some config wrong :
modparam("dispatcher", "flags", 2) // Failover support is enabled modparam("dispatcher", "ds_ping_method", "OPTIONS") modparam("dispatcher", "ds_hash_size", 8) modparam("dispatcher", "db_url", DBURL) modparam("dispatcher", "table_name", "TBK_DISPATCHER") modparam("dispatcher", "setid_col", "TBK_NapGroupId") modparam("dispatcher", "destination_col", "TBK_NapPeer") modparam("dispatcher", "flags_col", "TBK_NapState") modparam("dispatcher", "priority_col", "TBK_NapPriority") modparam("dispatcher", "attrs_col", "TBK_NapAttrs") modparam("dispatcher", "ds_probing_mode", 3) modparam("dispatcher", "ds_ping_interval", 10) modparam("dispatcher", "ds_probing_threshold", 2) modparam("dispatcher", "ds_inactive_threshold", 2) modparam("dispatcher", "ds_ping_reply_codes", "code=200;code=484;code=404") modparam("dispatcher", "ds_db_extra_attrs", "socket=TBK_Sap") modparam("dispatcher", "ds_ping_from", "sip:PeerProbing@peer.probing")
What do you think might be the problem here? If you need any more info please let me know. HA setup is a really important feature for us to move forward and as such we need to assure that we use the correct socket.