Chi sono |  Contatti |  Mappa del sito 
 
 
 
 
Home > Articoli > Asterisk > Asterisk Failover e registrazioni SIP
 
 

Asterisk Failover e registrazioni SIP

Abbiamo gia accennato nel precedente articolo al seguente problema:
Quando un server Asterisk, nell'ambito del cluster definito tramite uCarp, diviene Master, non è in possesso dei dati di registrazione degli apparecchi SIP e deve attendere il refresh della registrazione per poterli raggiungere.

L'efficienza del failover automatico viene di fatto mortificata.
Per limitare il danno si possono mettere in pratica alcune misure, ad esempio abbassare l'intervallo di tempo necessario a rinnovare la registrazione.

D'altra parte bisogna ammettere che il problema non si pone nemmeno nel caso in cui gli apparecchi SIP abbiano la possibilità di utilizzare differenti registrar e proxy, come si verifica in genere con telefoni di fascia elevata. In tal caso basta fare riferimento agli indirizzi di rete dei vari server senza utilizzare l'indirizzo virtuale.

In caso contrario, per ottenere un failover veramente efficiente occorre utilizzare altre soluzioni. Quella che viene qui esaminata risolve il problema della latenza nella raggiungibilità degli agents SIP nel modo seguente:

Si da per scontato che sia sta allestito un cluster di due server Asterisk basato su uCarp (vedi articolo relativo), e che Asterisk utilizzi l'architettura Real Time per memorizzare i dati di ciascun peer in una tabella di database MySQL.

Tale tabella (sippeers), col relativo database (asterisk), sarà presente su ciascuno dei nodi del cluster, i contenuti saranno sincronizzati grazie al meccanismo di replicazione (master-master) messo a disposizione da MySQL.

In questo scenario ognuno dei due nodi, come database server, svolgerà un ruolo sia di master che di slave nei confronti dell'altro

Per ottenere questo comportamento, dovremo impostare opportunamente il file my.cnf

in server1:

[mysqld]
..........
server-id = 1
replicate-same-server-id = 0
auto-increment-increment = 2
auto-increment-offset = 1

master-host = indirizzo_ip_server2
master-user = nome_utente_per_replica
master-password = password_utente_per_replica
master-port = 3306
replicate-do-db = asterisk

log-bin = /var/lib/mysql/mysql-bin.log
binlog-do-db = asterisk
relay-log = /var/lib/mysql/slave-relay.log
relay-log-index = /var/lib/mysql/slave-relay-log.index
..........
in server2:
[mysqld]
..........
server-id = 2
replicate-same-server-id = 0
auto-increment-increment = 2
auto-increment-offset = 2

master-host = indirizzo_ip_server1
master-user = nome_utente_per_replica
master-password = password_utente_per_replica
master-port = 3306
replicate-do-db = asterisk

log-bin = /var/lib/mysql/mysql-bin.log
binlog-do-db = asterisk
relay-log = /var/lib/mysql/slave-relay.log
relay-log-index = /var/lib/mysql/slave-relay-log.index
..........
Dovrà anche essere creato un utente ad hoc per la replica, che abbia i permessi replica sulla tabella della macchina master, altrimenti non riuscirà a leggere i dati da replicare, quindi su ognuno dei due server:
mysql> grant replication slave on *.* to nome_utente_per_replica@indirizzo_ip_altro_server
 identified by 'password_utente_per_replica';
mysql> flush privileges; 
Alcune modifiche si rendono ancora necessarie in sip.conf (sezione [general]):
bindaddr=192.168.1.10 
rtcachefriends=yes	
rtupdate=yes.
rtautoclear=no 
ignoreregexpire=yes		
Il meccanismo di replicazione non è assolutamente vincolato alla commutazione di stato master/backup del cluster, che nella fattispecie è stata impostata come segue:

/etc/rc.d/rc.local:

echo start slave |/usr/bin/mysql
/usr/local/sbin/ucarp -i eth0 -s 192.168.1.2 -v 1 -p pippo \
-a 192.168.1.10 -u /etc/ucarp/ucarp-up.sh -d /etc/ucarp/ucarp-down.sh -B -z
/etc/ucarp/ucarp-up.sh:
#!/bin/sh
exec 2> /dev/null
/sbin/ip addr add 192.168.1.10/24 dev "$1"
/usr/sbin/safe_asterisk
/etc/ucarp/ucarp-down.sh:
#!/bin/sh
exec 2> /dev/null
/sbin/ip addr del 192.168.1.10/24 dev "$1"
/bin/killall -9 asterisk
/var/spool/cron/crontab:
...............
* * * * * test -x /etc/ucarp/ucarp-cron && /etc/ucarp/ucarp-cron >/dev/null
...............
/etc/ucarp/ucarp-cron:
#!/bin/sh
UCARP=`ps ax|grep /usr/local/sbin/ucarp|grep -v grep|awk '{print $1}'`

	if [ "$UCARP" == "" ]; then
		/usr/local/sbin/ucarp -i eth0 -s 192.168.1.2 -v 1 -p pippo \
                -a 192.168.1.10 -u /etc/ucarp/ucarp-up.sh -d /etc/ucarp/ucarp-down.sh -B -z
	fi
exit 0;
La configurazione riportata attua una variante di quanto visto nel precedente articolo, e che prevede che un solo server Asterisk alla volta sia in funzione, ovvero quello ospitato sul nodo Master del cluster uCarp.
Sono ovviamente possibili ulteriori sofisticazioni nella scrittura degli script di controllo.