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