====== 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 -a L'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 200 Le 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 reload La 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.