Iskustvo sa CEPH-om

Kada ima više podataka nego što može stati na jedan disk, vrijeme je da razmislite o RAID-u. Kao dijete, često sam čuo od starijih: „Jednog dana RAID će biti prošlost, skladištenje objekata će ispuniti svijet, a vi ni ne znate šta je CEPH“, tako da je prva stvar u mom samostalnom životu bio je da stvorim svoj vlastiti klaster. Svrha eksperimenta bila je upoznavanje sa unutrašnjom strukturom ceph-a i razumijevanje opsega njegove primjene. Koliko je opravdana primjena ceph-a u srednjim i malim preduzećima? Nakon nekoliko godina rada i nekoliko nepovratnih gubitaka podataka, pojavilo se razumijevanje zamršenosti da nije sve tako jednostavno. Posebnosti CEPH-a predstavljaju prepreke njegovom širokom usvajanju i zbog njih su eksperimenti zašli u ćorsokak. Ispod je opis svih preduzetih koraka, dobijenih rezultata i izvedenih zaključaka. Ako upućeni ljudi podijele svoje iskustvo i objasne neke stvari, bit ću zahvalan.

Napomena: Komentatori su identifikovali ozbiljne greške u nekim od pretpostavki koje zahtevaju reviziju celog članka.

CEPH strategija

CEPH klaster kombinuje proizvoljan broj K diskova proizvoljne veličine i pohranjuje podatke na njima, duplirajući svaki dio (4 MB po defaultu) zadati broj N puta.

Razmotrimo najjednostavniji slučaj sa dva identična diska. Od njih možete sastaviti RAID 1 ili klaster sa N=2 - rezultat će biti isti. Ako postoje tri diska i različite su veličine, onda je lako sastaviti klaster sa N=2: neki od podataka će biti na diskovima 1 i 2, neki će biti na diskovima 1 i 3, a neki će biti na 2 i 3, dok RAID neće (možete sastaviti takav RAID, ali to bi bila perverzija). Ako ima još više diskova, onda je moguće kreirati RAID 5; CEPH ima analogni - erasure_code, koji je u suprotnosti s ranim konceptima programera, pa se stoga ne razmatra. RAID 5 pretpostavlja da postoji mali broj diskova, koji su svi u dobrom stanju. Ako jedan pokvari, ostali moraju izdržati dok se disk ne zamijeni i podaci se vrate na njega. CEPH, sa N>=3, podstiče upotrebu starih diskova, posebno ako držite nekoliko dobrih diskova za pohranu jedne kopije podataka, a preostale dvije ili tri kopije pohranite na veliki broj starih diskova, tada informacije bit će sigurno, budući da su za sada novi diskovi živi - nema problema, a ako se jedan od njih pokvari, onda je istovremeni kvar tri diska s vijekom trajanja više od pet godina, po mogućnosti s različitih servera, krajnje malo vjerojatan događaj.

Postoji suptilnost u distribuciji kopija. Podrazumevano se pretpostavlja da su podaci podijeljeni u više (~100 po disku) PG distributivnih grupa, od kojih je svaka duplicirana na nekim diskovima. Recimo K=6, N=2, onda ako bilo koja dva diska pokvare, podaci su zagarantovano izgubljeni, jer će prema teoriji vjerovatnoće postojati barem jedan PG koji će se nalaziti na ova dva diska. A gubitak jedne grupe čini sve podatke u grupi nedostupnima. Ako su diskovi podijeljeni u tri para i podaci se smiju pohranjivati ​​samo na diskove unutar jednog para, onda je takva distribucija otporna i na kvar bilo kojeg diska, ali ako dva diska pokvare, vjerovatnoća gubitka podataka nije 100%, ali samo 3/15, pa čak i u slučaju kvara tri diska - samo 12/20. Dakle, entropija u distribuciji podataka ne doprinosi toleranciji grešaka. Takođe imajte na umu da za fajl server, besplatna RAM memorija značajno povećava brzinu odgovora. Što je više memorije u svakom čvoru i što je više memorije u svim čvorovima, to će biti brže. To je nesumnjivo prednost klastera u odnosu na jedan server i, još više, hardverski NAS, gdje je ugrađena vrlo mala količina memorije.

Iz toga proizilazi da je CEPH dobar način da se stvori pouzdan sistem za skladištenje podataka za desetine TB sa mogućnošću skaliranja uz minimalno ulaganje od zastarele opreme (ovde će, naravno, biti potrebni troškovi, ali mali u poređenju sa komercijalnim sistemima za skladištenje).

Implementacija klastera

