ceph storage cluster

Ceph ist eine in „die Breite“ skalierende software-basierte Storagelösung. Es können Einzelfestplatten in handelsüblichen Computern zu einem ausfallsicheren Cluster vereint werden. Alle folgenden Zugriffsmethoden werden intern auf Objekte abgebildet.

  • librados: Direktzugriff für Anwendungen, Binding for div. Sprachen.
  • RadosGW: bucket-basiertes REST-Gateway, S3 und Swift-kompatibel. Die meisten Amazon S3 features werden unterstütztunterstützte S3 Operationen, die fehlende S3 Bucket Notification lässt sich mit ggf. mit s3gw-haproxy nachrüsten
  • RDB: „verteiltes“ Blockgerät (Linux-Kernelmodul ab 2.6.39 möglich und/oder Quemu/KVM-Treiber) zum Exklusivmount von Clients, oder mit extra Aufwand (NFS, Clusterfähiges FS, iSCSI bei nicht *nix-Betriebssystemen wie Windows oder Vmware) multi-userfähig
  • Ceph FS: Posix-kompatibles Dateisystem (FUSE) für Multisystemzugriff, langsamer bei FUSE

Mit Ceph Nano existiert eine auf Docker basierende und einzeln läuffähige Demo-Instanz von Ceph.

http://docs.ceph.com/docs/luminous/glossary/

  • CRUSH-Algorithmus: Algorithmus zur Bestimmung des Ablageortes eines Objektes (macht eine Abfrage an einen Indexdienst überflüssig)
  • Placement Group (PG): logische Gruppierung von Objekten, die jeweils auf dem gleichen Satz von physikalischen Geräten gespeichert werden, typischer„ Wert liegt bei etwa 100 PGs pro OSD?
  • Pools: Standardpool namens „data“, eine Art mointpoint zur logischen Gliederung. erlauben individuelle Einstellungen u.a. bei der Redundanz (von striping bis x-faches mirroring)
  • Mirroring: Anzahl der Kopien im Cluster (Ausfallsicherheit, Erhöhung der Lesegeschwindigkeit). Redundanz von 2 heißt: 2 Kopien im Cluster
  • Replikation: Faktor der Redundanz multipliziert linear den Speicherbedarf.
  • striping:
    • Stripe Units: Größe der Daten
    • Objektgröße: ganzzahliges Vielfaches der Stripe-Unit-Größe. Legt fest wann die maximale Objektgröße erreicht ist und eine neue Objektgruppe angefangen wird.
    • Stripe-Anzahl: bei 1 wird ein Objekt bis zur maximalen Objektgröße benutzt und dann ein neues Objekt angelegt. D.h. es findet keine Verbesserung der (Schreib-) Geschwindigkeit statt bei Werten größer 1 werden x Objekte (auf unterschiedlichen OSDs) erzeugt und nacheinander (in der Größe Stripe Units) befüllt.
  • cluster map (verwaltet vom MON): Liste bestehend aus Monitors, OSD, PG, Crush, MDS
  • Erasure coding: Redundanz kann „errechnet“ werden - auf Kosten von Geschwindigkeit (Durchsatz) und CPU-Belastung. Eher für selten benutzte oder leistungsunkritische Daten Sinn.
  • Node: Server/Node/Host: einzelne Maschine
  • Ceph OSD:
    • Überwachung der Verfügbarkeit des von ihm betreuten OSD (wenn nötig recovery und rebalancing)
    • Management der Netzwerkkommunikation mit Ceph-Clients und anderen OSD Daemons.
    • Integritätschecks („Scrubbing“)
    • Überwachung/Sicherstellung Objektredundanz (erster angesprochener OSD übermitteln Daten weiter und meldet Erfolg)
  • Ceph-Monitor (mind. 1 besser 2+)
    • erstellt Cluster-Map (=Gesamtbeschreibung des Clusterzustands)
      • Status und Adressen aller OSD Daemons, Monitore und Metadata-Server
      • Paxos-Algorithmus votet nodes raus Clients kontaktieren den Monitor für die Cluster-Map
    • Ceph Metadata Server (MDS)
    • manager daemon mgr (ceph luminous+ builds >= v12.x)

