Hinweis: Kommentatoren haben auf schwerwiegende Fehler in einigen der Annahmen hingewiesen, die eine Überarbeitung des gesamten Artikels erfordern.
CEPH-Strategie
Der CEPH-Cluster kombiniert eine beliebige Anzahl von K Festplatten beliebiger Größe und speichert Daten darauf, wobei jedes Stück (standardmäßig 4 MB) eine bestimmte Anzahl N-mal dupliziert wird.
Betrachten Sie den einfachsten Fall mit zwei identischen Festplatten. Von ihnen können Sie entweder RAID 1 oder einen Cluster mit N = 2 sammeln - das Ergebnis ist das gleiche. Wenn drei Festplatten vorhanden sind und unterschiedliche Größen haben, 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 einige auf 2 und 3, während RAID dies nicht tut (Sie können sie sammeln ein solches RAID, aber es wäre eine Perversion). Wenn es noch mehr Festplatten gibt, ist es möglich, RAID 5 zu erstellen. CEPH verfügt über einen analogen Löschcode, der den frühen Konzepten der Entwickler widerspricht und daher nicht berücksichtigt wird. RAID 5 setzt voraus, dass Sie eine kleine Anzahl von Festplatten haben und dass alle in gutem Zustand sind. Wenn einer ausfällt, muss der Rest durchhalten, bis die Festplatte ersetzt und die Daten wiederhergestellt sind. CEPH für N> = 3 fördert die Verwendung alter Laufwerke, insbesondereWenn Sie mehrere gute Datenträger aufbewahren, um eine Kopie der Daten zu speichern, und die verbleibenden zwei oder drei Kopien auf einer großen Anzahl alter Datenträger speichern, sind die Informationen sicher, da solange die neuen Datenträger aktiv sind, keine Probleme auftreten und wenn einer von ihnen beschädigt wird, der gleichzeitige Fehler drei Festplatten mit einer Lebensdauer von mehr als fünf Jahren, vorzugsweise von verschiedenen Servern - ein äußerst unwahrscheinliches Ereignis.
Die Verteilung von Kopien ist subtil. Standardmäßig wird davon ausgegangen, dass die Daten in eine größere Anzahl (~ 100 pro Festplatte) von PG-Verteilergruppen unterteilt sind, von denen jede auf einigen Festplatten dupliziert ist. Angenommen, K = 6, N = 2, dann gehen bei einem Ausfall von zwei Festplatten garantiert Daten verloren, da sich nach der Wahrscheinlichkeitstheorie mindestens ein PG auf diesen beiden Festplatten befindet. Und der Verlust einer Gruppe macht den Zugriff auf alle Daten im Pool unzugänglich. Wenn die Datenträger in drei Paare aufgeteilt sind und nur Daten auf Datenträgern innerhalb eines Paares gespeichert werden können, ist eine solche Verteilung auch gegen den Ausfall eines Datenträgers resistent. Wenn jedoch zwei Datenträger ausfallen, beträgt die Wahrscheinlichkeit eines Datenverlusts nicht 100%, sondern nur 3/15, und selbst im Fehlerfall drei Festplatten - nur 12/20. Daher trägt die Entropie bei der Datenverteilung nicht zur Fehlertoleranz bei. Beachten Sie auchdass für den Dateiserver freier RAM die Antwortgeschwindigkeit erheblich erhöht. Je mehr Speicher in jedem Knoten und je mehr Speicher in allen Knoten vorhanden ist, desto schneller wird er. Dies ist zweifellos der Vorteil eines Clusters gegenüber einem einzelnen Server und darüber hinaus einem Hardware-NAS, in dem nur sehr wenig Speicher integriert ist.
Daraus folgt, dass CEPH ein guter Weg ist, um mit minimalen Investitionen aus veralteten Geräten ein zuverlässiges Speichersystem für Dutzende von TB mit Skalierbarkeit zu schaffen (hier sind natürlich Kosten erforderlich, aber im Vergleich zu kommerziellen Speichersystemen gering).
Cluster-Implementierung
Nehmen Sie für das Experiment einen stillgelegten Intel DQ57TM + Intel Core i3 540 + 16 GB RAM-Computer. Wir werden vier 2-TB-Festplatten in einer Art RAID10 organisieren. Nach einem erfolgreichen Test werden wir einen zweiten Knoten und die gleiche Anzahl von Festplatten hinzufügen.
Installieren Sie Linux. Die Verteilung erfordert Anpassung und Stabilität. Debian und Suse erfüllen die Anforderungen. Suse verfügt über ein flexibleres Installationsprogramm zum Deaktivieren von Paketen. Leider konnte ich nicht herausfinden, was weggeworfen werden kann, ohne das System zu beschädigen. Wir installieren Debian über Debootstrap Buster. Die Option min-base installiert ein nicht funktionierendes System, dem Treiber fehlen. Der Größenunterschied gegenüber der Vollversion ist nicht so groß, dass er stört. Da die Arbeit auf einer physischen Maschine ausgeführt wird, möchte ich Schnappschüsse wie auf virtuellen Maschinen erstellen. Entweder LVM oder btrfs (oder xfs oder zfs - der Unterschied ist nicht groß) bieten eine solche Möglichkeit. Schnappschüsse sind keine Stärke für LVM. Wir setzen btrfs. Und der Bootloader ist im MBR. Es macht keinen Sinn, eine 50-MB-Festplatte mit einer FAT-Partition zu verstopfen.Wenn Sie es in den 1-MB-Bereich der Partitionstabelle verschieben und den gesamten Speicherplatz für das System zuweisen können. Es wurden 700 MB Speicherplatz benötigt. Wie viele SUSE-Basisinstallationen sich anscheinend nicht an 1,1 oder 1,4 GB erinnern.
CEPH installieren. Ignorieren Sie Version 12 im Debian-Repository und stellen Sie eine direkte Verbindung von der Site 15.2.3 her. Befolgen Sie die Anweisungen im Abschnitt "Manuelles Installieren von CEPH" mit den folgenden Vorbehalten:
- Bevor Sie das Repository verbinden, müssen Sie gnupg wget ca-certificates installieren
- Nach dem Verbinden des Repositorys, jedoch vor der Installation des Clusters, wird die Installation von Paketen weggelassen: apt -y --no-install-empfiehlt die Installation von ceph-common ceph-mon ceph-osd ceph-mds ceph-mgr
- Zum Zeitpunkt der Installation wird ceph-osd aus (bereits verständlichen) Gründen versuchen, lvm2 zu installieren. Es besteht keine dringende Notwendigkeit dafür. Wenn Sie Probleme bei der Installation eines Pakets haben, können Sie es abbrechen, indem Sie die Abhängigkeit in / var / lib / dpkg / status für ceph-osd entfernen.
Beim Schreiben des Artikels wurde ein weniger humaner Patch verwendet:cat << EOF >> /var/lib/dpkg/status Package: lvm2 Status: install ok installed Priority: important Section: admin Installed-Size: 0 Maintainer: Debian Adduser Developers <adduser@packages.debian.org> Architecture: all Multi-Arch: foreign Version: 113.118 Description: No-install EOF
Clusterübersicht
ceph-osd - ist für das Speichern von Daten auf der Festplatte verantwortlich. Für jede Festplatte wird ein Netzwerkdienst gestartet, der Anforderungen zum Lesen oder Schreiben in Objekte akzeptiert und ausführt. Dieser Artikel beschreibt den Bluestore-Speicher als niedrigste Ebene. Im Dienstverzeichnis werden Dienstdateien erstellt, die die Cluster-ID, den Speicher, den Typ usw. sowie die erforderliche Blockdatei beschreiben. Diese Dateien werden nicht geändert. Wenn die Datei physisch ist, erstellt osd ein Dateisystem und speichert Daten. Wenn es sich bei der Datei um einen Link handelt, befinden sich die Daten auf dem Gerät, auf das der Link verweist. Zusätzlich zum Hauptgerät können block.db - Metadaten (RocksDB) und block.wal - ein Protokoll (RocksDB Write-Ahead-Protokoll) zusätzlich angegeben werden. Wenn keine zusätzlichen Geräte angegeben sind, werden die Metadaten und das Protokoll auf dem primären Gerät gespeichert.Es ist sehr wichtig, die Verfügbarkeit von freiem Speicherplatz für RocksDB zu überwachen, da sonst das OSD nicht gestartet wird!
Bei der Standard-OSD-Erstellung in alten Versionen ist die Festplatte in zwei Abschnitte unterteilt: Der erste ist 100 MB xfs, in / var / lib / ... gemountet und enthält Dienstinformationen, der zweite wird an den Hauptspeicher übergeben. Die neue Version verwendet lvm.
Theoretisch können Sie keine Miniaturpartition bereitstellen, sondern die Dateien in / var / lib / ... ablegen, sie auf allen Knoten duplizieren und die gesamte Festplatte für die Daten auswählen, ohne einen GPT- oder LVM-Header zu erstellen. Wenn Sie ein OSD manuell hinzufügen, müssen Sie sicherstellen, dass der ceph-Benutzer Schreibzugriff auf die Datenblockgeräte hat und das Servicedatenverzeichnis automatisch in / var / lib ... bereitgestellt wird, wenn Sie sie dort ablegen möchten. Es ist auch ratsam, den Zielparameter osd memory anzugeben, damit genügend physischer Speicher vorhanden ist.
ceph-mds. Auf einer niedrigen Ebene ist CEPH Objektspeicher. Der Blockspeicher reduziert sich auf das Speichern jedes 4-MB-Blocks als Objekt. Die Dateispeicherung funktioniert genauso. Es werden zwei Pools erstellt: einer für Metadaten und einer für Daten. Sie werden zu einem Dateisystem zusammengefasst. Zu diesem Zeitpunkt wird eine Art Datensatz erstellt. Wenn Sie also das Dateisystem löschen, aber beide Pools speichern, können Sie es nicht wiederherstellen. Es gibt ein Verfahren zum Extrahieren von Dateien nach Blöcken, das nicht getestet wurde. Der Dienst ceph-mds ist für den Zugriff auf das Dateisystem verantwortlich. Für jedes Dateisystem ist eine separate Instanz des Dienstes erforderlich. Es gibt eine Option "Rang", mit der Sie einen Anschein von mehreren Dateisystemen in einem erstellen können - auch nicht getestet.
ceph-mon - Dieser Dienst speichert die Clusterzuordnung. Es enthält Informationen zu allen OSDs, den PG-Verteilungsalgorithmus in OSD und vor allem Informationen zu allen Objekten (die Details dieses Mechanismus sind mir nicht klar: Darin befindet sich ein Verzeichnis /var/lib/ceph/mon/.../store.db Es gibt eine große Datei - 26 MB, und in einem Cluster von 105 KB-Objekten werden etwas mehr als 256 Bytes pro Objekt ausgegeben. Ich denke, der Monitor führt eine Liste aller Objekte und PGs, in denen sie liegen. Eine Beschädigung dieses Verzeichnisses führt zum Verlust aller Daten im Cluster. Daher wurde der Schluss gezogen, dass CRUSH zeigt, wie sich PGs auf dem OSD befinden und wie sich Objekte auf PG befinden - in der Datenbank (die Schlussfolgerung hat sich als falsch herausgestellt, was genau sie enthält, muss geklärt werden). Infolgedessen können wir das System zunächst nicht im RO-Modus auf einem USB-Flash-Laufwerk installieren, da die Datenbank ständig geschrieben wird.Für diese Daten (kaum mehr als 1 GB) benötigen Sie eine zusätzliche Festplatte, und zweitens benötigen Sie eine Kopie dieser Datenbank in Echtzeit. Wenn mehrere Monitore vorhanden sind, wird aufgrund dieser eine Fehlertoleranz bereitgestellt. Wenn jedoch ein Monitor vorhanden ist, maximal zwei, muss der Datenschutz gewährleistet sein. Es gibt ein theoretisches Verfahren zum Wiederherstellen eines Monitors basierend auf OSD-Daten. In dem Moment, in dem sich herausstellte, dass er auf Objektebene wiederhergestellt wurde, wurde das Dateisystem im Moment nicht wiederhergestellt. Bisher können Sie sich nicht auf diesen Mechanismus verlassen.Zum Zeitpunkt der Wiederherstellung auf Objektebene wurde das Dateisystem zum Zeitpunkt der Wiederherstellung nicht wiederhergestellt. Bisher können Sie sich nicht auf diesen Mechanismus verlassen.Zum Zeitpunkt der Wiederherstellung auf Objektebene wurde das Dateisystem zum Zeitpunkt der Wiederherstellung nicht wiederhergestellt. Bisher können Sie sich nicht auf diesen Mechanismus verlassen.
rados-gw - exportiert Objektspeicher über das S3-Protokoll und dergleichen. Erstellt viele Pools, es ist nicht klar 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 ist. Es ist bestrebt, die richtige Menge an PG / OSD aufrechtzuerhalten. Wenn Sie das Verhältnis manuell steuern möchten, können Sie die Skalierung für jeden Pool deaktivieren. In diesem Fall wird das Modul jedoch durch 0 geteilt, und der Clusterstatus wird zu FEHLER. Das Modul ist in Python geschrieben. Wenn Sie die erforderliche Zeile auskommentieren, wird es deaktiviert. Details sind zu faul, um sich zu erinnern.
Referenzen:
Installieren von CEPH
Recovery nach vollständigem Monitorausfall
Artikel über BlueStore in der Beschreibung der Ceph Ceph-
Architektur. Salbei A. Weil
Skriptlisten:
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 <adduser@packages.debian.org>
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 <adduser@packages.debian.org>
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
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 ()
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
Der Hauptmarketingvorteil von CEPH ist CRUSH, ein Algorithmus zur Berechnung des Speicherorts von Daten. Monitore verteilen diesen Algorithmus an Clients, wonach Clients den gewünschten Host und das gewünschte OSD direkt anfordern. CRUSH stellt sicher, dass es keine Zentralisierung gibt. Es ist eine kleine Datei, die Sie zumindest drucken und an die Wand hängen können. Die Praxis hat gezeigt, dass CRUSH keine erschöpfende Karte ist. Das Zerstören und Neuerstellen von Monitoren unter Beibehaltung aller OSDs und CRUSHs reicht nicht aus, um den Cluster wiederherzustellen. Daraus wurde geschlossen, dass jeder Monitor einige Metadaten über den gesamten Cluster speichert. Die unbedeutende Menge dieser Metadaten schränkt die Clustergröße nicht ein, erfordert jedoch die Gewährleistung ihrer Sicherheit, wodurch die Festplattenökonomie durch die Installation des Systems auf einem USB-Flash-Laufwerk entfällt und Cluster mit weniger als drei Knoten ausgeschlossen werden.Aggressive Entwicklerrichtlinie in Bezug auf optionale Funktionen. Weit zum Minimalismus. Dokumentation auf der Ebene: "Für das, was wir haben - danke schon, aber sehr, sehr selten." Die Möglichkeit zur Interaktion mit Diensten auf niedriger Ebene wird bereitgestellt, aber die Dokumentation zu diesem Thema ist zu oberflächlich, daher eher nein als ja. In einer Notsituation besteht praktisch keine Möglichkeit, Daten wiederherzustellen (dank der Erklärungen der Community bleibt die Chance weiterhin bestehen).In einer Notsituation besteht fast keine Chance auf Datenwiederherstellung (dank der Erklärungen der Community besteht immer noch eine Chance).In einer Notsituation besteht fast keine Chance auf Datenwiederherstellung (dank der Erklärungen der Community besteht immer noch eine Chance).
Optionen für weitere Aktionen: Verlassen Sie CEPH und verwenden Sie das banale Multi-Disk-btrfs (oder xfs, zfs). Erfahren Sie neue Informationen zu CEPH, mit denen Sie es unter den angegebenen Bedingungen betreiben können, und versuchen Sie, Ihren eigenen Speicher als Upgrade zu schreiben.