Howto DRBD

De Tutoriales de Informatica
Saltar a: navegación, buscar

Introducción

DRBD se puede entender como RAID-1 basada en red.

Requerimientos de sistema

Se necesitan 2 servidores identicos con el siguiente hardware:

  • tarjeta de red libre (conectado con un cable de conexión directa)
  • Discos disponibles (por ejemplo / dev / sdb)
  • Utilice un controlador RAID de hardware con BBU para eliminar problemas de rendimiento sobre los metadatos internos.

Red

Configurar eth1 en ambos nodos con una dirección IP fija privada.

Ejemplo de / etc / network / interfaces

cat /etc/network/interfaces
# network interface settings
auto lo
iface lo inet loopback

iface eth0 inet manual

auto eth1
iface eth1 inet static
        address  10.0.7.105
        netmask  255.255.240.0

auto vmbr0
iface vmbr0 inet static
        address  192.168.7.105
        netmask  255.255.240.0
        gateway  192.168.2.1
        bridge_ports eth0
        bridge_stp off
        bridge_fd 0

segundo nodo.

# network interface settings
auto lo
iface lo inet loopback

iface eth0 inet manual

auto eth1
iface eth1 inet static
        address  10.0.7.106
        netmask  255.255.240.0

auto vmbr0
iface vmbr0 inet static
        address  192.168.7.106
        netmask  255.255.240.0
        gateway  192.168.2.1
        bridge_ports eth0
        bridge_stp off
        bridge_fd 0

Disco para DRBD

Tengo que crear una partición "lvm linux" en ambos servidores del mismo tamaño.

Ejemplo de como crearla.

proxmox-105:~# fdisk /dev/sdb
                                                                                                                                                             
The number of cylinders for this disk is set to 19457.                                                                                                          
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): n                                                                                                                                         
Command action                                                                                                                                                  
   e   extended                                                                                                                                                 
   p   primary partition (1-4)                                                                                                                                  
p                                                                                                                                                               
Partition number (1-4): 1                                                                                                                                       
First cylinder (1-19457, default 1):                                                                                                                            
Using default value 1                                                                                                                                           
Last cylinder or +size or +sizeM or +sizeK (1-19457, default 19457):                                                                                            
Using default value 19457                                                                                                                                       
                                                                                                                                                                
Command (m for help): t                                                                                                                                         
Selected partition 1                                                                                                                                            
Hex code (type L to list codes): 8e                                                                                                                             
Changed system type of partition 1 to 8e (Linux LVM)                                                                                                            
                                                                                                                                                                
Command (m for help): p                                                                                                                                         
                                                                                                                                                                
Disk /dev/sdb: 160.0 GB, 160041885696 bytes                                                                                                                     
255 heads, 63 sectors/track, 19457 cylinders                                                                                                                    
Units = cylinders of 16065 * 512 = 8225280 bytes                                                                                                                
Disk identifier: 0x49e2fd2f                                                                                                                                     
                                                                                                                                                                
   Device Boot      Start         End      Blocks   Id  System                                                                                                  
/dev/sdb1               1       19457   156288321   8e  Linux LVM                                                                                               
                                                                                                                                                                
Command (m for help): w                                                                                                                                         
The partition table has been altered!                                                                                                                           
                                                                                                                                                                
Calling ioctl() to re-read partition table.                                                                                                                     
                                                                                          
Syncing disks.
proxmox-105:~#

LVM

Las particiones que formaran el LVM tienen que tener el flag 8e (Linux VM). Con el comando pvcreate marcamos los volúmenes para meterlos en el LVM:

pvcreate /dev/sdb1
pvcreate /dev/sdd1

Y después creamos el VG (Grupo de Volúmenes) al que hemos llamado lvm

vgcreate lvmdisk /dev/sdb1 /dev/sdd1

Ahora añadimos los volúmenes lógicos (LV) dentro del LVM... es como si hiciéramos particiones del Grupo de volúmenes. En este caso solo creare una partición a la que asignare todo el espacio.

Si queremos crear mas particiones para saber de cuanto espacio disponemos podemos ejecutar el comando vg display que nos devuelve información acerca del lvm

 proxmox-105:~# vgdisplay lvmdisk

 --- Volume group ---
  VG Name               lvmdisk
  System ID             
  Format                lvm2
  Metadata Areas        2
  Metadata Sequence No  1
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                0
  Open LV               0
  Max PV                0
  Cur PV                2
  Act PV                2
  VG Size               1.59 TB
  PE Size               4.00 MB
  Total PE              417316
  Alloc PE / Size       0 / 0   
  Free  PE / Size       417316 / 1.59 TB
  VG UUID               u9DOD0-nIC0-e9XR-ZR2a-Pboe-wLGg-PClygM