Was man allgemein wissen muss:

  • Lesezugriffe werden nicht parallel auf auf allen OSD ausgeführt (die Kopien haben), sondern nur auf dem lt. CRUSH MAP primär zuständigen OSD
  • journaling führt zur Halbierung der I/O wenn dafür kein extra Gerät gewählt wurde (zuerst wird sogar mit O_DIRECT and O_DSYNC geschrieben), hier sind dedizierte SSDs die erste Wahl. Alternativ bluestore.
  • scrubbing führt zu Leistungseinbrüchen, die Intervalle sollten angepasst werden:
    [global]
    # 1 day: 86400
    # 1 week: 604800
    # 30days: 2592000
    osd scrub load threshold = 0.5
    osd scrub min interval = 86400
    osd scrub max interval = 604800
    osd deep scrub interval = 2592000
    osd scrub during recovery = false
    # only between hours 1 and 8:
    osd scrub begin hour = 1
    osd scrub end hour = 8
  • kleine Cluster (wenige Node, wenige Datenträger → OSDs) sind etwas ungünstig in manchen Szenarien (man landet schneller bei „full“, besonders wenn die Kapazitäten ungleich verteilt sind)
  • es gibt keine asynchrone Replikation (mit Ausnahme von rbd-mirroring), d.h. erst die Daten es in der geforderten Replikation in den Journalen angekommen sind, wird die I/O-Aktion erfolgreich
  • über CRUSH-Rule kann die geforderte örtliche Verteilung (Datenzentren, Brandabschnitte) eingestellt werden, dazu müssen die Verbindung performant genug sein

Anforderungen allgemein:

  • CPU (spezieller bei erasure) so gut wie es noch sinnvoll ist
  • mind. 2x 1Gbit sind (idealerweise mehr) da Client das eine und der Cluster ein anderes (privates) Netzwerk) unterschiedliche Geräte für das Betriebssystem und den Komponenten jeweils auch
  • passenderer Linux I/O-Scheduler (wie deadline statt cfq)

Komponenten:

  • OSD (1+, ungerade Anzahl!)
    • Normalbetrieb: 500M per daemon, aber bei recovery/rebalancing: ~1GB RAM pro 1TB storage!
    • ~1GB Speicher für das Journal (SSD!) - Schreibgeschwindigkeit > 1Gbit/s (d.h. ~125MB/s)
  • mds:
    • 1 GB RAM per daemon
  • Mon
    • 1 GB RAM per daemon
    • ruhig auf extra Hardware oder maximal mit client drauf, die Ressourcen-Anforderungen sind moderat/gering
    • extra device bzw. nicht device mit OSD teilen da fsyncs OSDs negativ beeinflussen können
  • RBD Client: Kernel 4.5+ für CEPH_FEATURE_NEW_OSDOPREPLY_ENCODING
  • Journale
    • SSD (NVMe?)
    • hohe IOPs bei zufälligen und massiv parallelen kleinen Schreibvorgängen
    • hohe write endurance

Links:

Benchmarks

rados bench: Installation aus Paketquelle: https://download.ceph.com/

ceph osd pool create scbench 100 100
rados bench -p scbench 10 write --no-cleanup
rados bench -p scbench 10 seq
rados bench -p scbench 10 rand
rados -p scbench cleanup

http://tracker.ceph.com/projects/ceph/wiki/Benchmark_Ceph_Cluster_Performance

Wartungsmodus

Bei geplante Wartungen (reboots, …) kann der Cluster in einen „Wartungsmodus“ geschaltet werden, der verhindert das Reparaturaktionen wie rebalancing von alleine starten:

Anschalten:

ceph osd set noout

Ausschalten:

ceph osd unset noout

Dienste verwalten

Operating a Cluster - Running Ceph with systemd

sudo systemctl start ceph.target
 
# nach Typ:
sudo systemctl restart ceph-osd.target
sudo systemctl restart ceph-mon.target
sudo systemctl restart ceph-mds.target

scrubbing temporär deaktivieren

An:

ceph osd set noscrub
ceph osd set nodeep-scrub

Aus:

ceph osd unset noscrub
ceph osd unset nodeep-scrub

Placement Groups bleiben im activating status bei luminous

Anzahl der placement groups per OSD anzeigen:

ceph osd df
# nach Änderung restart osd + mon
[global]
mon_max_pg_per_osd = 500

https://blog.widodh.nl/2018/01/placement-groups-with-ceph-luminous-stay-in-activating-state/

  • ceph osd stat
  • ceph mon stat
  • ceph osd df
  • ceph osd pool stats
  • iostat -x <list of /dev/disks> 1

ceph exporter

ceph exporter exportiert Metriken z.B. nach Prometheus.

