Asterisk alta disponibilidad - DRBD - Raid1 vía TCP en Linode

DRBD es un programa que permite conectar particiones presentes en distintos servidores y tenerlas sincronizadas. Funciona en el mismo modo de un sistema RAID1 con la sencilla diferencias que las copias de los datos se hacen a través de la red usando el protocolo TCP. En este articulo veremos como instalar DRBD en dos servidores VPS en Linode y de esta forma crear un sistema de alta disponibilidad para Asterisk. Lo mismo podemos hacer con dos servidores locales con un minimo de cambios.

Antes que nada tenemos que instalar y configurar el sistema operativo Linux (en nuestro caso CentOS 5.3) en Linode. En el video se muestra el procedimiento a seguir en un servidor Linode. El mismo procedimiento hay que repetirlo en el segundo servidor Linode.

Una vez terminada esta operación, tendremos los dos servidores Linode listos para la instalación y configuración de DRBD. Siendo los dos servidores localizados en el mismo centro de datos podemos aprovechar de la posibilidad de interconectarlos como  si estuvieran en una red local.

ServerA

IP publico: 69.164.204.41
IP Lan: 192.168.130.234

Configuramos la IP de la red local:

nano /etc/sysconfig/network-scripts/ifcfg-eth0:1

pegamos las siguientes líneas:

DEVICE=eth0:1
BOOTPROTO=none
ONBOOT=yes
IPADDR=192.168.130.234
NETMASK=255.255.128.0

Guardamos los cambios y cambiamos el nombre del host:

nano /etc/sysconfig/network

modificamos la siguiente línea:

HOSTNAME=localhost.localdomain

para que quede:

HOSTNAME=test1.voztovoice.org

Terminada la operación reiniciamos el servidor:

reboot

Seguimos el mismo procedimiento en el segundo servidor:

ServerB

IP publico: 69.164.204.42
IP Lan: 192.168.130.58

nano /etc/sysconfig/network-scripts/ifcfg-eth0:1

DEVICE=eth0:1
BOOTPROTO=none
ONBOOT=yes
IPADDR=192.168.130.58
NETMASK=255.255.128.0

nano /etc/sysconfig/network

cambiamos la siguiente línea:

HOSTNAME=localhost.localdomain

para que quede:

HOSTNAME=test2.voztovoice.org

reboot

Seguimos con la configuración de los dos server para que cada uno sepa a que dirección IP encontrar el otro:

ServerA

nano /etc/hosts

Añadimos las siguientes líneas:

192.168.130.234 test1.voztovoice.org

192.168.130.58 test2.voztovoice.org

Guardamos los cambios y averiguamos que efectivamente logramos localizar el servidor B

ping test2.voztovoice.org

PING test2.voztovoice.org (192.168.130.58) 56(84) bytes of data.
64 bytes from test2.voztovoice.org (192.168.130.58): icmp_seq=1 ttl=64 time=0.346 ms
64 bytes from test2.voztovoice.org (192.168.130.58): icmp_seq=2 ttl=64 time=0.344 ms
64 bytes from test2.voztovoice.org (192.168.130.58): icmp_seq=3 ttl=64 time=0.370 ms
64 bytes from test2.voztovoice.org (192.168.130.58): icmp_seq=4 ttl=64 time=0.430 ms

--- test2.voztovoice.org ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3000ms
rtt min/avg/max/mdev = 0.344/0.372/0.430/0.039 ms

Seguimos el mismo procedimiento en el servidor B

ServerB

nano /etc/hosts

Añadimos las siguientes líneas:

192.168.130.234 test1.voztovoice.org

192.168.130.58 test2.voztovoice.org

ping test1.voztovoice.org

PING test1.voztovoice.org (192.168.130.234) 56(84) bytes of data.
64 bytes from test1.voztovoice.org (192.168.130.234): icmp_seq=1 ttl=64 time=0.389 ms
64 bytes from test1.voztovoice.org (192.168.130.234): icmp_seq=2 ttl=64 time=0.365 ms
64 bytes from test1.voztovoice.org (192.168.130.234): icmp_seq=3 ttl=64 time=0.331 ms
64 bytes from test1.voztovoice.org (192.168.130.234): icmp_seq=4 ttl=64 time=0.446 ms

--- test1.voztovoice.org ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 2999ms
rtt min/avg/max/mdev = 0.331/0.382/0.446/0.048 ms

Una vez terminada esta preparamos el sistema para la instalación de DRBD:

ServerA ServerB

Las operaciones que siguen hay que ejecutarlas en ambos servidores:

Instalamos los paquetes necesarios para la instalación de DRBD

yum update

yum install flex gcc gcc-c++ glibc-devel make bzip2-devel wget

cd /usr/src

Miramos la versión del XEN kernel instalado:

uname –r

2.6.18.8-linode22

La descargamos:

wget http://www.linode.com/src/2.6.18.8-linode22.tar.bz2

descomprimimos el paquete y cambiamos el nombre a la carpeta:

tar -xf 2.6.18.8-linode22.tar.bz2

mv 2.6.18.8-linode22 linux

Ahora creamos una enlace simbólico a la carpeta creada en la carpeta del kernel instalado:

cd /lib/modules/2.6.18.8-linode22/

ln -s /usr/src/linux build

Ya podemos empezar con la instalación de DRBD:

cd /usr/src

wget http://oss.linbit.com/drbd/8.3/drbd-8.3.7.tar.gz

tar -xf drbd-8.3.7.tar.gz

cd drbd-8.3.7

./configure --prefix=/ --with-km

make KDIR=/usr/src/linux/

make install

De esta forma compilamos e instalarnos DRBD como modulo del Kernel

