jump to navigation

Instalación servidores con OCFS2, DRBD, LVM2, RAID1 sobre Debian (howto install) 10 agosto, 2009

Posted by ubanov in Informática-Linux.
Tags: , , , , ,
trackback

Es esta entrada voy a describir una instalación muy interesante que he realizado recientemente. La instalación consta de dos máquinas conectadas en red, que tienen el mismo File System montado en ambas máquinas y el contenido de los discos está replicado en ambas.

Para hacer la réplica de los discos en dos máquinas se va a utilizar el DRBD v8, y para montar el disco en ambas máquinas OCFS2.

De forma gráfica lo que vamos a montar es lo siguiente:

OCFS2 

Vamos a partir de dos máquinas instaladas con Debian 5.0 (Lenny).

Particionar ambos discos iguales con tres particiones, para ello en la instalación elegir el método de participacionado Manual.

# cat /proc/mdstat
Personalities : [raid1]
md2 : active (auto-read-only) raid1 sda6[0] sdb6[1]
2441728 blocks [2/2] [UU]

md1 : active (auto-read-only) raid1 sda5[0] sdb5[1]
586240 blocks [2/2] [UU]

md0 : active raid1 sda1[0] sdb1[1]
2931712 blocks [2/2] [UU]

# mdadm –readwrite /dev/md0
# mdadm –readwrite /dev/md1
# mdadm –readwrite /dev/md2

De forma detallada los discos quedarán de la siguiente forma:

OCFS2discos

Sobre estas máquinas vamos a instalar los siguientes paquetes de software:

apt-get install ssh
apt-get install ifenslave-2.6
apt-get install mdadm
apt-get install lvm2
apt-get install drbd8-modules-2.6.26-2-686 drbd8-utils
apt-get install ocfs2-tools

La idea es que ambas máquinas tengan dos interfaces de red, configurados en bonding, utilizando el ifenslave (es muy importante que la red entre ambas máquinas siempre estén funcionando, y esta es una forma de asegurarlo). Como esto está en muchos sitios no lo voy a describir aquí.

 Respecto al disco cada máquina le pondremos dos discos duros iguales para hacer RAID-1, dado que los discos son baratos y esta configuración nos dará mayor disponibilidad. Aunque luego la idea es tener una especie de RAID-1 en red, con lo que podría sobrar.

 Sobre cada máquina montaremos 3 particiones en RAID-1, una para el sistema, otra para el área de SWAP y una tercera para contener los datos en si.

 Sobre la partición de datos crearemos un volumen LVM.

pvcreate /dev/md2
vgcreate data /dev/md2

 Luego podríamos crear volumenes, por ejemplo para crear un volumen de 1G:

lvcreate -L 1G -n grupo1 data

 Después de tener creado el “trozo” de disco (/dev/data/grupo1 en este caso) que está en RAID-1, vamos a proceder a replicarlo entre ambas máquinas.

Para ello utilizaremos el drbd. La configuración del mismo sería:

cat >etc/drbd.conf <<EOF
#
global {
    usage-count no;
}

common {
  protocol C;
  startup {
    wfc-timeout  300;
    degr-wfc-timeout 120;    # 2 minutes.
  }

  syncer {
    rate 10M;
  }

  disk {
    on-io-error   detach;
  }
}

resource r0 {
  startup {
    become-primary-on both;
  }

  net {
    allow-two-primaries;
    after-sb-0pri discard-zero-changes;
    after-sb-1pri discard-secondary;
    after-sb-2pri disconnect;
  }

  on node1 {
    device     /dev/drbd0;
    disk       /dev/data/grupo1;
    meta-disk  internal;
    address    192.168.149.132:7788;
  }

  on node2 {
    device     /dev/drbd0;
    disk       /dev/data/grupo1;
    meta-disk  internal;
    address   192.168.149.131:7788;
  }
}
EOF

 
Con esa configuración parar y volver a arrancar el drbd (esto debería hacerse en ambos nodos).

Para inicializar el disco drbd ejecutar los siguientes comandos:

drbdadm create-md all
drbdadm attach all
drbdadm syncer all
drbdadm connect all

 
(información de cómo hacer la primera réplica obtenida de: http://www.drbd.org/users-guide/s-first-time-up.html)

Por último en uno de los dos nodos hay que ejecutar el siguiente comando, con la idea de que se fuerce la repliación de ese nodo al siguiente (por ahora está vacío el File System con lo que no importa en qué nodo hacerlo):

drbdadm — –overwrite-data-of-peer primary all

Como tenemos la idea de crear un file system que va a estar en ambos nodos en modo de escritura, deberemos hacer que en ambos esté en modo primario de DRBD. Por ello será necesario ejecutar “drbdadm primary all” en otro nodo.

Se podrá ir viendo cómo va la réplica con el comando cat /proc/drbd, aunque podremos empezar a trabajar con el File System antes de que acabe este proceso.

Configurar OCFS2 (en ambas máquinas):

cat >/etc/ocfs2/cluster.conf <<EOF
cluster:
    node_count = 2
    name = ocfs2
 
node:
    ip_port = 7777
    ip_address = 192.168.149.132
    number = 0
    name = node1
    cluster = ocfs2
 
node:
    ip_port = 7777
    ip_address = 192.168.149.131
    number = 1
    name = node2
    cluster = ocfs2
EOF

dpkg-reconfigure ocfs2-tools

# comprobar estado
/etc/init.d/o2cb status

Lo último que nos queda es crear el FS de tipo OCFS2, para ello se ejecuta en una de las dos máquinas el comando:

mkfs -t ocfs2 -N 2 -L ocfs2_drbd0 /dev/drbd0
 
Con este sistema en ambas máquinas se podría montar el disco, esto nos dará la posibilidad de poder hacer muchas cosas: servidores de ficheros, servidores de virtualización… Esta instalación tengo intención de utilizarla para crear dos servidores con Xen, en la cual puedan montar máquinas virtuales y se pueda hacer el Live Migration con dos servidores.

Que desventajas tiene esta instalación con respecto a montar un FS de tipo Ext3 (elijo este como ejemplo, por ser el más típico FS).
– OCFS2 es un FS más complejo
– OCFS2 da un rendimiento más bajo (se deshabilitan los caches, se comunican por red ambos nodos según se hacen escrituras…)

 En www.drbd.com hay mucha documentación interesante sobre cosas que se pueden hacer en drbd, recomiendo mirarlo.

 

Snapshots sobre OCFS2
Se puede crear un snapshot (una foto de como está el Filesystem en un determinado momento). Para ello se creará con los siguientes comandos:

lvcreate -L 200M -s -n snap1 /dev/data/grupo1
# para borrarlo luego
lvremove -f /dev/data/snap1

Para crear un snapshot es necesario tener espacio libre. En el momento que se hace un snapshot el rendimiento del disco bajará (por cada escritura en el disco principal se escribirán dos veces, una en el snapshot y otra en el propio disco). Si un snapshot se «llena» se invalidará (haya más cambios sobre el Filesystem del espacio reservado).

El «problema» que podemos tener con un snapshot sobre un FileSystem OCFS2 es que no vamos a poder tener en una misma máquina montado simultaneamente un filesystem y su Snapshot (vamos que o bien tienes el file system o bien el snapshot).
 

GFS
En lugar de utilizar OCFS2 podríamos hacer el montaje de ambos FS utilizando GFS de RedHat, la configuración es más compleja por que es necesario configurar el cluster también. No voy a explicar cómo se hace, pero como referencia voy a dejar los comandos necesarios para hacerlo. Importante la parte de fencing (sistema para evitar que ambos nodos puedan perder conectividad y estar trabajando al mismo tiempo)

apt-get install cman drbd8
# configuracion de manual fencing
# documentacion /usr/share/doc/gfs2-tools/min-gfs.txt copiar a /etc/cluster/cluster.conf

mkdir /etc/cluster
cat >/etc/cluster/cluster.conf <<EOF
<?xml version=»1.0″?>
<cluster config_version=»2″>
 
<cman two_node=»1″ expected_votes=»1″>
</cman>
 
<clusternodes>
<clusternode nodeid=»1″>
        <fence>
                <method>
                        <device ipaddr=»debianSRV1″/>
                </method>
        </fence>
</clusternode>
 
<clusternode nodeid=»2″>
        <fence>
                <method>
                        <device ipaddr=»debianSRV2″/>
                </method>
        </fence>
</clusternode>

</clusternodes>

<fencedevices>
        <fencedevice agent=»fence_manual»/>
</fencedevices>
 
</cluster>
EOF

 
# habría que poner fencing. Ver documento http://www.redhat.com/docs/manuals/enterprise/RHEL-5-manual/Cluster_Administration/s1-config-fence-devices-conga-CA.html

 

debianSRV2:~# more /etc/hosts
127.0.0.1       localhost
#127.0.1.1       debianSRV1.ubanov.homelinux.com      debianSRV1

# The following lines are desirable for IPv6 capable hosts
::1     localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
ff02::3 ip6-allhosts
 
192.168.149.130 debianSRV1
192.168.149.129 debianSRV2
EOF

modprobe dlm
modprobe gfs2
modprobe lock_dlm

#gnbd_serv -n
#ccsd
#cman_tool join

ccs_tool addnodeid

/etc/init.d/cman start

#comprobar en ambos nodos funcionamiento
cman_tool status

# aniadir en recurso siguientes lineas
  startup {
    become-primary-on both;
  }

  net {
    # allow-two-primaries;
    after-sb-0pri discard-zero-changes;
    after-sb-1pri discard-secondary;
    after-sb-2pri disconnect;
  }

Crear una segunda partición replicada
# /dev/data2/grupo21

cat >etc/drbd.conf </etc/ocfs2/cluster.conf <>/etc/drbd.conf <<EOF

resource r1 {

startup {
become-primary-on both;
}
net {
allow-two-primaries;
after-sb-0pri discard-zero-changes;
after-sb-1pri discard-secondary;
after-sb-2pri disconnect;
}

on node1 {
device /dev/drbd1;
disk /dev/data/grupo2;
meta-disk internal;
address 192.168.149.132:7789;
}

on node2 {
device /dev/drbd1;
disk /dev/data/grupo2;
meta-disk internal;
address 192.168.149.131:7789;
}
}
EOF

drbdadm create-md r1
drbdadm attach r1
drbdadm syncer r1
drbdadm connect r1
# en uno de ellos ejecutar
drbdadm — –overwrite-data-of-peer primary r1
# con cat /proc/drbd vas viendo estado
# y en el otro ejecutar
drbdadm primary r1

# crear file system (solo en uno de los dos)
mkfs -t ocfs2 -N 2 -L ocfs2_drbd1 /dev/drbd1

Comentarios»

1. Victor Hugo - 29 septiembre, 2009

Hola, gracias por la ayuda.
Pero tengo un problema, todo va bien, en teoria, hasta que intento montar el filesystem:

cluster1:/# mount -at ocfs2 /dev/sda4 /ha
mount.ocfs2: Device or resource busy while mounting /dev/sda4 on /ha. Check ‘dmesg’ for more information on this error.

la salida del dmesg:

cluster1:/# dmesg | tail
[ 55.122935] ACPI: PCI Interrupt 0000:04:02.0[A] -> GSI 16 (level, low) -> IRQ 16
[ 55.122992] [drm] Initialized radeon 1.29.0 20080528 on minor 0
[ 55.124803] drbd0: conn( WFBitMapT -> WFSyncUUID )
[ 55.124803] drbd0: peer( Secondary -> Primary )
[ 55.135179] drbd0: conn( WFSyncUUID -> SyncTarget ) disk( UpToDate -> Inconsistent )
[ 55.135205] drbd0: Began resync as SyncTarget (will sync 0 KB [0 bits set]).
[ 55.135212] drbd0: Resync done (total 1 sec; paused 0 sec; 0 K/sec)
[ 55.135220] drbd0: conn( SyncTarget -> Connected ) disk( Inconsistent -> UpToDate )
[ 59.119513] eth1: no IPv6 routers present
[ 1225.863601] OCFS2 1.5.0

Y el estatus del drbd:

cluster1:/# /etc/init.d/drbd status
drbd driver loaded OK; device status:
version: 8.0.14 (api:86/proto:86)
GIT-hash: bb447522fc9a87d0069b7e14f0234911ebdab0f7 build by phil@fat-tyre, 2008-11-12 16:40:33
m:res cs st ds p mounted fstype
0:r0 Connected Primary/Primary UpToDate/UpToDate C

Cual puede ser la falla?

Gracias

2. ubanov - 30 septiembre, 2009

Yo apostaría por un problema con el OCFS2… lo malo es que el dmesg dice poco. Qué te ha dice el comando «/etc/init.d/o2cb status». Cuando has creado el FS con «mkfs -t ocfs2 -N 2 -L ocfs2_drbd0 /dev/drbd0», te ha dicho algo raro?

Victor Hugo - 30 septiembre, 2009

Hola, hice todo el proceso de nuevo, pero despues de crear la particion y antes de ejecutar los comandos de drbd, cree el filesystem:
# mkfs.ocfs2 /dev/sda10
Segui los pasos y voila.
Estoy haciendo un pequeño documento de los comando y lo envio cuando este listo.

De nuevo gracias

3. Victor Hugo - 30 septiembre, 2009

Ivan, ya tengo el documento con los comandos, lo envio a algun correo?

4. Guillermo - 20 enero, 2010

hola, es posible que la ultima parte del texto esté mal? parece que hablas de montar un GFS y acabas haciendo un mkfs de un OCFS2 otra vez… ¿?

ubanov - 20 enero, 2010

yo probé ocfs y gfs…. igual al escribirlo se me juntaron ambos… algún día que tenga tiempo ya lo revisaré 😛

5. Bamboo Plates Disposable - 14 enero, 2013

I love what you guys tend to be up too. This sort of clever work and coverage!
Keep up the terrific works guys I’ve incorporated you guys to my own blogroll.


Deja un comentario