Delovne izkušnje CEPH

Ko je podatkov več, kot jih lahko spravimo na en disk, je čas, da pomislimo na RAID. Kot otrok sem od starejših pogosto slišal: “nekega dne bo RAID preteklost, shramba objektov bo napolnila svet, ti pa sploh ne veš, kaj je CEPH,” torej prva stvar v mojem samostojnem življenju. je bilo ustvariti svoj grozd. Namen poskusa je bil seznaniti se z notranjo strukturo cefa in razumeti obseg njegove uporabe. Kako upravičena je uvedba ceph v srednjih in malih podjetjih? Po nekaj letih delovanja in nekaj nepopravljivih izgubah podatkov se je pojavilo razumevanje zapletenosti, da ni vse tako preprosto. Posebnosti CEPH predstavljajo ovire za njegovo široko uporabo in zaradi njih so poskusi zašli v slepo ulico. Spodaj je opis vseh izvedenih korakov, dobljenega rezultata in sklepov. Če bodo poznavalci delili svoje izkušnje in razložili nekatere točke, bom hvaležen.

Opomba: Komentatorji so odkrili resne napake v nekaterih predpostavkah, ki zahtevajo revizijo celotnega članka.

Strategija CEPH

Grozd CEPH združuje poljubno število K diskov poljubne velikosti in shranjuje podatke nanje, tako da podvoji vsak kos (privzeto 4 MB) dano število N-krat.

Oglejmo si najpreprostejši primer z dvema enakima diskoma. Iz njih lahko sestavite RAID 1 ali gručo z N=2 - rezultat bo enak. Če so diski trije in so različnih velikosti, je enostavno sestaviti gručo z N=2: nekaj podatkov bo na diskih 1 in 2, nekaj na diskih 1 in 3, nekaj pa bo na 2 in 3, medtem ko RAID ne bo (lahko sestavite tak RAID, vendar bi bila perverzija). Če je diskov še več, potem je mogoče ustvariti RAID 5; CEPH ima analog - erasure_code, ki je v nasprotju z zgodnjimi koncepti razvijalcev in zato ni upoštevan. RAID 5 predpostavlja, da obstaja majhno število pogonov, ki so vsi v dobrem stanju. Če eden odpove, morajo ostali zdržati, dokler se disk ne zamenja in podatki na njem niso obnovljeni. CEPH z N>=3 spodbuja uporabo starih diskov, še posebej, če imate več dobrih diskov za shranjevanje ene kopije podatkov, preostali dve ali tri kopije pa shranite na veliko število starih diskov, potem informacije bo varno, saj so zaenkrat novi diski živi - ni težav, in če se eden od njih pokvari, je hkratna okvara treh diskov z življenjsko dobo več kot pet let, po možnosti iz različnih strežnikov, zelo malo verjetna dogodek.

Pri distribuciji kopij obstaja subtilnost. Privzeto se predpostavlja, da so podatki razdeljeni v več (~100 na disk) distribucijskih skupin PG, od katerih je vsaka podvojena na nekaterih diskih. Recimo K=6, N=2, potem, če katerikoli disk odpove, so podatki zagotovljeno izgubljeni, saj bo po teoriji verjetnosti vsaj en PG, ki se bo nahajal na teh dveh diskih. In izguba ene skupine povzroči, da vsi podatki v bazenu niso na voljo. Če so diski razdeljeni na tri pare in je dovoljeno shranjevanje podatkov le na diske znotraj enega para, potem je takšna porazdelitev odporna tudi na okvaro katerega koli diska, če pa odpovejo dva diska, verjetnost izgube podatkov ni velika. 100%, vendar le 3/15, in tudi v primeru okvare treh diskov - samo 12/20. Zato entropija v distribuciji podatkov ne prispeva k toleranci napak. Upoštevajte tudi, da za datotečni strežnik prosti RAM znatno poveča hitrost odziva. Več pomnilnika v vsakem vozlišču in več pomnilnika v vseh vozliščih, hitrejši bo. To je nedvomno prednost gruče pred enim strežnikom in še bolj pred strojnim NAS, kjer je vgrajena zelo majhna količina pomnilnika.

Iz tega sledi, da je CEPH dober način za ustvarjanje zanesljivega sistema za shranjevanje podatkov za več deset TB z možnostjo prilagajanja z minimalnimi naložbami iz zastarele opreme (tukaj bodo seveda potrebni stroški, vendar majhni v primerjavi s komercialnimi sistemi za shranjevanje).

Izvedba grozda

Za poskus vzemimo odslužen računalnik Intel DQ57TM + Intel core i3 540 + 16 GB RAM-a. Štiri 2 TB diske bomo organizirali v nekaj podobnega RAID10, po uspešnem testu bomo dodali drugo vozlišče in enako število diskov.