Zabbix-Integration in Luminous

https://ceph.com/community/new-luminous-zabbix/ Ceph Manager Dashboard v2

Konfiguration (gilt global und wird vom MGR ausgeführt):

ceph mgr module enable zabbix
# statt 60s alle 10s Daten senden:
ceph zabbix config-set interval 10
ceph zabbix config-set identifier HOSTNAME-VON-CEPH-IN-ZABBIX
ceph zabbix config-set zabbix_host IP-ODER-FQDN-VOM-ZABBIX-SERVER

Testen:

ceph zabbix send

Logs:

grep -i zabbix /var/log/ceph/ceph-mgr.ceph1.log

Nagios/Icinga

object-backup

Methode 1: rados cppool (readonly-Zugriff für Client notwendig):

rados cppool $pool $pool.new
ceph osd pool rename $pool $pool.old
ceph osd pool rename $pool.new $pool

Methode 2: Rados Export/Import

rados export --create testpool tmp_dir
rados import tmp_dir newpool
# Stop All IO
# And redo a sync of modified objects
rados export --workers 5 testpool tmp_dir
rados import --workers 5 tmp_dir newpool

Methode 3: Cache Tier drüberlegen und Objekte in neuen pool migrieren

export/import rados images

Netzwerksetup und Firewall-Freigaben

  • Ceph Client → public network
  • public network (eigene Netzwerkkarte empfohlen):

Description: The IP address and netmask of the public (front-side) network (e.g., 192.168.0.0/24). Set in . You may specify comma-delimited subnets.

[global]
public network = ip-address}/{netmask} [, {ip-address}/{netmask}]
  • Monitors: 6789 TCP
  • OSDs Kummunikation: range 6800:7300 TCP
  • cluster netzwerk (eigene Netzwerkkarte empfohlen; sollte nicht vom public network oder Internet erreichbar sein)
    [global]
    cluster network = ip-address}/{netmask} [, {ip-address}/{netmask}]

siehe auch: Ceph Networking details

Releases: http://docs.ceph.com/docs/master/releases/ Get Packages: http://docs.ceph.com/docs/master/install/get-packages/

Destroy Cluster

ceph-deploy purge node1 node2 node3
ceph-deploy purgedata node1 node2 node3
ceph-deploy forgetkeys
rm ceph.*

Hosts vorbereiten

ceph-deploy braucht einen Benutzer auf dem System der

  • via SSH pubkey-Zugriff (Passwort reicht nicht) erreichbar ist
  • nicht gleichlautend mit dem ceph-System-Benutzer ist
  • per sudo root-Rechte erreichen kann (ohne Passwortabfrage)

Hier im Beispiel wird

useradd -d /home/cephdeploy -m cephdeploy
# Zufallspasswort setzen
passwd cephdeploy
 
echo "cephdeploy ALL = (root) NOPASSWD:ALL" | sudo tee /etc/sudoers.d/cephdeploy
 
mkdir /home/cephdeploy/.ssh
# pubkey hinterlegen: ssh-copy-id -i ~/.ssh/id_dsa.pub cephdeploy@CEPH-HOST
vi /home/cephdeploy/.ssh/authorized_keys
chown cephdeploy /home/cephdeploy/.ssh
chown cephdeploy /home/cephdeploy/.ssh/authorized_keys
chmod 700 /home/cephdeploy/.ssh
chmod 600 /home/cephdeploy/.ssh/authorized_keys

Alle beteiligten Nodes sollten per /etc/hosts die IPs fest hinterlegt haben um DNS-Problemen vorzubeugen.

node1   1.2.3.4
node2   1.2.3.5
node3   1.2.3.6

Für die Ceph-Nodes eine SSH-Config hinterlegen (.ssh/config):

# ======== CEPH=============

Host node1
   Hostname node1.domain.tld
   User cephdeploy

Host node2
   Hostname node2.domain.tld
   User cephdeploy

Host node3
   Hostname node3.domain.tld
   User cephdeploy

Ceph Installation auf admin-Rechnern und Nodes

Ceph packages

wget -q -O- 'https://download.ceph.com/keys/release.asc' | sudo apt-key add -

(debian) minimal-system:

  • ca-certificates vorher installieren)
  • sudo apt-get install apt-transport-https

    sonst “method driver /usr/lib/apt/methods/https could not be found„)

