Frage zu Ceph/Crushmap

F_Berlin

Member
Apr 10, 2016
9
0
21
61
Hallo Alle.

Ich habe mir einen Cluster mit 4 Nodes aufgesetzt.
Jeder Node hat neben der Boot-Platte noch vier 1TB-Platten, die jede ein OSD hat.
insgesamt also 16 OSDs.
Auf jedem Node läuft auch ein Monitor.

Alles nach Anleitung und Default aufgesetzt.
Ich hatte von der Dokumentation her den Eindruck, dass immer mindest eine Replication von 2 eingestellt ist. Nachdem wir den Cluster wegen Arbeiten an der Stromversorgung komplett runter fahren mussten, und ein Node wegen einem Filesystemcheck nicht hoch kam, war auch das ganze Ceph-Storage weg. Ich habe mir die Crushmap nun etwas genauer angesehen, und finde unter #rules:
Code:
# rules
rule replicated_ruleset {
    ruleset 0
    type replicated
    min_size 1
    max_size 10
    step take default
    step chooseleaf firstn 0 type host
    step emit
}

Ein min_size 1 bedeutet doch, dass nur mindest eine Kopei der Daten vorhanden sein muss, was mir den Ausfall des Storage erklären würde.

Da ich aus der ganzen Doku nicht wirklich schlau werde, weil mir wohl an irgendeiner Stelle ein grundsätzliches Verständniss fehlt, möchte ich mal schreiben, was ich erreichen will, und hoffe jemand kann mir erklären, wie ich das erreiche.

Alle Daten sollten auf allen Nodes gleich sein, so dass ein oder zwei Nodes ausfallen können, der Storage aber immer noch online ist.

ist das ggf. gar nicht möglich?

In meinem Kopf vergleiche ich immer Ceph mit einem Software Raid, so gesprochen hätte ich gerne zwischen den Nodes Raid1 (Mirror) und auf jedem Node Raid0 (Stripe).

Ist das ggf. der falsche Gedankenansatz?

Noch ein paar Infos:

Für Corosync und Ceph gibt es ein 10GBE Netzwerk, Kontakt zur Aussenwelt geht über 1GBE.
Im Moment laufen zwei VMs auf dem Cluster.

Hier der Anfang der Crushmap:
Code:
# begin crush map 
tunable choose_local_tries 0 
tunable choose_local_fallback_tries 0 
tunable choose_total_tries 50 
tunable chooseleaf_descend_once 1 
tunable straw_calc_version 1

Fragen?
Tipps?

Beste Grüße aus Berlin,
Franziskus
 
Hallo,

Ich selber verwende auch ceph aber ohne den Einrichtungsmanager von Proxmox sondern lieber ceph-deploy.

Jedenfalls
min_size = <wieviel Replicas von der Datei darf noch vorhanden sein im Cluster bis es auf Notfall umschaltet (also stehen bleibt)>

Man könnte CEPH so sehen als wenn es eine Art RAID unter den Storage Servern ist.
Beim erstellen eines Pools gibt man an wieviel Replicas man von den Daten haben möchte, diese verteilt CEPH (dank crushmap) dann über die ganzen Nodes (CEPH Storage).
Somit kann auch ein ganzer Node ausfallen.
Was aber unbedingt beachtet werden sollte ist die Anzahl der Monitor Hosts / Dienste.
Also immer 3,5 oder 7 somit können Maximal 1,2 oder 3 Monitor Hosts Ausfallen bis der Cluster in den Notbetrieb geht und stehen bleibt.
http://docs.ceph.com/docs/master/start/intro/

Zu deinem Problem:

Poste mal bitte das Ergebnis dieser 2 Befehle:
Code:
ceph -s
ceph osd tree
Alle beide Befehle als Root / bzw. mit sudo
 
Last edited:
In meinem Kopf vergleiche ich immer Ceph mit einem Software Raid, so gesprochen hätte ich gerne zwischen den Nodes Raid1 (Mirror) und auf jedem Node Raid0 (Stripe).

Für das müsstest du Replica 3 bzw. bei 4 Hosts Replica 4 setzen (würde aber empfehlen Replica 3 da es sonst nur Speicherplatz verschwendung ist).
Das kann man im laufendem Betrieb mit diesem Befehl machen:
Code:
ceph osd pool set <pool_Name> size <2 oder 3 für mutige auch 1>

Ich würde dir die Ceph Dokumentation sehr empfehlen (da CEPH sehr viel kann und mit falschem verständnis auch sehr viel Kopfschmerzen verursacht).
http://docs.ceph.com/docs/master/rados/operations/pools/
 
Hallo Brawn,

vielen Dank für Deine Unterstützung.
Ich war die letzten Tage in einem Workshop, der ziemlich intensiv war, daher kann ich erst antworten:

Code:
ceph -s
ceph osd tree
Alle beide Befehle als Root / bzw. mit sudo

