Izkušnje z uporabo CEPH

Ko se podatki povečajo do te mere, da ne ustrezajo več na enem disku, je čas, da razmislimo o RAID-u. V otroštvu sem pogosto slišal od starejših: „Nekega dne bo RAID izginil, objektna shranjevanja bodo prevzela svet, ti pa ne boš vedel, kaj je CEPH“ — zato je bila moja prva naloga v samostojnem življenju ustvariti svoj klaster. Namen eksperimenta je bil spoznati notranje delovanje ceph in razumeti okvirje njegove uporabe. Koliko je smiselno uvajanje ceph v srednje podjetje in v majhna? Po več letih uporabe in nekaj nepovratnih izgubljenih podatkov se je pojavilo razumevanje zapletenosti, da stvari niso tako enostavne. Lastnosti CEPH ustvarjajo ovire za njegovo širšo uporabo, zaradi katerih so eksperimentiranje dosegli slepo ulico. Spodaj je opis vseh prehojenih korakov, dobljeni rezultati in narejeni zaključki. Če bi mi vedni ljudje lahko delili izkušnje in pojasnili nekatere točke — bom hvaležen.

Opomba: komentatorji so opozorili na resne napake v nekaterih predpostavkah, kar zahteva pregled celotnega članka.

Strategija CEPH

Klaster CEPH združuje poljubno število K diskov poljubne velikosti in shranjuje podatke na njih, pri čemer vsak delček (4 MB po privzetku) podvaja N-krat.

Poglejmo najprej najpreprostejši primer z dvema enakima diskom. Iz njiju lahko sestavimo bodisi RAID 1 bodisi kluster z N=2 – rezultat bo enak. Če so trije diski in so različnih velikosti, je enostavno sestaviti kluster z N=2: del podatkov bo na diskih 1 in 2, del na 1 in 3, del pa na 2 in 3, medtem ko RAID ne more biti sestavljen (tak RAID sicer lahko sestavimo, a to bi bilo izkrivljeno). Če diskov postane še več, je možno ustvariti RAID 5, pri CEPH pa imamo analogni sistem – erasure_code, ki nasprotuje prvotnim konceptom razvijalcev, zato se ne obravnava. RAID 5 predvideva, da je na voljo majhen številk diskov in da so vsi v dobrem stanju. Pri odpovedi enega morajo ostali vzdržati, dokler ne zamenjajo diska in obnovijo podatke nanj. CEPH pa pri N>=3 spodbuja uporabo starejših diskov, zlasti če imamo več dobrih diskov za shranjevanje ene kopije podatkov, preostale dve ali tri kopije pa hranimo na večjem številu starejših diskov, potem bo informacija varna, saj dokler so novi diski zdravi, ni težav, če pa eden od njih odpove, je hkratna odpoved treh diskov, ki so starejši od petih let, še posebej iz različnih strežnikov – izjemno malo verjetna dogodivščina.

V razdelitvi kopij obstaja posebnost. Privzeto se smatra, da so podatki razdeljeni na večjih količin (~po 100 na disk) skupin razdelitve PG, ki se vsaka podvoji na nekaterih diskih. Recimo, K=6, N=2, potem pri okvari dveh poljubnih diskov podatki zagotovo izginejo, saj po teoriji verjetnosti obstaja vsaj ena PG, ki se nahaja prav na teh dveh diskih. In izguba ene skupine povzroči nedostopnost vseh podatkov v bazenu. Če pa diske razdelimo na tri pare in dovolimo shranjevanje podatkov le na diskih znotraj enega para, je taka razdelitev prav tako odporna na okvaro katerega koli diska, toda pri okvari dveh je verjetnost izgube podatkov ne 100%, temveč le 3/15, in celo pri okvari treh diskov — le 12/20. Od tod sledi, da entropija v razdelitvi podatkov ne prispeva k odpornosti na okvare. Prav tako opažamo, da prosta RAM pomnilnika na datotečnem strežniku znatno povečuje hitrost odziva. Več pomnilnika v vsakem vozlišču in več pomnilnika v vseh vozliščih — hitrejše bo. To je nedvomno prednost klasterja pred enim samim strežnikom in še bolj, pred strojno NAS napravo, v katero je vgrajen zelo majhen obseg pomnilnika.

Od tod sledi, da je CEPH dober način, da z minimalnimi vložki iz zastarele opreme ustvarite zanesljiv sistem za shranjevanje podatkov na desetine TB z možnostjo razširjanja (tu bodo seveda potrebni stroški, a majhni v primerjavi s komercialnimi SHR).

Izvedba klasterja

Za poskus bomo vzeli odpisan računalnik Intel DQ57TM + Intel core i3 540 + 16 GB RAM. Čtiri diske po 2 TB bomo organizirali v podobnost RAID10, po uspešnem preizkusu pa dodali drugo vozlišče in še toliko diskov.