benötigte Pakete:

  • Debian Jessie+:
    sudo apt-get install software-properties-common
  • Debian Wheezy und vorher:
    sudo apt-get install python-software-properties
  • Debian stretch:
    sudo apt-add-repository 'deb https://download.ceph.com/debian-luminous/ stretch main'
  • Ubuntu 16.04:
    sudo apt-add-repository 'deb https://download.ceph.com/debian-luminous/ xenial main'

    Das resultiert auf xenial in:

    deb http://security.ubuntu.com/ubuntu xenial-security main restricted
    # deb-src http://security.ubuntu.com/ubuntu xenial-security main restricted
    deb http://security.ubuntu.com/ubuntu xenial-security universe
    # deb-src http://security.ubuntu.com/ubuntu xenial-security universe
    deb http://security.ubuntu.com/ubuntu xenial-security multiverse
    # deb-src http://security.ubuntu.com/ubuntu xenial-security multiverse
    deb https://download.ceph.com/debian-luminous/ xenial main
    # deb-src https://download.ceph.com/debian-luminous/ xenial main
  • Ubuntu 18.04:
    sudo apt-add-repository 'deb https://download.ceph.com/debian-luminous/ bionic main'

    Das resultiert auf bionic in:

    deb http://security.ubuntu.com/ubuntu bionic-security main restricted
    # deb-src http://security.ubuntu.com/ubuntu bionic-security main restricted
    deb http://security.ubuntu.com/ubuntu bionic-security universe
    # deb-src http://security.ubuntu.com/ubuntu bionic-security universe
    deb http://security.ubuntu.com/ubuntu bionic-security multiverse
    # deb-src http://security.ubuntu.com/ubuntu bionic-security multiverse
    deb http://archive.canonical.com/ bionic partner
    # deb-src http://archive.canonical.com/ bionic partner
    deb https://download.ceph.com/debian-luminous/ bionic main
    # deb-src https://download.ceph.com/debian-luminous/ bionic main

„Ceph on ARM processors requires Google’s memory profiling tools (google-perftools). The Ceph repository should have a copy at https://download.ceph.com/packages/google-perftools/debian.

  • Repository hinzufügen:
    echo deb https://download.ceph.com/packages/google-perftools/debian  $(lsb_release -sc) main | sudo tee /etc/apt/sources.list.d/google-perftools.list"

Allgemein: wget -q https://download.ceph.com/debian-{release}/pool/main/c/ceph/ceph_{version}{distro}_{arch}.deb

ceph installieren:

sudo apt install ceph

Cluster erstellen (Admin-Rechner)

ceph-deploy installieren:

sudo apt install ceph-deploy

Projektdirectory anlegen

mkdir ceph-cluster1
cd ceph-cluster1
ssh-keygen -f ./sshkey -b 3072

(keine passphrase)

den sshkey für ceph-deploy zu den Nodes übertragen:

ssh-copy-id -i sshkey.pub cephdeploy@node1
ssh-copy-id -i sshkey.pub cephdeploy@node2
ssh-copy-id -i sshkey.pub cephdeploy@node3

Nodes erzeugen

ceph-deploy new node1 node2 node3
ceph-deploy install node1 node2 node3

ersten Mon erstellen (besser gleich 3)

ceph-deploy mon create-initial

lokales Projektverzeichnis enthält nun:

ceph.client.admin.keyring
ceph.bootstrap-mgr.keyring
ceph.bootstrap-osd.keyring
ceph.bootstrap-mds.keyring
ceph.bootstrap-rgw.keyring
ceph.bootstrap-rbd.keyring

admin nodes erzeugen(Verwaltung)

# config für cli-tools (administration) auf hosts verteilen ( wenn das so gewünscht ist; diese müssen vorbereitet sein + mind. ceph-common installiert haben):

ceph-deploy admin node1 node2 node3

:!: auf admin-Instanzen kann „ceph health“ (kurz) oder „ceph -s“ (ausführlich) ausgeführt werden.

manager daemon

manager daemon (ab „luminous“ nötig) erstellen:

ceph-deploy mgr create node1

OSDs erzeugen

http://docs.ceph.com/docs/luminous/rados/operations/add-or-rm-osds

:!: auf jedem node muss mindestens ein Blockdevice frei sein. Das sollten einfache/unabhängige Festplatten sein (kein remote-storage oder raid!) Wenn kein bluestore benutzt wird dann sollte zusätzlich pro Node ein Gerät (SSD) für die journale der OSDs partitioniert werden, da dort die Daten zuerst geschrieben werden.

Variante 1: Test mit loop-devices