Za eksperiment uzmimo rastavljeni računar Intel DQ57TM + Intel core i3 540 + 16 GB RAM-a. Četiri diska od 2 TB ćemo organizirati u nešto poput RAID10, nakon uspješnog testiranja dodaćemo drugi čvor i isto toliko diskova.

Instaliranje Linuxa. Distribucija zahtijeva mogućnost prilagođavanja i stabilnost. Debian i Suse ispunjavaju zahtjeve. Suse ima fleksibilniji instalater koji vam omogućava da onemogućite bilo koji paket; Nažalost, nisam mogao shvatiti koje bi se mogle baciti bez oštećenja sistema. Instalirajte Debian koristeći debootstrap buster. Opcija min-base instalira pokvareni sistem kojem nedostaju drajveri. Razlika u veličini u odnosu na punu verziju nije toliko velika da bi smetala. Pošto se posao obavlja na fizičkoj mašini, želim da napravim snimke, kao na virtuelnim mašinama. Ovu opciju pruža ili LVM ili btrfs (ili xfs, ili zfs - razlika nije velika). LVM snimci nisu jača strana. Instalirajte btrfs. A bootloader je u MBR-u. Nema smisla pretrpavati disk od 50 MB FAT particijom kada ga možete gurnuti u područje tablice particija od 1 MB i dodijeliti sav prostor za sistem. Zauzeo je 700 MB na disku. Ne sjećam se koliko ima osnovna SUSE instalacija, mislim da je oko 1.1 ili 1.4 GB.

Instalirajte CEPH. Zanemarujemo verziju 12 u debianovom spremištu i povezujemo se direktno sa 15.2.3 stranice. Slijedimo upute iz odjeljka “Ručno instalirajte CEPH” sa sljedećim upozorenjima:

  • Prije povezivanja spremišta, morate instalirati gnupg wget ca-certifikate
  • Nakon povezivanja spremišta, ali prije instaliranja klastera, instalacija paketa je izostavljena: apt -y --no-install-recommends install ceph-common ceph-mon ceph-osd ceph-mds ceph-mgr
  • Prilikom instaliranja CEPH-a, iz nepoznatih razloga, pokušat će instalirati lvm2. U principu, nije šteta, ali instalacija ne uspijeva, pa se ni CEPH neće instalirati.

    Ova zakrpa je pomogla:

    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 klastera

ceph-osd - odgovoran je za pohranjivanje podataka na disk. Za svaki disk se pokreće mrežni servis koji prihvata i izvršava zahtjeve za čitanje ili pisanje objekata. Na disku se kreiraju dvije particije. Jedan od njih sadrži informacije o klasteru, broju diska i ključevima za klaster. Ova informacija od 1 KB kreira se jednom prilikom dodavanja diska i nikada nije primjećena da se mijenja. Druga particija nema sistem datoteka i pohranjuje CEPH binarne podatke. Automatska instalacija u prethodnim verzijama kreirala je 100MB xfs particiju za servisne informacije. Pretvorio sam disk u MBR i dodijelio samo 16MB - usluga se ne žali. Mislim da bi se xfs mogao zamijeniti ext bez ikakvih problema. Ova particija je montirana u /var/lib/…, gdje servis čita informacije o OSD-u i također pronalazi referencu na blok uređaj gdje su pohranjeni binarni podaci. Teoretski, možete odmah postaviti pomoćne datoteke u /var/lib/… i dodijeliti cijeli disk za podatke. Prilikom kreiranja OSD-a putem ceph-deploy-a, automatski se kreira pravilo za montiranje particije u /var/lib/…, a ceph korisniku se također dodjeljuju prava za čitanje željenog blok uređaja. Ako instalirate ručno, to morate učiniti sami; dokumentacija to ne kaže. Također je preporučljivo odrediti ciljni parametar osd memorije tako da ima dovoljno fizičke memorije.

ceph-mds. Na niskom nivou, CEPH je skladište objekata. Mogućnost blokiranja memorije svodi se na pohranjivanje svakog bloka od 4MB kao objekta. Pohrana datoteka radi na istom principu. Kreiraju se dva skupa: jedan za metapodatke, drugi za podatke. Kombinuju se u sistem datoteka. U ovom trenutku se kreira neka vrsta zapisa, pa ako izbrišete sistem datoteka, ali zadržite oba skupa, nećete ga moći vratiti. Postoji procedura za izdvajanje fajlova po blokovima, nisam je testirao. Ceph-mds servis je odgovoran za pristup sistemu datoteka. Svaki sistem datoteka zahtijeva posebnu instancu usluge. Postoji opcija "indeks", koja vam omogućava da kreirate izgled nekoliko sistema datoteka u jednom - takođe nije testirano.