Namestitev Linuxa. Distribucija mora omogočati prilagodljivost in stabilnost. Primerna sta Debian in Suse. Suse ima bolj prilagodljiv namestitveni program, ki omogoča izklop katerega koli paketa; žal nisem mogel razumeti, katere pakete je mogoče odstraniti brez škode za sistem. Namestimo Debian preko debootstrap buster. Možnost min-base namesti neoperativni sistem, ki mu primanjkuje gonilnikov. Razlika v velikosti v primerjavi s polno različico ni tako velika, da bi se s tem preveč obremenjevali. Ker se delo izvaja na fizični napravi, želimo ustvariti posnetke, kot na virtualnih strojih. To možnost omogoča bodisi LVM bodisi btrfs (ali xfs, ali zfs — razlika ni velika). LVM ni močan pri posnetkih. Izberemo btrfs. In za zagonski nalagalnik — v MBR. Ni smisla onesnaževati diska 50 MB particijo s FAT, ko lahko vse vložimo v 1 MB območje tabele particij in vse preostalo prostor namenimo sistemu. Zasedlo je 700 MB na disku. Koliko zasede osnovna namestitev SUSE — se ne spomnim, zdi se, da okoli 1.1 ali 1.4 GB.

Namestitev CEPH. Ignoriramo različico 12 v repozitoriju debian in se povezujemo neposredno s spletne strani 15.2.3. Sledimo navodilom v razdelku „namestitev CEPH ročno“ s sledečimi opombami:

  • Pred povezovanjem repozitorija je potrebno namestiti gnupg wget ca-certificates.
  • Po povezavi repozitorija, vendar pred namestitvijo gruče je spustimo namestitev paketov: apt -y --no-install-recommends install ceph-common ceph-mon ceph-osd ceph-mds ceph-mgr.
  • Ob namestitvi CEPH se iz nejasnih razlogov poskuša namestiti lvm2. Po pravici rečeno, ni škoda, vendar se namestitev konča s napako, zato CEPH ne bo nameščen.

    Ta popravek je pomagal:

    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
    

Pregled gruče

ceph-osd — odgovoren za shranjevanje podatkov na disku. Za vsak disk se zažene omrežna storitev, ki sprejema in izvršuje zahteve za branje ali pisanje v objekte. Na disku nastaneta dva razdelka. Eden vsebuje informacije o klastru, številki diska in ključe za klaster. Te informacije, velikosti 1 KB, se enkrat ustvarijo ob dodajanju diska in ne spremenijo več. Na drugem razdelku ni datotečnega sistema in hranijo se binarni podatki CEPH. Samodejna namestitev v prejšnjih različicah je ustvarila xfs razdelek velikosti 100 MB za servisne informacije. Disk sem pretvoril v MBR in dodelil le 16 MB — storitev se ne pritožuje. Mislim, da bi xfs brez težav lahko zamenjali z ext. Ta razdelek se montira v /var/lib/…, kjer storitev prebere informacije o OSD in najde povezavo do bloka naprave, kjer so shranjeni binarni podatki. Teoretično bi bilo možno pomožne shraniti neposredno v /var/lib/…, celoten disk pa nameniti podatkom. Pri ustvarjanju OSD preko ceph-deploy se samodejno ustvari pravilo za montažo razdelka v /var/lib/…, prav tako se dodelijo pravice uporabniku ceph za branje potrebnega bloka naprave. Pri ročni namestitvi je to treba narediti sam, o tem v dokumentaciji ni omenjeno. Prav tako je zaželeno določiti parameter osd memory target, da zadostuje fizični pomnilnik.

ceph-mds. Na nizki ravni je CEPH objektno shranjevanje. Možnost blokovnega shranjevanja je omejena na shranjevanje vsakega bloka 4 MB v obliki objekta. Po istem principu deluje tudi shranjevanje datotek. Ustvarita se dva bazena: eden za metapodatke, drugi — za podatke. Ti se kombinirajo v datotečni sistem. V tem trenutku se ustvari neka vnos, zato če izbrišemo datotečni sistem, a obdržimo oba bazena, ga ne bo mogoče obnoviti. Obstaja postopek za pridobivanje datotek po blokih, tega nisem testiral. Za dostop do datotečnega sistema je odgovorna storitev ceph-mds. Za vsak datotečni sistem je potrebna ločena instanca storitve. Obstaja možnost 'indeks', ki omogoča ustvarjanje podobnosti več datotečnih sistemov v enem — tega prav tako nisem testiral.