Besonderheit: überleben den reboot nicht, hier kein journal (daher NICHT für produktiv-Cluster benutzen, eher für einen ersten Test in vServern).

dd if=/dev/zero bs=1024000 count=10240 >> /ceph-osd.img
losetup /dev/loop0 /ceph-osd.img
ceph-deploy osd create node1:loop0 node2:loop0 node3:loop0
Variante 2: filestore

Reale devices per /dev/by-uuid oder lvm volumes (empfohlen) einbinden, siehe auch: http://docs.ceph.com/docs/master/ceph-volume/#migrating .

LVM-Beispiel:

  • in der Volume-group „vg_OSDs“ das logical volume „lv_OSD_A“ angelegt (…B, …C),
  • in der Volume-group „vg_journal“ jeweils ein logical Volume für das journal „lv_journal_A“ (…B, …C)

Erster Schritt: LVM-Geräte müssen per prepare vorbereitet werden (xfs-Formatierung):

ceph-volume lvm prepare --filestore --data vg_OSDs/lv_OSD_A --journal vg_journal/lv_journal_A

In einem realen Setup bevorzuge ich den Namen aus Festplattenmodell und Seriennummer zu bilden (vg_osd_$Modell_$Seriennumer)1). Das erleichtert den Austausch bei Defekten.

In der Ausgabe von ceph-osd findet sich sowohl die neue osd.$ID als auch die osd-uuid (“–osd-uuid“). Alternativ sucht man sich einfach den neuen Namen aus dem ceph osd tree heraus und fragt die uuid ab (hier ist der neue OSD der osd.4):

ceph-osd -i 4  --get-osd-fsid
6b0e9607-82d8-4c7f-99f6-89a4235225d4

Zweiter Schritt: OSD Aktivieren (Schema: ceph-volume lvm activate –filestore $ID $OSD-FSID):

ceph-volume lvm activate --filestore 4 6b0e9607-82d8-4c7f-99f6-89a4235225d4

Die alternativ beschriebene 1-step-Methode mit ceph-deploy funktioniert nicht zuverlässig2):

ceph-deploy osd create node1:vg_OSDs/lv_OSD_A:vg_journal/lv_journal_A
Variante 3: bluestore

bluestore ist ab luminous möglich und empfohlen:

Beispiel: leere Festplatte /dev/sdd

parted /dev/sdd
(parted) mkpart
Partition name?  []?                                                      
File system type?  [ext2]?                                                
Start? 2048s                                                              
End? -1s
Warning: You requested a partition from 1049kB to 4001GB (sectors 2048..7814037167).
The closest location we can manage is 1049kB to 4001GB (sectors 2048..7814037134).
Is this still acceptable to you?
Yes/No? y                                                                 
(parted) set 1 lvm on
(parted) quit
ceph-deploy osd create --data /dev/sdd1 node1

manuell auf Host:

ceph-volume lvm create --bluestore --data /dev/sdd1

Skript zur Migration von OSDs

OSD entfernen

Die Entfernung von OSDs ist in „luminous“ leider noch ein manueller Vorgang: http://docs.ceph.com/docs/luminous/rados/operations/add-or-rm-osds/#removing-osds-manual

:!: der Cluster soll nicht „full“ sein, es könnte nicht mehr genug Platz verfügbar sein.

In kleineren Clustern können PGs im Status „active+remapped“ stecken bleiben. Daher kann es besser sein, dem zu entfernenden OSD per reweight rauszunehmen:

ceph osd crush reweight osd.3 0

oder gleich richtig aus:

ceph osd out osd.3

Folgen:

  • rebalance startet: status active+clean → active
  • wenn fertig: status active → active+clean

Stoppen:

systemctl stop ceph-osd@osd.3

Löschen:

ceph osd purge osd.3 --yes-i-really-mean-it

zusätzliche mgr erzeugen

node2 + node3 zum mgr machen:

ceph-deploy mgr create node3

ceph -s zeigt nun:

mgr: node1(active), standbys: node2, node3

Optional: Ceph Object Gateway

FIXME Testen

ceph-deploy rgw create node1 ...
# port 7480 ändern:
[client]
rgw frontends = civetweb port=80

Optional: mehr mon hinzufügen (Anzahl ungerade!)

FIXME

ceph-deploy mon add node2 node3

Möglichweise tritt die folgende Fehlermeldung auf:

[ceph3][WARNIN] node2 is not defined in `mon initial members`
[ceph3][WARNIN] monitor node2 does not exist in monmap
mon not present in monmap or ceph.conf

