Kamailio funzionalità di Balancer
Le funzionalità di load balancer su Kamailio sono rese disponibili attraverso il modulo “dispatcher”, che prevede il supporto di diversi algoritmi di balancing e traffic dispatching.
In questo tutorial vedremo come configurare Kamailio per bilanciare il traffico verso differenti destinazioni in base alla loro disponibilità, illustrando le modalità round-robin e priority. Kamailio è in grado di monitorare lo stato degli end-point di destinazione attraverso l’utilizzo di SIP OPTIONS oppure altri messaggi come INFO.
Creare una lista di server di destinazione
Per attivare il supporto del balancing è necessario abilitare il modulo “dispatcher” e configurarlo opportunamente, oltre a definire la lista degli end-point di destinazione, da monitorare e verso cui inviare il traffico.
Come primo step, creare il file “dispatcher.list” (di solito inserito nello stesso path del file di configurazione, es. /etc/kamailio/) ed inserire le informazioni relative ai vari target di destinazione.
# setid(int) destination(sip uri) flags(int,opt) priority(int,opt) attrs(str,opt)
1 sip:192.168.0.24 1 5
1 sip:192.168.0.25 1 0
- setid(int): è l’id del gruppo di risorse target
- destination(sip uri): è il target sip:ip:port
- flags(int): parametro opzionale indica lo stato del target; 0=inactive destination, 1=temporary trying (lo stato dipende dalla risposta alle probe)
- priority(int): parametro opzionale indica la priorità per il target specifico
Nell’esempio indicato sopra le due destinazioni saranno entrambe active/inactive in base alle rispettive risposte alle probe ma la prima ha priorità maggiore della seconda.
Attivare il modulo dispatcher
Abilitare il modulo dispatcher inserendo la direttiva “#!define WITH_DISPATCHER” all’inizio del file di configurazione e successivamente caricare il modulo “dispatcher.so” nella sezione “Modules” del file di configurazione.
#!KAMAILIO
#
#!define WITH_DEBUG
#!define WITH_TLS
#!define WITH_NAT
#!define WITH_DISPATCHER
#
...
####### Modules Section ########
...
#!ifdef WITH_DISPATCHER
loadmodule "dispatcher.so"
#!endif
Configurare il modulo all’interno della sezione “setting module-specific parameters” del file di configurazione di kamailio.
#!ifdef WITH_DISPATCHER
modparam("dispatcher", "list_file", "/etc/kamailio/dispatcher.list")
modparam("dispatcher", "ds_ping_method", "OPTIONS")
modparam("dispatcher", "ds_ping_interval", 30)
modparam("dispatcher", "ds_ping_from", "sip:192.168.0.20")
modparam("dispatcher", "ds_ping_reply_codes", "code=200;code=484")
modparam("dispatcher", "ds_probing_mode", 1)
modparam("dispatcher", "ds_probing_threshold", 1)
#!endif
- list_file: path completo del file dispatcher.list con l’elenco dei target
- ds_ping_mehod: metodo SIP per il probing
- ds_ping_interval: intervallo in secondi tra le probe
- ds_ping_from: contenuto del header from sulla probe
- ds_ping_reply_codes: codici di risposta SIP accettati come success alla probe
- ds_probing_mode: 1 per inviare probe a tutti i target configurati
- ds_probing_threshold: numero di risposte KO per considerare il target come unavailable
Con la configurazione indicata, il sistema invierà SIP OPTIONS di probe ogni 30 secondi verso tutti i target configurati nella lista, accettando come risposta OK i codici 200 OK e 484 Address Incomplete, e considerando la destinazione offline appena si verifica una mancata risposta alla probe.
Configurare il routing distribuito verso i server di destinazione
Il routing verso le destinazioni è pilotato dal metodo “ds_select_dst()” (oppure “ds_select_domain()”) da inserire all’interno della opportuna regola di routing configurata su Kamailio. In questo esempio utilizziamo la regola di routing applicata di default per l’inoltro verso destinazioni esterne al dominio del sistema, identificata dalla label “SIPOUT”.
route[SIPOUT] {
#if (uri==myself) return;
append_hf("P-hint: outbound\r\n");
xlog("Request URI: $ru, user[$rU]");
if ($rd == "external.domain1.local")
route(RELAY);
else if ($rd == "external.domain2.local") {
if(!ds_select_dst("1", "8")) {
send_reply("404", "No destination");
exit;
}
route(RELAY);
}
exit;
}
Nell’esempio indicato sopra, il sistema inoltrerà le chiamate ricevute sul dominio “external.domain2.local” verso una delle destinazioni disponibili sulla lista. In particolare utilizzando il metodo “ds_select_dst()” si può decidere l’algoritmo di routing da utilizzare:
- ds_select_dst(“1”, “8”): effettua il forward delle chiamate verso la destinazione con “setid 1” (id presente nel file dispatcher.list) che ha più alta priorità tra quelle disponibili al momento
- ds_select_dst(“1”, “4”): effettua il forward in modalità round-robin verso le destinazioni con “setid 1” (id presente nel file dispatcher.list) al momento disponibili
Oltre il metodo “ds_select_dst()” è possibile utilizzare il metodo “ds_select_domain()”, che a differenza del primo va a sostituire la parte “domain” della request URI originale con l’indirizzo IP della destinazione selezionata nella lista di disponibilità (l’header to resta invariato). Entrambi i metodi hanno gli stessi parametri di ingresso.
Tutti i dettagli sono disponbili sulla documentazione ufficiale di Kamailio relativa al modulo dispatcher.