Viviendo Linux en TwitterViviendo Linux en Facebook
Español (spanish formal Internacional)English (United Kingdom)Italian - ItalyDeutsch (DE-CH-AT)French (Fr)Português (Brasil)Hebrew (Israel)Russian (CIS)繁體中文Japanese(JP)HindiCroatian(HR)

Donaciones

Donate using PayPal
Amount:
Nota:

Anuncios

En el foro

Anuncios

Home Laboratorio Instalación ¿Imposible? Creando un cluster con Ubuntu parte 2

Creando un cluster con Ubuntu parte 2

Atención, abrir en una nueva ventana. ImprimirE-mail

Laboratorio - Instalación: ¿Imposible?


¡Saludos! En nuestro artículo anterior hablamos de cómo hacer un cluster, bueno, de la introducción al como hacerlo. Definimos que vamos a hacerlo con Ubuntu Jaunty, en dos equipos con 8GB de RAM y 4 núcleos y dos discos duros SATA.

En esta ocasión veremos como crear el almacenamiento en cluster, que será la base para todo lo demás.

Lo primero que debo decir, es que este paso es crucial y además ha sido el mas complejo con el que me he topado de todo este Laboratorio.

Mi primera idea era usar iSCSI para hacer un iRAID-1 y formatearlo con GFS/OCFS2. Esto iba funcionando muy bien, hasta el punto en que intente montar el dispositivo de iRAID en mis dos hosts al mismo tiempo. Ahí falló todo, no se podía abrir el dispositivo origen /dev/sda1 dos veces al mismo tiempo. Entonces me tuve que echar para atrás y buscar otra solución.

Esta fue DRBD. Este maravilloso desarrollo permite hacer un RAID-1 de 2 equipos (por lo pronto) en red. Se encarga de la sincronización y replicación de cambios a nivel bloques de ambos discos.

Luego, intenté compartir dentro de cada host su propio dispositivo de DRBD usando iSCSI. Otro fracaso. Dentro del mismo equipo todo funcionaba perfecto, con todas sus maquinas virtuales, pero cuando quería hacer lo mismo en el otro host y que las maquinas virtuales del host1 se pusieran de acuerdo con las del host2, todo fracasó. No se hablaron nunca, puesto que eran dispositivos distintos para el cluster.

Luego, después de pensarlo, y para consolarme un poco, me fije que la velocidad máxima de escritura de mis discos era de 20MB/s en acceso aleatorio, y que mi red interna es de 1GB, así que podía usar NFS dentro de cada host para darle acceso al dispositivo de almacenamiento a cada nodo, sin tener problemas de velocidad.

Sin embargo mi idea sigue, y espero lograrlo algún día, cuando lo logre, escribiré una actualización. La idea es hacer un GFS2/OCFS2 sobre iSCSI sobre DRBD o sobre un iRAID-1.

Finalmente, llegó el momento de elegir el sistema de archivos. Si tu intentas a un cluster en el que todos los nodos pueden escribir, ponerle un sistema de archivos normal, como ext3, xfs, reiserfs o similares, al montar en dispositivo en dos o mas nodos y escribir en ellos, se corromperá todo y tendrás que formatear de nuevo. Para hacer algo así se necesita un sistema de archivos para cluster. Inicialmente probe GFS2, pero su complejidad de configuración me hizo desistir. Probe luego OCFS2 que me pareció muy sencillo, por lo que fue el gran ganador.

Ahora que he terminado la introducción a este artículo, vamos a lo que nos interesa, que es a fabricar todo.

Lo primero será instalar los paquetes que vamos a usar. Recuerda, estamos trabajando en Ubuntu Jaunty.

1
2
3
sudo apt-get install drbd-module-source drbd8-utils 
sudo apt-get install ocfs2-tools
sudo apt-get install nfs-kernel-server

Una vez instalado esto que requerimos, tenemos que particionar el disco de almacenamiento.

