Patirtis su CEPH

Kai yra daugiau duomenų, nei telpa viename diske, laikas pagalvoti apie RAID. Vaikystėje dažnai girdėdavau iš vyresniųjų: „vieną dieną RAID bus praeitis, objektų saugykla užpildys pasaulį, o tu net nežinai, kas yra CEPH“, tai pirmas dalykas mano savarankiškame gyvenime. buvo sukurti savo klasterį. Eksperimento tikslas buvo susipažinti su vidine cefo struktūra ir suprasti jo taikymo sritį. Kiek pagrįstas cefo diegimas vidutinio dydžio ir mažose įmonėse? Po kelerių veiklos metų ir poros negrįžtamų duomenų praradimų atsirado subtilybių supratimas, kad ne viskas taip paprasta. CEPH ypatumai kliudo plačiai jį taikyti, ir dėl jų eksperimentai atsidūrė aklavietėje. Žemiau pateikiamas visų atliktų veiksmų aprašymas, gautas rezultatas ir padarytos išvados. Jei išmanantys žmonės pasidalins savo patirtimi ir paaiškins kai kuriuos dalykus, būsiu dėkingas.

Pastaba: komentatoriai nustatė rimtų klaidų kai kuriose prielaidose, dėl kurių reikia peržiūrėti visą straipsnį.

CEPH strategija

CEPH klasteris sujungia savavališką skaičių K savavališko dydžio diskų ir juose saugo duomenis, dubliuodamas kiekvieną fragmentą (pagal nutylėjimą 4 MB) tam tikrą skaičių N kartų.

Panagrinėkime paprasčiausią atvejį su dviem vienodais diskais. Iš jų galite arba surinkti RAID 1, arba klasterį su N=2 – rezultatas bus toks pat. Jei yra trys diskai ir jie yra skirtingų dydžių, tada nesunku surinkti klasterį su N=2: dalis duomenų bus 1 ir 2 diskuose, dalis bus 1 ir 3 diskuose, o dalis bus 2 ir 3, o RAID nebus (galite surinkti tokį RAID, bet tai būtų iškrypimas). Jei yra dar daugiau diskų, tada galima sukurti RAID 5; CEPH turi analogą - erasure_code, kuris prieštarauja ankstyvoms kūrėjų koncepcijoms, todėl nėra svarstomas. RAID 5 daro prielaidą, kad yra nedaug diskų, kurie visi yra geros būklės. Jei vienas sugenda, kiti turi atsilaikyti, kol diskas bus pakeistas ir jame bus atkurti duomenys. CEPH, su N>=3, skatina naudoti senus diskus, ypač jei laikote kelis gerus diskus vienai duomenų kopijai saugoti, o likusias dvi ar tris kopijas saugote dideliame kiekyje senų diskų, tada informacija bus saugūs, nes kol kas nauji diskai gyvi - nėra jokių problemų, o jei vienas iš jų sugenda, tada trijų diskų, kurių tarnavimo laikas yra ilgesnis nei penkeri metai, gedimas vienu metu, pageidautina iš skirtingų serverių, yra labai mažai tikėtina. įvykis.

Yra kopijų platinimo subtilumas. Pagal numatytuosius nustatymus daroma prielaida, kad duomenys yra suskirstyti į daugiau (~100 viename diske) PG paskirstymo grupes, kurių kiekviena yra dubliuojama kai kuriuose diskuose. Tarkime, K=6, N=2, tada sugedus kokiems nors dviem diskams, duomenys garantuotai bus prarasti, nes pagal tikimybių teoriją šiuose dviejuose diskuose bus bent vienas PG. Ir praradus vieną grupę visi telkinio duomenys tampa nepasiekiami. Jei diskai suskirstyti į tris poras ir duomenis leidžiama saugoti tik vienos poros diskuose, tai toks paskirstymas taip pat atsparus kurio nors vieno disko gedimui, tačiau sugedus dviem diskams duomenų praradimo tikimybė nėra 100%, bet tik 3/15, o net sugedus trims diskams – tik 12/20. Taigi duomenų paskirstymo entropija neprisideda prie atsparumo gedimams. Taip pat atkreipkite dėmesį, kad failų serveriui nemokama RAM žymiai padidina atsako greitį. Kuo daugiau atminties kiekviename mazge ir kuo daugiau atminties visuose mazguose, tuo jis bus greitesnis. Tai neabejotinai yra klasterio pranašumas prieš vieną serverį ir, juo labiau, aparatinę NAS, kur įmontuota labai mažai atminties.

Iš to išplaukia, kad CEPH yra geras būdas sukurti patikimą dešimčių TB duomenų saugojimo sistemą su galimybe padidinti mastelį su minimaliomis investicijomis iš pasenusios įrangos (čia, žinoma, reikės išlaidų, bet mažų, palyginti su komercinėmis saugojimo sistemomis).

Klasterio diegimas

