Erfahrung mit CEPH

Wenn mehr Daten vorhanden sind, als auf eine Festplatte passen, ist es an der Zeit, über RAID nachzudenken. Als Kind hörte ich oft von meinen Älteren: „Eines Tages wird RAID der Vergangenheit angehören, Objektspeicher wird die Welt füllen und man weiß nicht einmal, was CEPH ist“, also das Erste in meinem unabhängigen Leben war, meinen eigenen Cluster zu erstellen. Der Zweck des Experiments bestand darin, sich mit der internen Struktur von Ceph vertraut zu machen und den Umfang seiner Anwendung zu verstehen. Wie gerechtfertigt ist der Einsatz von Ceph im Mittelstand und in Kleinbetrieben? Nach mehreren Betriebsjahren und einigen irreversiblen Datenverlusten entstand die Einsicht in die Feinheiten, dass nicht alles so einfach ist. Die Besonderheiten von CEPH stellen ein Hindernis für seine weitverbreitete Einführung dar und führen dazu, dass Experimente in eine Sackgasse geraten sind. Nachfolgend finden Sie eine Beschreibung aller durchgeführten Schritte, des erzielten Ergebnisses und der daraus gezogenen Schlussfolgerungen. Wenn sachkundige Leute ihre Erfahrungen teilen und einige Punkte erklären, bin ich dankbar.

Hinweis: Kommentatoren haben in einigen Annahmen schwerwiegende Fehler festgestellt, die eine Überarbeitung des gesamten Artikels erfordern.

CEPH-Strategie

Der CEPH-Cluster kombiniert eine beliebige Anzahl K von Festplatten beliebiger Größe und speichert Daten darauf, wobei jedes Stück (standardmäßig 4 MB) eine bestimmte Anzahl N-mal dupliziert wird.

Betrachten wir den einfachsten Fall mit zwei identischen Festplatten. Daraus können Sie entweder RAID 1 oder einen Cluster mit N=2 zusammenstellen – das Ergebnis wird das gleiche sein. Wenn es drei Festplatten gibt und diese unterschiedlich groß sind, ist es einfach, einen Cluster mit N=2 zusammenzustellen: Einige der Daten befinden sich auf den Festplatten 1 und 2, einige auf den Festplatten 1 und 3 und wieder andere auf den Festplatten 2 und 3 auf 5 und 5, während RAID nicht (Sie können ein solches RAID zusammenstellen, aber es wäre eine Perversion). Wenn noch mehr Festplatten vorhanden sind, ist es möglich, RAID 3 zu erstellen; CEPH hat ein Analogon – erasure_code, was den frühen Konzepten der Entwickler widerspricht und daher nicht berücksichtigt wird. Bei RAID XNUMX wird davon ausgegangen, dass eine kleine Anzahl an Laufwerken vorhanden ist, die sich alle in gutem Zustand befinden. Wenn einer ausfällt, müssen die anderen warten, bis die Festplatte ausgetauscht und die Daten darauf wiederhergestellt werden. CEPH, mit N>=XNUMX, empfiehlt die Verwendung alter Festplatten, insbesondere wenn Sie mehrere gute Festplatten zum Speichern einer Kopie der Daten behalten und die verbleibenden zwei oder drei Kopien auf einer großen Anzahl alter Festplatten speichern, dann die Informationen wird sicher sein, da vorerst neue Festplatten am Leben sind - es gibt keine Probleme, und wenn eine davon kaputt geht, ist der gleichzeitige Ausfall von drei Festplatten mit einer Lebensdauer von mehr als fünf Jahren, vorzugsweise von verschiedenen Servern, äußerst unwahrscheinlich Ereignis.

Die Verteilung der Kopien ist subtil. Standardmäßig wird davon ausgegangen, dass die Daten in mehr (ca. 100 pro Datenträger) PG-Verteilungsgruppen unterteilt sind, die jeweils auf einigen Datenträgern dupliziert sind. Nehmen wir an, K=6, N=2. Wenn zwei beliebige Festplatten ausfallen, gehen garantiert Daten verloren, da sich laut Wahrscheinlichkeitstheorie mindestens ein PG auf diesen beiden Festplatten befindet. Und der Verlust einer Gruppe führt dazu, dass alle Daten im Pool nicht mehr verfügbar sind. Wenn die Festplatten in drei Paare aufgeteilt sind und Daten nur auf Festplatten innerhalb eines Paares gespeichert werden dürfen, ist eine solche Verteilung auch resistent gegen den Ausfall einer Festplatte. Wenn jedoch zwei Festplatten ausfallen, besteht keine Wahrscheinlichkeit für einen Datenverlust 100 %, aber nur 3/15, und selbst im Falle eines Ausfalls von drei Festplatten - nur 12/20. Daher trägt die Entropie bei der Datenverteilung nicht zur Fehlertoleranz bei. Beachten Sie außerdem, dass bei einem Dateiserver freier RAM die Reaktionsgeschwindigkeit deutlich erhöht. Je mehr Speicher in jedem Knoten und je mehr Speicher in allen Knoten vorhanden ist, desto schneller wird es sein. Dies ist zweifellos ein Vorteil eines Clusters gegenüber einem einzelnen Server und noch mehr gegenüber einem Hardware-NAS, in dem nur sehr wenig Speicher eingebaut ist.