Lösung:

auch: http://tracker.ceph.com/issues/5195

zuerst pool erstellen

http://docs.ceph.com/docs/master/rados/operations/pools/

ceph osd pool create pool1 100 100 replicated

oder

ceph osd pool create pool1 100 100 erasure

List pools:

ceph osd lspools
1 pool1,

pool einer Anwendung zuweisen

In aktuellen ceph-Versionen muss ein pool einer Anwendung zugewiesen werden:

  1. pool-name: pool1
  2. application-name: cephfs, rbd, rgw, freie Eingabe

Hier Zuweisung auf cephfs:

ceph osd pool application enable pool1 cephfs

Pool löschen

Zum löschen eines Pools muss der Namen 2x hintereinander geschrieben werden, gefolgt von „–yes-i-really-really-mean-it“.

ceph osd pool delete pool1 pool1 --yes-i-really-really-mean-it

Seit der Version „hammer“ funktioniert dies nicht mehr direkt, die folgende Fehlermeldung erscheint

Error EPERM: pool deletion is disabled; you must first set the mon_allow_pool_delete config option to true before you can destroy a pool

Entweder man setzt die Option global

[global]
...
mon_allow_pool_delete = true

oder auf mon-Ebene:

[mon.1]
...
mon_allow_pool_delete = true

Anschließend müssen die OSDs neu gestartet werden:

systemctl restart ceph-mon.target

Einzelne Pools sollten gegen versehentliches löschen geschützt werden:

ceph osd pool set $pool nodelete true

Hintergrund der Änderung

Pool umbenennen

ceph osd pool rename pool-alt pool-neu

Pool Statistics

rados df
ceph osd dump | grep 'replicated size'
 pool 1 'pool1' replicated size 3 min_size 2 crush_rule 0 object_hash rjenkins pg_num 100 pgp_num 100 last_change 17 flags hashpspool stripe_width 0 application rbd

Pool Snapshot

  • anlegen:
    ceph osd pool mksnap {pool-name} {snap-name}
  • löschen:
    ceph osd pool rmsnap {pool-name} {snap-name}

FIXME Snapshot benutzen?

Pool Quota

ceph osd pool set-quota data max_objects 10000

# 1 Gigabyte:

ceph osd pool set-quota data max_bytes 1073741824

Quota anzeigen:

ceph osd pool get-quota data

einen pool für rbd nutzbar machen

Zuweisung eines pools („pool1“) an rbd:

ceph osd pool application enable pool1 rbd

Initialisieren (auf admin-node:)

rbd pool init pool1

:!: Benutzerverwaltung Block-device: Standard ist „admin“ → sollte feiner angelegt werden! http://docs.ceph.com/docs/master/rbd/rados-rbd-cmds/#create-a-block-device-user

rbd Image anlegen

zum speichern muss der client

  1. pool
  2. object namen

angeben.

Siehe auch Objekte abspeichern

Schema:

rbd create --size {megabytes} {pool-name}/{image-name}
rbd create --size 2048 pool1/image1 --image-feature fast-diff

Image Aktionen

Images eines pools (pool1) anzeigen (Ergebnis: image1):

rbd ls pool1
 image1

Informationen anzeigen:

rbd info pool1/image1
"rbd image 'image1':
        size 2048 MB in 512 objects
        order 22 (4096 kB objects)
        block_name_prefix: rbd_data.104b74b0dc51
        format: 2
        features: layering, exclusive-lock, object-map, fast-diff, deep-flatten
        flags: 
        create_timestamp: Fri Feb  9 00:56:19 2018"

resize:

  • mehr (3072 MB):
    rbd resize --size 3072 pool1/image1
  • weniger (1024 MB):
    rbd resize --size 1024 pool1/image1 --allow-shrink

löschen:

  • sofort:
    rbd rm pool1/image1
  • löschen (Papierkorb):
    rbd trash mv pool1/image1
  • Wiederherstellen:
    rbd trash restore pool1/image1

weitere Befehle: http://docs.ceph.com/docs/master/man/8/rbd/

rbd und erasure coding

Erasure-coding verspricht einen geringeren overhead auf Kosten von CPU-Zeit beim recovery.