Antes de crear el LV debemos cargar el modulo Device mapper driver:

modprobe dm-mod 

En el caso de que no lo podamos cargar, hay que instalar los siguiente paquetes

apt-get install libdevmapper-dev libdevmapper1.02.1

Si la version de kernel es superior a la 2.6.18, hay que cargarlo de la siguiente forma:

editar /etc/initramfs-tools/modules y agregar lo siguiente

dm-mod

reiniciar y con esto el modulo ya queda cargado.

Ahora creamos el LV:

lvcreate -n disk -l 100%VG  lvmdisk

-n disk sera el nombre del LV

-l Puedes especificar el tamaño en porcentaje del VG, en este caso dejamos para el LV el 100% del VG, ya que quiero que todo aparezca como un unico disco.

-L Esta opción nos permitiría especificar el tamaño en Kb, Mb, Gb del LV, por ejemplo -L250G (crea un LV de 250GB)

Confuguración LVM

Es necesario cambiar la sección de filtrado en la configuración lvm de ambos nodos:

 nano /etc/lvm/lvm.conf

# By default we accept every block device:
filter = [ "r|/dev/lvmdisk/disk|", "r|/dev/disk/|", "r|/dev/block/|", "a/.*/" ]

Cambiar /dev/lvmdisk/disk por el disco que utilizamos.

Configuración DRBD

Instalación de software

Instalar las herramientas de usuario DRBD en ambos nodos (tengo DRBD 8.3.2 en el kernel y también drbd8 utils-8.3.2):

apt-get install drbd8-utils

Preparar el archivo drbd.conf

ejemplo del archivo drbd.conf, este archivo no precisamente tiene que ser identico en ambos nodos

proxmox-105:~# cat /etc/drbd.conf
global { usage-count no; }
common { syncer { rate 30M; } }
resource r0 {
        protocol C;
        startup {
                wfc-timeout  15;     # wfc-timeout can be dangerous (http://forum.proxmox.co$
                degr-wfc-timeout 60;
                become-primary-on both;
        }
        net {
                cram-hmac-alg sha1;
                shared-secret "my-secret";
                allow-two-primaries;
                after-sb-0pri discard-zero-changes;
                after-sb-1pri discard-secondary;
                after-sb-2pri disconnect;
        }
        on server02 {
                device /dev/drbd0;
                disk /dev/lvmdisk/disk;
                address 192.168.22.60:7788;
                meta-disk internal;
        }
#Disco del sevidor master
        on server01 {
                device /dev/drbd0;
                disk /dev/lvmdisk/disk;
                address 192.168.22.106:7788;
                meta-disk internal;
        }
}

Iniciar DRBD

Iniciar DRBD en los dos nodos:

/etc/init.d/drbd start

Ahora creo los metadatos en ambos nodos:

drbdadm create-md r0

Levanto el dispositivo en los dos nodos

drbdadm up r0

Cheque el estado del DRBD en ambos nodos, deberia tener algo parecido a lo siguiente:

proxmox-105:~# cat /proc/drbd
version: 8.3.2 (api:88/proto:86-90)
GIT-hash: dd7985327f146f33b86d4bff5ca8c94234ce840e build by root@oahu, 2009-09-10 15:18:39
 0: cs:Connected ro:Secondary/Secondary ds:Inconsistent/Inconsistent C r----
    ns:0 nr:0 dw:0 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:2096348

El DRBD esta listo para funcionar, ya asigno los recurso. ahora hay que sincronizarlo. Con el siguiente comando inicio la sincronización. Esto hay que hacerlo en un nodo solamente.

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

Hay que esperar que la sincronización incial termine, se puede ir chuequeando el estado con el siguiente comando:

proxmox-120:~# watch cat /proc/drbd

Para finalizar hay que comprobar si el DRBD se inicia en modo primario, para esto simplemente hay que para e iniciar DRBD en ambos nodos.

/etc/init.d/drbd stop
/etc/init.d/drbd start

El DRBD deberia estar en modo primario

proxmox-105:~# cat /proc/drbd
version: 8.3.2 (api:88/proto:86-90)
GIT-hash: dd7985327f146f33b86d4bff5ca8c94234ce840e build by root@oahu, 2009-09-10 15:18:39
 0: cs:Connected ro:Primary/Primary ds:UpToDate/UpToDate C r----
    ns:0 nr:0 dw:0 dr:268 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:0