Daraus folgt, dass CEPH eine gute Möglichkeit ist, ein zuverlässiges Datenspeichersystem für mehrere Dutzend TB zu erstellen, das mit minimalen Investitionen in veraltete Geräte skaliert werden kann (hier sind natürlich Kosten erforderlich, die jedoch im Vergleich zu kommerziellen Speichersystemen gering sind).

Cluster-Implementierung

Nehmen wir für das Experiment einen ausgemusterten Computer Intel DQ57TM + Intel Core i3 540 + 16 GB RAM. Wir werden vier 2-TB-Festplatten in etwas wie RAID10 organisieren, nach einem erfolgreichen Test werden wir einen zweiten Knoten und die gleiche Anzahl an Festplatten hinzufügen.

Linux installieren. Die Verteilung erfordert Anpassungsfähigkeit und Stabilität. Debian und Suse erfüllen die Anforderungen. Suse verfügt über ein flexibleres Installationsprogramm, mit dem Sie jedes Paket deaktivieren können. Leider konnte ich nicht herausfinden, welche davon weggeworfen werden könnten, ohne das System zu beschädigen. Installieren Sie Debian mit Debootstrap Buster. Die Min-Base-Option installiert ein kaputtes System, dem Treiber fehlen. Der Größenunterschied zur Vollversion ist nicht so groß, dass er stören könnte. Da die Arbeit auf einer physischen Maschine ausgeführt wird, möchte ich Snapshots erstellen, wie auf virtuellen Maschinen. Diese Option wird entweder von LVM oder btrfs (oder xfs oder zfs – der Unterschied ist nicht groß) bereitgestellt. LVM-Snapshots sind keine Stärke. Btrfs installieren. Und der Bootloader befindet sich im MBR. Es macht keinen Sinn, eine 50-MB-Festplatte mit einer FAT-Partition zu überladen, wenn Sie sie in einen 1-MB-Partitionstabellenbereich verschieben und den gesamten Speicherplatz für das System reservieren können. Hat 700 MB auf der Festplatte beansprucht. Ich kann mich nicht erinnern, wie viel die grundlegende SUSE-Installation hat, ich glaube, es sind etwa 1.1 oder 1.4 GB.

Installieren Sie CEPH. Wir ignorieren Version 12 im Debian-Repository und stellen eine direkte Verbindung von der 15.2.3-Site her. Wir befolgen die Anweisungen aus dem Abschnitt „CEPH manuell installieren“ mit den folgenden Einschränkungen:

  • Bevor Sie das Repository verbinden, müssen Sie gnupg wget ca-certificates installieren
  • Nach dem Verbinden des Repositorys, aber vor der Installation des Clusters entfällt die Installation von Paketen: apt -y --no-install-recommends install ceph-common ceph-mon ceph-osd ceph-mds ceph-mgr
  • Bei der Installation von CEPH wird aus unbekannten Gründen versucht, lvm2 zu installieren. Im Prinzip ist es nicht schade, aber die Installation schlägt fehl, sodass CEPH auch nicht installiert wird.

    Dieser Patch hat geholfen:

    cat << EOF >> /var/lib/dpkg/status
    Package: lvm2
    Status: install ok installed
    Priority: important
    Section: admin
    Installed-Size: 0
    Maintainer: Debian Adduser Developers <[email protected]>
    Architecture: all
    Multi-Arch: foreign
    Version: 113.118
    Description: No-install
    EOF
    

Clusterübersicht

