Lo primero es preparar el sistema. En mi caso he cogido un par de máquinas no muy antiguas que había por la empresa (esas que a los de windows ya no les sirven y con las que Linux va de maravilla) y ponerles un par de tarjetas de red a cada una (una para la red y otra para el heartbeat). El heartbeat puede enviarse a través de un puerto serie con un modem nulo, pero mi experiencia no ha sido positiva, no se si por mi culpa que no he configurado bien el asunto pero al poco de comenzar se perdía la comunicación en un sentido y se me iba todo al carajo, así que me decanté por una tarjeta de red (hay un montón tiradas en la empresa muertas de risa).
Una vez tengamos las maquinas preparadas deberemos establecer las direcciones IP de cada una de ellas. En mi caso utilicé dos redes, una para el heartbeat y otra de servicio, esta última tendrá dos direcciones IP, una la del equipo como tal y otra la del nodo del cluster.
En mi caso quedaría de la siguiente manera:
Caronte:
- eth0 10.50.1.202/20 (servicio y cluster, la IP del cluster no se configura en el sistema operativo, se hará en la configuración del cib.xml)
- eth1 172.16.0.1/30 (heartbeat)
Musicas:
-eth0 10.50.1.203/20 (servicio y cluster)
-eth1 172.16.0.2/30
Una vez tengamos esto, estaremos ya en disposición de comenzar la configuración de heartbeat como tal.
Para el que todavía no lo tenga instalado, en ubuntu basta con hacer
sudo apt-get install heartbeat
El que no tenga ubuntu podrá ver en el siguiente enlace http://www.linux-ha.org/DownloadSoftware las últimas versiones y descargarselas.
Una vez instalado Heartbeat deberemos empezar configurando el archivo /etc/ha.d/ha.cf. La documentación está en http://www.linux-ha.org/ha.cf y en mi caso el archivo a quedado de la siguiente manera:
logfacility local6 #Los log seran enviados como local6 para poder redireccionarlos a un archivo de ha.log con syslog-ng
keepalive 500ms
warntime 2
deadtime 4
initdead 10
bcast eth2
udpport 694
node Caronte Musicas
auto_failback on #cuidado con esto
ping 10.50.1.1 #podemos usar ping_group para hacerlo contra varias máquinas
compression bz2
compression_threshold 2
crm respawn
autojoin any #Permitir que se unan nuevos nodos automáticamente
El archivo /etc/ha.d/authkeys queda en mi caso de la siguiente manera
auth 2
#1 crc
2 sha1 'contraseña que queramos`
#3 md5 Hello!
Tras configurar los dos archivos los copiamos al mismo directorio del otro nodo, y a partir de ahora es cuando empieza el meollo de la cuestión ya que configuramos los recursos de nuestro cluster. La documentación de como configurar el /var/lib/heartbeat/crm/cib.xml (OJO. No modificar nunca el archivo cib.xml directamente, hacerlo a través de las herramientas del crm que explicaré más adelante)está en el siguiente enlace http://clusterlabs.org/wiki/Documentation. Si por cualquier motivo no os reconoce los cambios en el archivo, puede ser que tengáis una versión y la documentación que estéis viendo sea de otra, así que para ver los campos de la vuestra, basta con consultar en el archivo /usr/share/heartbeat/crm.dtd, donde podemos encontrar éstos y valores que reconoce nuestra versión.
Los pasos que he seguido yo son los siguientes:
1º) Arrancamos el cluster en las dos máquinas, ejecutando en cada una de ellas /etc/init.d/heartbeat start
2º) Comprobamos que el cluster arranca y tenemos las dos máquinas levantadas con el comando
crm_mon -i5
Esperamos a que los dos nodos esten online como en mi caso:
Refresh in 1s...
============
Last updated: Wed Feb 25 10:27:21 2009
Current DC: caronte (871ed0db-b56c-467f-a31a-807fa717dccb)
2 Nodes configured.
0 Resources configured.
============
Node: caronte (871ed0db-b56c-467f-a31a-807fa717dccb): online
Node: musicas (6f0bbea5-947c-42ee-a5ba-9cb5b5ba9fef): online
3º) Llegados a este punto tenemos los dos nodos levantados, uno de ellos se ha erigido como DC (Designated Coordinator osea el coordinador designado para gestionar el cluster) en mi caso caronte y como se puede observar sin ningún recurso en ninguno de los nodos. Es ahora cuando empieza el trabajo para convertir este cluster en activo/activo. Antes de nada ejecutaremos crm_attribute -v false --attr-name symmetric-cluster que evitará ejecutar cualquier recurso en cualquier nodo que no hayamos espeificado. Después creamos un archivo llamado recursos que contenga lo siguiente:
<resources>
<primitive id="IPMusicas" class="ocf" type="IPaddr" provider="heartbeat">
<operations>
<op id="IPMusicas-startup" name="monitor" interval="0" timeout="90s"/>
<op id="IPMusicas-start" name="start" interval="0" timeout="180s"/>
<op id="IPMusicas-stop" name="stop" interval="0" timeout="180s"/>
</operations>
<instance_attributes id="IPMusicas">
<attributes>
<nvpair id="IPMusicas-ip" name="ip" value="10.50.2.230"/>
<nvpair id="IPMusicas-mask" name="netmask" value="255.255.240.0"/>
</attributes>
</instance_attributes>
</primitive>
<primitive id="IPCaronte" class="ocf" type="IPaddr" provider="heartbeat">
<operations>
<op id="IPCaronte-startup" name="monitor" interval="0" timeout="90s"/>
<op id="IPCaronte-start" name="start" interval="0" timeout="180s"/>
<op id="IPCaronte-stop" name="stop" interval="0" timeout="180s"/>
</operations>
<instance_attributes id="IPCaronte">
<attributes>
<nvpair id="IPCaronte-ip" name="ip" value="10.50.1.200"/>
<nvpair id="IPCaronte-mask" name="netmask" value="255.255.240.0"/>
</attributes>
</instance_attributes>
</primitive>
</resources>
<constraints>
<rsc_location id="MusicasEnCaronte" rsc="IPMusicas" node="caronte" score="0"/>
<rsc_location id="MusicasEnMusicas" rsc="IPMusicas" node="Musicas" score="200"/>
<rsc_location id="CaronteEnCaronte" rsc="IPCaronte" node="caronte" score="200"/>
<rsc_location id="CaronteEnMusicas" rsc="IPCaronte" node="Musicas" score="0"/>
</constraints>
Seguidamente ejecutaremos el comando
cibadmin -R --xml-file recursos
En ese momento el cluster cambiará, arrancará los dos servicio y se replicará el archivo cib.xml entre los nodos automáticamente. Pasaremos a tener en la pantalla en la que demajos el crm_mon -i3 los siguiente:
Refresh in 5s...
============
Last updated: Wed Feb 25 13:15:55 2009
Current DC: caronte (871ed0db-b56c-467f-a31a-807fa717dccb)
2 Nodes configured.
2 Resources configured.
============
Node: caronte (871ed0db-b56c-467f-a31a-807fa717dccb): online
Node: musicas (6f0bbea5-947c-42ee-a5ba-9cb5b5ba9fef): online
IPMusicas (heartbeat::ocf:IPaddr): Started musicas
IPCaronte (heartbeat::ocf:IPaddr): Started caronte
Como se puede observar se ha iniciado el servicio IPMusicas en musicas y el IPCaronte en caronte. En los recursos se definieron éstos y cada uno lo que hacía era asignar una dirección IP. Un ifconfig en Caronte mostraría:
eth0 Link encap:Ethernet direcciónHW 00:c0:9f:1d:75:62
inet dirección:10.50.1.202 Difusión:10.50.255.255 Máscara:255.255.240.0
dirección inet6: fe80::2c0:9fff:fe1d:7562/64 Alcance:VÃnculo
ARRIBA DIFUSIÃN CORRIENDO MULTICAST MTU:1500 Métrica:1
RX packets:24880 errors:0 dropped:0 overruns:0 frame:0
TX packets:5018 errors:0 dropped:0 overruns:0 carrier:0
colisiones:0 txqueuelen:1000
RX bytes:2016368 (1.9 MB) TX bytes:690645 (674.4 KB)
Dirección base: 0xecc0 Memoria:fe100000-fe120000
eth0:0 Link encap:Ethernet direcciónHW 00:c0:9f:1d:75:62
inet dirección:10.50.1.200 Difusión:10.50.15.255 Máscara:255.255.240.0
eth1 Link encap:Ethernet direcciónHW 00:00:d1:f0:01:44
inet dirección:172.16.0.1 Difusión:172.16.0.4 Máscara:255.255.255.252
dirección inet6: fe80::200:d1ff:fef0:144/64 Alcance:VÃnculo
ARRIBA DIFUSIÃN CORRIENDO MULTICAST MTU:1500 Métrica:1
RX packets:2867 errors:0 dropped:0 overruns:0 frame:0
TX packets:2829 errors:0 dropped:0 overruns:0 carrier:0
colisiones:0 txqueuelen:1000
RX bytes:823661 (804.3 KB) TX bytes:847457 (827.5 KB)
Interrupción:20
Y en Musicas:
eth0 Link encap:Ethernet HWaddr 00:c0:9f:1f:79:10
inet addr:10.50.1.203 Bcast:10.50.15.255 Mask:255.255.240.0
inet6 addr: fe80::2c0:9fff:fe1f:7910/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:82959 errors:0 dropped:0 overruns:0 frame:0
TX packets:12876 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:6484769 (6.4 MB) TX bytes:1816187 (1.8 MB)
eth0:0 Link encap:Ethernet HWaddr 00:c0:9f:1f:79:10
inet addr:10.50.2.230 Bcast:10.50.15.255 Mask:255.255.240.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
eth1 Link encap:Ethernet HWaddr 00:00:d1:f0:00:0c
inet addr:172.16.0.2 Bcast:172.16.0.4 Mask:255.255.255.252
inet6 addr: fe80::200:d1ff:fef0:c/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:9965 errors:0 dropped:0 overruns:0 frame:0
TX packets:10550 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:2892141 (2.8 MB) TX bytes:2940213 (2.9 MB)
Interrupt:20
Como se puede observar nos ha levantado las dos direcciones de los nodos 10.50.2.230 y 10.50.1.200.
Si ahora tiramos una de las dos máquinas (o tiramos el heartbeat) por ejemplo Musicas, un ping mostraría los siguientes resultados:
Haciendo ping a 10.50.2.230 con 32 bytes de datos:
Respuesta desde 10.50.2.230: bytes=32 tiempo<1m TTL=64
Respuesta desde 10.50.2.230: bytes=32 tiempo<1m TTL=64
Respuesta desde 10.50.2.230: bytes=32 tiempo<1m TTL=64
Respuesta desde 10.50.2.230: bytes=32 tiempo<1m TTL=64
Tiempo de espera agotado para esta solicitud.
Respuesta desde 10.50.2.230: bytes=32 tiempo<1m TTL=64
Respuesta desde 10.50.2.230: bytes=32 tiempo<1m TTL=64
Respuesta desde 10.50.2.230: bytes=32 tiempo<1m TTL=64
Respuesta desde 10.50.2.230: bytes=32 tiempo<1m TTL=64
Respuesta desde 10.50.2.230: bytes=32 tiempo<1m TTL=64
Respuesta desde 10.50.2.230: bytes=32 tiempo<1m TTL=64
Estadísticas de ping para 10.50.2.230:
Paquetes: enviados = 11, recibidos = 10, perdidos = 1
(9% perdidos),
Es decir, hemos perdido un único paquete de datos y enseguida a pasado a respondernos Caronte con la dirección de Musicas. Si ejecutamos el comando crm_mon -i5 nos mostrará los siguiente:
Refresh in 1s...
============
Last updated: Wed Feb 25 13:23:36 2009
Current DC: caronte (871ed0db-b56c-467f-a31a-807fa717dccb)
2 Nodes configured.
2 Resources configured.
============
Node: caronte (871ed0db-b56c-467f-a31a-807fa717dccb): online
Node: musicas (6f0bbea5-947c-42ee-a5ba-9cb5b5ba9fef): OFFLINE
IPMusicas (heartbeat::ocf:IPaddr): Started caronte
IPCaronte (heartbeat::ocf:IPaddr): Started caronte
Como se puede ver el recurso IPMusicas se ha arrancado en Caronte, y los interfaces de red se encuentran de la siguiente manera:
eth0 Link encap:Ethernet direcciónHW 00:c0:9f:1d:75:62
inet dirección:10.50.1.202 Difusión:10.50.255.255 Máscara:255.255.240.0
dirección inet6: fe80::2c0:9fff:fe1d:7562/64 Alcance:VÃnculo
ARRIBA DIFUSIÃN CORRIENDO MULTICAST MTU:1500 Métrica:1
RX packets:35096 errors:0 dropped:0 overruns:0 frame:0
TX packets:6982 errors:0 dropped:0 overruns:0 carrier:0
colisiones:0 txqueuelen:1000
RX bytes:2871409 (2.7 MB) TX bytes:955840 (933.4 KB)
Dirección base: 0xecc0 Memoria:fe100000-fe120000
eth0:0 Link encap:Ethernet direcciónHW 00:c0:9f:1d:75:62
inet dirección:10.50.1.200 Difusión:10.50.15.255 Máscara:255.255.240.0
ARRIBA DIFUSIÃN CORRIENDO MULTICAST MTU:1500 Métrica:1
Dirección base: 0xecc0 Memoria:fe100000-fe120000
eth0:1 Link encap:Ethernet direcciónHW 00:c0:9f:1d:75:62
inet dirección:10.50.2.230 Difusión:10.50.15.255 Máscara:255.255.240.0
ARRIBA DIFUSIÃN CORRIENDO MULTICAST MTU:1500 Métrica:1
Dirección base: 0xecc0 Memoria:fe100000-fe120000
eth1 Link encap:Ethernet direcciónHW 00:00:d1:f0:01:44
inet dirección:172.16.0.1 Difusión:172.16.0.4 Máscara:255.255.255.252
dirección inet6: fe80::200:d1ff:fef0:144/64 Alcance:VÃnculo
ARRIBA DIFUSIÃN CORRIENDO MULTICAST MTU:1500 Métrica:1
RX packets:3578 errors:0 dropped:0 overruns:0 frame:0
TX packets:4111 errors:0 dropped:0 overruns:0 carrier:0
colisiones:0 txqueuelen:1000
RX bytes:1012689 (988.9 KB) TX bytes:1215957 (1.1 MB)
Interrupción:20
Tenemos la dirección de Caronte y estamos dando servicio.
Ya tenemos dos nodos en estado activo/activo dando servicio, para añadir recursos estudiar la forma en la que se configuraron en el archivo cib.xml y reproducirlo para cada recurso nuevo que se quiera introducir.
Los recursos deben confirmar el estandar LSB o el OCF, y el nodo los buscará en /etc/ha.d/resources.d, en /usr/lib/ocf/resources.d/
No hay comentarios:
Publicar un comentario