Este tipo de configuración se implementa en centrales IP donde queremos brindar una alta disponibilidad.
Inicialmente necesitamos dos servidores que tengan asterisk instalado.
La herramienta a utilizar es heartbeat en su versión 2.1.3, utilizaremos el heartbeat para sensar el servicio del asterisk en ambos servidores, y si se cae alguno de ellos el otro tomara su lugar, como maestro y esclavo, si cae el maestro, el esclavo toma su lugar, y si se levanta el maestro nuevamente lleva el mando.
Estamos usando Centos 4.7, instalamos en ambos servidores el heartbeat.
yum –y install heartbeat
Para este ejemplo el asterisk principal tiene el hostname lcla.com y el backup lclabk.com
Para todas las configuraciones necesitamos este parámetro así que asegúrense de poner el nombre de hostname la respuesta al comando
uname –n
[root@lcla /]# uname –n
lcla.com
[root@lclabk /]# uname –n
Ahora debemos de modificar el archivo /etc/hosts de la siguiente forma, En lcla.com :
[root@lclabk /]# cat /etc/hosts
127.0.0.1 lclabk.com lclabk localhost.localdomain localhost 192.168.254.204 lcla.com lcla
192.168.254.202 lclabk.com lclabk
En lcla backup .com
[root@lclabk /]# cat /etc/hosts
127.0.0.1 lclabk.com lclabk localhost.localdomain localhost 192.168.254.204 lcla.com lcla
192.168.254.202 lclabk.com lclabk
Notemos que el servidor maestro tiene la ip 192.168.254.204 y el esclavo la ip 192.168.254.202.
Ahora empezamos a configurar en el maestro, copiemos los siguientes archivos
cp /usr/share/doc/heartbeat-2.1.3/authkeys /etc/ha.d/ cp /usr/share/doc/heartbeat-2.1.3/ha.cf /etc/ha.d/ cp /usr/share/doc/heartbeat-2.1.3/haresources /etc/ha.d/
luego editamos el archivo vi /etc/ha.d/authkeys
auth 2
2 sha1 mipass
Cambiamos los permisos en el archivo authkeys :
chmod 600 /etc/ha.d/authkeys
Editemos el archivo ha.cf el cual es muy importante
vi /etc/ha.d/ha.cf
Agreguemos las siguientes lineas: logfile /var/log/ha-log logfacility local0 keepalive 2 deadtime 30 initdead 120 bcast eth0 udpport 694 auto_failback on node lcla.com node lclabk.com
La parte final de la configuración del hearbeat es seleccionando los demonios que queremos que esten en alta disponibilidad, para nosotros asterisk
vi /etc/ha.d/haresources
Agreguemos la siguiente línea
lcla.com IPaddr::192.168.254.200/24/eth0 asterisk
Notemos que estamos poniendo la IP 192.168.254.200, esta nos servira como una ip virtual, que sera utilizada para la comunicación de asterisk, ya sea con los anexos sip iax, u otra comunicación voip que realice con asterisk.
Finalmente debemos de copiar los archivos de configuración del heartbeat del maestro al esclavo
scp -r /etc/ha.d/ [email protected]:/etc/
y con ello ya tenemos listo.
Para que siempre se inicie el heartbeat al prender el servidor agregamos en ambos
chkconfig heartbeat on
Reiniciamos el servicio en ambos servidores.
service heartbeat restart
Si no te tomaron bien los hostname, revisa todos los archivos donde se declara el hostname, que son básicamente tres
/etc/hosts
/etc/sysconfig/network
/etc/sysconfig/network-scripts/ifcfg-eth0
Si tienes algún problema prueba reiniciando tus servidores, para que te tome bien el hostname.
Si todo esta bien, entonces desde otra maquina prueba haciendo ping a la ip virtual 192.168.254.200, y en el maestro deberás tener ambas ip.
[root@lcla /]# ifconfig
eth0 Link encap:Ethernet HWaddr 00:0C:29:7D:E2:3E
inet addr:192.168.254.204 Bcast:192.168.254.255 Mask:255.255.255.0 inet6 addr: fe80::20c:29ff:fe7d:e23e/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:16653 errors:0 dropped:0 overruns:0 frame:0 TX packets:14789 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000
RX bytes:2564095 (2.4 MiB) TX bytes:3349104 (3.1 MiB) Interrupt:177 Base address:0x1400
eth0:0 Link encap:Ethernet HWaddr 00:0C:29:7D:E2:3E
inet addr:192.168.254.200 Bcast:192.168.254.255 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
Interrupt:177 Base address:0x1400
lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:1283 errors:0 dropped:0 overruns:0 frame:0 TX packets:1283 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0
Luego de lograr la alta disponibilidad del demonio del Asterisk, necesitamos sincronizar los archivos de configuración, de esta manera al realizar algún cambio en la configuración del Asterisk principal, este replique en la configuración del Asterisk backup.
Podríamos hacerlo simplemente con un script que ejecute un scp periódicamente y copie los archivos del /etc/asterisk, pero esto no es muy eficiente. Puesto que podemos utilizar el rsync que es un programa que ofrece transmisión eficiente de datos incrementales comprimidos y cifrados, el algoritmo compara los checksum de manera eficiente, y cuando no encuentra coincidencias, envía los cambios e información de cómo reensamblarlos, de esta forma solo se copian los nuevos cambios.
El script que ejecuta el rsync, es necesario ponerle el password, luego colocar el script en el crontab para que se ejecute periódicamente.
[root@lcla ~]# cat /sbin/syncdata.bash
#!/usr/bin/expect -f
spawn rsync -raz --progress --size-only /etc/asterisk/ 192.168.254.202:/etc/asterisk/
match_max 100000
# Look for passwod prompt expect "*?assword:*" send -- "123456"
# send blank line (\r) to make sure we get back to gui send -- "\r"
expect eof
[root@lcla ~]# crontab –e
*/1 * * * * /sbin/syncdata.bash
Bueno todo esto se hace posible con el rsync
[root@lcla ~]# rpm -q rsync
rsync-2.6.3-1
Ahora que tenemos alta disponibilidad del demonio del Asterisk, la sincronización de los archivos de configuración entre la central principal y la de backup. Ello nos sirve para un escenario donde solo necesitamos un Asterisk con configuración a mano. Sin embargo Freepbx entre otros software de administración, manejan algunas parámetros con base de datos, en el caso de realtime por ejemplo. Además el cdr podemos estar guardándolo en una base de datos también. Por tanto
necesitamos tener un backup de la base de datos en cuestión de la central principal en la de backup. Para esta labor vamos a utilizar replicación de base de datos en mysql. De esta manera, se replicaran los nuevos registros hechos en la base de datos de la central principal, en la central de backup.
Por ello para no generar incoherencias, debemos hacer un backup de la base de datos de la central principal y restaurarlo en la base de datos de la central de backup, antes de configurar la replicación.
Paso 1:
Master: 192.168.254.204 Slave: 192.168.254.202
Paso 2:
En el Master, realizar los cambios en el archivo my.cnf:
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock old_passwords=1
log-bin
binlog-do-db= # input the database which should be replicated
binlog-ignore-db=mysql # input the database that should be ignored for replication binlog-ignore-db=test server-id=1 [mysql.server] user=mysql basedir=/var/lib [mysqld_safe] err-log=/var/log/mysqld.log pid-file=/var/run/mysqld/mysqld.pid Paso 3:
En el master, crear una cuenta de replicación para el esclavo en mysql.
mysql> grant replication slave on *.* to 'replication'@192.168.254.202 identified by 'slave';
luego reiniciar el servicio de mysql en el master.
Paso 4:
Ahora editar el archivo my.cnf en el Slave:
[mysqld] datadir=/var/lib/mysql socket=/var/lib/mysql/mysql.sock old_passwords=1 server-id=2 master-host = 192.168.254.204 master-user = replication master-password = slave master-port = 3306 [mysql.server] user=mysql basedir=/var/lib [mysqld_safe] err-log=/var/log/mysqld.log pid-file=/var/run/mysqld/mysqld.pid
Paso 5:
Reiniciar el servicio de mysql en el slave y luego
mysql> start slave;
mysql> show slave status\G;
*************************** 1. row *************************** Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.254.204 Master_User: replica Master_Port: 3306 Connect_Retry: 60 Master_Log_File: MASTERMYSQL01-bin.000009 Read_Master_Log_Pos: 4 Relay_Log_File: MASTERMYSQL02-relay-bin.000015 Relay_Log_Pos: 3630 Relay_Master_Log_File: MASTERMYSQL01-bin.000009 Slave_IO_Running: Yes Slave_SQL_Running: Yes Replicate_Do_DB: Replicate_Ignore_DB: Replicate_Do_Table: Replicate_Ignore_Table: Replicate_Wild_Do_Table: Replicate_Wild_Ignore_Table: Last_Errno: 0 Last_Error: Skip_Counter: 0 Exec_Master_Log_Pos: 4 Relay_Log_Space: 3630 Until_Condition: None Until_Log_File: Until_Log_Pos: 0 Master_SSL_Allowed: No Master_SSL_CA_File: Master_SSL_CA_Path: Master_SSL_Cert: Master_SSL_Cipher: Master_SSL_Key: Seconds_Behind_Master: 1519187 1 row in set (0.00 sec)
Slave_IO_Running y Slave_SQL_Running: deben estar en YES.
Paso 6:
En el master:
mysql> show master status;
+---+---+---+---+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+---+---+---+---+ |MysqlMYSQL01-bin.000008 | 410 | asterisk | |
+---+---+---+---+ 1 row in set (0.00 sec)
Y ahora esta listo, debemos hacer pruebas ingresando datos, en la base de datos principal y observar como estos se reflejan en la central de backup.