Code:
root@pve04:~# ceph -s
  cluster c7a65cb5-a8d9-4745-b7a2-5a9e4a5d2da7
  health HEALTH_OK
  monmap e4: 4 mons at {0=10.1.1.151:6789/0,1=10.1.1.152:6789/0,2=10.1.1.153:6789/0,3=10.1.1.154:6789/0}
  election epoch 104, quorum 0,1,2,3 0,1,2,3
  osdmap e1081: 16 osds: 16 up, 16 in
  pgmap v1571809: 512 pgs, 1 pools, 130 GB data, 33324 objects
  391 GB used, 14425 GB / 14816 GB avail
  512 active+clean
  client io 12551 B/s rd, 93236 B/s wr, 29 op/s

Code:
root@pve04:~# ceph osd tree
ID WEIGHT   TYPE NAME      UP/DOWN REWEIGHT PRIMARY-AFFINITY
-1 14.39990 root default
-2  3.59998     host pve01
0  0.89999         osd.0       up  1.00000          1.00000
4  0.89999         osd.4       up  1.00000          1.00000
8  0.89999         osd.8       up  1.00000          1.00000
12  0.89999         osd.12      up  1.00000          1.00000
-3  3.59998     host pve02
1  0.89999         osd.1       up  1.00000          1.00000
5  0.89999         osd.5       up  1.00000          1.00000
9  0.89999         osd.9       up  1.00000          1.00000
13  0.89999         osd.13      up  1.00000          1.00000
-4  3.59998     host pve03
2  0.89999         osd.2       up  1.00000          1.00000
10  0.89999         osd.10      up  1.00000          1.00000
14  0.89999         osd.14      up  1.00000          1.00000
6  0.89999         osd.6       up  1.00000          1.00000
-5  3.59998     host pve04
3  0.89999         osd.3       up  1.00000          1.00000
7  0.89999         osd.7       up  1.00000          1.00000
11  0.89999         osd.11      up  1.00000          1.00000
15  0.89999         osd.15      up  1.00000          1.00000
 
Für das müsstest du Replica 3 bzw. bei 4 Hosts Replica 4 setzen (würde aber empfehlen Replica 3 da es sonst nur Speicherplatz verschwendung ist).
Das kann man im laufendem Betrieb mit diesem Befehl machen:
Code:
ceph osd pool set <pool_Name> size <2 oder 3 für mutige auch 1>

Ich würde dir die Ceph Dokumentation sehr empfehlen (da CEPH sehr viel kann und mit falschem verständnis auch sehr viel Kopfschmerzen verursacht).
http://docs.ceph.com/docs/master/rados/operations/pools/

Also, der size war von Anfang an 3, der min_size war 2.

Demnach alles richtig.

Dann weiß ich nicht, warum der Pool "weg" war, als einer Nodes gefehlt hat.
Oder lag es an den Monitors?

Wo stelle ich ein, wieviele Monitors für ein Quorum nötig sind?

Was mit auch auffiel war, dass eine ganze Reihe an OSDs offline und out waren??