Im Zusammenhang von rbd (und cephfs) gibt es aber mehrere Vorraussetzungen:

  • das luminous v12.2.x eingesetzt wird
  • das ein pool „overwrite support“ hat
    librbd::image::CreateRequest: 0x55e60878a6f0 handle_validate_overwrite: pool missing required overwrite support

    Dies ist standardmäßig nicht der Fall und muss daher explizit aktiviert werden:

    ceph osd pool set mein_erasure_pool allow_ec_overwrites true
  • die OSDs müssen mit bluestore eingerichtet worden sein. Mit filestore geht das nicht:
    Error EINVAL: pool must only be stored on bluestore for scrubbing to work: osd.2 uses filestore
  • die omap-property wird nicht unterstützt 3) Deswegen gibt es die spezielle „data pool“ property.
  • aus den release-Notes release Notes:
    ((v12.2.0 Luminous))
    * *Erasure coded* pools now have `full support for overwrites
        <../rados/operations/erasure-code/#erasure-coding-with-overwrites>`_,
        allowing them to be used with RBD and CephFS.
    
    * rbd and cephfs can use erasure coding with bluestore. This may be
      enabled by setting ``allow_ec_overwrites`` to ``true`` for a pool. Since
      this relies on bluestore's checksumming to do deep scrubbing,
      enabling this on a pool stored on filestore is not allowed.

Wenn alle diese Vorraussetzungen erfüllt sind, zeigt diese Anleitung wie es geht.

Hier abgewandelt ein minimal redundantes setup (profil ec-31-profile, zu profilen siehe Erasure code profiles):

ceph osd erasure-code-profile set ec-31-profile k=3 m=1 crush-failure-domain=host
ceph osd pool create $poolname 128 erasure ec-31-profile
ceph osd pool set $poolname allow_ec_overwrites true
ceph osd pool $poolname enable rbd ec-31-profile
rbd create $poolname/$imagename --size 1T --data-pool $poolname

rbd-kernel-module

http://docs.ceph.com/docs/luminous/rbd/rbd-ko/

rbd map share --pool pool1

Möglicherweise müssen features abgeschaltet werden, die der Client nicht unterstützt:

rbd: image share: image uses unsupported features: 0x38

(hier deep-flatten/layering, siehe rbd info):

rbd feature disable pool1/rbd1 deep-flatten
--image-feature feature-name

    Specifies which RBD format 2 feature should be enabled when creating an image. Multiple features can be enabled by repeating this option multiple times. The following features are supported:

        layering: layering support
        striping: striping v2 support
        exclusive-lock: exclusive locking support
        object-map: object map support (requires exclusive-lock)
        fast-diff: fast diff calculations (requires object-map)
        deep-flatten: snapshot flatten support
        journaling: journaled IO support (requires exclusive-lock)

U.U geht das nicht im laufenden Betrieb:

rbd: failed to update image features: 2018-02-18 22:01:59.941776 7fa8d9ae70c0 -1 librbd::Operations: cannot update immutable features

daher neu anlegen:

rbd create pool1/test2 -s 1024 --image-format 2 --image-feature exclusive-lock
rbd info pool1/test2
rbd image 'test2':
	size 1024 MB in 256 objects
	order 22 (4096 kB objects)
	block_name_prefix: rbd_data.107c2ae8944a
	format: 2
	features: exclusive-lock
	flags: 
rbd feature disable pool1/test2 exclusive-lock

image mounten/unmounten/anzeigen

gemountete image anzeigen:

rbd showmapped
id pool    image   snap device    
0  pool1 test2 -    /dev/rbd0 

mounten:

rbd map pool1/test2

das benutzte device wird von rbd zurückgemeldet:

/dev/rbd0

unmounten:

rbd unmap pool1/test2

Client zu alt

[So Feb 18 22:02:28 2018] libceph: mon0 1.2.3.4:6789 feature set mismatch, my 106b84a842a42 < server's 40106b84a842a42, missing 400000000000000
[So Feb 18 22:02:28 2018] libceph: mon0 1.2.3.4:6789 missing required protocol features

CEPH_FEATURE_NEW_OSDOPREPLY_ENCODING braucht Kernel 4.5+ - Ubuntu 16.04 hat Linux 4.4 ! → Codes siehe http://cephnotes.ksperis.com/blog/2014/01/21/feature-set-mismatch-error-on-ceph-kernel-client (aktuelle Tabelle siehe kernel sources in features.h).