ceph-mon — ta storitev shranjuje zemljevid klasterja. Vključuje informacije o vseh OSD-jih, algoritmu razporeditve PG v OSD in, kar je najpomembnejše, informacije o vseh objektih (podrobnosti o mehanizmu mi niso jasne: obstaja katalog /var/lib/ceph/mon/.../store.db, kjer je shranjena velika datoteka — 26MB, v klasterju pa je 105K objektov, kar pomeni malo več kot 256 bajtov na objekt, - mislim, da monitor hrani seznam vseh objektov in PG, v katerih so shranjeni). Poškodba tega kataloga vodi do izgube vseh podatkov v klasterju. Od tod izhaja sklep, da CRUSH prikazuje, kako so PG-ji razporejeni po OSD-jih, in kako so objekti razporejeni po PG-jih — centralno so shranjeni znotraj baze podatkov, ne glede na to, kako se razvijalci izogibajo temu besedilu. Kot posledica, po prvi, ne moremo namestiti sistema na USB ključe v RO načinu, ker se v bazo podatkov stalno zapisuje, potrebujemo dodaten disk za to (verjetno ne več kot 1 GB), po drugi strani pa je potrebno v realnem času imeti kopijo te baze. Če je monitorov več, se odpornost na napake zagotavlja samodejno, vendar v našem primeru imamo le enega, maksimalno dva. Obstaja teoretična procedura za obnovitev monitorja na podlagi podatkov OSD, do nje sem se trikrat zatekel iz različnih razlogov in trikrat so bili rezultati brez napak, pa tudi brez podatkov. Na žalost ta mehanizem ne deluje. Ali pa uporabljamo miniaturno particijo na OSD in sestavljamo RAID za shranjevanje baze podatkov, kar gotovo zelo slabo vpliva na zmogljivost, ali pa zagotovimo vsaj dve zanesljivi fizični nosilci, zaželeno USB, da ne zasedamo povezav.

rados-gw — izvaža objektno shranjevanje prek protokola S3 in podobnih. Ustvarja številne bazene, ne vem točno zakaj. Nisem izvajal eksperimentov.

ceph-mgr — ob namestitvi te storitve se zažene več modulov. Eden od njih je nediskriminatorni autoscale. Prizadeva si ohranjati pravilno število PG/OSD. Če želite upravljati razmerje ročno, lahko prepoveste povečanje za vsak bazen, vendar v tem primeru modul pade zaradi deljenja z 0, status klasterja pa postane ERROR. Modul je napisan v Pythonu in če v njem zakomentirate potrebno vrstico, to privede do njegovega izklopa. Podrobnosti so mi nekoliko lenobe spominjati.

Seznam uporabljenih virov:

Namestitev CEPH
Obnova ob popolnem odpovedi monitorja

Seznami skriptov:

Namestitev sistema preko 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 6

Ustvarjanje klasterja

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@rbd1

Dodavanje OSD (deo)

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

Резюме

Glavno marketinško prednost CEPH je CRUSH - algoritem za izračunavanje lokacije podatkov. Monitori distribuirajo ta algoritem strankam, po katerem stranke neposredno zahtevajo ustrezen vozlišče in ustrezen OSD. CRUSH zagotavlja odsotnost centralizacije. Gre za majhno datoteko, ki jo lahko natisnete in obesite na steno. Praksa je pokazala, da CRUSH ni izčrpen zemljevid. Če uničite in znova ustvarite monitorje ter obdržite vse OSD in CRUSH, to ni dovolj za obnovitev klastra. Od tod izhaja zaključek, da ima vsak monitor nekaj metapodatkov o celotnem klastru. Neustrezna količina teh metapodatkov ne nalaga omejitev na velikost klastra, temveč zahteva, da se zagotovi njihova zaščita, kar izključuje prihranek diska z namestitvijo sistema na flash pomnilnik in izključuje klastra s manj kot tremi vozlišči. Agresivna politika razvijalca glede opcijskih funkcij. Daleč od minimalizma. Dokumentacija na ravni: „za to, kar je, — hvala, ampak zelo, zelo skopo“. Možnost interakcije s storitvami na nizki ravni je predvidena, vendar se dokumentacija preveč površno dotika te teme, zato je verjetneje ne kot da. Praktično nobene možnosti za obnovitev podatkov iz izredne situacije.

Možnosti nadaljnjih ukrepov: opustiti CEPH in uporabiti banalni večdiskovni btrfs (ali xfs, zfs), poiskati nove informacije o CEPH, ki bodo omogočile njegovo uporabo v navedenih pogojih, poskusiti v okviru izobraževanja napisati lastno shrambo.

Izvor: habr.com

Kupite zanesljivo gostovanje za spletne strani z zaščito pred DDoS, VPS VDS strežniki 🔥 Kupite zanesljivo gostovanje za spletne strani z zaščito pred DDoS, VPS VDS strežniki | ProHoster