informatique:systeme:ha:ceph

Ceph

Cette méthodologie décrie la mise en place d'un cluster composé de trois serveurs.

Schéma réseau

Schéma cluster Ceph

  • 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
  • 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.
  • 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
rbd list --pool=[pool]

Avec :

  • [pool] : le nom du pool
rbd info [pool]/[volume]

Avec :

  • [pool] : le nom du pool
  • [volume : le nom du volume
rbd rm [pool]/[volume]

Avec :

  • [pool] : le nom du pool
  • [volume : le nom du volume

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 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 ici.
  • 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 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 ici, à savoir agrandir la partition et le PV.
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é”.
rbd snap list [pool]/[nom-vm]

Avec :

  • [pool] : le nom du pool
  • [volume] : le nom du volume

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.
rbd snap rm [pool]/[volume]@[snap]

Avec :

  • [pool] : le nom du pool
  • [volume] : le nom du volume
  • [snap] : le nom du snapshot
  • 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 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

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 "<secret ephemeral='no' private='no'><uuid>`uuidgen`</uuid><usage type='ceph'><name>client.libvirt secret</name></usage></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é 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 :

    <disk type='network' device='disk'>
      <driver name='qemu' cache='none'/>
      <auth username='libvirt'>
        <secret type='ceph' uuid='9b*******************************27e'/>
      </auth>
      <source protocol='rbd' name='libvirt/[nom volume]'>
        <host name='192.168.0.1' port='6789'/>
        <host name='192.168.0.2' port='6789'/>
        <host name='192.168.0.3' port='6789'/>
      </source>
      <target dev='vda' bus='virtio'/>
      <alias name='virtio-disk0'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/>
    </disk>
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 <disk/>) et ajouter le disque ensuite avec la commande suivante :
virsh attach-device [nom-vm] [/chemin/fichier.xml] --persistent

L'option –persitent permet que ce disque soit systématiquement attaché à la VM au moment de son démarrage.

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 pacemaker par exemple) sur le cluster pour faire la supervision sur celle-ci uniquement.
  • informatique/systeme/ha/ceph.txt
  • Dernière modification : 2014/10/16 14:50
  • de bn8