HOWTO gnbd Le principe est de mettre à disposition des périphériques de stockage dans notre exemple des disques dur ide et scsi, via le réseau (gnbd) et de pouvoir les utiliser sur des machines distantes, comme s'il s'agissait d'un device local. Bien entendu une fois le device présent en local, on peut le partitionner/formater, ou crée un volume de grande capacité via lvm2. notre architecture: 6 nodes node21 à node26 qui exportent des gnbd 1 node supplémentaire 1 serveur guibpiv.guibland.com la configuration materielle au niveau des disques dur: 3 nodes avec des disques scsi 10go 1 portable avec un disque ide de 80go 2 stations avec des disques de 80go ide bien entendu pour gérer autant de node ils faut des outils de remote admin cluster et un bon gestionnaire d'installation de package parrallel. Sans ces outils il va devenir très compliqué de gérer notre parc de machine. On peut faire des scripts, mais ce n'est pas une méthode "propre". Personnellement j'utilise la Mandriva LE 2005 avec: gexec : outil de commande parrallèle sur un cluster authd : serveur d'authentification pour pcpc et gexec pcp : copie parralle de fichier sur plusieurs machines ka-run : outils de commande et copie de fichiers parrallèle via rsh ou ssh urpmi-parallel-ka-run : urpmi utilisant le ka tools pour installer des rpm en mode parrallel Vous n'etes pas obligé d'utiliser tous ces outils, je vais rapidement vous expliquer comment installer et configurer gexec et pcp avec le serveur d'authentification authd. tout d'abord il faut les télécharger, les compiler puis les installer sur le servuer et sur tous les nodes. http://www.cs.berkeley.edu/~bnc/gexec/ http://www.cs.berkeley.edu/~bnc/authd/ http://www.cs.berkeley.edu/~bnc/pcp/ ensuite on crée un clé publique authd sur le serveur: openssl genrsa -rand 15000 -out /etc/auth_priv.pem on la rends lisible que par le root: chmod 600 /etc/auth_priv.pem chown root.root /etc/auth_priv.pem on génére la clé pub associé: openssl rsa -in /etc/auth_priv.pem -pubout -out /etc/auth_pub.pem on copie enfin cette clé publique dans /etc/auth_pub.pem de tous les nodes. Il suffit ensuite de démarrer authd sur le serveur et tous les nodes: /usr/sbin/authd -d sur le serveur on va désormais configurer une variable d'environnement GEXEC_SVRS qui listera tous les nodes que l'on désire administrer: export GEXEC_SVRS=node20.guibland.com node21.guibland.com node22.guibland.com node23.guibland.com node24.guibland.com node25.guibland.com node26.guibland.com nous allons maintenant tester gexec en lançant une commande du serveur: gexec -n 0 uname -p 1 Intel(R) Pentium(R) M processor 1.70GHz 0 AMD Athlon(tm) XP 2400+ 5 AMD Athlon(tm) XP 1600+ 4 Pentium III (Coppermine) 2 Pentium III (Coppermine) 3 Pentium III (Coppermine) 6 AMD Duron(tm) processor notre outil de commande parrallèle fonctionne. Testons maintenant la copie de fichier sur tous les nodes. la syntaxe pcp est la suivante: pcp fichier_à_copier fichier_sur_les_nodes [node0] [node1] [node2] .. si vous utilisez une distribution qui fournit authd et gexec, assurez vous que la clé publique sur les nodes et bien celle du serveur, et non leur propre clé générée au premier démarrage du service authd. outils nécessaires à réaliser ce HOWTO: http://sources.redhat.com/dm/ http://sources.redhat.com/lvm2/ http://sources.redhat.com/cluster/ cvs -d :pserver:cvs@sources.redhat.com:/cvs/dm co device-mapper cvs -d :pserver:cvs@sources.redhat.com:/cvs/lvm2 co LVM2 cvs -d :pserver:cvs@sources.redhat.com:/cvs/cluster co cluster device-mapper: ftp://sources.redhat.com/pub/dm/ lvm2: ftp://sources.redhat.com/pub/lvm2/ lvm2 compiler avec --with-clvmd --with-cluster=shared ccs cman dlm gfs gulm iddev magma gnbd fence: http://sources.redhat.com/cluster/ ccs: Cluster Configuration System cman: Cluster Manager, outil de management du cluster gfs: Global File System, système de fichier partagé dlm: Distributed Lock Manager, un lock manager pour GFS gulm: un autre lock manager pour GFS iddev: Identify device, identifie le contenu d'un device magma: cluster/lock manager API abstraction library, API de management cluster gnbd: GFS Network Block Device, GFS exporter en réseau fence: cluster I/O fencing system, système gérant les accès -------------- serveur ------------- fichier de conf serveur pour faire touner ccsd, il faut un /etc/cluster/cluster.conf avant tout il faut un nom pour le cluster, et une méthode d'accès au nodes. Dans notre exemple nous utiliserons l'accès manual via l'adresse IP. ............. Il nous faut charger les modules permettant de gérer cman, dlm, gnbd et gfs: modprobe cman dlm gnbd gfs lock_dlm service ccsd start [root@guibpiv ~]# cman_tool status Protocol version: 5.0.1 Config version: 0 Cluster name: Cluster ID: 0 Cluster Member: No Membership state: Not-in-Cluster on obtient le meme résultat avec la commande: [root@guibpiv ~]# cat /proc/cluster/status Protocol version: 5.0.1 Config version: 0 Cluster name: Cluster ID: 0 Cluster Member: No Membership state: Not-in-Cluster maintenant on fait rejoindre le serveur au cluster mandriva: [root@guibpiv ~]# cman_tool join on peut regarder si le serveur a rejoins le cluster [root@guibpiv ~]# cman_tool status Protocol version: 5.0.1 Config version: 1 Cluster name: mandriva Cluster ID: 26945 Cluster Member: No Membership state: New-Cluster? on constate qu'il est en train de rejoindre le cluster. au bout de quelques secondes: [root@guibpiv ~]# cman_tool status Protocol version: 5.0.1 Config version: 1 Cluster name: mandriva Cluster ID: 26945 Cluster Member: Yes Membership state: Cluster-Member Nodes: 1 Expected_votes: 8 Total_votes: 1 Quorum: 5 Activity blocked Active subsystems: 0 Node name: guibpiv.guibland.com Node addresses: 10.0.1.253 notre serveur est devnu "Cluster-Member", donc il a bien résussi à rejoindre le cluster "mandriva" on peut visualiser les nodes présents dans le cluster mandriva: [root@guibpiv ~]# cman_tool nodes Node Votes Exp Sts Name 1 1 8 M guibpiv.guibland.com ------------- nodes ------------- il faut aussi charger les modules sur les nodes: [root@guibpiv ~]# gexec -n 0 "modprobe cman" [root@guibpiv ~]# gexec -n 0 "modprobe dlm" [root@guibpiv ~]# gexec -n 0 "modprobe gnbd" [root@guibpiv ~]# gexec -n 0 "modprobe gfs" on peut vérifier par exemple vérifier que gnbd est bien chargé: [root@guibpiv ~]# gexec -n 0 "lsmod " | grep "gnbd" 1 gnbd 39424 0 0 gnbd 39424 0 5 gnbd 39424 0 3 gnbd 39424 0 4 gnbd 39424 0 2 gnbd 39424 0 6 gnbd 39424 0 Maintenant nos nodes sont près à rejoindre le cluster mandriva. Pour se connecter au serveur nommé: mandriva la simple commande [root@guibpiv ~]# gexec -n 0 "killall ccsd" [root@guibpiv ~]# gexec -n 0 "ccsd mandriva" rejoindre le cluster mandriva: [root@guibpiv ~]# gexec -n 0 "cman_tool join" regarder le status de la connexion: [root@guibpiv ~]# cman_tool nodes Node Votes Exp Sts Name 1 1 8 M guibpiv.guibland.com 2 1 8 M node21.guibland.com 3 1 8 M node20.guibland.com 4 1 8 M node23.guibland.com 5 1 8 M node26.guibland.com 6 1 8 J node24.guibland.com le "J" explique que le node24.guibland.com est en train de rejoindre le cluster mandriva. Au bout de quelques secondes tous les nodes ont rejoin le cluster: [root@guibpiv ~]# cman_tool nodes Node Votes Exp Sts Name 1 1 8 M guibpiv.guibland.com 2 1 8 M node21.guibland.com 3 1 8 M node20.guibland.com 4 1 8 M node23.guibland.com 5 1 8 M node26.guibland.com 6 1 8 M node24.guibland.com 7 1 8 M node25.guibland.com 8 1 8 M node22.guibland.com On va démarrer le démon cluster clvmd sur le serveur et tous les nodes: [root@guibpiv ~]# clvmd [root@guibpiv ~]# ls -la /dev/dlm* crw-rw---- 1 root root 10, 60 Apr 14 16:49 /dev/dlm_clvmd crw-rw---- 1 root root 10, 61 Apr 14 16:48 /dev/dlm-control [root@guibpiv ~]# gexec -n 0 "clvmd" si un node n'a pas le module dlm chargé ils retournera cette erreur dans /var/log/messages: clvmd: Unable to create lockspace for CLVM: No such file or directory Désormais le service clvmd est disponible sur le cluster mandriva: [root@guibpiv ~]# cman_tool services Service Name GID LID State Code DLM Lock Space: "clvmd" 2 1 run - [1 2 3 4 5 6 7 8] activer les volumes lvm locallement: [root@guibpiv ~]# gexec -n O "vgchange -aly" -aly : mettre à disposition les volumes logiques ensuite sur les tous les nodes qui ont des gnbd à exporter: démarrer le serveur gnbd: [root@guibpiv ~]# gexec -n O "gnbd_srv -v" -v : verbose exporter le disque /dev/hda3: gnbd_export -c -v -e node25export -d /dev/hda3 -c : utiliser la page cache linux -v : verbose -e : nom du device exporté -d : device à exporter [root@node25 ~]# gnbd_import -e n25 node25export vérifier que le disque est bien exporté: [root@node25 ~]# gnbd_export Server[1] : node25export -------------------------- file : /dev/hda3 sectors : 15626016 readonly : no cached : no timeout : 60 regarder les services offerts par le cluster: [root@guibpiv ~]# cat /proc/cluster/services Service Name GID LID State Code Fence Domain: "default" 3 2 run - [1 3 4 5 6 7 8] DLM Lock Space: "data" 6 5 run - [1] GFS Mount Group: "data" 7 6 run - [1] ----------------------------------------------- node ou serveur (dans notre cas sur le serveur) ----------------------------------------------- Pour monter un gnbd exporter du node25 sur un autre node gnbd_import -v -i node25.guibland.com regarder les devices ainsi crée: [root@guibpiv dev]# ls gnbd/* gnbd/node21export gnbd/node22export gnbd/node23export gnbd/node24export gnbd/node25export gnbd/node26export lister les import gnbd: [root@guibpiv dev]# gnbd_import Device name : node21export ---------------------- Minor # : 0 Proc name : /dev/gnbd0 Server : node21.guibland.com Port : 14567 State : Open Connected Pending Readonly : No Sectors : 10232145 Device name : node22export ---------------------- Minor # : 1 Proc name : /dev/gnbd1 Server : node22.guibland.com Port : 14567 State : Open Connected Clear Readonly : No Sectors : 13960422 Device name : node23export ---------------------- Minor # : 2 Proc name : /dev/gnbd2 Server : node23.guibland.com Port : 14567 State : Open Connected Clear Readonly : No Sectors : 13317822 Device name : node24export ---------------------- Minor # : 3 Proc name : /dev/gnbd3 Server : node24.guibland.com Port : 14567 State : Open Connected Clear Readonly : No Sectors : 13317822 Device name : node25export ---------------------- Minor # : 4 Proc name : /dev/gnbd4 Server : node25.guibland.com Port : 14567 State : Open Connected Clear Readonly : No Sectors : 15626016 Device name : node26export ---------------------- Minor # : 5 Proc name : /dev/gnbd5 Server : node26.guibland.com Port : 14567 State : Open Connected Clear Readonly : No Sectors : 15626016 créer un lvm sur les devices comme s'il s'agissait de disques locaux: [root@guibpiv ~]# pvcreate /dev/gnbd/* -ff Physical volume "/dev/gnbd/node21export" successfully created Physical volume "/dev/gnbd/node22export" successfully created Physical volume "/dev/gnbd/node23export" successfully created Physical volume "/dev/gnbd/node24export" successfully created Physical volume "/dev/gnbd/node25export" successfully created Physical volume "/dev/gnbd/node26export" successfully created [root@guibpiv dev]# pvdisplay --- Physical volume --- PV Name /dev/gnbd0 VG Name cluster_vg PV Size 4,88 GB / not usable 0 Allocatable yes (but full) PE Size (KByte) 4096 Total PE 1248 Free PE 0 Allocated PE 1248 PV UUID IyFHZM-5nAO-oPKN-apte-2TDt-lG1U-d20mEy --- Physical volume --- PV Name /dev/gnbd1 VG Name cluster_vg PV Size 6,66 GB / not usable 0 Allocatable yes (but full) PE Size (KByte) 4096 Total PE 1704 Free PE 0 Allocated PE 1704 PV UUID Rt6Lpu-Mnw4-Pk4S-so3b-Zz0d-ugaN-mH8AX9 --- Physical volume --- PV Name /dev/gnbd2 VG Name cluster_vg PV Size 6,35 GB / not usable 0 Allocatable yes (but full) PE Size (KByte) 4096 Total PE 1625 Free PE 0 Allocated PE 1625 PV UUID ZMuv08-JCO7-pcIg-Qbqz-jOgJ-pr4L-j5nrrl --- Physical volume --- PV Name /dev/gnbd3 VG Name cluster_vg PV Size 6,35 GB / not usable 0 Allocatable yes (but full) PE Size (KByte) 4096 Total PE 1625 Free PE 0 Allocated PE 1625 PV UUID voE8hV-nEMS-hIsn-AEKW-QaWT-yFZa-vCTz2B --- Physical volume --- PV Name /dev/gnbd4 VG Name cluster_vg PV Size 7,45 GB / not usable 0 Allocatable yes (but full) PE Size (KByte) 4096 Total PE 1907 Free PE 0 Allocated PE 1907 PV UUID SJhmhK-1Fti-2IYJ-KwOG-gvHR-t3VL-9FaU2J --- Physical volume --- PV Name /dev/gnbd5 VG Name cluster_vg PV Size 7,45 GB / not usable 0 Allocatable yes PE Size (KByte) 4096 Total PE 1907 Free PE 32 Allocated PE 1875 PV UUID dCvUsK-GNtU-bgcr-h0tF-sAIW-f3uU-SSgskk créer le volume: vgcreate cluster_vg /dev/gnbd/* [root@guibpiv dev]# vgdisplay --- Volume group --- VG Name cluster_vg System ID Format lvm2 Metadata Areas 6 Metadata Sequence No 2 VG Access read/write VG Status resizable MAX LV 0 Cur LV 1 Open LV 1 Max PV 0 Cur PV 6 Act PV 6 VG Size 39,12 GB PE Size 4,00 MB Total PE 10016 Alloc PE / Size 9984 / 39,00 GB Free PE / Size 32 / 128,00 MB VG UUID j3gDua-maQB-d7BY-0l4Q-eZyr-VBPz-WYQH0a créer la parttion lvm: [root@guibpiv gnbd]# lvcreate -L 39G cluster_vg /proc/misc: No entry for device-mapper found Is device-mapper driver missing from kernel? Failure to communicate with kernel device-mapper driver. striped: Required device-mapper target(s) not detected in your kernel lvcreate: Create a logical volume ce message indique que l'on a pas chargé le devicemapper sur le serveur: [root@guibpiv gnbd]# modprobe -v dm-mod device-mapper: 4.4.0-ioctl (2005-01-12) initialised: dm-devel@redhat.com [root@guibpiv gnbd]# lvcreate -L 39G cluster_vg Logical volume "lvol0" created [root@guibpiv dev]# lvdisplay --- Logical volume --- LV Name /dev/cluster_vg/lvol0 VG Name cluster_vg LV UUID 9bI8tO-y7J2-bdD2-gk0k-L2QS-KP5J-hquKU0 LV Write Access read/write LV Status available # open 1 LV Size 39,00 GB Current LE 9984 Segments 6 Allocation inherit Read ahead sectors 0 Block device 252:0 maintenant on peut formater le device /dev/cluster_vg/lvol0 en gfs par exemple: [root@guibpiv gnbd]# gfs_mkfs -p lock_dlm -t mandriva:data -j 6 /dev/cluster_vg/lvol0 This will destroy any data on /dev/cluster_vg/lvol0. Are you sure you want to proceed? [y/n] y Device: /dev/cluster_vg/lvol0 Blocksize: 4096 Filesystem Size: 28898264 Journals: 6 Resource Groups: 442 Locking Protocol: lock_dlm Lock Table: mandriva:data -p lock_dlm : le nom du protocol de lock -j 6 : nombre de journaux, égal au nombres de nodes -t mandriva:data1_gfs : mandriva et le nom du cluster, et data le nom unique du fs reste tout simplement à monter le device: [root@guibpiv gnbd]# mount -t gfs /dev/cluster_vg/lvol0 /mnt/test_vg/ mount: permission denied il faut avoir charger gfs, et dlm_lock et avoir rejoins le fence domain pour pouvoir monter la partition clvm gfs Lock_Harness (built Apr 13 2005 17:40:02) installed GFS (built Apr 13 2005 17:40:32) installed GFS: Trying to join cluster "lock_dlm", "mandriva:data" Lock_DLM (built Apr 13 2005 17:40:07) installed lock_dlm: fence domain not found; check fenced GFS: can't mount proto = lock_dlm, table = mandriva:data, hostdata = GFS: Trying to join cluster "lock_dlm", "mandriva:data" df | grep test_vg /dev/mapper/cluster_vg-lvol0 39G 11G 29G 26% /mnt/test_vg ---------------------- exporter un device via gnbd ---------------------- démarrer un serveur gnbd sans contacter un server cluster: gnbd_serv -n -n : permet d'exporter le device avec du linux page cache [root@node21 ~]# gnbd_export -c -v -e node21export -d /dev/hda5 gnbd_export: created GNBD node21export serving file /dev/hda5 -v : verbose -c : active le cache, et permet d'exporter sans serveur cluster ---------------- info supp ----------------- [root@guibpiv ~]# cat /proc/cluster/status Protocol version: 5.0.1 Config version: 1 Cluster name: mandriva Cluster ID: 26945 Cluster Member: Yes Membership state: Cluster-Member Nodes: 8 Expected_votes: 8 Total_votes: 8 Quorum: 5 Active subsystems: 5 Node name: guibpiv.guibland.com Node addresses: 10.0.1.253 [root@guibpiv ~]# cat /proc/cluster/nodes Node Votes Exp Sts Name 1 1 8 M guibpiv.guibland.com 2 1 8 M node20.guibland.com 3 1 8 M node25.guibland.com 4 1 8 M node23.guibland.com 5 1 8 M node22.guibland.com 6 1 8 M node26.guibland.com 7 1 8 M node24.guibland.com 8 1 8 M node21.guibland.com la table des partitions avec les gnbd des nodes et le lvm: [root@guibpiv ~]# cat /proc/partitions major minor #blocks name 3 0 80043264 hda 3 1 522081 hda1 3 2 6136830 hda2 3 3 1 hda3 3 5 53536581 hda5 3 6 19840243 hda6 22 0 80043264 hdc 22 1 80043232 hdc1 250 0 5116072 gnbd0 250 1 6980211 gnbd1 250 2 6658911 gnbd2 250 3 6658911 gnbd3 250 4 7813008 gnbd4 250 5 7813008 gnbd5 252 0 40894464 dm-0 251 0 9223372036854775807 diapered_dm-0