Ceph-mon - Ova usluga pohranjuje mapu klastera. Uključuje informacije o svim OSD-ovima, algoritam za distribuciju PG-ova u OSD-ovima i, što je najvažnije, informacije o svim objektima (detalji ovog mehanizma mi nisu jasni: postoji direktorij /var/lib/ceph/mon/…/ store.db, sadrži veliki fajl od 26MB, au grupi od 105K objekata ispada nešto više od 256 bajtova po objektu - mislim da monitor pohranjuje listu svih objekata i PG-ova u kojima nalaze se). Oštećenje ovog direktorija rezultira gubitkom svih podataka u klasteru. Otuda je izvučen zaključak da CRUSH pokazuje kako se PG-ovi nalaze na OSD-u, a kako se objekti nalaze na PG-ovima - oni su centralno pohranjeni unutar baze podataka, bez obzira koliko programeri izbjegavaju ovu riječ. Kao rezultat toga, prvo, ne možemo instalirati sistem na fleš disk u RO modu, pošto se baza podataka stalno snima, za njih je potreban dodatni disk (teško više od 1 GB), drugo, potrebno je imati kopirajte ovu bazu u realnom vremenu. Ako postoji više monitora, onda je otpornost na greške osigurana automatski, ali u našem slučaju postoji samo jedan monitor, maksimalno dva. Postoji teoretska procedura za vraćanje monitora u prvobitno stanje na osnovu podataka na ekranu, ja sam joj pribjegao tri puta iz raznih razloga, a tri puta nije bilo poruka o grešci, kao ni podataka. Nažalost, ovaj mehanizam ne radi. Ili ćemo upravljati minijaturnom particijom na OSD-u i sastaviti RAID za pohranu baze podataka, što će sigurno imati jako loš učinak na performanse, ili ćemo dodijeliti barem dva pouzdana fizička medija, po mogućnosti USB, kako ne bi zauzeli portove.

rados-gw - izvozi skladištenje objekata preko S3 protokola i slično. Stvara mnogo bazena, nejasno je zašto. Nisam mnogo eksperimentisao.

ceph-mgr - Prilikom instaliranja ove usluge pokreće se nekoliko modula. Jedan od njih je automatsko skaliranje koje se ne može onemogućiti. Nastoji održati ispravnu količinu PG/OSD-a. Ako želite ručno kontrolirati omjer, možete onemogućiti skaliranje za svaki skup, ali u ovom slučaju modul pada s podjelom na 0, a status klastera postaje GREŠKA. Modul je napisan u Python-u i ako u njemu prokomentarišete potrebnu liniju, to dovodi do njegovog onemogućavanja. Previše lijen da bi zapamtio detalje.

Spisak korištenih izvora:

Instalacija CEPH
Oporavak od potpunog kvara monitora

Liste skripti:

Instalacija sistema putem 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

Kreirajte 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

Dodavanje OSD (dio)

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

Rezime

Glavna marketinška prednost CEPH-a je CRUSH - algoritam za izračunavanje lokacije podataka. Monitori distribuiraju ovaj algoritam klijentima, nakon čega klijenti direktno traže željeni čvor i željeni OSD. CRUSH ne osigurava centralizaciju. To je mali fajl koji čak možete odštampati i okačiti na zid. Praksa je pokazala da CRUSH nije iscrpna mapa. Ako uništite i ponovo kreirate monitore, zadržavajući sve OSD i CRUSH, onda to nije dovoljno za vraćanje klastera. Iz ovoga se zaključuje da svaki monitor pohranjuje neke metapodatke o cijelom klasteru. Mala količina ovih metapodataka ne nameće ograničenja na veličinu klastera, ali zahteva njihovu sigurnost, što eliminiše uštede na disku instaliranjem sistema na fleš disk i isključuje klastere sa manje od tri čvora. Agresivna politika programera u pogledu opcionih karakteristika. Daleko od minimalizma. Dokumentacija je na nivou „hvala za ono što imamo, ali je vrlo, vrlo oskudna“. Mogućnost interakcije sa uslugama na niskom nivou je obezbeđena, ali dokumentacija se previše površno dotiče ove teme, tako da je verovatnije ne nego da. Praktično nema šanse za oporavak podataka iz vanredne situacije.

Opcije za dalje radnje: napustite CEPH i koristite banalni multi-disk btrfs (ili xfs, zfs), saznajte nove informacije o CEPH-u, koje će vam omogućiti da ga koristite pod navedenim uvjetima, pokušajte napisati vlastitu memoriju kao naprednu obuku.

izvor: www.habr.com

Dodajte komentar