ADVENTOS Blog

Ceph Bluestore: Erweiterte Verwendung von ceph-deploy osd



Das Kommandozeilentool ceph-deploy bietet eine vereinfachte und automatisierte Konfiguration mehrerer Ceph-Nodes. Ein Teil dessen ist das Erstellen von OSDs, die seit Version Luminous standardmäßig als Bluestore angelegt werden. Das sog. Journaling des ehem. Filestore wurde durch die Parameter Block-DB/WAL abgelöst, die - vereinfacht formuliert - mithilfe (je) eines schnellen dezidierten Speichers (z.B. einer SSD) das Datenmanagement des OSDs beschleunigen. Der darauf angepasste Befehl sähe nun folgendermaßen aus:

ceph-deploy osd create --data /path/to/data/dev --block-wal /path/to/wal/dev --block-db /path/to/db/dev NODE

Das data/dev sollte eine hohe Speicherkapazität (z.B. HDD) aufweisen, das wal/dev bzw. das db/dev eine hohe Lese-/Schreibrate (z.B. SSD, kann dasselbe dev sein).

 


Zeitsynchronität: Ceph unter Ubuntu 18.04



Die Zeitsynchronisation bei Ceph auf Ubuntu 18.04-Systemen muss so konfiguriert werden, dass NTP anstatt des standardmäßigen timesyncd-Dienst verwendet wird. Dies erfolgt mit folgenden Befehlen auf allen Ceph-Nodes (setzt einen installierten NTP-Dienst voraus):

sudo timedatectl set-ntp off

sudo systemctl enable ntp

Zusätzlich ist empfehlenswert, in der /etc/ntp.conf auf allen Nodes einen Node-Hostnamen als weitere Referenz durch folgende Zeile server NODE1 hinzuzufügen, falls die externen Zeitserver nicht erreicht werden können. Danach muss je Node der NTP-Dienst neugestartet werden.

sudo systemctl restart ntp

Werden die obigen Schritte nicht durchgeführt, gibt Ceph eine Warnmeldung über die Asynchronizität der Nodes aus, sodass ein sicherer Datenabgleich nicht gewährleistet werden kann.


OpenNebula: Erstellen von Snapshots mit Ceph als Storage-System



 

Beim Versuch, unter ONe ein Snapshot von einer VM zu erstellen, erscheint im Log, dass das Format raw für VM-Snapshots nicht kompatibel sei, obwohl die Images als qcow2 angelegt wurden. Dieser Schein trügt, denn in der jeweiligen Datei mit den Eigenschaften einer VM steht, dass das Image als raw vorliegt. Grund dafür ist, dass Ceph derzeit keine native Unterstützung für qcow2 enthält und somit alle Images automatisch als raw anlegt. Ein Snapshot ist unter der Verwendung von Ceph nur für Images und nicht für VMs möglich. Ein Rollback eines solchen Snapshots ist zudem nur im ausgeschalteten Zustand der VM möglich. Außerdem bietet ONe bisher keine Möglichkeit, einen scheduled task für Image-Snapshots zu erstellen. Eine Möglichkeit, sich dagegen Abhilfe zu verschaffen, wäre, ein (Ana)cron-Job (zeitgesteuerte Skripts unter Linux) mithilfe eines Shell-Skriptes zu erstellen. Die Programmierung eines solchen Skriptes erfordert zwar erweiterte Programmierkenntnisse, jedoch lassen sich so die Snapshot-Aufgaben sehr detailliert formulieren, da jegliche Tools des Betriebssystems zur Verfügung stehen. Z.B. lassen sich die Snapshots direkt auf ein externes Medium, wie einem NAS, als Image-Datei exportieren, um später wieder – auch in einem anderem Cluster – importiert zu werden. Hier ein Beispiel für ein solches Skript:

#!/bin/bash
# Create VM snapshots weekly

set -e

#Disk IDs must match VM IDs!
vmids=(1 2 3)       #space separated VM IDs
diskids=(0 1 0)     #space separated Disk IDs

if [ "${#vmids[@]}" != "${#diskids[@]}" ]
then
        echo "Disk IDs don't equal VM IDs! Aborting..."
        exit 1
fi