Mis discos son identicos, de 250GB cada uno, y los parti mas o menos a la mitad para tener una parte de storage y otra parte de respaldos en cada equipo.

Tu puedes usar el software que acostumbres para hacer las particiones, yo utilicé fdisk directamente, por que estoy acostumbrado a usarlo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
# fdisk /dev/sda
The number of cylinders for this disk is set to 30401.
There is nothing wrong with that, but this is larger than 1024,
and could in certain setups cause problems with:
1) software that runs at boot time (e.g., old versions of LILO)
2) booting and partitioning software from other OSs
(e.g., DOS FDISK, OS/2 FDISK)

Command (m for help): p
Disk /dev/sda: 250.0 GB, 250059350016 bytes
255 heads, 63 sectors/track, 30401 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk identifier: 0x000080a8

Device Boot Start End Blocks Id System
Command (m for help): n
Command action
e extended
p primary partition (1-4)
p
Partition number (1-4): 1
First cylinder (1-30401, default 1):
Using default value 1
Last cylinder, +cylinders or +size{K,M,G} (1-30401, default 30401): 16319

Command (m for help):
Command (m for help): n
Command action
e extended
p primary partition (1-4)
p
Partition number (1-4): 2
First cylinder (16320-30401, default 16320):
Using default value 16320
Last cylinder, +cylinders or +size{K,M,G} (16320-30401, default 30401):
Using default value 30401

Command (m for help):
Command (m for help): p

Disk /dev/sda: 250.0 GB, 250059350016 bytes
255 heads, 63 sectors/track, 30401 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk identifier: 0x000080a8

Device Boot Start End Blocks Id System
/dev/sda1 1 16319 131082336 83 Linux
/dev/sda2 16320 30401 113113665 83 Linux

Command (m for help):
q

Una vez que terminamos el proceso de particionar, es recomendable reiniciar, aunque no siempre es necesario. Para mayor seguridad, reiniciamos.

Lo que sigue ahora es configurar nuestro DRBD. Tenemos dos dispositivos en hosts diferentes, de la misma capacidad exacta, así que esta es nuestra configuración, que debe estar en /etc/drbd.conf:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
global { 
usage-count yes;
}
common {
protocol C;
}
resource r0 {
startup {
become-primary-on both;
}
net {
allow-two-primaries;
cram-hmac-alg "sha1";
shared-secret "123456";
after-sb-0pri discard-zero-changes;
after-sb-1pri discard-secondary;
after-sb-2pri disconnect;
rr-conflict violently;
}
syncer {
rate 40M;
}
on node1 {
device /dev/drbd0;
disk /dev/sda1;
address 192.168.100.3:7789;
meta-disk internal;
}
on node2 {
device /dev/drbd0;
disk /dev/sda1;
address 192.168.100.1:7789;
meta-disk internal;
}
}

Considera la parte de syncer, donde tengo especificado 40M. Este rubro especifica la velocidad de sincronización entre ambos hosts. Es realmente importante definirlo adecuadamente, si lo defines muy alto, y no tienes una red suficientemente grante y dedicada, entonces vas a alentar mucho tu red, si lo defines bajo, va a tardar mucho en sincronizarse. El estandar de 10M será suficiente para la mayoría. En mi caso yo tengo una red de gigabit dedicada a esto, así que le puse un valor mayor.

Ahora vamos a crear nuestro dispositivo drbd, y después vamos a sincronizarlos. Estos pasos debes realizarlos en ambos nodos simultaneamente, no te adelantes en un nodo si no haz hecho el paso correspondiente en el otro nodo.

1
drbdadm create-md r0

Revisamos que se haya creado:

1
2
3
4
5
6
7
cat /proc/drbd
version: 8.2.5 (api:88/proto:86-88)
GIT-hash: 9faf052fdae5ef0c61b4d03890e2d2eab550610c build by root@node1.test.lab, 2008-05-23 11:45:23
0: cs:StandAlone st:Secondary/Unknown ds:Inconsistent/Outdated 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/127 hits:0 misses:0 starving:0 dirty:0 changed:0