Crear un volumen fisico para LVM

En uno de los nodos crear el volumen fisico:

proxmox-105:~# pvcreate /dev/drbd0
  Physical volume "/dev/drbd0" successfully created
proxmox-105:~#

Comando para chequear volumen fisico:

proxmox-105:~# pvscan
  PV /dev/sda2    VG pve             lvm2 [465.26 GB / 4.00 GB free]
  PV /dev/drbd0                      lvm2 [149.04 GB]
  Total: 2 [613.30 GB] / in use: 1 [613.30 GB] / in no VG: 1 [4.00 GB]
proxmox-105:~#

Crear un grupo de volumen

En un solo nodo crear el volumen

proxmox-105:~# vgcreate virtual /dev/drbd0
  Volume group "virtual" successfully created
proxmox-105:~#

Chequear el volumen nuevamente:

proxmox-105:~# pvscan
  PV /dev/sda2    VG pve             lvm2 [465.26 GB / 4.00 GB free]
  PV /dev/drbd0   VG virtual          lvm2 [149.04 GB / 149.04 GB free]
...
proxmox-105:~#

Re-sincronización de nodos

Cuando se corta la conexion entre los nodos del cluster por X motivo, cada uno de los nodos cree que el otro cayó y por lo tanto levanta los servicios que tiene asignado. Cuando el enlace vuelve a levantarse los nodos no saben qué hacer porque son todos nodos primarios. Esto se llama split brain o cerebros divididos.

Este tipo de error requiere de nuestra intervención ya que tenemos que decidir en qué nodos vamos a descartar los cambios que se produjeron durante el split brain.

En el nodo primario más joven, donde queremos eliminar los cambios, hacemos:

server2~# drbdadm secondary r0 (o "all" para aplicarlo a todos los recursos drbd)
server2~# drbdadm disconnect r0 (o "all" para aplicarlo a todos los recursos drbd) 
server2~# drbdadm -- --discard-my-data connect r0 (o "all" para aplicarlo a todos los recursos drbd)

Luego, en el nodo primario con los datos correctos, hacemos:

server1~# drbdadm connect r0 (o "all" para aplicarlo a todos los recursos drbd)

Resincronizacion de nodos - v2

  1. Link sobre posible perdida de sincronismo al ejecutar snapshots: http://forum.proxmox.com/archive/index.php/t-6449.html

- Realizar el reinicio de ambos servidores Proxmox, la configuración establecida en /etc/drbd.conf hace que al levantar detecte cual de los 2 discos debe prevalecer y cual debe ser la "víctima", y los sincroniza en función de esto.

- Para ver el estado del DRBD ejecutamos:

	cat /proc/drbd

- Si los discos no están sincronizados normalmente quedan en WFConnection. Para forzar la reconección ejecutamos en ambos:

	drbdadm connect r0

- Nuevamente para ver el estado del DRBD ejecutamos:

	cat /proc/drbd


- En caso de que ambos discos hayan tenido cambios no se resincronizará, y quedarán ambos como "Standalone". En este caso el administrador debe meter mano con el criterio de cuál disco debe pisar al otro, para ello los pason serían los siguientes:

- En el nodo que deseamos que pierda los cambios ejecutar:

	drbdadm disconnect r0 (lo saca de estado WFConnect y pasa a StandAlone)
	drbdadm secondary r0 (lo cambia a modo secundario)
	drbdadm -- --discard-my-data connect r0

(donde r0 es el nombre del recurso)

- En el nodo Master que deseamos que mantenga los cambios ejecutar:

	drbdadm connect r0

- Luego observamos como se realiza la re-sincronización, haciendo:

	watch cat /proc/drbd

		 version: 8.3.4 (api:88/proto:86-91)
		 GIT-hash: 70a645ae080411c87b4482a135847d69dc90a6a2 build by root@oahu, 2010-02-01 10:48:22
		 0: cs:SyncSource ro:Primary/Secondary ds:UpToDate/Inconsistent C r----
                 ns:175552 nr:0 dw:5053148 dr:1853444 al:1421 bm:1402 lo:1 pe:14 ua:244 ap:0 ep:1 wo:b oos:1786124
		 [>...................] sync'ed:  9.0% (1786124/1961260)K
		 finish: 0:02:23 speed: 12,404 (11,672) K/sec

- Volvemos a configurar como Primary el nodo que habíamos pasado a Secondary:

	drbdadm primary r0