tmppath="/home/cephadmin"       #path to store Imagess before moving to destination path
destpath="/mnt/nas/vmbackups"   #final destination path
datenow=$(date +%Y%m%d)
for i in "${!vmids[@]}"; do     #walk through the array above
        vmexist=$(onevm list -l ID | grep ${vmids[$i]} | tr -s ' ')
        if [ -z $vmexist ] || [ ${vmids[$i]} != $vmexist ]      #check whether VM ID exists with given Disk ID
        then
                echo "VM with ID ${vmids[$i]} doesn't exist. Skipping..."
        else
                vmstate=$(onevm list -l ID,STAT | grep ${vmids[$i]} | tr -s ' ' | cut -d ' ' -f3)
                #ensure snapshot can or needs to be created
                if [ -z "$(onevm show ${vmids[$i]} | awk '/VM DISKS/' RS= | tail -n +2 | awk '{ print $1$2 }' | grep ${diskids[$i]}cephds)" ] || [ -n "$(oneimage list -x | grep ${vmids[$i]}-${diskids[$i]}-IMG$datenow)" ] || [ $vmstate == "unde" ]
                then
                        echo "VM ${vmids[$i]} not valid or necessary, skipping..."
                else
                        onevm disk-snapshot-create  ${vmids[$i]}  ${diskids[$i]} "Snap$datenow"
                        vmstate=$(onevm list -l ID,STAT | grep ${vmids[$i]} | tr -s ' ' | cut -d ' ' -f3)
                        while [ $vmstate == "snap" ]
                        do
                                sleep 1
                                echo "Waiting for snap to be created..."
                                vmstate=$(onevm list -l ID,STAT | grep ${vmids[$i]} | tr -s ' ' | cut -d ' ' -f3)
                        done
                        imgout=$(onevm disk-saveas ${vmids[$i]}  ${diskids[$i]} "${vmids[$i]}-${diskids[$i]}-IMG$datenow")
                        vmstate=$(onevm list -l ID,STAT | grep ${vmids[$i]} | tr -s ' ' | cut -d ' ' -f3)
                        while [ $vmstate == "hotp" ]
                        do
                                sleep 1
                                echo "Waiting for image to be created..."
                                vmstate=$(onevm list -l ID,STAT | grep ${vmids[$i]} | tr -s ' ' | cut -d ' ' -f3)
                        done
                        imgid=$(echo $imgout | cut -d ' ' -f3)
                        imgstate=$(oneimage list -l ID,STAT | grep ${vmids[$i]} | tr -s ' ' | cut -d ' ' -f3)
                        while [ $vmstate == "lock" ]
                        do
                                sleep 1
                                echo "Waiting for image to get finished..."
                                imgstate=$(oneimage list -l ID,STAT | grep ${vmids[$i]} | tr -s ' ' | cut -d ' ' -f3)
                        done
                        qemu-img convert -f raw rbd:one/one-$imgid -O raw $tmppath/${vmids[$i]}-${diskids[$i]}-IMG$datenow.raw
                        #copy to destination
                        cp $tmppath/${vmids[$i]}-${diskids[$i]}-IMG$datenow.raw $destpath/${vmids[$i]}-${diskids[$i]}-IMG$datenow.raw
                        #remove temporary file
                        rm -rf $tmppath/${vmids[$i]}-${diskids[$i]}-IMG$datenow.raw
                fi
        fi
done

exit 0

 

 


Ceph upgrade pitfalls



Das Upgrade von Jewel nach Luminous hält doch den einen oder anderen Fallstrick parat. Vor allem, wenn wie unserem Fall das Upgrade per apt auf den Nodes selbst vorgenommen wird. 

Hier die Schritte im Einzelnen:

Die Nodes vorbereiten

ceph osd set sortbitwise
ceph set noout

Die Quellen für apt anpassen: 

sed -i 's/jewel/luminous/' /etc/apt/sources.list.d/ceph.list

Und das eigentliche Update durchführen:

apt-get update && apt-get dist-upgrade

Dann die MON Dienste neustarten

systemctl restart ceph-mon@<id>

Schließlich noch die OSDs

systemctl restart ceph-osd.target

Und schließlich mit 

ceph osd require-osd-release luminous
ceph osd crush tunables optimal
ceph osd unset noout

den Cluster für Luminous optimieren. 

Soweit alles ganz problemlos und genauch nach ceph-Manual

Was die offizielle ceph Dokumentation leider verschweigt, ist das auf diese Weise der neue Dienst ceph-mgr nicht installiert wird, was ceph health nicht nur mit der ungewohnten Meldung "no active mgr" quittiert, sondern auch sämtliche Pools als inexistent ausweist 

ceph status
  cluster:
    id:     046d138f-6d9a-4aaa-918b-142ea99cffbc
    health: HEALTH_WARN
            no active mgr
 
  services:
    mon: 3 daemons, quorum ham-nebula-01,ham-nebula-02,ham-nebula-03
    mgr: no daemons active
    osd: 3 osds: 3 up, 3 in
 
  data:
    pools:   0 pools, 0 pgs
    objects: 0 objects, 0 bytes
    usage:   0 kB used, 0 kB / 0 kB avail
    pgs:  

Nachdem der ersten Schrecken aus den Beinkleidern gewichen, erst mal über ceph-mgr kundig gemacht und wie in den Release Notes zu lesen ist der MGR Dienst seit Luminous ein notwendiger notwendiger Bestandteil geworden. 

Zuerst einfach auf allen MON Nodes das Paket ceph-mgr mit 

apt-get install ceph-mgr

nachinstallieren. Dann wird es etwas tricky: 

Für jeden MGR-Node einen Keyring generieren 

ceph auth get-or-create mgr.<mgr-name> mon 'allow profile mgr' osd 'allow *' mds 'allow *'
ceph auth get mgr.<mgr-name>

exported keyring for mgr.<mgr-name>

[mgr.<mgr-name>]

key = xxxxxxxxxxxxxxxxxxxxxxxx==
caps mds = "allow *"
caps mon = "allow profile mgr"
caps osd = "allow *"

und unter /var/lib/ceph/mgr/<cluster>-<mgr-name>/keyring speichern. Dabei muss der File-Eigentümer unbedingt auf ceph:ceph geändert werden. 

Wenn das erledigt ist kann der Dienst enabled und gestartet werden 

systemctl enable ceph-mgr@mgr3.service
systemctl start ceph-mgr@mgr3

Und als kleines Extra noch das nagelneue Dashboard in Betrieb nehmen mit 

ceph mgr module enable dashboard

Damit steht ein schickes Web Dashboard unter Port 7000 zur Verfügung

Ceph MGR Dashboard