Movemos la configuración predefinida que viene con la instalación de DRBD

mv /etc/drbd.conf /etc/drbd.conf.old

y creamos la nuestra:

nano /etc/drbd.conf

global {
        usage-count yes;
}

common {
        protocol C;
}
resource data {
  net {
    allow-two-primaries;
  }
  startup {
    become-primary-on both;
  }
  on test1.voztovoice.org {
    device    /dev/drbd1;
    disk      /dev/xvdc;
    address   192.168.130.234:7789;
    meta-disk /dev/xvdd[0];
  }
  on test2.voztovoice.org {
    device    /dev/drbd1;
    disk      /dev/xvdc;
    address   192.168.130.58:7789;
    meta-disk /dev/xvdd[0];
  }
}

De esta forma creamos dos nodos primarios usando el protocolo C y llamamos este recurso creado “data”.

El nodo 1 será test1.voztovoice.org cuya IP local es 192.168.130.234 Utilizaremos las dos particiones creadas (xvdc y xvdd) una para las copia de los datos y la otra como meta disco para guardar los datos que DRBD crea al momento de conectarse y actualizarse con el segundo nodo.

El nodo 2 será test2.voztovoice.org cuya IP local es 192.168.130.58.

Ahora creamos los meta-datos en la partición xvdd de ambos servidores:

drbdadm create-md data

Normalmente sale este error:

Found ext3 filesystem

This would corrupt existing data.
If you want me to do this, you need to zero out the first part
of the device (destroy the content).
You should be very sure that you mean it.
Operation refused.

Command 'drbdmeta 1 v08 /dev/xvdd 0 create-md' terminated with exit code 40
drbdadm create-md data: exited with code 40

Lo solucionamos destruyendo todos los datos presentes:

dd if=/dev/zero of=/dev/xvdd bs=1M count=128

128+0 records in
128+0 records out
134217728 bytes (134 MB) copied, 0.333349 seconds, 403 MB/s

Volvemos al comando:

drbdadm create-md data

Writing meta data...
initializing activity log
NOT initialized bitmap
New drbd meta data block successfully created.
success

Ahora modificamos el script de arranque automático de DRBD:

nano /etc/init.d/drbd

Modificando esta línea:

$MODPROBE -s drbd `$DRBDADM sh-mod-parms` $ADD_MOD_PARAM || {

para que quede:

$MODPROBE -f drbd `$DRBDADM sh-mod-parms` $ADD_MOD_PARAM || {

Terminamos configurando el sistema para que el script se inicie al iniciarse el sistema operativo:

chkconfig --add drbd

chkconfig drbd on

Para crear una primera sincronización entre los datos de las dos particiones de los dos servidores cargamos el modulo DRBD en el Kernel:

modprobe -f drbd

averiguamos que efectivamente se cargó:

lsmod

Module                  Size  Used by
drbd                  247200  0

Ahora creamos la conexión entre los dos servidores:

drbdadm attach data

drbdadm syncer data

drbdadm connect data

Efectuamos una primera sincronización de los datos:

ServerA

drbdadm -- --overwrite-data-of-peer primary data

Esta operación puede durar bastante tiempo dependiendo del tamaño de los discos. Podemos controlar en cualquier momento a que punto ha llegado con el comando:

cat /proc/drbd

version: 8.3.7 (api:88/proto:86-91)
GIT-hash: ea9e28dbff98e331a62bcbcc63a6135808fe2917 build by root@test1.voztovoice.org, 2010-04-13 13:37:24

1: cs:SyncSource ro:Primary/Secondary ds:UpToDate/Inconsistent C r----
    ns:384744 nr:0 dw:0 dr:384744 al:0 bm:23 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:106776
        [==============>.....] sync'ed: 78.6% (106776/491520)K
        finish: 0:07:07 speed: 240 (240) K/sec

Una vez terminada la sincronización de los dos recursos reiniciamos ambos servidores:

reboot

Volvemos al servidor A

ServerA

Creamos una nueva carpeta donde vamos a copiar los datos que queremos sincronizar:

mkdir /data

Montamos la partición de los datos:

mount /dev/drbd1 /data

y creamos unos cuantos archivos:

touch /data/file1
touch /data/file2
touch /data/file3

ls /data

file1  file2  file3  lost+found

La quitamos:

umount /data

y averiguamos el resultado en el servidor B

ServerB

mkdir /data

mount /dev/drbd1 /data

ls /data

file1  file2  file3  lost+found

umount /data

Claramente este es solo un ejemplo. En el caso de asterisk podemos copiar directamente la carpeta de esta forma:

ServerA

mount /dev/drbd1 /data

mkdir /data/etc

cd /etc

mv asterisk /data/etc/asterisk

ln –s /data/etc/asterisk asterisk

Lo mismo hacemos con DAHDI:

mv dahdi /data/etc/dahdi

ln –s /data/etc/dahdi dahdi

umount /data

 

ServerB

mount /dev/drbd1 /data

cd /etc

rm –fr asterisk

rm –fr dahdi

ln –s /data/etc/asterisk asterisk

ln –s /data/etc/dahdi dahdi

umount /data

A este punto tenemos configurado y en función DRBD. En el próximo articulo veremos como complementar DRBD con Heartbeat de forma que si el servidor principal de Asterisk (serverA) se cae, el servidor de respaldo (ServerB) tomará su lugar y utilizará los mismos archivos de configuración compartidos con DRBD.

Vota el Articulo: 

Sin votos (todavía)
Evalúa la calidad del articulo
Suscribirse a Comentarios de "Asterisk alta disponibilidad - DRBD - Raid1 vía TCP en Linode" Suscribirse a VozToVoice - Todos los comentarios