Configurando un cluster de alta disponibilidad con Heartbeat/DRBD
1. Requisitos Previos
- Configuración mínima de CentOS-5
Asegúrarse de que ambos nodos puedan resolver nombres de forma correcta (incluso a través de DNS o /etc/hosts)
yum update (como siempre ... )
yum install hearbeat drbd kmod-drbd (disponible en los repositorios extras)
2. Situación actual
nodo1.midominio.org 172.29.156.20/24 disco fuente /dev/sdb que será replicado
nodo2.midominio.org 172.29.156.21/24 disco destino /dev/sdb/
3. Configuración DRBD
Configuraremos DRBD para que /dev/sdb sea replicado desde un nodo a otro (los roles pueden ser cambiados en cualquier momento) El nombre del recuso drbd puede ser “repdata” (por supuesto usted puede utilizar el nombre que desee) Aquí está el contenido del fichero /etc/drbd.conf :
# # por favor mire el ejemplo de archivo de configuración en # /usr/share/doc/drbd/drbd.conf # global { usage-count no; } resource repdata { protocol C; startup { wfc-timeout 0; degr-wfc-timeout 120; } disk { on-io-error detach; } # or panic, ... net { cram-hmac-alg "sha1"; shared-secret "Cent0Sru!3z"; } # no olvide de seleccionar una clave para la autenticación! syncer { rate 10M; } on nodo1.midominio.org { device /dev/drbd0; disk /dev/sdb; address 172.29.156.20:7788; meta-disk internal; } on nodo2.midominio.org { device /dev/drbd0; disk /dev/sdb; address 172.29.156.21:7788; meta-disk internal; } }
Replique este fichero de configuración (/etc/drbd.conf) al segundo nodo
scp /etc/drbd.conf root@nodo2:/etc/
Inicie el área meta-data en el disco antes de iniciar drdb (! en ambos nodos!)
[root@nodo1 etc]# drbdadm create-md repdata v08 Magic number not found v07 Magic number not found About to create a new drbd meta data block on /dev/sdb. . ==> This might destroy existing data! <== Do you want to proceed? [need to type 'yes' to confirm] yes Creating meta data... initialising activity log NOT initialized bitmap (256 KB) New drbd meta data block sucessfully created.
Inicie drdb en ambos nodos (service drbd start)
[root@nodo1 etc]# service drbd start Starting DRBD resources: [ d0 n0 ]. ...... [root@nodo1 etc]# cat /proc/drbd version: 8.0.4 (api:86/proto:86) SVN Revision: 2947 build by buildsvn@c5-i386-build, 2007-07-31 19:17:18 . 0: cs:Connected st:Secondary/Secondary ds:Inconsistent/Inconsistent C r--- . ns:0 nr:0 dw:0 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 . resync: used:0/31 hits:0 misses:0 starving:0 dirty:0 changed:0 act_log: used:0/257 hits:0 misses:0 starving:0 dirty:0 changed:0 [root@nodo1 etc]# ssh root@nodo2 cat /proc/drbd version: 8.0.4 (api:86/proto:86) SVN Revision: 2947 build by buildsvn@c5-i386-build, 2007-07-31 19:17:18 . 0: cs:Connected st:Secondary/Secondary ds:Inconsistent/Inconsistent C r--- . ns:0 nr:0 dw:0 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 . resync: used:0/31 hits:0 misses:0 starving:0 dirty:0 changed:0 act_log: used:0/257 hits:0 misses:0 starving:0 dirty:0 changed:0
Como puede ver, ambos nodos son secundarios, lo cual es normal, necesitamos decidir cual nodo actuará como primario ahora (nodo1): esto iniciará la primera 'sincronización completa' entre los dos nodos:
[root@nodo1 etc]# drbdadm -- --overwrite-data-of-peer primary repdata [root@nodo1 etc]# watch -n 1 cat /proc/drbd version: 8.0.4 (api:86/proto:86) SVN Revision: 2947 build by buildsvn@c5-i386-build, 2007-07-31 19:17:18 . 0: cs:SyncTarget st:Primary/Secondary ds:Inconsistent/Inconsistent C r--- . ns:0 nr:68608 dw:68608 dr:0 al:0 bm:4 lo:0 pe:0 ua:0 ap:0 . [>...................] sync'ed: 0.9% (8124/8191)M finish: 0:12:05 speed: 11,432 (11,432) K/sec resync: used:0/31 hits:4283 misses:5 starving:0 dirty:0 changed:5 act_log: used:0/257 hits:0 misses:0 starving:0 dirty:0 changed:0
Ahora podremos formatear /dev/drbd0 y montarlo en el nodo1:
Cree algún dato falso en el nodo1:
[root@nodo1 etc]# for i in {1..5};do dd if=/dev/zero of=/repdata/file$i bs=1M count=100;done
Ahora cambie manualmente al segundo nodo:
[root@nodo1 /]# umount /repdata ; drbdadm secondary repdata [root@nodo2 /]# mkdir /repdata ; drbdadm primary repdata ; mount /dev/drbd0 /repdata [root@nodo2 /]# ls /repdata/ file1 file2 file3 file4 file5 lost+found
Bien, los datos has sido replicados .... ahora borremos/agreguemos algunos archivos:
[root@nodo2 /]# rm /repdata/file2 ; dd if=/dev/zero of=/repdata/file6 bs=100M count=2
Ahora cambiemos para el primer nodo :
[root@nodo2 /]# umount /repdata/ ; drbdadm secondary repdata [root@nodo1 /]# drbdadm primary repdata ; mount /dev/drbd0 /repdata [root@nodo1 /]# ls /repdata/ file1 file3 file4 file5 file6 lost+found
OK .... Drbd está funcionando ... asegurémosnos que siempre inicie al arrancar:
chkconfig drbd on
4. Configuración Heartbeat V2
Vamos a configurar un simple fichero /etc/ha.d/hs.cf:
keepalive 2 deadtime 30 warntime 10 initdead 120 bcast eth0 node nodo1.midominio.org node nodo2.midominio.org crm yes
Cree también /etc/ha.d/authkeys (con permisos 600 !!!) :
auth 1 1 sha1 MySecret
Inicie el servicio heartbeat en el nodo1 :
[root@nodo1 ha.d]# service heartbeat start Starting High-Availability services: [OK]
Chequee el estado del cluster :
[root@nodo1 ha.d]# crm_mon
Replique ahora los ficheros ha.cf y authkeys para el nodo2 e inicie heartbeat:
[root@nodo1 ha.d]# scp /etc/ha.d/ha.cf /etc/ha.d/authkeys root@nodo2:/etc/ha.d/ [root@nodo2 ha.d]# service heartbeat start
Verifique el cluster con crm_mon:
===== Last updated: Wed Sep 12 16:20:39 2007 Current DC: nodo1.centos.org (6cb712e4-4e4f-49bf-8200-4f15d6bd7385) 2 Nodes configured. 0 Resources configured. ===== Node: nodo1.midominio.org (6cb712e4-4e4f-49bf-8200-4f15d6bd7385): online Node: nodo2.midominio.org (f6112aae-8e2b-403f-ae93-e5fd4ac4d27e): online
|
NOTA: sobre la GUI - Usted puede instalar heartbeat-gui (yum install heartbeat-gui) en una estación de trabajo X y conectarse al cluster, pero necesitará cambiar la contraseña del usuario hacluster en ambos nodos ! (o usted puede usar otra cuenta pero debe poner esta en el grupo haclient) |
Ahora crearemos un grupo de recursos que contengan una dirección ip (172,29,156,200), el dispositivo drbd (de nombre repdata) y la operación de montaje de sistema de archivos (mount /dev/drbd0 /repdata). Esto iniciará todos los recursos de un grupo en orden (ordered=true) y en un nodo (collocated=true).
|
NOTA: Usar un grupo es más sencillo que usar recursos independientes. |
Aquí está el contenido de /var/lib/heartbeat/crb/cib.xml:
<cib generated="false" admin_epoch="0" epoch="25" num_updates="1" have_quorum="true" ignore_dtd="false" num_peers="0" cib-last-written="Sun Sep 16 19:47:18 2007" cib_feature_revision="1.3" ccm_transition="1"> <configuration> <crm_config/> <nodes> <node id="6cb712e4-4e4f-49bf-8200-4f15d6bd7385" uname="nodo1.midominio.org" type="normal"/> <node id="f6112aae-8e2b-403f-ae93-e5fd4ac4d27e" uname="nodo2.midominio.org" type="normal"/> </nodes> <resources> <group id="Mi-Grupo-DRBD" ordered="true" collocated="true"> <primitive id="IP-Addr" class="ocf" type="IPaddr2" provider="heartbeat"> <instance_attributes id="IP-Addr_instance_attrs"> <attributes> <nvpair id="IP-Addr_target_role" name="target_role" value="started"/> <nvpair id="2e967596-73fe-444e-82ea-18f61f3848d7" name="ip" value="172.29.156.200"/> </attributes> </instance_attributes> </primitive> <instance_attributes id="Mi-Grupo-DRBD_instance_attrs"> <attributes> <nvpair id="Mi-Grupo-DRBD_target_role" name="target_role" value="started"/> </attributes> </instance_attributes> <primitive id="DRBD_data" class="heartbeat" type="drbddisk" provider="heartbeat"> <instance_attributes id="DRBD_data_instance_attrs"> <attributes> <nvpair id="DRBD_data_target_role" name="target_role" value="started"/> <nvpair id="93d753a8-e69a-4ea5-a73d-ab0d0367f001" name="1" value="repdata"/> </attributes> </instance_attributes> </primitive> <primitive id="FS_repdata" class="ocf" type="Filesystem" provider="heartbeat"> <instance_attributes id="FS_repdata_instance_attrs"> <attributes> <nvpair id="FS_repdata_target_role" name="target_role" value="started"/> <nvpair id="96d659dd-0881-46df-86af-d2ec3854a73f" name="fstype" value="ext3"/> <nvpair id="8a150609-e5cb-4a75-99af-059ddbfbc635" name="device" value="/dev/drbd0"/> <nvpair id="de9706e8-7dfb-4505-b623-5f316b1920a3" name="directory" value="/repdata"/> </attributes> </instance_attributes> </primitive> </group> </resources> <constraints> <rsc_location id="runs_on_pref_node" rsc="Mi-Grupo-DRBD"> <rule id="prefered_runs_on_pref_node" score="100"> <expression attribute="#uname" id="786ef2b1-4289-4570-8923-4c926025e8fd" operation="eq" value="nodo1.midominio.org"/> </rule> </rsc_location> </constraints> </configuration> </cib>
Como puede ver, hemos creado una limitación rsc_location para que los recursos del cluster puedan iniciar en el nodo preferido.
Ahora usted podrá mover recursos a través de cli (crm_resource) o usando la gui (cambie la localización del valor de la regla de limitación – por ejemplo cambiando de nodo1.midominio.org a nodo2.midominio.org y luego haga click en aplicar). Usted será capaz de ver todos los recursos cambiando de un nodo a otro (dirección ip, drbd y sistema de archivos de montaje).