====== Ceph ======
===== Mise en place d'un cluster =====
Cette méthodologie décrie la mise en place d'un cluster composé de trois serveurs.
==== Schéma réseau ====
{{ :informatique:systeme:ha:schema-reseau.png?direct&400 |Schéma réseau}}
==== Schéma du cluster Ceph ====
{{ :informatique:systeme:ha:schema-ceph.png?direct&400 |Schéma cluster Ceph}}
==== Pré-requis ====
* Les 3 serveurs doivent posséder 2 disques //SSD// (64Go minimum) en RAID1 pour le système et les journaux //Ceph// et deux autres disques (//SATA 2To// par exemple) pour les //OSD// (=les données du cluster)
* L'OS des serveurs doit être installé sur un disque utilisant **LVM**. Partitionnement proposé :
* /dev/sda
* /dev/sda1 : Type //Linux raid auto//, tout l'espace disque disponible
* /dev/sdb
* /dev/sdb1 : Type //Linux raid auto//, tout l'espace disque disponible
* /dev/sdc : Disque //OSD// Ceph 1, xfs (formatage durant la procédure)
* /dev/sdd : Disque //OSD// Ceph 2, xfs (formatage durant la procédure)
* /dev/md0 (RAID 1 logiciel de /dev/sda1 et /dev/sdb1) : PV LVM
* vg_$( hostname -s ) : VG LVM contenant le PV /dev/md0
* LV //root// : 4Go, ext4 monté dans /
* LV //tmp// : 1Go, ext4 monté dans /tmp
* LV //var// : 5Go, ext4 monté dans /var
* LV //swap// : 2Go, utilisé en SWAP
* LV //ceph// : 30Go, xfs monté dans /var/lib/ceph. La méthodologie du formatage de ce LV est expliqué plus loin.
* Les 3 serveurs doivent être installés sur **Debian Wheezy** (architecture amd64)
* L'authentification par clé SSH entre les serveurs doit être en place pour l'utilisateur //root//
* Le nom court des serveurs (exemple : //ceph1//) doit est connu des serveurs. Vous pouvez simplement mettre dans votre fichier ///etc/hosts// : 192.168.0.1 ceph1
192.168.0.2 ceph2
192.168.0.3 ceph3
==== Installation de Ceph ====
* Mise en place du dépôt Ceph : echo "deb http://ceph.com/debian-dumpling/ wheezy main" > /etc/apt/sources.list.d/ceph.list
gpg --keyserver pgpkeys.mit.edu --recv-key 7EBFDD5D17ED316D
gpg -a --export 7EBFDD5D17ED316D|apt-key add -
apt-get update
* Création du LV //ceph//, formatage et montage : lvcreate -nceph -L30G vg_`hostname -s`
mkfs.xfs -n size=64k /dev/vg_$( hostname -s )/ceph
echo "/dev/mapper/vg_$( hostname -s )-ceph /var/lib/ceph xfs rw,noexec,nodev,noatime,nodiratime,inode64 0 0" >> /etc/fstab
mount -a
* Installation de Ceph : apt-get install ceph
* Mise en place des disques OSD : mkdir /var/lib/ceph/osd/ceph-0 -p
mkdir /var/lib/ceph/osd/ceph-1 -p
mkfs.xfs -f -n size=64k /dev/sdc
mkfs.xfs -f -n size=64k /dev/sdd
echo "/dev/sdc /var/lib/ceph/osd/ceph-0 xfs rw,noexec,nodev,noatime,nodiratime,inode64 0 0" >> /etc/fstab
echo "/dev/sdd /var/lib/ceph/osd/ceph-1 xfs rw,noexec,nodev,noatime,nodiratime,inode64 0 0" >> /etc/fstab
mount -aL'ID des OSD (//ceph-X// = //osd.X//) dépend du serveur installé. Ce référer au schéma du cluster Ceph.
==== Configuration de Ceph ====
* Mettre en place le fichier de configuration principale ///etc/ceph/ceph.conf// sur les trois serveurs (fichier identique) : [global]
fsid = db22d697-03f5-4122-9f81-8c08ec680fe4
auth cluster required = cephx
auth service required = cephx
auth client required = cephx
# We may loose one server
mon osd full ratio = 0.66
# We may be able to loose two servers
mon osd nearfull ratio = 0.33
[mon]
mon initial members = a,b,c
[mon.a]
host = ceph1
mon addr = 192.168.0.1
[mon.b]
host = ceph2
mon addr = 192.168.0.2
[mon.c]
host = ceph3
mon addr = 192.168.0.3
[osd]
osd journal size = 10000
osd journal = /var/lib/ceph/journal/$cluster-$id
osd recovery max active = 1
[osd.0]
host = ceph1
[osd.1]
host = ceph1
[osd.2]
host = ceph2
[osd.3]
host = ceph2
[osd.4]
host = ceph3
[osd.5]
host = ceph3
**Remarque :** Le //fsid// peut-être généré avec la commande //uuidgen// (paquet Debian //uuid-runtime//).
=== Configuration des monitors ===
* Sur //ceph1// : mkdir -p /var/lib/ceph/mon/ceph-a
ceph-authtool --create-keyring /etc/ceph/ceph.client.admin.keyring --gen-key -n client.admin
chmod 600 /etc/ceph/ceph.client.admin.keyring
ceph-authtool --create-keyring /var/lib/ceph/mon/ceph-a/keyring --gen-key -n mon.
cp -a /var/lib/ceph/mon/ceph-a/keyring /etc/ceph/ceph.mon.a.keyring
cat /etc/ceph/ceph.client.admin.keyring >> /var/lib/ceph/mon/ceph-a/keyring
ceph-authtool /var/lib/ceph/mon/ceph-a/keyring -n client.admin --cap mds 'allow' --cap osd 'allow *' --cap mon 'allow *'
ceph-mon -i a -f -c /etc/ceph/ceph.conf --mkfs
* Sur //ceph2// : mkdir -p /var/lib/ceph/mon/ceph-b
scp 192.168.0.1:/var/lib/ceph/mon/ceph-a/keyring /var/lib/ceph/mon/ceph-b/keyring
scp 192.168.0.1:/etc/ceph/ceph.mon.a.keyring /etc/ceph/ceph.mon.b.keyring
scp 192.168.0.1:/etc/ceph/ceph.client.admin.keyring /etc/ceph/ceph.client.admin.keyring
chmod 600 /etc/ceph/ceph.client.admin.keyring
ceph-mon -i b -f -c /etc/ceph/ceph.conf --mkfs
* Sur //ceph3// : mkdir -p /var/lib/ceph/mon/ceph-c
scp 192.168.0.1:/var/lib/ceph/mon/ceph-a/keyring /var/lib/ceph/mon/ceph-c/keyring
scp 192.168.0.1:/etc/ceph/ceph.mon.a.keyring /etc/ceph/ceph.mon.c.keyring
scp 192.168.0.1:/etc/ceph/ceph.client.admin.keyring /etc/ceph/ceph.client.admin.keyring
chmod 600 /etc/ceph/ceph.client.admin.keyring
ceph-mon -i c -f -c /etc/ceph/ceph.conf --mkfs
/etc/init.d/ceph -a start mon.c
ssh 192.168.0.2 "/etc/init.d/ceph -a start mon.b"
ssh 192.168.0.1 "/etc/init.d/ceph -a start mon.a"
=== Configuration des OSD ===
* Sur //ceph1// : mkdir /var/lib/ceph/journal/
ceph osd create
ceph-osd -i 0 --mkfs --mkkey
ceph auth add osd.0 osd 'allow *' mon 'allow rwx' -i /var/lib/ceph/osd/ceph-0/keyring
service ceph -a start osd.0
ceph osd crush set 0 2.0 root=default host=ceph1
ceph osd create
ceph-osd -i 1 --mkfs --mkkey
ceph auth add osd.1 osd 'allow *' mon 'allow rwx' -i /var/lib/ceph/osd/ceph-1/keyring
service ceph -a start osd.1
ceph osd crush set 1 2.0 root=default host=ceph1
* Sur //ceph2// : mkdir /var/lib/ceph/journal/
ceph osd create
ceph-osd -i 2 --mkfs --mkkey
ceph auth add osd.2 osd 'allow *' mon 'allow rwx' -i /var/lib/ceph/osd/ceph-2/keyring
service ceph -a start osd.2
ceph osd crush set 2 2.0 root=default host=ceph2
ceph osd create
ceph-osd -i 3 --mkfs --mkkey
ceph auth add osd.3 osd 'allow *' mon 'allow rwx' -i /var/lib/ceph/osd/ceph-3/keyring
service ceph -a start osd.3
ceph osd crush set 3 2.0 root=default host=ceph2
* Sur //ceph3// : mkdir /var/lib/ceph/journal/
ceph osd create
ceph-osd -i 4 --mkfs --mkkey
ceph auth add osd.4 osd 'allow *' mon 'allow rwx' -i /var/lib/ceph/osd/ceph-4/keyring
service ceph -a start osd.4
ceph osd crush set 4 2.0 root=default host=ceph3
ceph osd create
ceph-osd -i 5 --mkfs --mkkey
ceph auth add osd.5 osd 'allow *' mon 'allow rwx' -i /var/lib/ceph/osd/ceph-5/keyring
service ceph -a start osd.5
ceph osd crush set 5 2.0 root=default host=ceph3
===== Gestion des volumes Ceph =====
==== Lister les volumes d'un pool ====
rbd list --pool=[pool]
**Avec :**
* **[pool] :** le nom du //pool//
==== Afficher les détails d'un volume ====
rbd info [pool]/[volume]
**Avec :**
* **[pool] :** le nom du //pool//
* **[volume :** le nom du //volume//
==== Supprimer un volume ====
rbd rm [pool]/[volume]
**Avec :**
* **[pool] :** le nom du //pool//
* **[volume :** le nom du //volume//
==== Agrandir un volume utilisé comme disque d'une machine virtuelle ====
=== Sans arrêter la VM ===
Utiliser la commande virsh suivante : virsh blockresize --domain [mavm] --path "[volume]" --size [newsize]
**Avec : **
* **[mavm] : ** le nom libvirt de la VM
* **[volume] : ** le nom du volume telque vue par la VM. Exemple : //vdc//
* **[newsize] : ** la nouvelle taille du volume. Exemple : //40G//
La modification est normalement propagé jusqu'au système d'exploitation de la VM. Il faut ensuite faire en sorte que la VM utilise ce nouvelle espace. Par exemple, si le volume est utilisé directement comme un volume physique LVM, vous pouvez suivre la procédure décrite [[informatique:systeme:matos:lvm#augmenter_un_pv|ici]].
=== Avec arrêt de la VM ===
* Arrêter la VM
* Une fois la VM arrêtée, agrandir l'image disque : rbd resize --size=[taille en Mb] [pool]/[volume]
* **Avec :**
* **[taille en Mb] :** la nouvelle taille du //volume// en Mo (exemple : 20480 pour 20G)
* **[pool] :** le nom du //pool//
* **[volume] :** le nom du //volume//
* Une fois le redimensionnement fait, relancer la VM
* Une fois la VM rebootée, il faut faire en sorte d'utiliser cette espace disque supplémentaire. Si vous utilisez //LVM//, vous pouvez suivre la procédure décrite [[informatique:systeme:matos:lvm#augmenter_un_pv|ici]].
==== Réduire un volume utilisé comme un disque d'une machine virtuelle ====
* Il faut commencer par réduire la taille disque utiliser sur la VM. Si vous utilisez //LVM//, vous pouvez suivre la procédure décrite [[informatique:systeme:matos:lvm#reduire_un_pv|ici]] jusqu'à l'arrêt pour réduction du disque de la VM.
* Arrêter ensuite la VM
Cette procédure étant potentiellement risqué, vous pouvez par précaution effectuer maintenant un //snapshot// du volume de la VM. Si la procédure ne se déroule pas correctement, pour pourrez toujours revenir en arrière et sinon vous pourrez la supprimer.
* Redimensionner ensuite le volume avec la commande suivante : rbd resize --size=[taille en Mb] [pool]/[volume] --allow-shrink
* **Avec :**
* **[taille en Mb] :** la nouvelle taille do //volume// en Mo (exemple : 20480 pour 20G)
* **[pool] :** le nom du //pool//
* **[volume] :** le nom du //volume//
* Relancer ensuite la VM. Si vous utilisé //LVM//, il faudra finir la procédure de redimensionnement décrite [[informatique:systeme:matos:lvm#reduire_un_pv|ici]], à savoir agrandir la partition et le //PV//.
==== Créer un snapshot d'un volume ====
rbd snap create [pool]/[volume]@[snap]
**Avec :**
* **[pool] :** le nom du //pool//
* **[volume] :** le nom du //volume//
* **[snap] :** le nom que vous voulez nommer votre //snapshot//. Ce nom doit être court, ne comporter que des caractères ASCII et sans espace ni caractère //"compliqué"//.
==== Lister les snapshot d'un volume ====
rbd snap list [pool]/[nom-vm]
**Avec :**
* **[pool] :** le nom du //pool//
* **[volume] :** le nom du //volume//
==== Remettre un volume à l'état d'un snapshot précédent ====
Cette opération consite a écraser toutes les modifications faites depuis un //snapshot//. Cette modification est **irréversible**. Il est cependant possible de faire un nouveau snapshot avant la restauration afin de pouvoir revenir à l'état précédent si nécessaire.
rbd snap rollback [pool]/[volume]@[snap]
**Avec :**
* **[pool] :** le nom du //pool//
* **[volume] :** le nom du //volume//
* **[snap] :** le nom du //snapshot//
Cette opération peut prendre pas mal de temps. Cette durée augmente en fonction de la taille du //snapshot// et de la quantité de modifications faitent depuis la création du //snapshot//.
==== Supprimer un snapshot d'un volume ====
rbd snap rm [pool]/[volume]@[snap]
**Avec :**
* **[pool] :** le nom du //pool//
* **[volume] :** le nom du //volume//
* **[snap] :** le nom du //snapshot//
===== Utilisation du cluster Ceph dans Libvirt =====
==== Installation de libvirt ====
* Création d'un LV //libvirt//, formatage ext4 et montage : lvcreate -L 5G -n libvirt vg_$( hostname -s )
mkfs.ext4 /dev/vg_$( hostname -s )/libvirt
tune2fs -i0 -c0 /dev/vg_$( hostname -s )/libvirt
echo "/dev/mapper/vg_$( hostname -s )-libvirt /var/lib/libvirt ext4 defaults 0 0" >> /etc/fstab
mount -a
* Déclaration du dépôt [[http://www.easter-eggs.com|Easter-eggs]] proposant des paquets Debian de Livbirt et KVM avec le support de //ceph// : echo "deb http://debian.easter-eggs.org/debian wheezy main libvirt kvm" > /etc/apt/sources.list.d/libvirt.list
apt-get update
* Installation de libvirt et ses dépendances : apt-get install libvirt-bin qemu-kvm netcat-openbsd qemu-utils
==== Configuration de libvirt pour utiliser le cluster Ceph ====
A faire sur //ceph1// :
* Création d'un utilisateur dédié pour //libvirt// au niveau de //ceph// : ceph auth get-or-create client.libvirt mon 'allow r' osd 'allow class-read object_prefix rbd_children, allow rwx pool=libvirt-pool'
* Création d'un //secret// Libvirt pour stocker les informations d'authentification auprès du cluster Ceph : echo "`uuidgen`client.libvirt secret" > /tmp/secret.xml
scp /tmp/secret.xml 192.168.0.2:/tmp/
scp /tmp/secret.xml 192.168.0.3:/tmp/
virsh secret-define /tmp/secret.xml
ssh 192.168.0.2 "virsh secret-define /tmp/secret.xml"
ssh 192.168.0.3 "virsh secret-define /tmp/secret.xml"
* Définition du //secret// :
* On commance par récupèré l'UUID du secret libvirt affiché lors de la création du secret à l'étape précedente : Secret 9b*******************************27e created
* On récupère la clé de l'utilisateur *ceph* *client.libvirt* au format *base64* : root@ceph1:~# ceph auth get client.libvirt
[client.libvirt]
key = AQ**********************************0A==
caps mon = "allow r"
caps osd = "allow class-read object_prefix rbd_children, allow rwx pool=libvirt-pool"
* On peut maintenant définir à partir des deux informations récupérées : virsh secret-set-value --secret 9b*******************************27e --base64 'AQ**********************************0A=='
ssh 192.168.0.2 "virsh secret-set-value --secret 9b*******************************27e --base64 'AQ**********************************0A=='"
ssh 192.168.0.3 "virsh secret-set-value --secret 9b*******************************27e --base64 'AQ**********************************0A=='"
* Création d'un //pool ceph// pour //libvirt// : ceph osd pool create libvirt 200Le nombre //200// utilisé lors de la création du pool libvirt correspond aux nombres de //Placement Group// calculé selon la méthode officielle expliqué [[http://ceph.com/docs/master/rados/operations/placement-groups/|ici]].
On peut désormais utiliser un volume //ceph// en tant que disque d'une machine virtuelle. Pour cela, voila un exemple de configuration d'un disque //ceph// d'une machine virtuelle :
Pour attacher un disque ceph à une VM en cours d'exectution, créé un fichier xml contenant juste la déclaration du disque (juste la balise ////) et ajouter le disque ensuite avec la commande suivante : virsh attach-device [nom-vm] [/chemin/fichier.xml] --persistentL'option //--persitent// permet que ce disque soit systématiquement attaché à la VM au moment de son démarrage.
===== Supervision de Ceph avec Nagios =====
On va mette ici en place trois checks différent :
* //check_ceph_health// : ce plugin vérifie simplement l'état général du cluster avec la commande //ceph health//
* //check_ceph_status// : ce plugin vérifie l'état général du cluster (//health//, nombre d'OSDs UP, nombre de MONs UP et l'état des PGs) avec la commande //ceph status//
* //check_ceph_usage// : ce plugin vérifie l'espace disque utilisé dans le cluster via la commande //ceph status//
Mise en place :
* Création d'une clé //authx// pour Nagios (à faire sur //ceph1//) : ceph auth get-or-create client.nagios mon 'allow r' > /etc/ceph/ceph.client.nagios.keyring
scp /etc/ceph/ceph.client.nagios.keyring 192.168.0.2:/etc/ceph/
ssh root@192.168.0.2 'chown nagios: /etc/ceph/ceph.client.nagios.keyring'
scp /etc/ceph/ceph.client.nagios.keyring 192.168.0.3:/etc/ceph/
ssh root@192.168.0.3 'chown nagios: /etc/ceph/ceph.client.nagios.keyring'
* Installation du plugin : git clone https://github.com/valerytschopp/ceph-nagios-plugins.git /usr/local/src/ceph-nagios-plugins
mkdir -p /usr/local/lib/nagios/plugins
ln -s /usr/local/src/ceph-nagios-plugins/src/check_ceph_health /usr/local/lib/nagios/plugins/check_ceph_health
git clone http://git.zionetrix.net/git/check_ceph_usage /usr/local/src/check_ceph_usage
ln -s /usr/local/src/check_ceph_usage/check_ceph_usage /usr/local/lib/nagios/plugins/check_ceph_usage
git clone http://git.zionetrix.net/git/check_ceph_status /usr/local/src/check_ceph_status
ln -s /usr/local/src/check_ceph_status/check_ceph_status /usr/local/lib/nagios/plugins/check_ceph_status
* Définition de la configuration du //check// d'//NRPE// (à mettre dans le fichier ///etc/ceph/ceph.client.nagios.keyring// par exemple) : command[check_ceph_health]=/usr/local/lib/nagios/plugins/check_ceph_health -d -i nagios -k /etc/ceph/ceph.client.nagios.keyring
command[check_ceph_usage]=/usr/local/lib/nagios/plugins/check_ceph_usage -i nagios -k /etc/ceph/ceph.client.nagios.keyring --warning-data 50 --critical-data 60 --warning-allocated 80 --critical-allocated 90
command[check_ceph_status]=/usr/local/lib/nagios/plugins/check_ceph_status -i nagios -k /etc/ceph/ceph.client.nagios.keyring
* Rechargement de la configuration d'NRPE pour appliquer la modification : service nagios-nrpe-server reloadLa supervision de l'état du cluster peut normalement être fait sur un seul des nœuds du cluster. Vous pouvez par exemple configurer une //VIP// (avec [[informatique:systeme:ha:pacemaker]] par exemple) sur le cluster pour faire la supervision sur celle-ci uniquement.