19 Erasure Coded Pools #
Ceph bietet eine Alternative zur normalen Reproduktion von Daten in Pools, die als Erasure oder Erasure Coded Pool bezeichnet wird. Erasure Pools bieten nicht alle Funktionen der reproduzierten Pools (sie können beispielsweise keine Metadaten für RBD-Pools speichern), belegen jedoch weniger Basisspeicherplatz. Ein standardmäßiger Erasure Pool, in dem 1 TB Daten gespeichert werden können, erfordert 1,5 TB Basisspeicherplatz für einen einzelnen Festplattenausfall. Im Vergleich dazu benötigt ein reproduzierter Pool einen Basisspeicherplatz von 2 TB für denselben Zweck.
Hintergrundinformationen zu dem Begriff Erasure Code finden Sie unter https://en.wikipedia.org/wiki/Erasure_code.
Eine Liste der Pool-Werte für EC-Pools finden Sie im Abschnitt Werte der Pools mit Löschcodierung.
19.1 Voraussetzungen für Erasure Coded Pools #
Zur Nutzung von Erasure Coding muss Folgendes ausgeführt werden:
Definieren Sie eine Löschregel in der CRUSH-Zuordnung.
Definieren Sie ein Löschcode-Profil, in dem der zu verwendende Codierungsalgorithmus angegeben ist.
Erstellen Sie einen Pool mit der obigen Regel und dem Profil.
Denken Sie daran, dass das Profil und die Details im Profil nicht mehr geändert werden können, sobald der Pool erstellt wurde und Daten in den Pool aufgenommen wurden.
Stellen Sie sicher, dass die CRUSH-Regeln für Erasure Pools indep
für step
verwenden. Weitere Informationen finden Sie in Abschnitt 17.3.2, „firstn und indep
“.
19.2 Erstellen eines Pools mit Löschcodierung für Testzwecke #
Der einfachste Erasure Coded Pool entspricht RAID5 und benötigt mindestens drei Hosts. Dieser Vorgang beschreibt die Erstellung eines Pools für Testzwecke.
Mit dem Kommando
ceph osd pool create
wird ein Pool vom Typ erasure erstellt. Die Zahl12
steht für die Anzahl der Placement Groups. Mit den Standardparametern kann der Pool den Ausfall eines OSD verarbeiten.cephuser@adm >
ceph osd pool create ecpool 12 12 erasure pool 'ecpool' createdDie Zeichenkette
ABCDEFGHI
wird in ein Objekt namensNYAN
geschrieben.cephuser@adm >
echo ABCDEFGHI | rados --pool ecpool put NYAN -Für Testzwecke können die OSDs nun deaktiviert werden, zum Beispiel durch Trennen vom Netzwerk.
Auf den Inhalt der Datei wird mit dem Kommando
rados
zugegriffen, um zu testen, ob der Pool den Ausfall von Geräten verarbeiten kann.cephuser@adm >
rados --pool ecpool get NYAN - ABCDEFGHI
19.3 Löschcode-Profile #
Wird das Kommando ceph osd pool create
zum Erstellen eines erasure pool aufgerufen, dann wird das Standardprofil verwendet, es sei denn ein anderes Profil wird angegeben. Profile definieren die Redundanz von Daten. Dies erfolgt durch Festlegen von zwei Parametern, die willkürlich als k
und m
bezeichnet werden. k und m definieren, in wie viele Datenblöcke
eine bestimmte Datenmenge aufgeteilt und wie viele Codierungs-Datenblöcke erstellt werden. Redundante Datenblöcke werden dann auf verschiedenen OSDs gespeichert.
Für Erasure Pool-Profile erforderliche Definitionen:
- chunk
Wenn die Verschlüsselungsfunktion aufgerufen wird, gibt sie Datenblöcke der selben Größe zurück: Datenblöcke, die verkettet werden können, um das ursprüngliche Objekt zu rekonstruieren, sowie Codierungs-Datenblöcke, mit denen ein verlorener Datenblock neu aufgebaut werden kann.
- k
Die Anzahl der Datenblöcke, d. h. die Anzahl der Blöcke, in die das ursprüngliche Objekt aufgeteilt wurde. Bei einem Wert von beispielsweise
k=2
wird ein Objekt von 10 KB ink
Objekte zu je 5 KB aufgeteilt. Der Standardwert fürmin_size
für Erasure Coded Pools lautetk + 1
. Es wird jedoch empfohlen,min_size
auf einen Wert von mindestensk + 2
festzulegen, damit keine Schreib- und Datenverluste eintreten.- m
Die Anzahl der Codierungs-Datenblöcke, d. h. die Anzahl der zusätzlichen Blöcke, die durch die Verschlüsselungsfunktionen berechnet werden. Bei 2 Codierungs-Datenblöcken können 2 OSDs ausfallen, ohne dass Daten verloren gehen.
- crush-failure-domain
Definiert, an welche Geräte die Datenblöcke verteilt werden. Ein Bucket-Typ muss als Wert festgelegt werden. Alle Bucket-Typen finden Sie in Abschnitt 17.2, „Buckets“. Wenn die Fehlerdomäne
rack
lautet, werden die Datenblöcke in verschiedenen Racks gespeichert, um die Stabilität im Fall von Rack-Fehlern zu erhöhen. Denken Sie daran, das hierfür k+m Racks erforderlich sind.
Mit dem in Abschnitt 19.2, „Erstellen eines Pools mit Löschcodierung für Testzwecke“ verwendeten standardmäßigen Löschcode-Profil verlieren Sie keine Cluster-Daten, wenn ein einzelnes OSD oder ein einzelner Host ausfällt. Daher benötigt es zum Speichern von 1 TB Daten weitere 0,5 TB Basisspeicherplatz. Für 1 TB Daten sind daher 1,5 TB Basisspeicherplatz erforderlich (k=2, m=1). Dies entspricht einer allgemeinen RAID5-Konfiguration. Zum Vergleich: Ein reproduzierter Pool benötigt 2 TB Basisspeicherplatz zum Speichern von 1 TB Daten.
Die Einstellungen des Standardprofils werden angezeigt mit:
cephuser@adm >
ceph osd erasure-code-profile get default
directory=.libs
k=2
m=1
plugin=jerasure
crush-failure-domain=host
technique=reed_sol_van
Es ist wichtig, das richtige Profil zu wählen, weil es nach Erstellung des Pools nicht mehr geändert werden kann. Ein neuer Pool mit einem anderen Profil muss erstellt und alle Objekte müssen vom vorigen Pool in den neuen Pool verschoben werden (siehe Abschnitt 18.6, „Pool-Migration“).
Die wichtigsten Parameter des Profils sind k
, m
und crush-failure-domain
, weil sie den Speicher-Overhead und die Datenhaltbarkeit definieren. Wenn beispielsweise die gewünschte Architektur den Verlust von zwei Racks mit einem Speicher-Overhead von 66 % kompensieren muss, kann das folgende Profil definiert werden. Dies gilt jedoch nur für eine CRUSH-Zuordnung mit Buckets vom Typ „rack“:
cephuser@adm >
ceph osd erasure-code-profile set myprofile \
k=3 \
m=2 \
crush-failure-domain=rack
Das Beispiel in Abschnitt 19.2, „Erstellen eines Pools mit Löschcodierung für Testzwecke“ kann mit diesem neuen Profil wiederholt werden:
cephuser@adm >
ceph osd pool create ecpool 12 12 erasure myprofilecephuser@adm >
echo ABCDEFGHI | rados --pool ecpool put NYAN -cephuser@adm >
rados --pool ecpool get NYAN - ABCDEFGHI
Das NYAN-Objekt wird in drei Datenblöcke aufgeteilt (k=3
) und zwei weitere Datenblöcke werden erstellt (m=2
). Der Wert von m
definiert, wie viele OSDs gleichzeitig ausfallen können, ohne dass Daten verloren gehen. Mit crush-failure-domain=rack
wird ein CRUSH-Regelsatz erstellt, der sicherstellt, dass keine zwei Datenblöcke im selben Rack gespeichert werden.
19.3.1 Erstellen eines neuen Löschcode-Profils #
Mit folgendem Kommando erstellen Sie ein neues Löschcode-Profil:
#
ceph osd erasure-code-profile set NAME \
directory=DIRECTORY \
plugin=PLUGIN \
stripe_unit=STRIPE_UNIT \
KEY=VALUE ... \
--force
- VERZEICHNIS
Optional. Legen Sie den Namen des Verzeichnisses fest, aus dem das Löschcode-Plugin geladen werden soll. Der Standardwert lautet
/usr/lib/ceph/erasure-code
.- PLUGIN
Optional. Mit dem Löschcode-Plugin können Sie Codierungsblöcke berechnen und fehlende Blöcke wiederherstellen. Verfügbare Plugins: „jerasure“, „isa“, „lrc“ und „shes“. Der Standardwert lautet „jerasure“.
- STRIPE_UNIT
Optional. Datenmenge in einem Datenblock pro Stripe. Bei einem Profil mit 2 Datenblöcken und dem Wert „stripe_unit=4K“ wird beispielsweise der Bereich 0–4K in Block 0 abgelegt, 4K–8K in Block 1 und 8K–12K wieder in Block 0. Dieser Wert muss ein Vielfaches von 4K sein, damit die bestmögliche Leistung erzielt wird. Der Standardwert wird beim Erstellen eines Pools aus der Monitor-Konfigurationsoption
osd_pool_erasure_code_stripe_unit
abgerufen. Der Wert für „stripe_width“ eines Pools mit diesem Profil entspricht der Anzahl der Datenblöcke, multipliziert mit diesem Wert für „stripe_unit“.- KEY=VALUE
Schlüssel-/Wertepaare von Optionen für das ausgewählte Löschcode-Plugin.
- --force
Optional. Überschreibt ein vorhandenes Profil mit demselben Namen und ermöglicht die Einstellung eines nicht durch 4K teilbaren Werts für „stripe_unit“.
19.3.2 Entfernen eines Löschcode-Profils #
Mit folgendem Kommando entfernen Sie das unter NAME angegebene Löschcode-Profil:
#
ceph osd erasure-code-profile rm NAME
Wenn ein Pool auf das Profil verweist, kann das Profil nicht gelöscht werden.
19.3.3 Abrufen der Details eines Löschcode-Profils #
Mit folgendem Kommando rufen Sie Details für das unter NAME angegebene Löschcode-Profil ab:
#
ceph osd erasure-code-profile get NAME
19.3.4 Auflisten von Löschcode-Profilen #
Mit folgendem Kommando rufen Sie eine Liste der Namen aller Löschcode-Profile ab:
#
ceph osd erasure-code-profile ls
19.4 Markieren von Erasure Coded Pools mit RADOS-Blockgerät #
Setzen Sie ein entsprechendes Tag, wenn Sie einen EC Pool als RBD-Pool kennzeichnen möchten:
cephuser@adm >
ceph osd pool application enable rbd ec_pool_name
RBD kann Image-Daten in EC Pools speichern. Der Image Header und die Metadaten müssen jedoch weiterhin in einem reproduzierten Pool gespeichert werden. Nehmen wir an, Sie verfügen zu diesem Zweck über einen Pool namens „rbd“:
cephuser@adm >
rbd create rbd/image_name --size 1T --data-pool ec_pool_name
Sie können das Image normalerweise wie jedes andere Image verwenden, außer dass alle Daten im Pool ec_pool_name gespeichert werden statt im „rbd“-Pool.