DRBD + Heartbeat = DNS en alta disponibilidad

El cliente donde estoy destinado quiere sacar el DNS del AD donde ahora está y pasarlo a Linux. En paso debe ser transparente y debe ser implementado con alguna herramienta para disponer de HA para dar servicio.

Con éstas premisas lo primero que pensé fue en instalar 2 RHEL, las herramientas de clustering e implementar el recurso del DNS en él, pero no todo es tan sencillo. Para empezar, RHEL, la licencia básica que tiene el cliente, no permite la instalación de los paquetes de clustering. De hecho, es una licencia a parte que se puede adquirir una vez tengas la básica. Total, que no era una opción.

Así que, como tampoco nos iba a hacer falta todo lo que lleva detrás la suite de clustering, opté por implementar el HA con Heartbeat y como tampoco vamos a disponer de un almacenamiento compartido para la info del DNS, eché mano de DRBD. Todo ésto implementado en Debian.

Partimos de la instalación básica de la última versión de Debian con los paquetes necesarios para toda la funcionalidad que le queremos dar.  Un detalle importante, es que al particionar los discos debemos hacerlo con LVM ya que lo que va a estar sincronizado con DRBD es un volúmen lógico.

La instación en Debian como siempre:

apt-get install heartbeat drbd8-utils

También deberemos instalar el servidor DNS en ambos nodos.

apt-get install bind9

Tras la instalación tendremos que reducir el tamaño del filesystem que contiene /home, pues por defecto le da todo el espacio disponible después de particionar los demás filesystems del sistema. Para ello, desmontamos el filesystem, reducimos el filesystem, reducimos el lv y montamos de nuevo. Ahora ya tenemos disponible en el vg espacio para crear un nuevo lv para sincronizar con DRBD.