ceph-osd – ist für die Speicherung von Daten auf der Festplatte verantwortlich. Für jede Festplatte wird ein Netzwerkdienst gestartet, der Anfragen zum Lesen oder Schreiben von Objekten entgegennimmt und ausführt. Auf der Festplatte werden zwei Partitionen erstellt. Einer davon enthält Informationen über den Cluster, die Festplattennummer und die Schlüssel zum Cluster. Diese 1-KB-Informationen werden einmalig beim Hinzufügen einer Festplatte erstellt und es wurde nie festgestellt, dass sie sich geändert haben. Die zweite Partition hat kein Dateisystem und speichert CEPH-Binärdaten. Bei der automatischen Installation in früheren Versionen wurde eine 100 MB große xfs-Partition für Dienstinformationen erstellt. Ich habe die Festplatte in MBR konvertiert und nur 16 MB zugewiesen – der Dienst beschwert sich nicht. Ich denke, xfs könnte problemlos durch ext ersetzt werden. Diese Partition wird in /var/lib/… gemountet, wo der Dienst Informationen über das OSD liest und auch einen Verweis auf das Blockgerät findet, auf dem die Binärdaten gespeichert sind. Theoretisch können Sie Hilfsdateien sofort in /var/lib/… platzieren und die gesamte Festplatte für Daten reservieren. Beim Erstellen eines OSD über ceph-deploy wird automatisch eine Regel zum Mounten der Partition in /var/lib/… erstellt und dem Ceph-Benutzer werden außerdem Rechte zum Lesen des gewünschten Blockgeräts zugewiesen. Wenn Sie manuell installieren, müssen Sie dies selbst tun; in der Dokumentation steht dies nicht. Es empfiehlt sich außerdem, den Parameter OSD-Speicherziel anzugeben, damit genügend physischer Speicher vorhanden ist.

ceph-mds. Auf einer niedrigen Ebene ist CEPH Objektspeicher. Die Möglichkeit, Speicher zu blockieren, besteht darin, jeden 4-MB-Block als Objekt zu speichern. Die Dateispeicherung funktioniert nach dem gleichen Prinzip. Es werden zwei Pools erstellt: einer für Metadaten, der andere für Daten. Sie werden zu einem Dateisystem zusammengefasst. In diesem Moment wird eine Art Datensatz erstellt. Wenn Sie also das Dateisystem löschen, aber beide Pools behalten, können Sie es nicht wiederherstellen. Es gibt ein Verfahren zum Extrahieren von Dateien nach Blöcken, ich habe es nicht getestet. Für den Zugriff auf das Dateisystem ist der Dienst ceph-mds zuständig. Jedes Dateisystem erfordert eine separate Instanz des Dienstes. Es gibt eine „Index“-Option, mit der Sie den Anschein mehrerer Dateisysteme in einem erstellen können – ebenfalls nicht getestet.

Ceph-mon – Dieser Dienst speichert eine Karte des Clusters. Es enthält Informationen zu allen OSDs, einen Algorithmus zum Verteilen von PGs in OSDs und vor allem Informationen zu allen Objekten (die Details dieses Mechanismus sind mir nicht klar: Es gibt ein Verzeichnis /var/lib/ceph/mon/…/ store.db, es enthält eine große Datei von 26 MB, und in einem Cluster von 105 KB Objekten sind es etwas mehr als 256 Bytes pro Objekt – ich denke, dass der Monitor eine Liste aller Objekte und der PGs speichert, in denen sie befinden sich). Eine Beschädigung dieses Verzeichnisses führt zum Verlust aller Daten im Cluster. Daraus wurde die Schlussfolgerung gezogen, dass CRUSH zeigt, wie sich PGs auf dem OSD befinden und wie sich Objekte auf PGs befinden – sie werden zentral in der Datenbank gespeichert, egal wie sehr die Entwickler dieses Wort meiden. Dies führt dazu, dass wir erstens das System nicht auf einem Flash-Laufwerk im RO-Modus installieren können, da die Datenbank ständig aufgezeichnet wird, für diese eine zusätzliche Festplatte benötigt wird (kaum mehr als 1 GB), zweitens ist eine erforderlich Kopieren Sie diese Basis in Echtzeit. Bei mehreren Monitoren ist die Fehlertoleranz automatisch gewährleistet, in unserem Fall gibt es jedoch nur einen Monitor, maximal zwei. Es gibt ein theoretisches Verfahren zum Wiederherstellen eines Monitors basierend auf OSD-Daten. Ich habe aus verschiedenen Gründen dreimal darauf zurückgegriffen und dreimal gab es keine Fehlermeldungen und auch keine Daten. Leider funktioniert dieser Mechanismus nicht. Entweder betreiben wir eine Miniaturpartition auf dem OSD und stellen ein RAID zur Speicherung der Datenbank zusammen, was sich sicherlich sehr negativ auf die Leistung auswirkt, oder wir weisen mindestens zwei zuverlässige physische Medien zu, am besten USB, um keine Ports zu belegen.