Die Doku habe ich bereits mehrfach gelesen, bin aber immer noch verwirrt :-(
 
Hi,
das Problem wird die komplett-Powerdown mit dem "eine Node kam nicht hoch" + 4 Mons, sein!

Wenn die erste Node startet, kommen die OSDs nicht hoch, weil noch kein quorum vorhanden ist - wie Brawn1 schon schrieb - 4 Mons sind nicht wirklich sinnvoll, lieber drei! (3 reichen auch für Cluster in normaler Größe - ich hatte ein 8 Node-Cluster mit > 100 OSDs und den auch nur mit 3 Mons betrieben).

Das selbe passiert bei der zweiten Node (immer noch kein Quorum wegen 4 Mons), erst bei der dritten Node ist das Quorum bei Dir da und die OSDs dieser Node starten. Wenn jetzt die OSDs der ersten beiden Nodes nochmal gestartet werden, funktioniert auch der Cluster...

Also einfach auf die Reihenfolge achten - erst Quorum mit den Mons erreichen und dann sehen, dass alle (oder möglichst alle) OSDs hoch kommen.

BTW. der Vergleich zwischen Raid und Ceph hinkt in vielen Fällen leider sehr...

Udo
 
Hi,
das Problem wird die komplett-Powerdown mit dem "eine Node kam nicht hoch" + 4 Mons, sein!
Udo

Hallo Udo,

danke für deinen Tipp.

Die Frage wäre für mich, ob ich das Quorum, ähnlich wie bei Proxmox, auch bei den Mons auf 2 Stellen könnte.
Also dass das Quorum schon bei 2 laufendens Mons erreicht ist.
Ich weiß, dass ich dann in eine Split-Situation laufen kann, halte das in diesem Fall (fast nur lesender Zugriff) für unwahrscheinlich.
 
BTW. der Vergleich zwischen Raid und Ceph hinkt in vielen Fällen leider sehr...

Udo

Das mit dem Ceph/Raid-Vergleich hinkt, klar, ganz verschiedene Techniken.

Aber im Prinzip verstehe ich das so, dass Ceph Daten erst in Journal schreibt, und dann auf die einzelnen OSDs verteilt.
In meinem Fall auf die OSD (auch) im Netzwerk. Daher ist der Limitierende Faktor sicherlich das Netzwerk, auch wenn wir hier 10GBE haben.

Wie ist das beim lesen?
Wir da parallel von mehreren OSD gelesen, und ggf. sogar von mehreren OSDs, aber alle auf dem gleichen Node?
Kann ich das beeinflussen?

In den meisten Doks steht immer nur drin das verteilt wird, und wenn man dies macht, dass dann das passiert (passieren soll).
Wenn das nicht klappt braucht man zur Fehlersuche ein tieferes Verständniss wie die Dinge "unter der Motorhaube" zusammenarbeiten. Und das fehlt mir in der Dokumentation.

Ceph verteilt die Daten nach der Crushmap. Mmh, okay. In meinem Beispiel "weiß" Ceph auf welchen Nodes welche OSDs sind.
Beim Schreiben verstehe ich ja, dass es gut ist, wenn alleDaten erst mal sicher angekommen sind.
Aber beim lesen sieht das ja anders aus.

Ich habe gerade mit einem RAID5 gesehen, dass es beim lesen fast genauso schnell wie die gleichen Platten in RAID0 war. Offensichtlich hat der Controller da bei der Parity direkt den nächsten Datensatz gelesen. Da ich sehr viel mit nur lesen, und das in großem Maße, zu tun habe, ist das Thema für mich natürlich sehr interessant (Media-Playout).

Aber wahrscheinlich gilt das gleiche wie immer: "Nur Versuch macht kluch"

Trotzdem wäre es interessant Eure Erfahrungen zu hören.

Schon mal vielen Dank,
Franziskus
 
Hallo Udo,

danke für deinen Tipp.

Die Frage wäre für mich, ob ich das Quorum, ähnlich wie bei Proxmox, auch bei den Mons auf 2 Stellen könnte.
Also dass das Quorum schon bei 2 laufendens Mons erreicht ist.
Ich weiß, dass ich dann in eine Split-Situation laufen kann, halte das in diesem Fall (fast nur lesender Zugriff) für unwahrscheinlich.
Hi,
ja mit 3 statt 4 Mons! Dann reichen zwei für's Quorum,

Deine längliche Mail bezüglich schreiben beantworte ich heute abend.

Udo
 
Das mit dem Ceph/Raid-Vergleich hinkt, klar, ganz verschiedene Techniken.

Aber im Prinzip verstehe ich das so, dass Ceph Daten erst in Journal schreibt, und dann auf die einzelnen OSDs verteilt.
In meinem Fall auf die OSD (auch) im Netzwerk. Daher ist der Limitierende Faktor sicherlich das Netzwerk, auch wenn wir hier 10GBE haben.
Hi Franziskus,
Schreiben bei Ceph läuft so:
Client fragt Mon nach crushmap
Mon antwortet Client
Client berechnet anhand der Crushmap wo die Daten (4MB-Block) zu schreiben sind und sendet diese zur entsprechenden Primary-OSD-Node.
Die OSD-Node schreibt diese in's Journal und sendet die Daten an die Replicas (die wiederum die Daten auch in's Journal schreiben),
Wenn Primary und alle Replicas die Daten sicher in's Journal geschrieben haben (mit sync), wird ein OK an den Client gegeben. Und die Daten werden vom Journal (oder besser gesagt, aus dem Memory-Cache) auf die OSDs geschrieben (wenn Du SSDs als Journal hast, sollte von denen so gut wie nie gelesen werden - sonst hat Du zuwenig RAM!)

Wie ist das beim lesen?
Wir da parallel von mehreren OSD gelesen, und ggf. sogar von mehreren OSDs, aber alle auf dem gleichen Node?
Kann ich das beeinflussen?
Lesen geht ähnlich, nur das anhand der crushmap errechnet wird, wer die primary-OSD ist und nur diese wird nach den Daten gefragt.
Dass heisst von den replicas wird vom client nie gelesen (nur die ceph-internen Housekeeping-Prozesse deep-scrub (und bedingt scrub) lesen von den replicas die Daten).
Beeinflussen kann man nur das Verhältnis, in wie weit eine OSD Primary sein soll (primary affinity). Wenn man eine schnelle und langsamer disks hat, liesse es sich so einrichten, dass die schnellen mehr Primarys halten und die langsamen nur/hauptsächlich Replicas...

Hoffe etwas Licht in den Ceph-Dschungel gebracht zu haben.

Es gibt einige Sachen, wo man tunen kann - allerdings ist es ein komplexes Zusammenspiel und nicht immer einfach die Flaschenhälse zu finden.

Udo
 

About

The Proxmox community has been around for many years and offers help and support for Proxmox VE, Proxmox Backup Server, and Proxmox Mail Gateway.
We think our community is one of the best thanks to people like you!

Get your subscription!

The Proxmox team works very hard to make sure you are running the best software and getting stable updates and security enhancements, as well as quick enterprise support. Tens of thousands of happy customers have a Proxmox subscription. Get yours easily in our online shop.

Buy now!