Como pasar el rato: Openfiler en HA
Monday, 7 de December de 2009Algunos sabrán que a veces para pasar el rato me dedico a probar cosas de estas que luego no usaré, pero ahí quedan.
El caso es que visité un foro de Josep Ros, que el hombre es un máquina en VMWare, y vi que había un montaje sugerido con drbd para poner datastorages de VMWare en HA. Luego, buscando un poco, encontré un tuto en howto forge donde explicaban como poner openfiler en HA usando heartbeat y drbd. Así que, manos a la obra. Lo que voy a hacer es intentar explicar un poco el proceso que seguí, ya que seguir el tuto de howto forge a pies juntillas no me dio resultado.
Todo lo que os cuento está hecho usando dos máquinas de desguace, un PIV a 2,4GHz con 512MB de RAM y un Celeron a 1GHz con 256MB de RAM, y los dos con un disco duro de 40 GB. Los discos son pequeños si, pero esto es sólo para probar, pero en el caso que tengáis dos pepino-pc que os hayan traído los reyes o algo así, va a ser lo mismo.
Empecemos.
Lo primero es descargar e instalar openfiler en las dos máquinas. La imagen para x86 o para x86_64 según las máquinas de que dispongáis. Durante la instalación, haced las particiones idénticas en un lado y otro, y cuando reiniciéis, os tendréis que asegurar que no se montan las particiones que se van a replicar entre los dos pc’s. En mi caso, hice el siguiente particionado:
- /dev/hda1 — /boot – 150MB
- /dev/hda2 — / — 10GB
- /dev/hda3 – swap – 1024MB
- /dev/hda5 – 512MB – Será donde guardemos los ficheros de config para el cluster.
- /dev/hda6 – 12,9 GB – Haremos un share SMB
- /dev/hda7 – 12,9 GB – La usaremos como target iSCSI para VMWare
Para que nos quede un poco mas claro, las particiones que replicaremos serán las de datos y la de config del cluster. Las de sistema no será necesario replicarlas ya que el sistema ya está instalado en ambos nodos. Aseguraos también de que los dos nodos resuelven correctamente el nombre del otro y opcionalmente, montad la autentificación por claves de ssh, para no tener que escribir el password cada vez que hagáis un scp.
DRBD
Montar drbd es bastante sencillo. Lo primero que tenéis que hacer es aseguraros de que las particiones estén vacías, ya que es muy probable que durante la instalación hayáis creado un sistema de ficheros sobre ellas. Si fuese así:
dd if=/dev/zero of=/dev/hdaX bs=1M count=1
Con esto borráis las particiones y las dejáis impolutas y podréis empezar a replicar. Lo siguiente, editamos el fichero /etc/drbd.conf en el nodo 1. Ahí tendremos que especificar un par de opciones generales y los arrays que váis a crear:
global {
# minor-count 64;
# dialog-refresh 5; # 5 seconds
# disable-ip-verification;
usage-count ask;
}
common {
syncer { rate 100M; }
}
resource cluster_metadata {
protocol C;
handlers {
pri-on-incon-degr "echo O > /proc/sysrq-trigger ; halt -f";
pri-lost-after-sb "echo O > /proc/sysrq-trigger ; halt -f";
local-io-error "echo O > /proc/sysrq-trigger ; halt -f";
# outdate-peer "/usr/sbin/drbd-peer-outdater";
}
startup {
# wfc-timeout 0;
degr-wfc-timeout 120; # 2 minutes.
}
disk {
on-io-error detach;
}
net {
after-sb-0pri disconnect;
after-sb-1pri disconnect;
after-sb-2pri disconnect;
rr-conflict disconnect;
}
syncer {
# rate 10M;
# after "r2";
al-extents 257;
}
on batman {
device /dev/drbd0;
disk /dev/hda5;
address 192.168.1.108:7788;
meta-disk internal;
}
on robin {
device /dev/drbd0;
disk /dev/hda5;
address 192.168.1.109:7788;
meta-disk internal;
}
}
resource vg0drbd {
protocol C;
startup {
wfc-timeout 0; ## Infinite!
degr-wfc-timeout 120; ## 2 minutes.
}
disk {
on-io-error detach;
}
net {
# timeout 60;
# connect-int 10;
# ping-int 10;
# max-buffers 2048;
# max-epoch-size 2048;
}
syncer {
after "cluster_metadata";
}
on batman {
device /dev/drbd1;
disk /dev/hda6;
address 192.168.1.108:7789;
meta-disk internal;
}
on robin {
device /dev/drbd1;
disk /dev/hda6;
address 192.168.1.109:7789;
meta-disk internal;
}
}
resource vg1drbd {
protocol C;
startup {
wfc-timeout 0; ## Infinite!
degr-wfc-timeout 120; ## 2 minutes.
}
disk {
on-io-error detach;
}
net {
# timeout 60;
# connect-int 10;
# ping-int 10;
# max-buffers 2048;
# max-epoch-size 2048;
}
syncer {
after "vg0drbd";
}
on batman {
device /dev/drbd2;
disk /dev/hda7;
address 192.168.1.108:7790;
meta-disk internal;
}
on robin {
device /dev/drbd2;
disk /dev/hda7;
address 192.168.1.109:7790;
meta-disk internal;
}
}
Luego lo copiamos al nodo 2. Una vez tenemos el fichero de configuración podemos crear los arrays (esto hay que hacerlo en ambos nodos):
drbdadm create-md cluster_metadatadrbdadm create-md vg0drbddrbdadm create-md vg1drbd
Y arrancamos el servicio drbd en los dos nodos. Si miráis el fichero /proc/drbd, veréis que el estado de los discos es inconsistente y que ambos nodos estan como secundarios. Así que en el nodo 1 hacéis:
drbdsetup /dev/drbd0 primary -odrbdsetup /dev/drbd1 primary -odrbdsetup /dev/drbd2 primary –o
Con esto hemos puesto al nodo 1 como primario en todas las particiones que gestiona drbd. Ahora si miráis el /proc/drbd, veréis como está replicando los datos. Ahora hay que añadir drbd al inicio del sistema y ya de paso, creamos el sistema de ficheros en la partición que nos guardará los ficheros de config del cluster.
chkconfig --level 2345 drbd on (en ambos nodos)mkfs.ext3 /dev/drbd0 (en el nodo 1)
En este punto, con los arrays creados, nos referiremos siempre al los dispositivos drbd para I/O o cualquier operación con discos.
Ok. Ahora, editamos el fichero /etc/lvm/lvm.conf y cambiamos el filtro de esto:
filter = [ "a/.*/" ]
a esto:
filter = [ "r|/dev/hda*|" ]
y procedemos a crear el physical volume sobre drbd1 (el otro sera sobre drbd2, ya que el 0 no será gestionado por lvm).
pvcreate /dev/drbd1
Heartbeat
Para configurar heartbeat nos hará falta crear dos ficheros, authkeys y ha.cf. En authkeys definimos el metódo de autenticación entre nodos del cluster. Podéis poner sencillamente esto:
auth 2
2 crc
Lo copiáis al nodo 2 y atención, aseguraos que los permisos sobre este fichero en ambos nodos es 600, ya que de lo contrario heartbeat no arrancará. Ahora el ha.cf:
debugfile /var/log/ha-debug
logfile /var/log/ha-log
logfacility local0
udpport 694
bcast eth0
keepalive 5
warntime 10
deadtime 120
initdead 120
auto_failback off
node batman
node robin
Importante: Aseguraos que la eth sobre la que vais a comprobar el heartbeat es la correcta (en mi caso solo tengo una eth en cada servidor así que no hay mucha probabilidad de error). Ah y cambiad los nombre de los nodos (lineas “node”) con el nombre de vuestros nodos. Cuando acabéis, copiadlo al nodo 2 y añadid heartbeat al inicio del sistema.
- chkconfig –level 2345 heartbeat on
Ahora es cuando tenemos que empezar a mover ficheros de configuración a la partición que hemos creado para el cluster y linkarlos, de manera que cuando hagamos el failover el nodo secundario monte dicha partición (que está replicada con drbd) y pueda arrancar los servicios correctamente:
En nuesto nodo primario:
- mkdir /cluster_metadata
- mount /dev/drbd0 /cluster_metadata
- mv /opt/openfiler/ /opt/openfiler.local
- mkdir /cluster_metadata/opt
- cp -a /opt/openfiler.local /cluster_metadata/opt/openfiler
- ln -s /cluster_metadata/opt/openfiler /opt/openfiler
- rm /cluster_metadata/opt/openfiler/sbin/openfiler
- ln -s /usr/sbin/httpd /cluster_metadata/opt/openfiler/sbin/openfiler
- rm /cluster_metadata/opt/openfiler/etc/rsync.xml
- ln -s /opt/openfiler.local/etc/rsync.xml /cluster_metadata/opt/openfiler/etc/
- mkdir -p /cluster_metadata/etc/httpd/conf.d
y editamos el fichero /opt/openfiler.local/etc/rsync.xml para que parezca algo asi:
<?xml version="1.0" ?>
<rsync>
<remote hostname="10.188.188.2"/> ## IP address of peer node.
<item path="/etc/ha.d/haresources"/>
<item path="/etc/ha.d/ha.cf"/>
<item path="/etc/ldap.conf"/>
<item path="/etc/openldap/ldap.conf"/>
<item path="/etc/ldap.secret"/>
<item path="/etc/nsswitch.conf"/>
<item path="/etc/krb5.conf"/>
</rsync>
Tened en cuenta en “hostname” poner la IP del nodo 2. En el nodo 2 nos basta con:
mkdir /cluster_metadatamv /opt/openfiler/ /opt/openfiler.localln -s /cluster_metadata/opt/openfiler /opt/openfiler
El link simbolico está “roto”, pero se arrgla al hacer el failover, ya que se montará la partición en el directorio /cluster_metadata. Hacemos lo mismo con el fichero /opt/openfiler.local/etc/rsync.xml, pero en el nodo 2 tenemos que poner la IP del nodo 1.
Ahora la configuración del heartbeat que trae openfiler. Esto sólo hay que hacerlo en el nodo 1. Editamos /cluster_metadata/opt/openfiler/etc/cluster.xml y lo dejamos tal que así.
<?xml version="1.0" ?>
<cluster>
<clustering state="on" />
<nodename value="batman" />
<resource value="MailTo::it@company.com::ClusterFailover"/>
<resource value="IPaddr::192.168.1.10/24" />
<resource value="drbddisk::">
<resource value="LVM::vg0drbd">
<resource value="Filesystem::/dev/drbd0::/cluster_metadata::ext3::defaults,noatime">
<resource value="MakeMounts"/>
</cluster>
Con esto lo que hacemos es definir a Batman (nodo 1) como el nodo primario. A su vez le decimos que añada un recurso al cluster como una IP virtual (la ip del cluster) y que monte la partición de los ficheros de configuración del cluster.
Ahora, hay que hacer lo mismo que con los ficheros de configuración del openfiler, pero con los de los diferentes servicios. Por partes.
iSCSI
en el nodo 1:
mv /etc/ietd.conf /cluster_metadata/etc/ln -s /cluster_metadata/etc/ietd.conf /etc/ietd.confmv /etc/initiators.allow /cluster_metadata/etc/ln -s /cluster_metadata/etc/initiators.allow /etc/initiators.allowmv /etc/initiators.deny /cluster_metadata/etc/ln -s /cluster_metadata/etc/initiators.deny /etc/initiators.deny
en el nodo 2:
rm /etc/ietd.confln -s /cluster_metadata/etc/ietd.conf /etc/ietd.confrm /etc/initiators.allowln -s /cluster_metadata/etc/initiators.allow /etc/initiators.allowrm /etc/initiators.denyln -s /cluster_metadata/etc/initiators.deny /etc/initiators.deny
FTP
En el nodo 1:
mv /etc/proftpd /cluster_metadata/etc/ln -s /cluster_metadata/etc/proftpd/ /etc/proftpd
En el nodo 2:
rm -rf /etc/proftpdln -s /cluster_metadata/etc/proftpd/ /etc/proftpd
SAMBA Y NFS.
Aquí tuve un pequeño problemita con el tuto de how to forge. Esto es lo que dice:
Nodo 1;
mkdir /cluster_metadata/etcmv /etc/samba/ /cluster_metadata/etc/ln -s /cluster_metadata/etc/samba/ /etc/sambamkdir -p /cluster_metadata/var/spoolmv /var/spool/samba/ /cluster_metadata/var/spool/ln -s /cluster_metadata/var/spool/samba/ /var/spool/sambamkdir -p /cluster_metadata/var/libmv /var/lib/nfs/ /cluster_metadata/var/lib/ln -s /cluster_metadata/var/lib/nfs/ /var/lib/nfsmv /etc/exports /cluster_metadata/etc/ln -s /cluster_metadata/etc/exports /etc/exports
Aunque esto, me dio error en el paso “mv /var/lib/nfs/ /cluster_metadata/var/lib/”. El caso es que hay un demonio por ahí que tiene algo que ver con rpc que bloquea el directorio. Para solucionarlo hice esto:
- Reemplazar todas las ocurrencias de /var/lib/nfs/rpc_pipefs por /var/lib/rpc_pipefs en los ficheros /etc/modprobe.conf.dist y /etc/idmapd.conf. Lo podeis hacer a manija o con este mini-script en perl:
perl -i.orig -pe '
if (m,^[^#], and m,/var/lib/nfs/rpc_pipefs,)
{print "#", $_; s,,/var/lib/rpc_pipefs,;}
' \
/etc/modprobe.conf.dist \
/etc/idmapd.confservice nfslock stopservice nfs stopservice rpcidmapd stop/bin/umount -a -t rpc_pipefsmv /var/lib/nfs/rpc_pipefs /var/lib//bin/mount -t rpc_pipefs sunrpc /var/lib/rpc_pipefsservice rpcidmapd start
Con esto moveis el directorio rpc_pipefs fuera de la carpeta /var/lib/nfs asi que os dejara moverla. Luego, podeis deshacer el proceso (cambiad las expresiones en el script) para que los locks de nfs se guarden en la partición compartida de configuración del cluster, de manera que cuando se haga el failover, se conserven.
Nodo 2:
rm -rf /etc/samba/ln -s /cluster_metadata/etc/samba/ /etc/sambarm -rf /var/spool/samba/ln -s /cluster_metadata/var/spool/samba/ /var/spool/sambarm -rf /var/lib/nfs/ln -s /cluster_metadata/var/lib/nfs/ /var/lib/nfsrm -rf /etc/exportsln -s /cluster_metadata/etc/exports /etc/exports
Hecho esto, creamos el primer volume group en el nodo 1:
vgcreate vg0drbd /dev/drbd1lvcreate -L 400M -n lv001 vg0drbd
Tened siempre como minimo un volumegroup con un logical volumen dentro por que si no el heartbeat no arrancara. Luego lo podreis borrar con la interfaz de openfiler y hacerlo al gusto, pero este es para que no de error al arrancar.
Luego en el nodo 1:
rm /opt/openfiler/etc/httpd/modulesln -s /usr/lib64/httpd/modules /opt/openfiler/etc/httpd/modules
(si teneis la arquitectura x86, como yo, le quitais el “64” al “lib64” y listo)
Ahora reiniciamos openfiler,
service openfiler restart
Y tendremos que activar o desactivar algun servicio mediante la interfaz para que escriba el fichero /etc/ha.d/haresources. Cuando lo tengamos, lo copiamos al nodo 2.
Y ahora solo queda aplicar el 2º axioma de la informatica, reiniciar. Reiniciamos los dos nodos, y al arrancar deberiamos tener el cluster activo. Ahora podeis entrar a la interfaz de administración a través de la IP del cluster (la que hayais definido previamente) y probar.
Si teneis algun problema, mirad en los ficheros de log del heartbeat (/var/log/ha-log y /var/log/ha-debug) de los dos nodos, y probad a parar y arrancar el openfiler en los dos nodos, para ver que errores genera.
Ahora podemos exportar con iSCSI, de manera que con los ESXi podemos adjuntar el storaga en dos o mas servidores. Esto nos sirve para que si uno de los dos “muere”, podamos arrancar la máquina virtual directamente en el otro, tal y como estaba cuando se paró.
Haced vuestras pruebas y ya me diréis!
Fuentes: howtoforge, linux-ha, kylecordes


el July 16th, 2010 a las 18:53
[...] Como no me gustan los extremos no afirmaré rotundamente, pero no me negaréis que los posts respecto a Openfiler de este blog se parecen muy mucho al que publiqué aquí. [...]
el September 1st, 2010 a las 05:59
Para mi son iguales.
Buscando justo esta info, llegue a la misma info desde dos lugares diferentes y ooohh!!! son iguales.
Las fechas de publicaciones son la prueba.
Slds