Sistema distribuit d'arxius entre diferents localitzacions

DRBD + GFS2 + LVM mitjançant Debian Lenny

El plantejament d'aquest document correspon a la necessitat d'accés a un mateix recurs de xarxa, per exemple amb Samba, des de localitzacions geogràfiques diferents.
Posem per cas una empresa que té dues seus, comunicades entre elles per algun sistema amb una velocitat limitada.

El servidor està a la seu central, mentre que els accessos des de la seu remota son molt més lents que en el cas dels usuaris de la seu central.

Una manera de solucionar això seria replicar les dades en un servidor a la seu allunyada, però comporta problemes d'integritat de dades, ja que no es pot controlar els canvis ni la simulteneitat d'accessos a fitxers.

La solució és DRBD (Distributed Replicated Block Device) combinada amb GFS2. DRBD és un sistema que permet replicar dispositius de bloc, que pot ser una partició física de disc o un volum lògic, per exemple.



DRBD és el sistema utiltzat per a clusters d'alta disponibilitat. El sistema per defecte funcionaria amb un parell de nodes, un primari i un altre com a secundari, per si el primer falla.

En el cas de l'escenari plantejat això no serveix, perquè els dos nodes han d'estar actius i accessibles alhora. Aquí entra la possibilitat de funcionament de primari-primari en tots dos nodes. Per si mateix aquest funcionament no seria suficient ja que DRBD no gestiona accessos simultanis en nodes diferents. Per això cal combinar-ho amb un sistema d'arxius com GFS2 (Global File System) o OCFS (Oracle Cluster File System). En aquest s'opta per GFS2, patrocinat per RedHat.

Això vol dir, en definitiva, que DRBD ens proporciona un sistema de RAID-1 [en]per xarxa.

Suposarem que disposem de dues màquines (poden ser virtuals) amb Debian Lenny, l'actual versió estable, per a fer la instal·lació. A partir d'ara parlarem dels hosts debian1 (192.168.122.98) i debian2 (192.168.122.11).

Primer de tot, instal·lar el programari necessari per a DRBD:

# aptitude install drbd8-utils drbd8-modules-2.6.26-2-686

I tot seguit s'ha d'editar l'arxiu de configuració als dos nodes /etc/drbd.conf. Es pot llegir detingudament la informació sobre la configuració que hi ha al propi arxiu. Cal parar atenció a l'opció become-primary-on both; que ens permet configurar el sistema en mode primari-primari.

global {
    usage-count yes;
}
common {
  syncer { rate 10M; }
}

resource r0 {
  protocol C;
  handlers {
    pri-on-incon-degr "echo o > /proc/sysrq-trigger ; halt -f";
    pri-lost-after-sb "echo o > /proc/sysrq-trigger ; halt -f";
    local-io-error "echo o > /proc/sysrq-trigger ; halt -f";
  }
  startup {
     become-primary-on both;
  }
  disk {
    on-io-error   detach;
  }
  net {
     allow-two-primaries;
    cram-hmac-alg "sha1";
    shared-secret "123456";
    after-sb-0pri discard-least-changes;
    after-sb-1pri violently-as0p;
    after-sb-2pri violently-as0p;
    rr-conflict violently;
  }
  syncer {
    rate 10M;
    al-extents 257;
  }
  on debian1 {
    device     /dev/drbd0;
    disk       /dev/vda2;
    address    192.168.122.98:7788;
    meta-disk  internal;
  }
  on debian2 {
    device    /dev/drbd0;
    disk      /dev/vda2;
    address   192.168.122.11:7788;
    meta-disk internal;
  }
}

En aquest cas /dev/vda2 és una partició amb LVM, que és de mida igual als dos nodes. Amb l'arxiu de configuració es genera un nou dispositiu de bloc que serà /dev/drbd0.

Als dos nodes cal realitzar les següents operacions:

# drbdadm create-md r0
# modprobe drbd
# drbdadm attach r0

Per a verificar l'estat de DRBD es pot executar la següent instrucció.

# cat /proc/drbd

Des de debian1 es pot connectar a l'altre node i tot seguit fer la primera sincronització que eliminarà les possibles dades.

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

En el segon node (debian2) ja es pot activar el recurs r0 com a primari:

# drbdadm primary r0

El següent pas consisteix a establir el sistema de fitxers al recurs distribuit que acabem de crear. Instal·lem programari necessari i configuem el cluster.

# aptitude install cman gfs2-tools clvm
# vi /etc/cluster/cluster.conf

<?xml version="1.0"?>
<cluster name="cluster01" config_version="1">
  <cman two_node="1" expected_votes="1">
  </cman>
  <clusternodes>
    <clusternode name="debian1" votes="1" nodeid="1">
      <fence>
        <method name="single">
          <device name="human" ipaddr="192.168.122.98"/>
        </method>
      </fence>
    </clusternode>
    <clusternode name="debian2" votes="1" nodeid="2">
      <fence>
        <method name="single">
          <device name="human" ipaddr="192.168.122.11"/>
        </method>
      </fence>
    </clusternode>
  </clusternodes>
  <fence_devices>
    <fence_device name="human" agent="fence_manual"/>
  </fence_devices>
</cluster>

Per ajudar-nos utilitzem LVM i el sistema de cluster per a volums lògics CLVM.
Editem /etc/lvm/lvm.conf i cal canviar locking_type = 1 per locking_type = 3. També cal canviar els filtres perquè no apareguin duplicats:
        #filter = [ "a/.*/" ]
        filter = [ "a|drbd.*|", "r|vda.*|" ]
# /etc/init.d/clvm restart

Tot seguit es crea el sistema de volums lògic, creant el model físic a partir de /dev/drbd0:
# pvcreate /dev/drbd0
# vgcreate ClusterVol01 /dev/drbd0
# lvcreate -L1G --name storage01 ClusterVol01

Es crea el sistema d'arxius GFS: gfs2_mkfs -p lock_dlm -t cluster01:storage01 -j 2 /dev/ClusterVol01/storage01
Ja es pot muntar el sistema d'arxius als 2 nodes, per exemple a /cluster/storage01
mount /dev/ClusterVol01/storage01 /cluster/storage01

És important arrencar els dos sistemes alhora. A partir d'aquest moment encara que algun dels dos caigui l'altre node continu funcionant sense problemes.

S'aconsella que els nodes, abans d'aturar-se, executin seqüencialment les següents instruccions:

# umount /cluster/storage01
# vgchange -aln
# /etc/init.d/clvm stop
# fence_tool leave
# cman_tool leave
# killall -9 ccsd

Fins aquí la la solució, tot i que evidentment hi ha millores a fer i altres configuracions a tenir en compte. Per exemple, crear el recurs DRBD a partir d'un volum lògic, per exemple. O afegir la configuració de Samba als dos nodes per accés concurrent en seus diferents.