viernes, 3 de mayo de 2013

Usando Global File System y KVM - GFS2 + KVM

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

Primero creamos el disco virtual a compartir

qemu-img create -f raw shared.raw 5G
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

[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


[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

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

# fence_xvm -o list
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

<cluster name="cluster1" config_version="2">
   <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