Namestitev Linuxa. Distribucija zahteva sposobnost prilagajanja in stabilnosti. Debian in Suse izpolnjujeta zahteve. Suse ima bolj prilagodljiv namestitveni program, ki vam omogoča, da onemogočite kateri koli paket; Na žalost nisem mogel ugotoviti, katere bi lahko zavrgli, ne da bi poškodovali sistem. Namestite Debian s programom debootstrap buster. Možnost min-base namesti pokvarjen sistem brez gonilnikov. Razlika v velikosti v primerjavi s polno različico ni tako velika, da bi motila. Ker delo poteka na fizičnem stroju, želim delati posnetke, kot na virtualnih strojih. To možnost ponuja LVM ali btrfs (ali xfs ali zfs - razlika ni velika). Posnetki LVM niso močna stran. Namestite btrfs. In zagonski nalagalnik je v MBR-ju. Nima smisla natrpati 50 MB diska s particijo FAT, če ga lahko potisnete v območje particijske tabele 1 MB in dodelite ves prostor za sistem. Na disku je zasedel 700 MB. Ne spomnim se, koliko ima osnovna namestitev SUSE, mislim, da okoli 1.1 ali 1.4 GB.

Namestite CEPH. Različico 12 v repozitoriju debian prezremo in se povežemo neposredno s spletnega mesta 15.2.3. Sledimo navodilom iz razdelka »Ročna namestitev CEPH« z naslednjimi opozorili:

  • Preden povežete repozitorij, morate namestiti potrdila gnupg wget ca
  • Po povezavi repozitorija, vendar pred namestitvijo gruče, je namestitev paketov izpuščena: apt -y --no-install-recommends install ceph-common ceph-mon ceph-osd ceph-mds ceph-mgr
  • Pri namestitvi CEPH bo iz neznanih razlogov poskusil namestiti lvm2. Načeloma ni škoda, vendar namestitev ne uspe, zato tudi CEPH ne bo namestil.

    Ta popravek je pomagal:

    cat << EOF >> /var/lib/dpkg/status
    Package: lvm2
    Status: install ok installed
    Priority: important
    Section: admin
    Installed-Size: 0
    Maintainer: Debian Adduser Developers <[email protected]>
    Architecture: all
    Multi-Arch: foreign
    Version: 113.118
    Description: No-install
    EOF
    

Pregled grozda

ceph-osd - je odgovoren za shranjevanje podatkov na disku. Za vsak disk se zažene omrežna storitev, ki sprejema in izvaja zahteve za branje ali pisanje v objekte. Na disku se ustvarita dve particiji. Eden od njih vsebuje podatke o gruči, številko diska in ključe gruče. Ta 1KB informacija se ustvari enkrat ob dodajanju diska in nikoli ni bila opažena sprememba. Druga particija nima datotečnega sistema in shranjuje binarne podatke CEPH. Samodejna namestitev v prejšnjih različicah je ustvarila 100 MB particijo xfs za servisne informacije. Disk sem pretvoril v MBR in dodelil samo 16MB - storitev se ne pritožuje. Mislim, da bi se dalo xfs brez težav zamenjati z ext. Ta particija je nameščena v /var/lib/…, kjer storitev prebere informacije o OSD in najde tudi sklic na blokovno napravo, kjer so shranjeni binarni podatki. Teoretično lahko takoj postavite pomožne datoteke v /var/lib/… in dodelite celoten disk za podatke. Pri ustvarjanju OSD prek ceph-deploy se samodejno ustvari pravilo za namestitev particije v /var/lib/…, uporabniku ceph pa so dodeljene tudi pravice za branje želene blokovne naprave. Če nameščate ročno, morate to storiti sami; v dokumentaciji tega ni navedeno. Priporočljivo je tudi, da določite ciljni parameter pomnilnika osd, da bo dovolj fizičnega pomnilnika.

ceph-mds. Na nizki ravni je CEPH shramba objektov. Možnost blokiranja pomnilnika se zmanjša na shranjevanje vsakega 4 MB bloka kot predmeta. Shranjevanje datotek deluje po istem principu. Ustvarita se dve skupini: ena za metapodatke, druga za podatke. Združeni so v datotečni sistem. V tem trenutku se ustvari nekakšen zapis, tako da če izbrišete datotečni sistem, vendar obdržite obe skupini, ga ne boste mogli obnoviti. Obstaja postopek za ekstrahiranje datotek po blokih, nisem ga preizkusil. Za dostop do datotečnega sistema je odgovorna storitev ceph-mds. Vsak datotečni sistem zahteva ločen primerek storitve. Obstaja možnost "indeks", ki vam omogoča, da ustvarite podobo več datotečnih sistemov v enem - prav tako ni preizkušeno.