Ahora vamos a conectar ambos nodos:

1
2
drbdadm connect r0

Y revisamos los cambios:

1
2
3
4
5
6
7
cat /proc/drbd
version: 8.2.5 (api:88/proto:86-88)
GIT-hash: 9faf052fdae5ef0c61b4d03890e2d2eab550610c build by root@node1.test.lab, 2008-05-23 11:45:23
0: cs:WFConnection st:Secondary/Unknown ds:Inconsistent/Outdated 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/127 hits:0 misses:0 starving:0 dirty:0 changed:0

¡Bien! ya estamos conectados, checa la "C" en la línea 4. Ahora vamos a hacer la sincronización inicial.

Es importante notar que para la sincronización inicial entre mas alto sea este valor, mejor, por que así tardamos menos en este lento paso. Yo le puse una velocidad de 110M y tardó cerca de 300 minutos.

Para hacer este cambio sin modificar la configuración, nada mejor que aplicarlo de manera temporal:

1
drbdsetup /dev/drbd0 syncer -r 110M

Ahora hagamos la sincronización inicial, sólo hazlo en uno de los dos nodos:

1
drbdadm -- --overwrite-data-of-peer primary r0

Y verificamos que se este realizando:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[root@host1]# cat /proc/drbd
version: 8.2.5 (api:88/proto:86-88)
GIT-hash: 9faf052fdae5ef0c61b4d03890e2d2eab550610c build by root@node1.test.lab, 2008-05-23 11:45:23
0: cs:SyncSource st:Primary/Secondary ds:UpToDate/Inconsistent C r—
ns:792 nr:0 dw:0 dr:792 al:0 bm:0 lo:0 pe:0 ua:0 ap:0
[>....................] synced: 0.2% (2096260/2097052)K
finish: 2:11:00 speed: 264 (264) K/sec
resync: used:0/31 hits:395 misses:1 starving:0 dirty:0 changed:1
act_log: used:0/127 hits:0 misses:0 starving:0 dirty:0 changed:0

[root@host2]# cat /proc/drbd
version: 8.2.5 (api:88/proto:86-88)
GIT-hash: 9faf052fdae5ef0c61b4d03890e2d2eab550610c build by root@node2.test.lab, 2008-05-23 12:58:18
0: cs:SyncTarget st:Secondary/Primary ds:Inconsistent/UpToDate C r—
ns:0 nr:1896 dw:1896 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0
[>....................] synced: 0.2% (2095156/2097052)K
finish: 2:02:12 speed: 268 (268) K/sec
resync: used:0/31 hits:947 misses:1 starving:0 dirty:0 changed:1
act_log: used:0/127 hits:0 misses:0 starving:0 dirty:0 changed:0

Esperamos a que termine la sincronización, para que nos muestre algo como esto:

1
2
3
4
5
6
root@host2:~# cat /proc/drbd 
version: 8.3.0 (api:88/proto:86-89)
GIT-hash: 9ba8b93e24d842f0dd3fb1f9b90e8348ddb95829 build by ivoks@ubuntu, 2009-01-17 07:49:56
0: cs:Connected ro:Primary/Primary ds:UpToDate/UpToDate C r---
ns:4847283 nr:4204861 dw:9052141 dr:17794 al:1004 bm:0 lo:1 pe:0 ua:0 ap:1 ep:1 wo:b oos:0

Estamos ya listos para el siguiente paso. Vamos a formatear el dispositivo /dev/drbd0 con ocfs2. Este paso solo hazlo en uno de los dos nodos:

1
2
root@host2:~# mkfs.ocfs2 -b 4K -T mail -N 2 -v /dev/drbd0

