Fórumok
Adott egy Ceph cluster, rajta egy nagy pool-al size 3 és min_size 2-es paraméterekkel, ha az egyik node-ot karbantartás miatt le kell állítani 1-2 órára, akkor ha jól értem BÁRMELYIK hdd kiesése esetén a teljes pool read-only lesz?
Ebben az esetben érdemes-e 3/1-re állítani?
+ mi szól az ellen, hogy eleve 3/1-ben hagyjam?
Hozzászólások
En ezt hasznaltam:
http://florian.ca/ceph-calculator/
Ez jó, csak nem válasz a kérdésre. Mert nyilván ha 1 node áll, és közben 1 hdd kiesik, az más eset, mintha normál körülmények között 1 HDD kiesik.
Ezt te tudod eldönteni, hogy mi a fontosabb:
Persze de két kérdés újra:
- jól értem-e, hogy ha 1 node karbantartása közben 1db HDD kiesik, akkor a teljes pool megáll 3/2-nél
- Mi a veszélye a 3/1-nek ami miatt alapból nem érdemes ezt a beállítást használni?
3/1 esetén a node újrainduláskor+ha 1 HDD elhalt ÉS rossz az időbeállítás akkor hibázhat a helyreállításkor?
A ceph-es tapasztalataim régiek, de:
- ha egy teljes node karbantartásra leáll, akkor 3/2 esetén ugyan még van redundancia, de ha ezen idő alatt a működő node-oknál kiesik egy HDD, akkor az előírt redundancia, hogy egy adatnak legalább két helyen meg kell lennie, már nem lehetséges, tehát az érdemi adatvesztés elkerülése érdekében a Ceph RO-ba teszi a pool-t. Tehát nem áll meg, de csak olvasni fogod tudni, írni nem. Adatod viszont nem vész el, mert a másik diszken még megvan.
- a 3/1 azt jelenti, hogy addig engedi a Ceph az írást, amíg legalább egy diszkre az adat leírható. Azért nem érdemes ezt használni, mert ilyen esetben a pool csak akkor vált RO-ba, amikor már annyi diszk kiesett, hogy adatvesztésed is van. Ez nyilván nem szerencsés.
"az érdemi adatvesztés elkerülése érdekében a Ceph RO-ba teszi a pool-t. Tehát nem áll meg, de csak olvasni fogod tudni, írni nem."
Ez igaz, de a gyakorlatban az összes arról futó VM megáll.
"mert ilyen esetben a pool csak akkor vált RO-ba, amikor már annyi diszk kiesett, hogy adatvesztésed is van. Ez nyilván nem szerencsés."
Szerencsésnek persze hogy nem szerencsés, ugyanakkor én arra vagyok kíváncsi, hogy jó gyakorlat-e az, ha a node karbantartásának idejére csökkentem a min_size-t?
Nyilván ha észreveszem, hogy kiesett még egy HDD a karbantartás alatt, akkor a leghamarabb visszakapcsolom a node-t, és megvárom, míg az egész helyreállítja magát ÉS visszaállítom a min_size-t 2-re.
De e nélkül meg azt kockáztatom, hogy a karbantartás alatti HDD hiba kilövi az összes VM-et.
Ezért ennek így elsőre több előnyét látom, mint veszélyét.
Erről van szó, hogy te tudod, hogy az üzletmenetedben elfogadható e ez a kockázat. Van ahol igen, van ahol nem. Helyetted nem tudja senki ezt megmondani. Mi van ha olyan szituációba kerülsz, hogy csak egy régebbi állapotot tud visszamásolni, replikálni? Elfogadható?
Pont a kockázatra lennék kíváncsi.
"Mi van ha olyan szituációba kerülsz, hogy csak egy régebbi állapotot tud visszamásolni, replikálni?"
Milyen esetben fordulhat ez elő?
Pl, 3 másolatból egyik az offline node-on van, ami sértetlen, csak régi, a másik két másolat alól pedig kidöglik a vinyo (mondjuk mert egy meghal, elkezd rebalancolni aztán terhelés alatt egy másik is kidől). Biztos láttál már sima raid5/6 stb tömbnél is olyat, hogy rebuild közben dölt ki másik hdd.
Én most állítottam össze életem első igazi (mármint fizikai) Ceph klaszterét, amit majd megfelelő kiismerés és tesztelés után élesben is szeretnénk használni. Így olvasd, amit írok.
Eléggé költség hatékonynak kell lennünk, mert ez a rendszer egy próba projekt, és ha bejön, akkor majd tudjuk fejleszteni, de elsőre nem akartunk és nem is tudtunk nagyon nagy összeget belefektetni.
Az összes megelőző információ gyűjtés után arra jutottam, hogy egy majdani éles rendszerben az abszolut minimum a 4 node, és node-onként minimum 2 OSD legyen már indulásnak is (itt speciel 4 lett, 2 SSD és 2 HDD formában, külön pool-ban). A Ceph 3/2 beállítással megy, és a fenti kalkulátor segítségével a nearfull értéket is jelentősen lejjebb vettem a kevés node miatt (gyárilag 0.85, nekem most 0.7).
Az éles rendszert szeretném ha működőképes maradna 2 tökéletesen működő node esetén (tehát 2 node teljesen jó, és rajtuk az összes OSD). A végén valami DC-ben lesz, ahová nem tudunk azonnal menni, és emiatt fontos, hogy ha egy node kiesik, és a maradék hármon van OSD hiba, akkor még ne álljon meg a rendszer. Ezt elvileg úgy érem el, hogy 3/2 a size és eléggé alacsony a nearfull, hogy minden adatom 3 példánya el is férjen ezen a 2 teljesn node-on végszükség esetén. Persze ez így rettentő nagy a kapacitás bukó, de ez az ára a kevés node+magas rendelkezésre állás igénynek az olvasmányaim alapján. Most több node nem fért bele a kitűzött keretbe.
Ilyen felállás mellett, ha karbantartok egy node-ot, akkor még mindig elromolhat OSD, vagy akár komplett node anélkül, hogy a rendszer megállna és/vagy 2-nél kevesebb példány lenne bármiből. Én nem mernék éles rendszernél olyant bevállalni, hogy lehet, hogy csak 1 példány van (nincs semennyi redundancia), mert onnan irtózat könnyű adatot veszíteni. Szerintem olyannal számolni kell, hogy pl. egy node hiányában bármelyik OSD read error-t produkál és ha 3/1 a beállítás, és pont a hibás OSD-n van olyan adat, amiből csak 1 példány van, akkor már meg is van a baj. Ráadásul ha nagyon nagyok az OSD-k, akkor sokkal tovább is tart, mire a rendszer helyre áll, és több idő alatt nagyon az esélye egy újabb hiában (ráadáusul a self healing azért elég strapás a rendszernek ahogy olvasom - éles tapasztalatom még nincs).
Azért nem gondolkodtam EC-ben (ami sokkal takarékosabb a tárhellyel), mert ahhoz a 4 node nagyon kevés, ugyanis ott is tartanám a minimum 2 OSD/node hibatűrési szintet, amihet kapásból dupla ennyi node kellene.
Természetesen ha az egészet vagy részét nem jól írtam/értelmeztem a leiratokból, akkor a hozzáértőket kérem javítsatok ki, hogy mást ne vezessek félre, és tanulhassak belőle.
Én ehhez csak annyit tennék hozzá, hogy a CEPH replikáció az nem backup.
Simán lehet pl egy elrontott pg repairrel inkonzisztenciát gyártani, és ez ilyenkor nyilván sok objectet érint, ha rbd-t is használsz, akkor pedig egy ilyen után sok block device-ban lesznek hibás chunkok, ezt rémálom javítani.
Nyilván! Erre elfelejtettem kitérni, de jogos és fontos kérdés. Én úgy tekintek a Ceph tárolóra, mint egy sima szerver sima diszkjére ilyen szempontból. A (nekem legjobban bevált) 3-2-1 backupnak Ceph esetén is meg kell lennie.
De ha a rendszer minél több hibát tud elviselni működőképesen és konzisztensen, annál kevésbé kell a (jellemzően lassú) backup-ból visszaálláshoz folyamodni, és annál kevesebb lesz az offline töltött idő.
Szerintem tévedsz.
Ha 3 másolatod van, és leállítasz egy node-ot + bejön egy HDD hiba, akkor 4 nodenál és 3/2-nél 66% eséllyel megállsz... hacsak a leállítás előtt nem out-olod ki a node összes HDD-jét és vársz erre 3napot.
"Az éles rendszert szeretném ha működőképes maradna 2 tökéletesen működő node esetén (tehát 2 node teljesen jó, és rajtuk az összes OSD)."
Na ez megint necces lesz.
4 node 3/2-ben az azt jelenti, ha lekapcsolsz (vagy alaplap hibás lesz) 2db nodeot, akkor pg-k 33%nál a két másolat azokon a node-okon lesz ami épp áll... tehát nem fogsz működni.
Működni 4/2-nél fogsz, mert ott valóban kieshet 2 node a 4-ből.
szerk.: ha 1 node esik ki, de van ideje a clusternek rebalance-olni, akkor természetesen kieshet a 2. is. (Csak hát azt néhány napot végig kell izgulni.. :-))) )
Ez teljesen jogos! Mondjuk ha 1 node kiesése után a rendszer helyreáll 3 node-dal, és akkor esik ki OSD, akkor működik tovább (de már több hibának nincs helye...). Ha a helyreállás közben esik ki OSD, akkor nagy eséllyel ez a megállás bekövetkezhet. De akkor csak a 4/2 a biztos megoldás, hogy 1 node kiesés és ezen felül egy teszőleges OSD kiesés biztos ne járjon (VM) leállással?
4 node, 8x 1.92TB SSD 3/2 esetén a "safe capacity" 3480 GB, 4/2 esetén már csak 2610 GB. Az azért eléggé kevés a 13920 GB nyers tárterületből.
Lehet bármi más értelmes verzió 4 node esetén, ami nem bánik ennyire pazarlóan a kapacitással, de a fenti meghibásodást biztosan tűri?
Elméletileg, vagy gyakorlatilag? Én gyakorlatban nem építenék páros számú node-ból clustert, akkor már 3 node és az árból több kis SSD. pl nodeonkén 6db 1T-s. Itt SSD hiba esetén többfelé tudja a rendszer szétszórni az adatokat. Ráadásul 3nodenál még lehet értelmes mesh hálót csinálni és akkor a hálózati eszköz kiesésével sem kell számolni.
De egy komplett node leállása esetén sem fogsz állni, hisz 2 node-dal még megy a rendszer. Ha meg látod, hogy áll akkor meg hajrá-hajrá gyerünk cserélni. Azért reálisan a HDD/SSD-k nagyobb eséllyel pusztulnak meg mint maga a node.
Már tudom, hogy nem igazán praktikus, de a páros számú node már adott, meg a benne lévő SSD-k és HDD-k is. A HDD-ket sajna nem tudjuk elfogadható bukóval SSD-re konvertálni, de a jövőbeni fejlesztésnél már csak SSD-k kerülnek majd be. Így a fizikai felálláson érdemben változtatni már nem tudok.
A hálózat is már adott, 2 db 10 GbE switch megvan, elsősorban azért már az elején, hogy ha újabb node áll majd be idővel, akkor a (remélhetőleg már élesben működő) rendszert ne kelljen alapjaiban átvariálni a bővítés miatt.
De a 4/2-es replikációt megfontolom, hogy 1 node + 1 OSD elvesztése miatt ne legyen read-only a tároló.
Ha azonos számú SSDd és HDDd van akkor talán érdemes letesztelni a teljesítményt, ha cache tierként az SSD használod, vagy ha HHDhez WAL-nak az SSD-t.
cache tier már nem supportált nem?
Nem tudok róla, miből gondolod?
Red Hat-ék dobták:
És mivel kb. java részét ők tolják be a kódnak, ezt ők nem fejlesztik, más se nagyon.
mar nem supportalt es ajanlott vagy 3 eve
Én is olvastam már, hogy a Luminous után már nem javasolt a cache tier Ceph szinten. Ha mégis cache-re van szükség (használata segít bizonyos fajta terheléseknél), akkor néhány féle LVM cache megoldás közül lehet választani. De ilyen bonyolításba már nem mennék bele, szerintem nekem nem hozna semmit, csak plusz komplexitást.
A HDD-k mellett van M.2-es NVMe SSD RocksDB/WAL céljából (igaz, nem enterprise kategória, mert olyant nem találtunk értelmes áron, kis méretben), egyenlőre a 2 db HDD 1-1 50GB-os szeletet kap az M.2-ből (tudom, 30 GB elég lenne, vagy 300 GB a következő hasznos lépcső, de annyi már nem telik ki per HDD).
Lehet "erasure code" pool-t csinálni, persze alacsonyabb iops. pl 4/2 erasure pool: 66 % a szabad hely.
4 node-dal hogyan? Nem merültem bele még nagyon, de nem k=2 és m=2 kellene legyen, és 50% szabad hely a vége? Vagy lehet ha jobban elolvasnám, akkor 4 node esetén nem lehet m=2-vel működni sehogyan sem, az egyszeres hibatűrés meg olyan lenne kb., mint a 3/1-es vagy 2/1-es replikáció.
De több helyen olvasom, hogy nagyságrendekkel rosszabb a teljesítménye, mint a replikált verziónak, VM-ek alá nem javasolja senki, csak nagy mennyiségű, nem IOPS kritikus adat alá. De ahhoz meg kevés a 4 node és a node-onként 2 OSD szerintem.
Raid-szerűség, 6 lemez , ebből 4 adat 2 "paritás" , igy jön ki a 66%. Vagy pl. 8+3 , 11 lemez.
Értem, de ha a 6 lemez nem 6 node-ban van, hanem csak 4-ben, akkor nem a node lesz a failure domain, hanem az OSD, ami komplett node kiesés ellen semmit nem véd, pláne kettő kiesése ellen.
Ezért írtam, hogy rendes EC-hez rettentő kevés a 4 node-om, szerintem.
És még valami, szegény Ceph elosztási algoritmusa néha elég vicces. Most épp azon küzdök, hogy a nodeban lévő 8 HDD-nál 5. rebalance után is az egyik HDD 60%on van a másik meg 85%-on...
Ezzel csak azt akarom mondani, hogy a tárhelyet bőven számold túl...
ui.: és a legszebb hogy 85%-nál kapott új HDD-t hogy legyen hely, épp most rakosgatja a dolgait, de az az OSD már 88%-on van, szóval még csak véletlenül sem annak az tehermentesítésével kezdett...
mar reg van pg autoscaling es a mgrben auto balancing is, nem kell kezzel csinalni semmit. ha tul regi a cephed akkor pedig frissiteni kell.
Tudom, de hiába van, ha a sokadik rebalance UTÁN az OSD.11 1 reweight érték mellett 59%-os telítettségen van, az OSD.17 a 0,94-es reweight-nél meg 83%-on.
Ja és mindehhez az OSD.16 nearfull, aminek a telítettsége 81%, tehát kevesebb mint a OSD.17 a 83%os telítettsége. (minden node és HDD egyforma).
Szóval néha nehéz követni mit miért csinál.
Mindazon által nyugodtabban alszok, mióta használjuk.
fent eleg jol leirtak hogy miert ne futtasson senki min_size=1-es clustert; en ket dolgot szeretnek hozzatenni, mert ugy latom ebben tobben tevednek fent:
- ugyan a beallitas a poolon van, ez nem a poolon van ervenyesitve, hanem PG szinten, igy siman lehet irhato PG is akkor ha meghalt egy diszk azutan hogy egy nodeot kivettel, mikozben egy masik PG meg be van allva mint a szog
- amint kiesik az osd egy pgbol (down + grace period) utana a pg kap egy ideiglenes HDD assignt, es mar nem [a,b,c] lesz benne, hanem mondjuk [a,b, c, tmp1], ideiglenesen, igy _uj adat_ irasakor sincs megallas (hiszen ha ketto pukkan el akkor [a, b, c, tmp1, tmp2] lesz benne), csak meglevo adat felulirasakor IMHO
ha ki van kapcsolva minden onjavitasi beallitas akkor nyilvan nem fog ez megtortenni, es akkor az iras is beallhat a PGn mint a szog, ahogy fent irtam
Akkor ha jól értem, a 4 node esetén 3/2-vel futó pool (PG) egy node kivétele, majd (self heal előtt) 1 OSD elvesztése esetén sem 100%, hogy minden VM leáll, mert nem tud írni.
Mi úgy számoltuk, hogy node hardver hiba miatt elég ritkán fog kiesni, mert rendes szerver hardver esetén szóló üzemben sem jellemző az ilyen megállás. Diszk hiba valószínű sokkal gyakrabban lesz, de arra sem heti/havi rendszerességgel számítunk ilyen kis darabszámok mellett.
Az itt összeszedett információk alapján én jelenleg elfogadható rendelkezésre állásnak látom a 4 host, size 3/2 pool felállást akkor. Pláne úgy, hogy ez a majdani rendszer egy szóló szerver helyére kerül, amivel eddig nem volt igazán sok gond hardver megállás téren. Szoftverrel sokkal többet bénáztunk amiből leállás volt... :-)
Még egy kérdés: jól gondolom, hogy ha 5 node lenne, és ugyan úgy size 3/2 esetén, 1 node + 1 OSD elveszítés esetben semmivel nem lenne jobb a helyzet, mint 4 node esetén? Mert 5 node esetén is a 3 példányból kieshet kettő (1 a kieső node-on és 1 a kieső OSD-n), és akkor az a PG átmenetileg min_size alatt lesz, ergo nem írható addig, amíg a self heal legalább még egy példányt létre nem hoz működő OSD-n (gondolom ez alatt az idő alatt vagy megáll vagy hibázik az érintett VM).
Az ilyen esetekre való készülést (igazából pool tervezést) hol lehet úgy elolvasni, hogy halandó is megértse belőle a szempontokat és lehetőségeket, és tudjon olyan beállítást gyártani, ami ezt az esetet megoldja biztosan? Vagy ez csak a gyakolat + az előforduló esetek alapos/részletes átgondolása?
mi 2 geppel, 2xes replikacioval indultunk, min_size=1-el. mai fejjel mar nem csinalnam, de ez meg az osidokben volt (szerintem mienk volt az egyik elso ceph cluster svajcban).
a kerdes az, hogy definialjuk az elvesztest: ha egy gep kiesik, akkor amint lejar a grace period (300 sec altalaban) a PG ki lesz bovitve [a,b,c]-rol [a,b,c(halott),d]-re, es elkezd az adat szepen atmozogni d-re ami a c-n lenne. HDDn ez nyilvan tovabb tart, mint SSD eseten. ha e kozben elhal egy diszked, akkor sincs gond, mert ahogy irtam, [a,b,c(halott),d]-rol [a,b(halott),c(halott),d,e] lesz, es maris tud irni a+e-re.
tehat abban az esetre ha veletlen halnak el komponensek akkor a rendelkezesre allas sosem serul, a cluster elerheto lesz folyamatosan.
remelem igy mar tisztabb!
Igen, így már teljesen tiszta, köszönöm a magyarázatot!
A felhasználás jellege miatt a helyreállás alatti csökkent IO teljesítmény nem fog gondot okozni, így ez nekünk tökéletes lesz arra amire szeretnénk.
Köszönöm szépen a válaszod!
Pont erre voltam kíváncsi, hogy a teljes pool áll le, vagy csak egy része!
Egyébként tudsz arra valamilyen eszközt, amivel kilistázható, hogy egy adott PG vagy OSD milyen image-ek adatait tartalmazza?
Google? :) https://ervikrant06.wordpress.com/2015/04/22/how-to-map-objects-to-osds-in-ceph/
Object szinten OK, de egy kis 10G-s imageben is van vagy 2500 objektum... nyilván leprogramozható, hogy egyesével összeszedni és kiírni, de kíváncsi voltam, hogy Ti esetleg használtok-e ilyen eszközt.
ezt nem neveznem azert "programozas"-nak, maximum valami kezdo scriptelesnek. :) de igen, ez a megoldas. rbd infobol kinyernyi a rados prefixet, rados lspoolbol kigreppeled, mappeled, kikapod uj sorba oket (s/, /\n/g) | sort | uniq, done
Összedobtam egy scriptet és megnéztem egy véletlenszerűen választott 6Gb-s VM imaget.
Az image adatai (1536 object) az összes OSD-n (24db) volt szétosztva.
Lehet ezért nincs erre kész utility. :-)
meglepo?
a crush garantalja azt hogy minden erintett OSD benne lesz, azt nem garantalja, hogy minden OSDn ugyanannyi PG lesz, illetve hogy ugyanannyi adat
Picit igen, mert az nem rémlett, hogy image szinten garantálni kéne, hogy az összes OSD részt vegyen benne. Mert ez ugye azt is jelenti, hogy indulóban felvett probléma esetén annak ellenére, hogy csak néhány PG érintett, mégis MINDEN imagenek lesz read only része. (Persze ha mázlim van,akkor pont az a része amit épp nem piszkál a rendszer.)
Ennél biztonság szempontjából lehet hatékonyabb lenne, ha nem akarná az összes OSD-t bevonni, teljesítmény szempontból most sem garantálható, hogy egyformán használja az OSD-ket, csak az, hogy hiba esetén mindenkit értint.
igy lehet jol skalazni :-)
alapbol 4MB-onkent van uj PG csoport assignolva, de ezt lehet allitani
:-)
Jó, akkor majd megemelem az object méretet 1G-re és akkor a kisebbek biztos nem lesznek rajta minden OSD-n :-)))
Ha jól emlékszem, akár ha csak 1 kbájt módosul a PG-ben, az egészet újra kell írni.
Hatékonyságról nem beszéltem.
Egyszerre csak egy dologra koncentráljunk. :-)