Ceph-mon - Ta storitev shrani zemljevid gruče. Vključuje informacije o vseh OSD-jih, algoritem za distribucijo PG-jev v OSD-jih in, kar je najpomembnejše, informacije o vseh objektih (podrobnosti tega mehanizma mi niso jasne: obstaja imenik /var/lib/ceph/mon/…/ store.db, vsebuje veliko datoteko, ki je velika 26 MB, v gruči 105K objektov pa se izkaže, da je nekaj več kot 256 bajtov na objekt - mislim, da monitor shrani seznam vseh objektov in PG-jev, v katerih se nahajajo). Poškodba tega imenika povzroči izgubo vseh podatkov v gruči. Zato je prišlo do zaključka, da CRUSH prikazuje, kako se PG nahajajo na OSD in kako se objekti nahajajo na PG - ti so centralno shranjeni v bazi podatkov, ne glede na to, kako zelo se razvijalci izogibajo tej besedi. Kot rezultat, prvič, ne moremo namestiti sistema na bliskovni pogon v načinu RO, ker se baza nenehno snema, za te je potreben dodaten disk (komaj več kot 1 GB), drugič, potrebno je imeti kopirajte to bazo v realnem času. Če je monitorjev več, je toleranca napak zagotovljena samodejno, v našem primeru pa je samo en monitor, največ dva. Obstaja teoretični postopek za obnovitev monitorja na podlagi podatkov OSD, k njemu sem se zatekel trikrat iz različnih razlogov in trikrat ni bilo sporočil o napakah, pa tudi podatkov. Na žalost ta mehanizem ne deluje. Ali upravljamo z miniaturno particijo na OSD in sestavimo RAID za shranjevanje podatkovne baze, kar bo zagotovo zelo slabo vplivalo na delovanje, ali pa dodelimo vsaj dva zanesljiva fizična medija, po možnosti USB, da ne zasedamo vrat.

rados-gw - izvozi shranjevanje objektov preko protokola S3 ipd. Ustvari veliko bazenov, ni jasno, zakaj. Nisem veliko eksperimentiral.

ceph-mgr - Pri namestitvi te storitve se zažene več modulov. Eden od njih je samodejno merjenje, ki ga ni mogoče onemogočiti. Prizadeva si vzdrževati pravilno količino PG/OSD. Če želite razmerje nadzorovati ročno, lahko onemogočite skaliranje za vsako področje, vendar se v tem primeru modul zruši z deljenjem z 0 in stanje gruče postane NAPAKA. Modul je napisan v Pythonu in če v njem komentirate potrebno vrstico, ga to onemogoči. Preveč len, da bi se spomnil podrobnosti.

Seznam uporabljenih virov:

Namestitev CEPH
Obnovitev po popolni okvari monitorja

Seznami skriptov:

Namestitev sistema prek debootstrapa

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 <[email protected]>
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 <[email protected]>
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

Ustvarite gručo

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

Dodajanje OSD (del)

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

Povzetek

Glavna marketinška prednost CEPH je CRUSH - algoritem za izračun lokacije podatkov. Monitorji distribuirajo ta algoritem strankam, nato pa stranke neposredno zahtevajo želeno vozlišče in želeni OSD. CRUSH ne zagotavlja centralizacije. Gre za majhno datoteko, ki jo lahko celo natisnete in obesite na steno. Praksa je pokazala, da CRUSH ni izčrpen zemljevid. Če uničite in ponovno ustvarite monitorje, pri čemer ohranite vse OSD in CRUSH, potem to ni dovolj za obnovitev gruče. Iz tega se sklepa, da vsak monitor hrani nekaj metapodatkov o celotni gruči. Majhna količina teh metapodatkov ne nalaga omejitev glede velikosti gruče, vendar zahteva zagotavljanje njihove varnosti, kar odpravlja prihranke na disku z namestitvijo sistema na bliskovni pogon in izključuje gruče z manj kot tremi vozlišči. Agresivna politika razvijalca glede neobveznih funkcij. Daleč od minimalizma. Dokumentacija je na ravni "hvala za to, kar imamo, vendar je zelo, zelo skromna." Možnost interakcije s storitvami na nizki ravni je zagotovljena, vendar se dokumentacija preveč površno dotika te teme, zato je bolj verjetno ne kot da. Praktično ni možnosti za obnovitev podatkov iz izrednih razmer.

Možnosti za nadaljnje ukrepanje: opustite CEPH in uporabite banalne večdiskne btrfs (ali xfs, zfs), poiščite nove informacije o CEPH, ki vam bodo omogočile delovanje pod določenimi pogoji, poskusite napisati svoj lasten pomnilnik kot napredni usposabljanje.

Vir: www.habr.com

Dodaj komentar