rados-gw – exportiert Objektspeicher über das S3-Protokoll und ähnliches. Erstellt viele Pools, es ist unklar, warum. Ich habe nicht viel experimentiert.

ceph-mgr – Bei der Installation dieses Dienstes werden mehrere Module gestartet. Eine davon ist die automatische Skalierung, die nicht deaktiviert werden kann. Es ist bestrebt, die korrekte Menge an PG/OSD beizubehalten. Wenn Sie das Verhältnis manuell steuern möchten, können Sie die Skalierung für jeden Pool deaktivieren. In diesem Fall stürzt das Modul jedoch bei einer Division durch 0 ab und der Clusterstatus wird FEHLER. Das Modul ist in Python geschrieben, und wenn Sie die erforderliche Zeile darin auskommentieren, führt dies zu seiner Deaktivierung. Zu faul, sich an die Details zu erinnern.

Liste der verwendeten Quellen:

Installation von CEPH
Wiederherstellung nach einem vollständigen Monitorausfall

Skriptauflistungen:

Installation des Systems per Debootstrap

blkdev=sdb1
mkfs.btrfs -f /dev/$blkdev
mount /dev/$blkdev /mnt
cd /mnt
for i in {@,@var,@home}; do btrfs subvolume create $i; done
mkdir snapshot @/{var,home}
for i in {var,home}; do mount -o bind @${i} @/$i; done
debootstrap buster @ http://deb.debian.org/debian; echo $?
for i in {dev,proc,sys}; do mount -o bind /$i @/$i; done
cp /etc/bash.bashrc @/etc/

chroot /mnt/@ /bin/bash
echo rbd1 > /etc/hostname
passwd
uuid=`blkid | grep $blkdev | cut -d """ -f 2`
cat << EOF > /etc/fstab
UUID=$uuid / btrfs noatime,nodiratime,subvol=@ 0 1
UUID=$uuid /var btrfs noatime,nodiratime,subvol=@var 0 2
UUID=$uuid /home btrfs noatime,nodiratime,subvol=@home 0 2
EOF
cat << EOF >> /var/lib/dpkg/status
Package: lvm2
Status: install ok installed
Priority: important
Section: admin
Installed-Size: 0
Maintainer: Debian Adduser Developers <[email protected]>
Architecture: all
Multi-Arch: foreign
Version: 113.118
Description: No-install

Package: sudo
Status: install ok installed
Priority: important
Section: admin
Installed-Size: 0
Maintainer: Debian Adduser Developers <[email protected]>
Architecture: all
Multi-Arch: foreign
Version: 113.118
Description: No-install
EOF

exit
grub-install --boot-directory=@/boot/ /dev/$blkdev
init 6

apt -yq install --no-install-recommends linux-image-amd64 bash-completion ed btrfs-progs grub-pc iproute2 ssh  smartmontools ntfs-3g net-tools man
exit
grub-install --boot-directory=@/boot/ /dev/$blkdev
init 6

Erstellen Sie einen Cluster

apt -yq install --no-install-recommends gnupg wget ca-certificates
echo 'deb https://download.ceph.com/debian-octopus/ buster main' >> /etc/apt/sources.list
wget -q -O- 'https://download.ceph.com/keys/release.asc' | apt-key add -
apt update
apt -yq install --no-install-recommends ceph-common ceph-mon

echo 192.168.11.11 rbd1 >> /etc/hosts
uuid=`cat /proc/sys/kernel/random/uuid`
cat << EOF > /etc/ceph/ceph.conf
[global]
fsid = $uuid
auth cluster required = cephx
auth service required = cephx
auth client required = cephx
mon allow pool delete = true
mon host = 192.168.11.11
mon initial members = rbd1
mon max pg per osd = 385
osd crush update on start = false
#osd memory target = 2147483648
osd memory target = 1610612736
osd scrub chunk min = 1
osd scrub chunk max = 2
osd scrub sleep = .2
osd pool default pg autoscale mode = off
osd pool default size = 1
osd pool default min size = 1
osd pool default pg num = 1
osd pool default pgp num = 1
[mon]
mgr initial modules = dashboard
EOF