En uno de los nodos empaquetamos todo el contenido de /etc/bind y lo guardamos a salvo: tar cvf /root/bind.tar /etc/bind/*

En ambos nodos creamos un nuevo lv: lvcreate -L1G -n dnslv systemvg

Creamos el fichero de configuración /etc/drbd.conf con la siguiente info:

global {
usage-count no;
}

common {
#Velocidad de sincronización. Velocidad de la red dedicada.
syncer {rate 100M; }
}

resource r1 {
#Protocolo de sincronización:
#    A: La sincronización se da por terminada cuando es enviada al buffer TCP local
#    B: La sincronización se da por terminada cuando ha llegado al buffer remoto
#    C: La sincronización se da por termianda cuando ha sido escrita también en el disco espejo
protocol C;
startup {
wfc-timeout 15;       #Tiempo seg. de espera por lo recursos remotos en el arranque del servicio
degr-wfc-timeout 60;  #Tiempo seg. de espera por un recurso perdido hasta se marca como          degradado
}

#    net {
#        cram-hmac-alg sha1;    #Algoritmo CRAM para la clave
#        shared-secret “secret”; #Clave de autentificación
#allow-two-primaries;   #Solo si hay cluster filesystem encima
#    }

on cluster1 {
device /dev/drbd0;    #Dispositivo RAID DRBD
disk /dev/cluster1/dnslv;        #Dispositivo local miembro de DRBD
address 192.168.56.102:7788;    #Interfaz de comunicación
meta-disk internal;    #Integrado en “/dev/cluster1/dnslv”
}

on cluster2 {
device /dev/drbd0;
disk /dev/cluster2/dnslv;
address 192.168.56.101:7788;
meta-disk internal;
}
}

En internet se pueden entontrar varios ejemplos, lo más importante es el protocolo de sincronización y el tiempo de espera.

Éste fichero lo pasamos también al 2º nodo tal cual.

Inicializamos los meta-datos en ambos nodos, que pueden estar en un área dentro del propio disco (o partición o lv) o fuera. Por defecto, se incluye en el disco que se sincroniza.

[root@node1 etc]# drbdadm create-md r1
v08 Magic number not found
v07 Magic number not found
About to create a new drbd meta data block on /dev/cluster1/dnslv.
. ==> 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.

Arrancarmos drbd en ambos nodos:

/etc/init.d/drbd start

Starting DRBD resources:    [ d0 n0 ]. ……

Comprobamos el estado de la sincronización:

[root@node1 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

Ambos nodos están como secundarios, debemos haceer que uno sea el primario y que el otro sincronice desde el primero.

[root@node1 etc]# drbdadm — –overwrite-data-of-peer primary r1
[root@node1 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:

Vemos que la barra de progreso va incrementándose, cuando finalice tendremos los 2 nodos sincronizados.

Aún cuando no haya terminado de sincronizar, ya tendremos disponible un nuevo dispositivo llamado /dev/drbd0 que se ha creado por encima del LV. Éste es sobre el que vamos a tranajar y el que se sincronizará periódicamente.

Así que vamos a ello:

mkfs.ext3 /dev/drbd0

mount /dev/drbd0 /etc/bind

root@cluster1:~# mount
/dev/mapper/cluster1-root on / type ext3 (rw,errors=remount-ro)
tmpfs on /lib/init/rw type tmpfs (rw,nosuid,mode=0755)
proc on /proc type proc (rw,noexec,nosuid,nodev)
sysfs on /sys type sysfs (rw,noexec,nosuid,nodev)
udev on /dev type tmpfs (rw,mode=0755)
tmpfs on /dev/shm type tmpfs (rw,nosuid,nodev)
devpts on /dev/pts type devpts (rw,noexec,nosuid,gid=5,mode=620)
/dev/cciss/c0d0p1 on /boot type ext2 (rw)
/dev/mapper/cluster1-home on /home type ext3 (rw)
/dev/mapper/cluster1-tmp on /tmp type ext3 (rw)
/dev/mapper/cluster1-usr on /usr type ext3 (rw)
/dev/mapper/cluster1-var on /var type ext3 (rw)
/dev/mapper/cluster1-logslv on /logs type ext3 (rw)
/dev/drbd0 on /etc/bind type ext3 (rw)

root@cluster1:~# cat /proc/drbd
version: 8.3.7 (api:88/proto:86-91)
srcversion: EE47D8BF18AC166BE219757
0: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r—-
ns:224 nr:0 dw:1036 dr:7992 al:2 bm:42 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:0
root@cluster1:~#

Ahora lo que queremos es sea Heartbeat el que controle el montaje del FS, el servicio BIND y la IP que vamos a balancear entre los 2 nodos.

Para ésto tocaremos 3 ficheros:

root@cluster1:/etc/ha.d# cat ha.cf
logfacility local0
keepalive 1
deadtime 10
bcast eth0
auto_failback off
node cluster1 cluster2
root@cluster1:/etc/ha.d# cat haresources
cluster1 IPaddr::X.X.X.X
cluster1 drbddisk::dns Filesystem::/dev/drbd0::/etc/bind::ext3 bind9
root@cluster1:/etc/ha.d# cat authkeys
auth 3
3 md5 tu_password

Debemos replicar éstos ficheros en el nodo2 exactamente igual que los tenemos en el nodo1.

La opción de auto_failback off la preferimos porque lso 2 nodos son iguales y realmetne no importa que el recurso esté en uno o en otro por mucho tiempo.

Finalmente, quitamos del arranque el demonio bind y agregamos, si no lo está ya, heartbeat.

Como ejemplo pego el log del nodo2 al reiniciar el nodo1:

Sep 15 11:55:33 cluster2 kernel: [2503138.827620] block drbd0: peer( Primary -> Secondary )
Sep 15 11:55:33 cluster2 heartbeat: [6906]: info: Received shutdown notice from ‘cluster1’.
Sep 15 11:55:33 cluster2 heartbeat: [6906]: info: Resources being acquired from cluster1.
Sep 15 11:55:33 cluster2 heartbeat: [3298]: info: acquire local HA resources (standby).
Sep 15 11:55:33 cluster2 heartbeat: [3299]: info: No local resources [/usr/share/heartbeat/ResourceManager listkeys cluster2] to acquire.
Sep 15 11:55:33 cluster2 heartbeat: [3298]: info: local HA resource acquisition completed (standby).
Sep 15 11:55:33 cluster2 heartbeat: [6906]: info: Standby resource acquisition done [all].
Sep 15 11:55:33 cluster2 harc[3324]: info: Running /etc/ha.d//rc.d/status status
Sep 15 11:55:33 cluster2 mach_down[3339]: info: Taking over resource group IPaddr::X.X.X.X
Sep 15 11:55:33 cluster2 ResourceManager[3364]: info: Acquiring resource group: cluster1 IPaddr::X.X.X.X
Sep 15 11:55:33 cluster2 IPaddr[3391]: INFO:  Resource is stopped
Sep 15 11:55:33 cluster2 ResourceManager[3364]: info: Running /etc/ha.d/resource.d/IPaddr X.X.X.X start
Sep 15 11:55:33 cluster2 IPaddr[3447]: INFO: Using calculated nic for X.X.X.X: eth0
Sep 15 11:55:33 cluster2 IPaddr[3447]: INFO: Using calculated netmask for X.X.X.X: 255.255.255.0
Sep 15 11:55:33 cluster2 IPaddr[3447]: INFO: eval ifconfig eth0:0 X.X.X.X netmask 255.255.255.0 broadcast X.X.X.255
Sep 15 11:55:33 cluster2 IPaddr[3435]: INFO:  Success
Sep 15 11:55:33 cluster2 mach_down[3339]: info: Taking over resource group drbddisk::dns
Sep 15 11:55:33 cluster2 ResourceManager[3542]: info: Acquiring resource group: cluster1 drbddisk::dns Filesystem::/dev/drbd0::/etc/bind::ext3 bind9
Sep 15 11:55:33 cluster2 ResourceManager[3542]: info: Running /etc/ha.d/resource.d/drbddisk dns start
Sep 15 11:55:33 cluster2 kernel: [2503139.127167] block drbd0: role( Secondary -> Primary )
Sep 15 11:55:33 cluster2 Filesystem[3608]: INFO:  Resource is stopped
Sep 15 11:55:33 cluster2 ResourceManager[3542]: info: Running /etc/ha.d/resource.d/Filesystem /dev/drbd0 /etc/bind ext3 start
Sep 15 11:55:33 cluster2 Filesystem[3684]: INFO: Running start for /dev/drbd0 on /etc/bind
Sep 15 11:55:33 cluster2 kernel: [2503139.227146] kjournald starting.  Commit interval 5 seconds
Sep 15 11:55:33 cluster2 kernel: [2503139.227151] EXT3-fs warning: maximal mount count reached, running e2fsck is recommended
Sep 15 11:55:33 cluster2 kernel: [2503139.234844] EXT3 FS on drbd0, internal journal
Sep 15 11:55:33 cluster2 kernel: [2503139.234849] EXT3-fs: mounted filesystem with ordered data mode.
Sep 15 11:55:33 cluster2 Filesystem[3678]: INFO:  Success
Sep 15 11:55:33 cluster2 ResourceManager[3542]: info: Running /etc/init.d/bind9  start
Sep 15 11:55:33 cluster2 mach_down[3339]: info: /usr/share/heartbeat/mach_down: nice_failback: foreign resources acquired
Sep 15 11:55:33 cluster2 mach_down[3339]: info: mach_down takeover complete for node cluster1.
Sep 15 11:55:33 cluster2 heartbeat: [6906]: info: mach_down takeover complete.
Sep 15 11:55:36 cluster2 kernel: [2503141.615135] block drbd0: peer( Secondary -> Unknown ) conn( Connected -> TearDown ) pdsk( UpToDate -> DUnknown )
Sep 15 11:55:36 cluster2 kernel: [2503141.615156] block drbd0: Creating new current UUID
Sep 15 11:55:36 cluster2 kernel: [2503141.615514] block drbd0: asender terminated
Sep 15 11:55:36 cluster2 kernel: [2503141.615517] block drbd0: Terminating drbd0_asender
Sep 15 11:55:36 cluster2 kernel: [2503141.627085] block drbd0: Connection closed
Sep 15 11:55:36 cluster2 kernel: [2503141.627090] block drbd0: conn( TearDown -> Unconnected )
Sep 15 11:55:36 cluster2 kernel: [2503141.627097] block drbd0: receiver terminated
Sep 15 11:55:36 cluster2 kernel: [2503141.627100] block drbd0: Restarting drbd0_receiver
Sep 15 11:55:36 cluster2 kernel: [2503141.627102] block drbd0: receiver (re)started
Sep 15 11:55:36 cluster2 kernel: [2503141.627107] block drbd0: conn( Unconnected -> WFConnection )
Sep 15 11:55:45 cluster2 heartbeat: [6906]: WARN: node cluster1: is dead
Sep 15 11:55:45 cluster2 heartbeat: [6906]: info: Dead node cluster1 gave up resources.
Sep 15 11:55:45 cluster2 heartbeat: [6906]: info: Link cluster1:eth0 dead.

 

Anuncios

2 thoughts on “DRBD + Heartbeat = DNS en alta disponibilidad

  1. con esta config, bind9 inicia despues de iniciar el resource IPaddr? de no ser asi, si bind9 inicia antes de IPaddr, como solucionas que bind9 inicie bindeado a la IPaddr X.X.X.X?

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s