Eksperimentui imkime nebeeksploatuojamą kompiuterį Intel DQ57TM + Intel core i3 540 + 16 GB RAM. Sutvarkysime keturis 2 TB diskus į kažką panašaus į RAID10, po sėkmingo testo pridėsime antrą mazgą ir tiek pat diskų.

Linux diegimas. Paskirstymas reikalauja gebėjimo tinkinti ir būti stabilus. Debian ir Suse atitinka reikalavimus. Suse turi lankstesnę diegimo programą, leidžiančią išjungti bet kurį paketą; Deja, nesugebėjau suprasti, kuriuos iš jų galima išmesti nepažeidžiant sistemos. Įdiekite Debian naudodami debootstrap buster. Min-base parinktis įdiegia sugedusią sistemą, kuriai trūksta tvarkyklių. Dydžio skirtumas lyginant su pilna versija nėra toks didelis, kad vargintų. Kadangi darbas atliekamas fizinėje mašinoje, noriu daryti momentines nuotraukas, pavyzdžiui, virtualiose mašinose. Šią parinktį suteikia arba LVM, arba btrfs (arba xfs, arba zfs – skirtumas nėra didelis). LVM momentinės nuotraukos nėra stiprioji pusė. Įdiegti btrf. O įkrovos įkroviklis yra MBR. Nėra prasmės užgriozdinti 50 MB diską FAT skaidiniu, kai galite įstumti jį į 1 MB skaidinio lentelės sritį ir skirti visą vietą sistemai. Diske užėmė 700 MB. Nepamenu, kiek turi bazinis SUSE diegimas, manau, kad tai apie 1.1 arba 1.4 GB.

Įdiekite CEPH. Mes ignoruojame 12 versiją debiano saugykloje ir jungiamės tiesiai iš 15.2.3 svetainės. Vadovaujamės instrukcijomis iš skyriaus „Įdiegti CEPH rankiniu būdu“ su šiais įspėjimais:

  • Prieš prijungdami saugyklą, turite įdiegti gnupg wget ca-certificates
  • Prijungus saugyklą, bet prieš diegiant klasterį, paketų diegimas praleidžiamas: apt -y --no-install-recommends install ceph-common ceph-mon ceph-osd ceph-mds ceph-mgr
  • Diegiant CEPH, dėl nežinomų priežasčių jis bandys įdiegti lvm2. Iš esmės negaila, bet nepavyksta įdiegti, todėl CEPH taip pat neįdiegs.

    Šis pleistras padėjo:

    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
    

Klasterio apžvalga

ceph-osd - yra atsakingas už duomenų saugojimą diske. Kiekvienam diskui paleidžiama tinklo paslauga, kuri priima ir vykdo užklausas skaityti ar rašyti objektus. Diske sukuriami du skirsniai. Viename iš jų yra informacijos apie klasterį, disko numerį ir klasterio raktus. Ši 1 KB informacija sukuriama vieną kartą pridedant diską ir niekada nebuvo pastebėta, kad ji pasikeitė. Antrasis skaidinys neturi failų sistemos ir saugo dvejetainius CEPH duomenis. Automatinis diegimas ankstesnėse versijose sukūrė 100 MB xfs skaidinį, skirtą paslaugų informacijai. Konvertavau diską į MBR ir skyriau tik 16MB – paslauga nesiskundžia. Manau, kad xfs be problemų būtų galima pakeisti ext. Šis skaidinys yra sumontuotas /var/lib/…, kur paslauga nuskaito informaciją apie OSD ir taip pat randa nuorodą į blokinį įrenginį, kuriame saugomi dvejetainiai duomenys. Teoriškai galite iš karto įdėti pagalbinius failus į /var/lib/… ir skirti visą diską duomenims. Kuriant OSD naudojant ceph-deploy, automatiškai sukuriama taisyklė, skirta prijungti skaidinį į /var/lib/…, o ceph vartotojui taip pat suteikiamos teisės skaityti norimą blokinį įrenginį. Jei įdiegiate rankiniu būdu, tai turite padaryti patys; dokumentacijoje to neparašyta. Taip pat patartina nurodyti osd atminties paskirties parametrą, kad būtų pakankamai fizinės atminties.

ceph-mds. Žemu lygiu CEPH yra objektų saugykla. Galimybė blokuoti saugyklą reiškia kiekvieno 4 MB bloko saugojimą kaip objektą. Failų saugojimas veikia tuo pačiu principu. Sukuriami du telkiniai: vienas metaduomenims, kitas duomenims. Jie sujungiami į failų sistemą. Šiuo metu sukuriamas kažkoks įrašas, todėl jei ištrinsite failų sistemą, bet paliksite abu telkinius, negalėsite jos atkurti. Yra failų ištraukimo pagal blokus procedūra, aš jos neišbandžiau. Ceph-mds paslauga yra atsakinga už prieigą prie failų sistemos. Kiekvienai failų sistemai reikalingas atskiras paslaugos egzempliorius. Yra parinktis „indeksas“, leidžianti sukurti kelių failų sistemų panašumą vienoje - taip pat neišbandyta.