ceph-authtool --create-keyring ceph.mon.keyring --gen-key -n mon. --cap mon 'allow *'
ceph-authtool --create-keyring ceph.client.admin.keyring --gen-key -n client.admin --cap mon 'allow *' --cap osd 'allow *' --cap mds 'allow *' --cap mgr 'allow *'
cp ceph.client.admin.keyring /etc/ceph/
ceph-authtool --create-keyring bootstrap-osd.ceph.keyring --gen-key -n client.bootstrap-osd --cap mon 'profile bootstrap-osd' --cap mgr 'allow r'
cp bootstrap-osd.ceph.keyring /var/lib/ceph/bootstrap-osd/ceph.keyring
ceph-authtool ceph.mon.keyring --import-keyring /etc/ceph/ceph.client.admin.keyring
ceph-authtool ceph.mon.keyring --import-keyring /var/lib/ceph/bootstrap-osd/ceph.keyring
monmaptool --create --add rbd1 192.168.11.11 --fsid $uuid monmap
rm -R /var/lib/ceph/mon/ceph-rbd1/*
ceph-mon --mkfs -i rbd1 --monmap monmap --keyring ceph.mon.keyring
chown ceph:ceph -R /var/lib/ceph
systemctl enable ceph-mon@rbd1
systemctl start ceph-mon@rbd1
ceph mon enable-msgr2
ceph status

# dashboard

apt -yq install --no-install-recommends ceph-mgr ceph-mgr-dashboard python3-distutils python3-yaml
mkdir /var/lib/ceph/mgr/ceph-rbd1
ceph auth get-or-create mgr.rbd1 mon 'allow profile mgr' osd 'allow *' mds 'allow *' > /var/lib/ceph/mgr/ceph-rbd1/keyring
systemctl enable ceph-mgr@rbd1
systemctl start ceph-mgr@rbd1
ceph config set mgr mgr/dashboard/ssl false
ceph config set mgr mgr/dashboard/server_port 7000
ceph dashboard ac-user-create root 1111115 administrator
systemctl stop ceph-mgr@rbd1
systemctl start ceph-mgr@rbd1

OSD hinzufügen (Teil)

apt install ceph-osd

osdnum=`ceph osd create`
mkdir -p /var/lib/ceph/osd/ceph-$osdnum
mkfs -t xfs /dev/sda1
mount -t xfs /dev/sda1 /var/lib/ceph/osd/ceph-$osdnum
cd /var/lib/ceph/osd/ceph-$osdnum
ceph auth get-or-create osd.0 mon 'profile osd' mgr 'profile osd' osd 'allow *' > /var/lib/ceph/osd/ceph-$osdnum/keyring
ln -s /dev/disk/by-partuuid/d8cc3da6-02  block
ceph-osd -i $osdnum --mkfs
#chown ceph:ceph /dev/sd?2
chown ceph:ceph -R /var/lib/ceph
systemctl enable ceph-osd@$osdnum
systemctl start ceph-osd@$osdnum

Zusammenfassung

Der wichtigste Marketingvorteil von CEPH ist CRUSH – ein Algorithmus zur Berechnung des Standorts von Daten. Monitore verteilen diesen Algorithmus an Clients, woraufhin Clients direkt den gewünschten Knoten und das gewünschte OSD anfordern. CRUSH gewährleistet keine Zentralisierung. Es handelt sich um eine kleine Datei, die Sie sogar ausdrucken und an die Wand hängen können. Die Praxis hat gezeigt, dass CRUSH keine erschöpfende Karte ist. Wenn Sie die Monitore zerstören und neu erstellen und dabei alle OSD- und CRUSH-Funktionen beibehalten, reicht dies nicht aus, um den Cluster wiederherzustellen. Daraus wird geschlossen, dass jeder Monitor einige Metadaten über den gesamten Cluster speichert. Die geringe Menge dieser Metadaten schränkt die Größe des Clusters nicht ein, erfordert jedoch die Gewährleistung ihrer Sicherheit, wodurch Festplatteneinsparungen durch die Installation des Systems auf einem Flash-Laufwerk entfallen und Cluster mit weniger als drei Knoten ausgeschlossen werden. Die aggressive Politik des Entwicklers bezüglich optionaler Funktionen. Weit entfernt vom Minimalismus. Die Dokumentation entspricht dem Niveau „Vielen Dank für das, was wir haben, aber sie ist sehr, sehr dürftig.“ Die Möglichkeit, mit Diensten auf niedriger Ebene zu interagieren, ist gegeben, aber die Dokumentation behandelt dieses Thema zu oberflächlich, sodass es eher ein Nein als ein Ja ist. Es gibt praktisch keine Chance, Daten in einer Notsituation wiederherzustellen.

Optionen für weitere Maßnahmen: CEPH aufgeben und das banale Multi-Disk-BTRFS (oder XFS, ZFS) verwenden, neue Informationen über CEPH herausfinden, die es Ihnen ermöglichen, es unter den angegebenen Bedingungen zu betreiben, versuchen, Ihren eigenen Speicher als Advanced zu schreiben Ausbildung.

Source: habr.com

Kommentar hinzufügen