Wenn die Menge an Daten gröĂer wird als das, was auf eine einzelne Festplatte passt, ist es höchste Zeit, ĂŒber RAID nachzudenken. In meiner Kindheit hörte ich oft von Ă€lteren Menschen: "Eines Tages werden RAIDs der Vergangenheit angehören, Objektspeicher werden die Welt erobern, und du weiĂt nicht einmal, was CEPH ist." Daher war es das Erste, was ich in meinem eigenen Leben tat, einen Cluster zu schaffen. Ziel des Experiments war es, das Innenleben von Ceph kennenzulernen und den Rahmen seiner Anwendung zu verstehen. Wie gerechtfertigt ist der Einsatz von Ceph im Mittelstand und im Kleingewerbe? Nach mehreren Jahren der Nutzung und ein paar irreversiblen Datenverlusten entstand ein VerstĂ€ndnis fĂŒr die Feinheiten, dass nicht alles so eindeutig ist. Die Besonderheiten von CEPH erschweren seine breite Verbreitung, und aufgrund dieser Hindernisse geraten die Experimente in eine Sackgasse. Im Folgenden wird eine Beschreibung aller durchgefĂŒhrten Schritte, das erhaltene Ergebnis und die getroffenen Schlussfolgerungen prĂ€sentiert. Wenn erfahrene Personen ihre Erfahrungen teilen und einige Punkte erlĂ€utern könnten, wĂ€re ich dankbar.
Hinweis: Kommentatoren haben auf schwerwiegende Fehler in einigen Annahmen hingewiesen, die eine Ăberarbeitung des gesamten Artikels erfordern.
CEPH-Strategie
Der CEPH-Cluster vereint eine beliebige Anzahl von K Festplatten beliebiger GröĂe und speichert Daten auf ihnen, indem er jedes StĂŒck (standardmĂ€Ăig 4 MB) N-mal dupliziert.
Betrachten wir den einfachsten Fall mit zwei identischen Festplatten. Daraus kann entweder ein RAID 1 oder ein Cluster mit N=2 gebildet werden â das Ergebnis wird dasselbe sein. Wenn es drei Festplatten gibt und diese unterschiedliche GröĂen haben, ist es einfach, ein Cluster mit N=2 zu erstellen: Ein Teil der Daten wird auf den Festplatten 1 und 2, ein Teil auf 1 und 3 und ein Teil auf 2 und 3 gespeichert, wĂ€hrend RAID nicht möglich ist (man kann zwar ein solches RAID einrichten, aber das wĂ€re eine Ungereimtheit). Bei noch mehr Festplatten ist die Erstellung von RAID 5 möglich, wĂ€hrend CEPH eine Ă€hnliche Funktion bietet â erasure_code, die den ursprĂŒnglichen Konzepten der Entwickler widerspricht und daher nicht in Betracht gezogen wird. RAID 5 geht davon aus, dass es eine geringe Anzahl von Festplatten gibt, und dass alle in gutem Zustand sind. Bei einem Ausfall einer Festplatte mĂŒssen die anderen bis zur Ersetzung der Festplatte und der Wiederherstellung der Daten darauf bestehen bleiben. CEPH hingegen ermutigt bei N>=3 zur Verwendung alter Festplatten; insbesondere wenn man mehrere zuverlĂ€ssige Festplatten zur Speicherung einer Kopie der Daten hat, wĂ€hrend die verbleibenden zwei bis drei Kopien auf einer groĂen Anzahl alter Festplatten gespeichert werden, dann sind die Informationen sicher, da solange die neuen Festplatten intakt sind, keine Probleme bestehen, und falls eine von ihnen ausfĂ€llt, ist ein gleichzeitiger Ausfall von drei Festplatten mit einer Lebensdauer von ĂŒber fĂŒnf Jahren, vorzugsweise aus verschiedenen Servern â ein extrem unwahrscheinliches Ereignis.
Bei der Verteilung von Kopien gibt es eine Feinheit. StandardmĂ€Ăig wird davon ausgegangen, dass Daten auf eine gröĂere Anzahl (ca. 100 pro Festplatte) von PG-Verteilungsgruppen verteilt werden, von denen jede auf bestimmten Festplatten dupliziert wird. Angenommen, K=6, N=2, dann gehen beim Ausfall zweier beliebiger Festplatten garantiert Daten verloren, da nach der Wahrscheinlichkeitstheorie mindestens eine PG auf genau diesen beiden Festplatten liegt. Der Verlust einer Gruppe macht alle Daten im Pool unzugĂ€nglich. Wenn man die Festplatten jedoch in drei Paare aufteilt und das Speichern von Daten nur auf Festplatten innerhalb eines Paares erlaubt, dann ist diese Verteilung ebenfalls gegenĂŒber dem Ausfall einer beliebigen Festplatte resilient. Bei dem Ausfall zweier Festplatten betrĂ€gt die Wahrscheinlichkeit eines Datenverlustes jedoch nicht 100 %, sondern nur 3/15, und selbst beim Ausfall dreier Festplatten nur 12/20. Daraus folgt, dass die Entropie in der Datenverteilung nicht zur Ausfallsicherheit beitrĂ€gt. DarĂŒber hinaus bemerken wir, dass fĂŒr einen Dateiserver der freie Arbeitsspeicher die Reaktionsgeschwindigkeit erheblich erhöht. Je mehr Speicher in jedem Knoten vorhanden ist 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 erst recht gegenĂŒber einem Hardware-NAS, in das nur eine sehr geringe Menge an Speicher integriert ist.
Daraus folgt, dass CEPH eine gute Möglichkeit ist, mit minimalen Investitionen aus veralteter Hardware ein zuverlĂ€ssiges Datenspeichersystem von mehreren TB mit Skalierungsmöglichkeiten zu schaffen (hier sind natĂŒrlich Investitionen erforderlich, jedoch gering im Vergleich zu kommerziellen SANs).
Einsatz eines Clusters
FĂŒr das Experiment nehmen wir einen auĂer Betrieb genommenen Computer: Intel DQ57TM + Intel Core i3 540 + 16 GB RAM. Vier Festplatten mit 2 TB werden zu einer RAID10-Ă€hnlichen Konfiguration organisiert, nach erfolgreicher PrĂŒfung fĂŒgen wir einen zweiten Knoten und ebenso viele Festplatten hinzu.
Installation von Linux. Der Distributor sollte anpassbar und stabil sein. Debian und Suse erfĂŒllen diese Anforderungen. Suse verfĂŒgt ĂŒber einen flexibleren Installer, der es ermöglicht, jedes Paket abzuwĂ€hlen; leider konnte ich nicht herausfinden, welche ich ohne negative Auswirkungen auf das System entfernen kann. Wir installieren Debian ĂŒber debootstrap buster. Die Option min-base installiert ein nicht funktionierendes System, dem die Treiber fehlen. Der GröĂenunterschied zur Vollversion ist nicht so groĂ, dass es sich lohnt, sich damit zu beschĂ€ftigen. Da die Arbeit auf einer physischen Maschine erfolgt, wĂŒrden wir gerne Snapshots machen, wie auf VMs. Diese Möglichkeit bieten entweder LVM oder btrfs (oder xfs oder zfs â der Unterschied ist nicht groĂ). Snapshots sind nicht die StĂ€rke von LVM. Wir installieren btrfs. Der Bootloader wird im MBR installiert. Es macht keinen Sinn, die Festplatte mit 50 MB fĂŒr eine FAT-Partition zu verstopfen, wenn wir sie in einen 1 MB Bereich der Partitionstabelle quetschen und den gesamten Platz dem System zuweisen können. Es hat 700 MB auf der Festplatte eingenommen. Ich habe nicht gemerkt, wie viel die Grundinstallation von SUSE benötigt â ich denke, es waren etwa 1,1 oder 1,4 GB.
Installation von CEPH. Wir ignorieren Version 12 im Debian-Repository und verbinden uns direkt von der Website 15.2.3. Wir folgen den Anweisungen im Abschnitt âInstallation von CEPH manuellâ mit den folgenden Vorbehalten:
- Vor dem HinzufĂŒgen des Repositories mĂŒssen gnupg wget ca-certificates installiert werden.
- Nach dem HinzufĂŒgen des Repositories, aber vor der Installation des Clusters wurde die Installation der Pakete weggelassen: apt -y --no-install-recommends install ceph-common ceph-mon ceph-osd ceph-mds ceph-mgr.
- Zum Zeitpunkt der Installation von CEPH wird aus unerklĂ€rlichen GrĂŒnden versucht, lvm2 zu installieren. Im Grunde genommen ist es nicht schade, aber die Installation schlĂ€gt fehl, sodass CEPH auch nicht installiert werden kann.
Dieser Patch hat geholfen:
cat <> /var/lib/dpkg/status Package: lvm2 Status: install ok installed Priority: important Section: admin Installed-Size: 0 Maintainer: Debian Adduser Developers Architecture: all Multi-Arch: foreign Version: 113.118 Description: No-install EOF
ClusterĂŒbersicht
ceph-osd â verantwortlich fĂŒr die Speicherung von Daten auf der Festplatte. FĂŒr jede Festplatte wird ein Netzwerkdienst gestartet, der Lese- oder Schreibanfragen fĂŒr Objekte entgegennimmt und ausfĂŒhrt. Auf der Festplatte werden zwei Partitionen erstellt. Eine davon enthĂ€lt Informationen ĂŒber den Cluster, die Festplattennummer sowie SchlĂŒssel fĂŒr den Cluster. Diese Informationen, die 1 KB umfassen, werden einmalig bei der HinzufĂŒgung der Festplatte erstellt und haben sich danach nie geĂ€ndert. Auf der zweiten Partition befindet sich kein Dateisystem, sondern es werden binĂ€re CEPH-Daten gespeichert. Die automatische Installation in frĂŒheren Versionen erstellte eine xfs-Partition mit einer GröĂe von 100 MB fĂŒr Verwaltungsinformationen. Ich habe die Festplatte in MBR konvertiert und nur 16 MB zugewiesen â der Dienst beschwert sich nicht. Ich denke, dass xfs sicherlich auch durch ext ersetzt werden könnte. Diese Partition wird in /var/lib/... gemountet, wo der Dienst Informationen ĂŒber OSD liest und auĂerdem den Link zu dem blockbasierten GerĂ€t findet, auf dem die binĂ€ren Daten gespeichert sind. Theoretisch könnten die Hilfsdaten direkt in /var/lib/... platziert werden, wĂ€hrend die gesamte Festplatte fĂŒr Daten reserviert bleibt. Bei der Erstellung von OSD ĂŒber ceph-deploy wird automatisch eine Regel zum Mounten der Partition in /var/lib/... erstellt, und dem Benutzer ceph werden Lese-Rechte fĂŒr das benötigte blockbasierte GerĂ€t zugewiesen. Bei einer manuellen Installation muss dies selbst durchgefĂŒhrt werden, in der Dokumentation steht dazu nichts. Es ist auch ratsam, den Parameter osd memory target anzugeben, damit genĂŒgend physischer Speicher zur VerfĂŒgung steht.
ceph-mds. Auf niedriger Ebene ist CEPH â ein objektspeicher. Die Möglichkeit des blockbasierten Speicherns beschrĂ€nkt sich auf die Speicherung jedes 4 MB groĂen Blocks als Objekt. Das Dateispeicher funktioniert nach dem gleichen Prinzip. Es werden zwei Pools erstellt: einer fĂŒr Metadaten, der andere fĂŒr Daten. Diese werden in einem Dateisystem zusammengefasst. In diesem Moment wird ein gewisser Eintrag erstellt, deshalb kann die Dateisystem nicht wiederhergestellt werden, wenn es gelöscht wird, aber beide Pools bleiben erhalten. Es gibt ein Verfahren zur Extraktion von Dateien in Blöcken, das ich nicht getestet habe. FĂŒr den Zugriff auf das Dateisystem ist der Dienst ceph-mds verantwortlich. Jede Dateisystem benötigt ein separates Exemplar des Dienstes. Es gibt die Option âIndexâ, die es ermöglicht, eine Art von mehreren Dateisystemen in einer zu erstellen â das wurde ebenfalls nicht getestet.
ceph-mon â dieser Dienst speichert die Clusterkarte. Er enthĂ€lt Informationen ĂŒber alle OSDs, den Algorithmus zur Verteilung von PGs auf OSDs und, was am wichtigsten ist, Informationen ĂŒber alle Objekte (die Details dieses Mechanismus sind mir unklar: es gibt ein Verzeichnis /var/lib/ceph/mon/.../store.db, in dem sich eine groĂe Datei â 26 MB â befindet, und im Cluster sind es 105k Objekte, was etwas mehr als 256 Byte pro Objekt ergibt. Ich denke, dass der Monitor eine Liste aller Objekte und PGs, in denen sie sich befinden, speichert). Eine BeschĂ€digung dieses Verzeichnisses fĂŒhrt zum Verlust aller Daten im Cluster. Daraus ergibt sich der Schluss, dass CRUSH zeigt, wie PGs auf OSDs verteilt sind, wĂ€hrend die Objekte zentral in einer Datenbank gespeichert sind, egal wie sehr die Entwickler dieses Wort zu vermeiden versuchen. Folglich können wir erstens das System nicht im RO-Modus auf einem Flash-Laufwerk installieren, da in die Datenbank stĂ€ndig geschrieben wird; es ist eine zusĂ€tzliche Festplatte erforderlich (vermutlich nicht mehr als 1 GB). Zweitens ist es notwendig, in Echtzeit eine Kopie dieser Datenbank zu haben. Wenn es mehrere Monitore gibt, wird die Ausfallsicherheit automatisch gewĂ€hrleistet. In unserem Fall gibt es jedoch nur einen Monitor, maximal zwei. Es gibt ein theoretisches Verfahren zur Wiederherstellung des Monitors auf der Grundlage von OSD-Daten, das ich aus verschiedenen GrĂŒnden dreimal angewendet habe und dreimal keine Fehlermeldungen oder Daten erhalten habe. Leider funktioniert dieser Mechanismus nicht. Entweder nutzen wir einen winzigen Abschnitt auf dem OSD und erstellen ein RAID zur Speicherung der Datenbank, was sich sicher sehr negativ auf die Leistung auswirken wird, oder wir stellen mindestens zwei zuverlĂ€ssige physische SpeichergerĂ€te bereit, vorzugsweise USB, um die Ports nicht zu blockieren.
rados-gw â exportiert das Objektspeicher ĂŒber das S3-Protokoll und Ă€hnliche. Es erstellt viele Pools, was unklar ist. Ich habe nicht besonders experimentiert.
ceph-mgr â bei der Installation dieses Dienstes werden mehrere Module gestartet. Eines davon ist das nicht abschaltbare Autoscale. Es versucht, die richtige Anzahl von PGs/OSDs aufrechtzuerhalten. Wenn man möchte, kann man die Skalierung fĂŒr jeden Pool unterbinden, aber in diesem Fall stĂŒrzt das Modul mit Division durch 0 ab, und der Clusterstatus wird ERROR. Das Modul ist in Python geschrieben, und wenn man die entsprechende Zeile auskommentiert, fĂŒhrt das zu seiner Deaktivierung. Die Einzelheiten sind mir zu faul, mir wieder ins GedĂ€chtnis zu rufen.
Liste der verwendeten Quellen:
Skripte Auflistungen:
Systeminstallation ĂŒber 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 < /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 <> /var/lib/dpkg/status
Package: lvm2
Status: install ok installed
Priority: important
Section: admin
Installed-Size: 0
Maintainer: Debian Adduser Developers
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
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 6Cluster erstellen
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 < /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@rbd1HinzufĂŒgen von OSD (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@$osdnumZusammenfassung
Der Hauptvorteil von CEPH ist CRUSH, ein Algorithmus zur Berechnung der Datenplatzierung. Monitore verbreiten diesen Algorithmus an die Kunden, wonach die Kunden direkt den benötigten Knoten und den gewĂŒnschten OSD anfragen. CRUSH gewĂ€hrleistet die Dezentralisierung. Es handelt sich um eine kleine Datei, die man sogar ausdrucken und an die Wand hĂ€ngen kann. Die Praxis hat gezeigt, dass CRUSH keine vollstĂ€ndige Karte ist. Wenn man die Monitore löscht und neu erstellt, wĂ€hrend alle OSD und CRUSH beibehalten werden, reicht das nicht aus, um den Cluster wiederherzustellen. Daraus ergibt sich, dass auf jedem Monitor einige Metadaten ĂŒber den gesamten Cluster gespeichert werden. Das geringe Volumen dieser Metadaten hat keine EinschrĂ€nkungen fĂŒr die ClustergröĂe zur Folge, erfordert jedoch deren Sicherheit, was eine Speicherersparnis durch die Installation des Systems auf einem USB-Stick ausschlieĂt und Cluster mit weniger als drei Knoten ausschlieĂt. Eine aggressive Haltung des Entwicklers gegenĂŒber optionalen Features. Weit entfernt von Minimalismus. Die Dokumentation ist auf dem Niveau: âDanke fĂŒr das, was vorhanden ist, aber es ist sehr, sehr spĂ€rlich.â Die Möglichkeit zur Interaktion mit Diensten auf niedriger Ebene ist gegeben, aber die Dokumentation behandelt dieses Thema zu oberflĂ€chlich, weshalb es eher ein Nein als ein Ja gibt. Praktisch keine Chancen auf Datenwiederherstellung aus einer Notlage.
Möglichkeiten fĂŒr das weitere Vorgehen: von CEPH absehen und ein einfaches Multi-Disks btrfs (oder xfs, zfs) verwenden, neue Informationen ĂŒber CEPH sammeln, die die Nutzung unter den angegebenen Bedingungen ermöglichen, oder zur Weiterbildung ein eigenes Speichersystem schreiben.
Quelle: habr.com
