En el siguiente laboratorio haremos un balanceador activo de llamadas, donde tenemos un servicio de telefonía PBX con Asterisk que desemamos se mantenga activo en caso de una falla. La infraestructura es la siguiente:
El balanceador es Kamailio, donde los teléfonos sip se registran con la IP 192.168.0.1 mientras que los PBX asterisk pbx 1 y 2 tienen la ip 192.168.0.10 y 192.168.0.20 respectivamente. El pbx1 es el server activo al que llegan las llamadas y si existe una falla de servicio las llamadas pasarán al pbx2
En server balanceador, la configuración de kamailio.cfg es la siguiente:
listen=192.168.0.1:5060
auto_aliases=no
log_stderror=yes
loadmodule "tm.so"
loadmodule "rr.so"
loadmodule "pv.so"
loadmodule "sl.so"
loadmodule "maxfwd.so"
loadmodule "nathelper.so"
loadmodule "textops.so"
loadmodule "siputils.so"
loadmodule "xlog.so"
loadmodule "sanity.so"
loadmodule "path.so"
loadmodule "dispatcher.so"
loadmodule "ctl.so"
modparam("nathelper|registrar", "received_avp", "$avp(s:rcv)")
modparam("dispatcher", "list_file", "/etc/kamailio/dispatcher.list")
modparam("dispatcher", "flags",2)
modparam("dispatcher", "use_default", 1) // default server siempre será el último de la lista con prioridad en dispatcher.list
modparam("dispatcher", "ds_ping_interval", 1)
modparam("tm", "fr_timer", 1500) // default 30s
modparam("dispatcher", "ds_probing_threshold", 1)
modparam("dispatcher", "ds_inactive_threshold", 1)
route {
# CANCEL processing
if (is_method("CANCEL")) {
if (t_check_trans()) {
t_relay();
}
exit;
}
if (is_method("INVITE")) {
#ds_select_dst("1","4");
sl_send_reply("100","Trying");
#forward();#uri:host, uri:port);
#exit();
#record_route();
}
route(DISPATCH);
route(RELAY);
}
route[RELAY]
{
if (!t_relay()) {
sl_reply_error();
}
xlog("saliendo de route relay");
exit;
}
# Dispatch requests
route[DISPATCH] {
# round robin dispatching on gateways group '1'
#if(!ds_select_dst("1", "4","2")){
# con menor peso
if(!ds_select_dst("1", "11")){
send_reply("404", "No destination");
exit;
}
xlog("L_DBG", "--- SCRIPT: going to <$ru> via <$du>\n");
t_on_failure("RTF_DISPATCH");
t_relay();
exit;
}
# Failure re-route
failure_route[RTF_DISPATCH] {
if (t_is_canceled()) {
exit;
}
# next DST - only for 500 or local timeout
xlog("failure entra\n");
if (t_check_status("500") or (t_branch_timeout() and !t_branch_replied())){
if(ds_next_dst()){
xlog("failure fallo a sguiente to <$ru> via <$du>\n");
t_on_failure("RTF_DISPATCH");
t_relay();
exit;
}
}
}
En dispatcher.list agregamos lo siguiente:
1 sip:192.168.0.20:5060 0 12 rweight=50;weight=50;cc=1;
1 sip:192.168.0.10:5060 0 12 rweight=50;weight=50;cc=1;
El último de la priodiad 1, es el que se establece como primario. Por último, reiniciar el servicio balanceador.
# systemctl restart kamailio
Cuando el servidor 192.168.0.10 no esté en red, o el servicio Asterisk no este funcionando, entonces Kamailio redireccionará las peticiones al 192.168.0.20.
Cześć.
Comentarios
Publicar un comentario