En esta nota vamos a compartir un disco entre 2 hosts a los cuales le vamos a instalar GFS2 para que puedan escribir de manera concurrente. Para realizar esta configuracion vamos a utilizar en una infraestructura virtual basada en KVM (ver nota anterior de KVM) para mas detalle o profundizar conceptos).
Vamos a dar por sentado que tenemos dos maquinas virtuales funcionando
# virsh list
Id Name State
----------------------------------------------------
1 vmCentOS1 running
2 vmCentOS2 running
Id Name State
----------------------------------------------------
1 vmCentOS1 running
2 vmCentOS2 running
Primero creamos el disco virtual a compartir
qemu-img create -f raw shared.raw 5G
Formatting 'shared.raw', fmt=raw size=5368709120
Formatting 'shared.raw', fmt=raw size=5368709120
Ahora ya creado vamos a presentarlos a ambas VMs
Entramos al virsh
# virsh
Presentamos los devices
virsh # attach-disk vmCentOS1 /VMs/shared.raw vdb --shareable
Disk attached successfully
virsh # attach-disk vmCentOS2 /VMs/shared.raw vdb --shareable
Disk attached successfully
Verificamos dentro de las VMs si se ve el disco nuevo
Disk attached successfully
virsh # attach-disk vmCentOS2 /VMs/shared.raw vdb --shareable
Disk attached successfully
Verificamos dentro de las VMs si se ve el disco nuevo
[root@vmCentos1 ~]# fdisk -l
...
...
Disk /dev/vdb: 5368 MB, 5368709120 bytes
16 heads, 63 sectors/track, 10402 cylinders
Units = cylinders of 1008 * 512 = 516096 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000
16 heads, 63 sectors/track, 10402 cylinders
Units = cylinders of 1008 * 512 = 516096 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000
[root@vmCentos2 ~]# fdisk -l
...
Disk /dev/vdb: 5368 MB, 5368709120 bytes
16 heads, 63 sectors/track, 10402 cylinders
Units = cylinders of 1008 * 512 = 516096 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000
16 heads, 63 sectors/track, 10402 cylinders
Units = cylinders of 1008 * 512 = 516096 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000
Para poder utilizar GFS2 necesitamos instalar los siguientes paquetes, en caso de necesitar mas debido a dependencias yum las seleccionara automaticamente
# yum install lvm2-cluster gfs2-utils
Una vez instalado tendremos que realizar la configuracion del cluster y en especial el fencing, ya que si no esta presente servicio de clvmd no levantara.
El fencing es un mecanismo que se utiliza para aislar a los nodos que no estan respondiendo dentro del cluster, en particular el GFS2/CLVMD cuando detectan una falla en un host, ejecutan el metodo de fencing y detienen las operaciones de entrada/salida hasta que termine la operacion de fencing.
Para hacer fencing vamos a usar fence-virtd, el cual lo instalamos en el host
# yum install fence-virt fence-virtd fence-virtd-libvirt fence-virtd-multicast
En las VMs solo es necesario el paquete fence-virt.
Luego de instalar debemos crear el directorio /etc/cluster y configurar el servicio de fencing
# mkdir /etc/cluster
# fence_virtd -c
Module search path [/usr/lib64/fence-virt]:
Available backends:
libvirt 0.1
Available listeners:
multicast 1.1
Listener modules are responsible for accepting requests
from fencing clients.
Listener module [multicast]:
The multicast listener module is designed for use environments
where the guests and hosts may communicate over a network using
multicast.
The multicast address is the address that a client will use to
send fencing requests to fence_virtd.
Multicast IP Address [225.0.0.12]:
Using ipv4 as family.
Multicast IP Port [1229]:
Setting a preferred interface causes fence_virtd to listen only
on that interface. Normally, it listens on the default network
interface. In environments where the virtual machines are
using the host machine as a gateway, this *must* be set
(typically to virbr0).
Set to 'none' for no interface.
Interface [none]: virbr0
The key file is the shared key information which is used to
authenticate fencing requests. The contents of this file must
be distributed to each physical host and virtual machine within
a cluster.
Key File [/etc/cluster/fence_xvm.key]:
Backend modules are responsible for routing requests to
the appropriate hypervisor or management layer.
Backend module [checkpoint]: libvirt
The libvirt backend module is designed for single desktops or
servers. Do not use in environments where virtual machines
may be migrated between hosts.
Libvirt URI [qemu:///system]:
Configuration complete.
=== Begin Configuration ===
backends {
libvirt {
uri = "qemu:///system";
}
}
listeners {
multicast {
interface = "virbr0";
port = "1229";
family = "ipv4";
address = "225.0.0.12";
key_file = "/etc/cluster/fence_xvm.key";
}
}
fence_virtd {
module_path = "/usr/lib64/fence-virt";
backend = "libvirt";
listener = "multicast";
}
=== End Configuration ===
Replace /etc/fence_virt.conf with the above [y/N]? y
Ahora creamos la key que usaremos
# dd if=/dev/urandom of=/etc/cluster/fence_xvm.key bs=4k count=1
1+0 records in
1+0 records out
4096 bytes (4.1 kB) copied, 0.00238924 s, 1.7 MB/s
Copiamos la key a ambos guests
# scp /etc/cluster/fence_xvm.key root@vmCentOS1:/etc/cluster/fence_xvm.key
# scp /etc/cluster/fence_xvm.key root@vmCentOS2:/etc/cluster/fence_xvm.key
Para validar que la configuracion funciona, corremos desde el host fisico la siguiente linea
vmCentOS1 fd58626b-da91-a03f-9610-63cb4a3e0b2e on
vmCentOS2 c986740c-887a-6df1-2b3f-ecbf2d238563 on
Desde la VM, probamos tambien si la configuracion tuvo exito
[root@vmCentos1 ~]# fence_xvm -o list
vmCentOS1 fd58626b-da91-a03f-9610-63cb4a3e0b2e on
vmCentOS2 c986740c-887a-6df1-2b3f-ecbf2d238563 on
Desde la otra VM tambien lo probamos
[root@vmCentos2 ~]# fence_xvm -o list
vmCentOS1 fd58626b-da91-a03f-9610-63cb4a3e0b2e on
vmCentOS2 c986740c-887a-6df1-2b3f-ecbf2d238563 on
Ya aqui estamos en condiciones de poder hacer otro tipo de prueba como el reboot o el apagado de un nodo por medio del fencing
[root@vmCentos1 ~]# fence_xvm -o reboot -H vmCentOS2
Si todo se configuro correctamente, en este momento se debio haber reiniciado el vmCentOS2.
Ahora generaremos un template basico para nuestro cluster
<cman two_node="1" expected_votes="1"/>
<clusternodes>
<clusternode name="vmCentOS1.domain" nodeid="1">
<fence>
</fence>
</clusternode>
<clusternode name="vmCentOS2.domain." nodeid="2">
<fence>
</fence>
</clusternode>
</clusternodes>
<fencedevices>
<fencedevice agent="fence_xvm" name="virtfence1" key_file="/etc/cluster/fence_xvm.key" multicast_address="225.0.0.12"/>
</fencedevices>
<rm>
</rm>
</cluster>
Con la configuracion creada podemos levantar y configurar el servicio de cluster
[root@vmCentos1 cluster]# chkconfig cman on
[root@vmCentos2 cluster]# service cman start
Starting cluster:
Checking if cluster has been disabled at boot... [ OK ]
Checking Network Manager... [ OK ]
Global setup... [ OK ]
Loading kernel modules... [ OK ]
Mounting configfs... [ OK ]
Starting cman... [ OK ]
Waiting for quorum... [ OK ]
Starting fenced... [ OK ]
Starting dlm_controld... [ OK ]
Tuning DLM kernel config... [ OK ]
Starting gfs_controld... [ OK ]
Unfencing self... [ OK ]
Joining fence domain... [ OK ]
Ahora copiamos el /etc/cluster/cluster.conf al otro nodo del cluster y levamtamos y configuramos el cman igual que en el vmCentOS1
En este momento podemos levantar el servicio de clvmd
[root@vmCentos1 ~]# service clvmd start
Starting clvmd: dlm: Using TCP for communications
Activating VG(s): 2 logical volume(s) in volume group "vg_vmcentos1" now active
clvmd not running on node vmCentOS2.domain.
[ OK ]
Corremos el mismo comando desde el nodo 2, en mi caso vmCentOS2 y ya finalmente estamos en condiciones de poder comartir el volumen.
Ahora pasamos a la configuracion de LVM, todos estos pasos son iguales a cuando trabajamos sin cluster, proximamante voy hacer una guia de LVM para Linux aunque es muy similar a lo que es HP-UX, de la cual si tengo una entrada en el blog
Primero creamos el physical volume
[root@vmCentos1 ~]# pvcreate /dev/vdb
Physical volume "/dev/vdb" successfully created
Segundo creamos el volume group
[root@vmCentos1 ~]# vgcreate vgshared /dev/vdb
Clustered volume group "vgshared" successfully created
Tercero creamos un logical volume
[root@vmCentos1 ~]# lvcreate -L 1024 -n lvol1 vgshared
Logical volume "lvol1" created
Como ultimo paso nos resta darle formato al volumen, formato que sera gfs2, las opciones del comando son,
-p tipo de lock, en este caso es un lock distribuido entre los nodos,
-t nombre de cluster seguido, el nombre del filesystem separado por :
-j la cantidad de journals a crear, que indica la cantidad de nodos que comparten el filesystem, en este caso configure 5 por un tema de escalabilidad.
[root@vmCentos1 ~]# mkfs.gfs2 -p lock_dlm -t cluster1:fsvgsharedlvol1 -j 5 /dev/vgshared/lvol1
This will destroy any data on /dev/vgshared/lvol1.
It appears to contain: symbolic link to `../dm-2'
Are you sure you want to proceed? [y/n] y
Device: /dev/vgshared/lvol1
Blocksize: 4096
Device Size 1.00 GB (262144 blocks)
Filesystem Size: 1.00 GB (262142 blocks)
Journals: 5
Resource Groups: 4
Locking Protocol: "lock_dlm"
Lock Table: "cluster1:fsvgsharedlvol1"
UUID: 09053a2a-5a43-3c7d-d46a-919586c612b2
Corremos un vgscan en el nodo2 para importar la configuracion
Agregamos las entradas correspondientes en ambos /etc/fstabs
#
## FSs compartidos gfs2
#
/dev/mapper/vgshared-lvol1 /sharedfs gfs2 defaults,acl 0 0
creamos el punto de montaje en ambos nodos
# mkdir /sharedfs
Montamos el filesystem, en este paso tendremos tambien que activar el servicio de gfs2 para que cuando reiniciemos las VMs estas monten automaticamente el FS que creamos, esta de mas decir que estas operaciones tambien se deben realizar en ambos nodos
# chkconfig gfs2 on
# mount /sharedfs
Verificamos que este montado
[root@vmCentos1 /]# df -k
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/mapper/vg_vmcentos1-lv_root
9845280 2411808 6933352 26% /
tmpfs 510208 28744 481464 6% /dev/shm
/dev/vda1 495844 55904 414340 12% /boot
/dev/mapper/vgshared-lvol1
1048400 661916 386484 64% /sharedfs
Corremos un mount -v para ver el tipo de filesystem
[root@vmCentos1 /]# mount -v
/dev/mapper/vg_vmcentos1-lv_root on / type ext4 (rw)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
tmpfs on /dev/shm type tmpfs (rw,rootcontext="system_u:object_r:tmpfs_t:s0")
/dev/vda1 on /boot type ext4 (rw)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw)
none on /sys/kernel/config type configfs (rw)
/dev/mapper/vgshared-lvol1 on /sharedfs type gfs2 (rw,seclabel,relatime,hostdata=jid=1,acl)
Como prueba final vamos a escribir en nuestro FS desde los dos nodos, primero vamos a ver el contenido del /sharedfs
[root@vmCentos1 sharedfs]# ls -la
total 8
drwxr-xr-x. 2 root root 3864 May 3 12:13 .
dr-xr-xr-x. 27 root root 4096 May 3 11:51 ..
y
[root@vmCentos2 sharedfs]# ls -al
total 8
drwxr-xr-x. 2 root root 3864 May 3 12:13 .
dr-xr-xr-x. 27 root root 4096 May 3 11:50 ..
[root@vmCentos2 sharedfs]#
Ahora vamos a escribir unos archivos
Primero desde el vmCentos1
[root@vmCentos1 sharedfs]# echo hola > hola
Luego en el vmCentos2
[root@vmCentos2 sharedfs]# echo mundo > mundo
Verificamos desde ambos nodos
Desde el vmCentos1
[root@vmCentos1 sharedfs]# ls
hola mundo
y luego desde el vmCentos2
[root@vmCentos2 sharedfs]# ls
hola mundo
No hay comentarios:
Publicar un comentario