Lösung:

  1. Client mit höherer Kernel-version einsetzen
  2. rbd-fuse benutzen (Leistungsverlust)
  3. die crush-tuneables auf eine alte Versionen zurückschalten (Auswirkungen siehe http://docs.ceph.com/docs/master/rados/operations/crush-map/#tunables)
    ceph osd crush tunables hammer

rbd trim

Rbd bildet Blockdevices auf Ceph-Objekten ab. Gelöschte Dateien führen daher nicht dazu das die ceph-Objekte freigegeben werden sondern diese bestehen weiter und werden wiederverwendet. Bei vielen kleinen Dateien kann dies aber deutlich bei der Arbeitsgeschwindigkeit merkbar sein, in diesem Fall ist eine fallweise Ausführung (z.B. täglich) sinnvoller.

mount -o discard /dev/rbd0 /media/rbd0
fstrim /media/rbd0

rbd-fuse

sudo aptitude install rbd-fuse

„rbd-fuse is a FUSE (File system in USErspace) client for RADOS block device (rbd) images. Given a pool containing rbd images, it will mount a userspace filesystem allowing access to those images as regular files at mountpoint.“

# mkdir  /media/rdb
# chown ich.gruppe  /media/rdb
rbd-fuse -c /pfad/zu/projektverzeichnis/ceph.conf -p pool1 /media/rdb
fusermount -u /media/rdb

Aktuell ist ceph nicht für den Betrieb im „freien“ Internet geeignet, es müssen Maßnahmen getroffen werden um ceph abzusichern:

At the moment, none of the Ceph authentication protocols provide secrecy for messages in transit. Thus, an eavesdropper on the wire can hear and understand all data sent between clients and servers in Ceph, even if it cannot create or alter them. Further, Ceph does not include options to encrypt user data in the object store. Users can hand-encrypt and store their own data in the Ceph object store, of course, but Ceph provides no features to perform object encryption itself. Those storing sensitive data in Ceph should consider encrypting their data before providing it to the Ceph system.

Quelle: http://docs.ceph.com/docs/mimic/rados/operations/user-management/

auth_cluster_required = cephx auth_service_required = cephx auth_client_required = cephx

Darüber hinaus können wenigstens Signaturen aktiviert werden:

# http://docs.ceph.com/docs/luminous/rados/configuration/auth-config-ref/#signatures
cephx require signatures = true
 # -> this needs: Kernel 3.19 AND ceph Version at least v0.54 (Argonaut is too old)
cephx cluster require signatures = true
cephx service require signatures = true

Client Rechte beschränken

server seite

Client „CLIENT1“ anlegen und Rechte vergeben:

ceph auth get-or-create client.CLIENT1 mds 'allow r' mon 'allow r' osd 'allow rw pool=TESTPOOL'

(ob mds 'allow r' nötig ist muss ich noch testen)

Beispiel für eine sichere RDB-ACL (Quelle: http://tracker.ceph.com/issues/9733):

ceph auth caps client.CLIENT1 mon 'allow r' osd 'allow x pool=TESTPOOL object_prefix rbd_children, allow rwx pool=TESTPOOL object_prefix rbd_header., allow rwx pool=TESTPOOL object_prefix rbd_id., allow rw pool=TESTPOOL object_prefix rbd_data.'

client seite

Erstens ceph installiert sein und eine config vorhanden sein /etc/ceph/ceph.conf:

 
[global]
fsid = f8ebdabe-2170-2562-97f2-85bb62efcbfd
mon_host = node1, node2, node3
auth_cluster_required = cephx
auth_service_required = cephx
auth_client_required = cephx

Dann muss ein keyring für den Zugriff angelegt worden sein:

ceph auth print-key client.CLIENT1 > /etc/ceph/client.CLIENT1.keyring

Client Connect (hier mit RBD):

rbd map TESTPOOL/image1 --id CLIENT1 --keyfile /etc/ceph/client.CLIENT1.keyring

--id und --keyfile können auch in eine Umgebungsvariable CEPH_ARGS exportiert werden:

CEPH_ARGS="--id CLIENT1 --keyfile /etc/ceph/client.CLIENT1.keyring"
export CEPH_ARGS
echo $CEPH_ARGS

Rechte verändern

Rechte müssen (absolut) neu gesetzt werden:

ceph auth caps client.CLIENT1 mds 'allow r' mon 'allow r' osd 'allow rw pool=TESTPOOL'

Bei Erfolg Meldung „updated caps for client.CLIENT1“.


1)
abrufbar mit
smartctl -i /dev/$GERÄT
2)
Stand 02/2018 Luminous v12.2
3)
„which allows you to store arbitrary key/value data inside each object“