Ceph-mon – ši paslauga saugo klasterio žemėlapį. Jame yra informacija apie visus OSD, PG paskirstymo OSD algoritmas ir, svarbiausia, informacija apie visus objektus (šio mechanizmo detalės man neaiškios: yra katalogas /var/lib/ceph/mon/…/ store.db, jame yra didelis failas yra 26 MB, o 105 256 objektų klasteryje vienas objektas yra šiek tiek daugiau nei 1 baitai - manau, kad monitorius saugo visų objektų sąrašą ir PG, kuriuose jie yra išsidėstę). Pažeidus šį katalogą prarandami visi klasterio duomenys. Iš to buvo padaryta išvada, kad CRUSH parodo, kaip PG yra OSD, o kaip objektai yra PG - jie yra centralizuotai saugomi duomenų bazės viduje, nesvarbu, kaip kūrėjai vengia šio žodžio. Dėl to, pirma, mes negalime įdiegti sistemos „flash drive“ RO režimu, nes duomenų bazė nuolat įrašoma, jiems reikia papildomo disko (vargiai daugiau nei XNUMX GB), antra, būtina turėti nukopijuokite šią bazę realiuoju laiku. Jei yra keli monitoriai, tada gedimų tolerancija užtikrinama automatiškai, tačiau mūsų atveju yra tik vienas monitorius, daugiausiai du. Yra teorinė monitoriaus atkūrimo procedūra pagal OSD duomenis, tris kartus griebiausi jos dėl įvairių priežasčių, tris kartus nebuvo klaidų pranešimų, taip pat jokių duomenų. Deja, šis mechanizmas neveikia. Arba eksploatuojame miniatiūrinį skaidinį OSD ir surenkame RAID duomenų bazei saugoti, o tai tikrai labai blogai paveiks našumą, arba skiriame bent dvi patikimas fizines laikmenas, geriausia USB, kad neužimtų prievadų.

rados-gw – eksportuoja objektų saugyklą per S3 protokolą ir panašiai. Sukuria daug baseinų, neaišku kodėl. Daug neeksperimentavau.

ceph-mgr – diegiant šią paslaugą paleidžiami keli moduliai. Vienas iš jų yra automatinis mastelis, kurio negalima išjungti. Jis siekia išlaikyti tinkamą PG/OSD kiekį. Jei norite rankiniu būdu valdyti santykį, galite išjungti kiekvieno telkinio mastelio keitimą, tačiau tokiu atveju modulis sugenda dalijantis iš 0 ir klasterio būsena tampa KLAIDA. Modulis parašytas Python, o jei jame pakomentuosite reikiamą eilutę, jis bus išjungtas. Tingi prisiminti smulkmenas.

Naudotų šaltinių sąrašas:

CEPH įrengimas
Atkūrimas po visiško monitoriaus gedimo

Scenarijų sąrašai:

Sistemos diegimas per 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 <[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

Sukurkite klasterį

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 pridėjimas (dalis)

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

Santrauka

Pagrindinis CEPH rinkodaros pranašumas yra CRUSH – duomenų vietos apskaičiavimo algoritmas. Monitoriai paskirsto šį algoritmą klientams, po kurių klientai tiesiogiai užklausia norimo mazgo ir norimo OSD. CRUSH neužtikrina jokios centralizacijos. Tai mažas failas, kurį netgi galite atsispausdinti ir pakabinti ant sienos. Praktika parodė, kad CRUSH nėra išsamus žemėlapis. Jei sunaikinsite ir atkursite monitorius, išlaikydami visą OSD ir CRUSH, to nepakanka klasteriui atkurti. Iš to daroma išvada, kad kiekvienas monitorius saugo tam tikrus metaduomenis apie visą klasterį. Mažas šių metaduomenų kiekis neapriboja klasterio dydžio, tačiau reikalauja užtikrinti jų saugumą, o tai pašalina disko taupymą įdiegiant sistemą „flash drive“ ir neįtraukia klasterių, kuriuose yra mažiau nei trys mazgai. Agresyvi kūrėjo politika dėl pasirenkamų funkcijų. Toli nuo minimalizmo. Dokumentai yra „ačiū už tai, ką turime, bet jie labai, labai menki“. Suteikiama žemo lygio galimybė bendrauti su paslaugomis, tačiau dokumentacijoje ši tema paliečiama pernelyg paviršutiniškai, todėl labiau tikėtina, kad ne, nei taip. Praktiškai nėra galimybės atkurti duomenis iš kritinės situacijos.

Tolimesnių veiksmų parinktys: atsisakyti CEPH ir naudoti banalius kelių diskų btrfs (arba xfs, zfs), sužinoti naujos informacijos apie CEPH, kuri leis jį naudoti nurodytomis sąlygomis, pabandyti įrašyti savo saugyklą kaip išplėstinę mokymas.

Šaltinis: www.habr.com

Добавить комментарий