En este caso, el parametro -T mail le indica al sistema ocfs2 que vamos a almacenar muchos archivos relativamente pequeños, para que optimice el journal. Y el parámetro -N 2 le indica cuantos nodos se van a conectar. Puesto que sólo vamos a conectar host1 y host2, solo requerimos 2 nodos.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
mkfs.ocfs2 1.3.9
Overwriting existing ocfs2 partition.
mkfs.ocfs2: OCFS2 directory corrupted while initializing the dlm
As this is an existing OCFS2 volume, it could be mounted on an another node in the cluster.
However, as mkfs.ocfs2 is unable to initialize the dlm, it cannot detect if the volume is in use or not.
To skip this check, use --force or -F.
root@node1:~# mkfs.ocfs2 -b 4K -T mail -N 16 -v -F /dev/drbd0
mkfs.ocfs2 1.3.9
Filesystem Type of mail
Filesystem label=
Block size=4096 (bits=12)
Cluster size=4096 (bits=12)
Volume size=134224175104 (32769574 clusters) (32769574 blocks)
1016 cluster groups (tail covers 29734 clusters, rest cover 32256 clusters)
Journal size=268435456
Initial number of node slots: 2
Creating bitmaps: done
Initializing superblock: done
Writing system files: done
Writing superblock: done
Writing backup superblock: 4 block(s)
Formatting Journals: done
Writing lost+found: done
mkfs.ocfs2 successful

Una vez que terminó el proceso de formateo vamos a conectar las unidades. Empezamos con reiniciar el servicio de OCFS2:

1
/etc/init.d/o2cb restart

Nota: puede ser que en ocasiones se te reinicien los nodos, esto es normal. Esto ocurre cuando uno de los dos nodos deja de responder por cierto tiempo, entonces, los otros nodos lo sacan del cluster. Para reingresar el cluster, hace un reinicio. Si esto ocurre con frecuencia, te sugiero editar el archivo de configuracion de o2cb ubicado en /etc/default/o2cb y cambiar la línea que dice O2CB_HEARTBEAT_THRESHOLD=7 por un número más grande, algo como 300, que son los segundos que va a esperar antes de reiniciar. No te olvides de reiniciar el servicio de o2cb después de este cambio.

Vamos ahora a montar las unidades. Yo cree una carpeta llamada /storage y ahí conecte la unidad drbd0 (recuerda hacer esto en los dos nodos, como todos los demás pasos, excepto los que te indico que solo en uno de ellos):

1
2
mkdir /storage
mount -t ocfs2 /dev/drbd0 /storage

Si hasta aquí no tienes ningun error, felicidades! ya tienes tu primer punto de montaje.

Lo que sigue es pan comido. Editamos el archivo /etc/exports para compartir la carpeta /storage con las máquinas virtuales:

1
2
/storage 10.0.1.0/26(rw,sync,no_root_squash)

Yo tengo la red interna de mis maquinas virtuales como 10.0.1.0/26, así que esa red comparto, solo los miembros de esta red van a poder acceder a este dispositivo.

Hasta aquí llegamos el día de hoy. Lo que sigue a continuación es crear las máquinas virtuales y montar estas unidades en cada una de ellas, pero esto lo veremos en el próximo artículo, ¡hasta pronto!

Referencias:

http://www.drbd.org/docs/about/



Compartir este artículo
Reddit! Del.icio.us! Mixx! Free and Open Source Software News Google! Live! Facebook! StumbleUpon! TwitThis Joomla Free PHP

Comentarios  

 
0 #3 medisoft 07-05-2011 03:30
I'm testing now GlusterFS. It seems to be good replacement for this technique. I still can't configure it to have the same performance, but I'm working with it. Also with Lustre and PVS.
Citar
 
 
0 #2 medisoft 25-03-2010 13:49
yes, you can :-)
Citar
 
 
0 #1 RG 25-03-2010 03:46
Hi, can we put lvm on top of drbd then mkfs ocfs2? thanks
Citar
 

Escribir un comentario


Código de seguridad
Refescar

Copyright © 2012 .:: Revista Viviendo Linux - México ::.. Todos los derechos reservados.