Iskustvo s CEPH

Kada ima više podataka nego što može stati na jedan disk, vrijeme je da razmislite o RAID-u. U djetinjstvu sam često slušao od svojih starijih: “Jednog dana će RAID biti prošlost, pohrana objekata ispunit će svijet, a vi uopće ne znate što je CEPH,” dakle prva stvar u mom samostalnom životu bio je stvoriti vlastiti klaster. Svrha eksperimenta bila je upoznavanje s unutarnjom strukturom cefa i razumijevanje opsega njegove primjene. Koliko je opravdana implementacija ceph-a u srednjim i malim poduzećima? Nakon nekoliko godina rada i nekoliko nepovratnih gubitaka podataka, pojavilo se razumijevanje zamršenosti da nije sve tako jednostavno. Osobitosti CEPH predstavljaju prepreke njegovoj širokoj primjeni i zbog njih su eksperimenti zapali u slijepu ulicu. U nastavku se nalazi opis svih poduzetih koraka, dobivenih rezultata i izvedenih zaključaka. Ako ljudi koji znaju podijele svoje iskustvo i objasne neke točke, bit ću vam zahvalan.

Napomena: Komentatori su identificirali ozbiljne pogreške u nekim od pretpostavki koje zahtijevaju reviziju cijelog članka.

Strategija CEPH

CEPH klaster kombinira proizvoljan broj K diskova proizvoljne veličine i pohranjuje podatke na njih, duplicirajući svaki komad (4 MB prema zadanim postavkama) određeni broj N puta.

Razmotrimo najjednostavniji slučaj s dva identična diska. Od njih možete sastaviti RAID 1 ili klaster s N=2 - rezultat će biti isti. Ako postoje tri diska i oni su različite veličine, onda je lako sastaviti klaster s N=2: neki će podaci 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 postoji još više diskova, tada je moguće stvoriti RAID 5; CEPH ima analogni - erasure_code, koji je u suprotnosti s ranim konceptima programera, pa se stoga ne uzima u obzir. RAID 5 pretpostavlja da postoji mali broj diskova koji su svi u dobrom stanju. Ako jedan zakaže, ostali moraju izdržati dok se disk ne zamijeni i podaci se na njega ne vrate. CEPH, s N>=3, potiče korištenje starih diskova, posebice 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 radnim vijekom dužim od pet godina, po mogućnosti s različitih poslužitelja, vrlo malo vjerojatan događaj.

Postoji suptilnost distribucije kopija. Prema zadanim postavkama, pretpostavlja se da su podaci podijeljeni u više (~100 po disku) PG distribucijskih grupa, od kojih je svaka duplicirana na nekim diskovima. Recimo K=6, N=2, tada ako bilo koja dva diska zataje, podaci su zajamčeno izgubljeni, jer će prema teoriji vjerojatnosti postojati barem jedan PG koji će se nalaziti na ta dva diska. A gubitak jedne grupe čini sve podatke u skupu nedostupnima. Ako su diskovi podijeljeni u tri para i dopušteno je pohranjivanje podataka samo na diskove unutar jednog para, tada je takva raspodjela također otporna na kvar bilo kojeg diska, ali ako dva diska zataje, vjerojatnost gubitka podataka nije 100%, ali samo 3/15, pa čak iu slučaju kvara tri diska - samo 12/20. Dakle, entropija u distribuciji podataka ne pridonosi toleranciji na pogreške. Također imajte na umu da za poslužitelj datoteka slobodni RAM 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. Ovo je nedvojbeno prednost klastera u odnosu na jedan poslužitelj i, još više, hardverski NAS, gdje je ugrađena vrlo mala količina memorije.

Iz toga slijedi da je CEPH dobar način za stvaranje pouzdanog sustava za pohranu podataka za desetke TB s mogućnošću skaliranja uz minimalna ulaganja iz zastarjele opreme (ovdje će, naravno, biti potrebni troškovi, ali mali u usporedbi s komercijalnim sustavima za pohranu).

Implementacija klastera

Za eksperiment uzmimo rashodovano računalo Intel DQ57TM + Intel core i3 540 + 16 GB RAM-a. Četiri diska od 2 TB organizirat ćemo u nešto poput RAID10, nakon uspješnog testa dodat ćemo drugi čvor i isti broj diskova.

Instalacija Linuxa. Distribucija zahtijeva mogućnost prilagodbe i stabilnosti. Debian i Suse ispunjavaju zahtjeve. Suse ima fleksibilniji instalacijski program koji vam omogućuje da onemogućite bilo koji paket; Nažalost, nisam mogao shvatiti koje bi se mogle baciti bez oštećenja sustava. Instalirajte Debian koristeći debootstrap buster. Opcija min-base instalira pokvareni sustav koji nema upravljačke programe. Razlika u veličini u odnosu na punu verziju nije toliko velika da smeta. Budući da se posao odvija na fizičkom stroju, želim napraviti snimke, kao na virtualnim strojevima. Ovu opciju nudi ili LVM ili btrfs (ili xfs, ili zfs - razlika nije velika). LVM snimke nisu jača strana. Instalirajte btrfs. A bootloader je u MBR-u. Nema smisla zatrpavati disk od 50 MB FAT particijom kada ga možete gurnuti u područje particijske tablice od 1 MB i dodijeliti sav prostor za sustav. 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. Ignoriramo verziju 12 u debian repozitoriju i povezujemo se izravno sa stranice 15.2.3. Slijedimo upute iz odjeljka "Ručna instalacija CEPH" uz sljedeća upozorenja:

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

    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 pohranu podataka na disk. Za svaki disk pokreće se mrežna usluga koja prihvaća i izvršava zahtjeve za čitanje ili pisanje u objekte. Na disku se stvaraju dvije particije. Jedan od njih sadrži podatke o klasteru, broj diska i ključeve klastera. Ove informacije od 1 KB stvaraju se jednom prilikom dodavanja diska i nikada nisu primijećene promjene. Druga particija nema datotečni sustav i pohranjuje CEPH binarne podatke. Automatska instalacija u prethodnim verzijama stvorila je xfs particiju od 100 MB za servisne informacije. Konvertirao sam disk u MBR i dodijelio samo 16 MB - usluga se ne žali. Mislim da bi se xfs bez problema mogao zamijeniti s ext. Ova je particija montirana u /var/lib/…, gdje usluga čita informacije o OSD-u i također pronalazi referencu na blok uređaj na kojem su pohranjeni binarni podaci. Teoretski, možete smjesta smjestiti pomoćne datoteke u /var/lib/… i dodijeliti cijeli disk za podatke. Prilikom kreiranja OSD-a putem ceph-deploy-a, automatski se stvara pravilo za montiranje particije u /var/lib/…, a ceph korisniku također se 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 navesti ciljni parametar osd memory kako bi bilo dovoljno fizičke memorije.

ceph-mds. Na niskoj razini, CEPH je pohrana objekata. Mogućnost blokiranja pohrane svodi se na pohranjivanje svakog bloka od 4 MB kao objekta. Pohrana datoteka radi na istom principu. Stvorena su dva skupa: jedan za metapodatke, drugi za podatke. Kombiniraju se u datotečni sustav. U ovom trenutku se stvara neka vrsta zapisa, pa ako izbrišete datotečni sustav, ali zadržite oba bazena, nećete ga moći vratiti. Postoji procedura za izdvajanje datoteka po blokovima, nisam je testirao. Za pristup datotečnom sustavu odgovoran je servis ceph-mds. Svaki datotečni sustav zahtijeva zasebnu instancu usluge. Postoji opcija "indeks", koja vam omogućuje stvaranje privida nekoliko datotečnih sustava u jednom - također nije testirano.

Ceph-mon - Ova usluga pohranjuje mapu klastera. Sadrži informacije o svim OSD-ovima, algoritam za distribuciju PG-ova u OSD-ovima i, što je najvažnije, informacije o svim objektima (pojedinosti ovog mehanizma nisu mi jasni: postoji direktorij /var/lib/ceph/mon/…/ store.db, sadrži veliku datoteku od 26 MB, au klasteru od 105 K objekata, ispada da je malo više od 256 bajtova po objektu - mislim da monitor pohranjuje popis svih objekata i PG-ova u kojima nalaze se). Oštećenje ovog direktorija rezultira gubitkom svih podataka u klasteru. Otuda je došlo do zaključka 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, ma koliko developeri izbjegavali tu riječ. Kao rezultat toga, prvo, ne možemo instalirati sustav na flash pogon u RO modu, budući da se baza podataka stalno snima, za njih je potreban dodatni disk (jedva više od 1 GB), drugo, potrebno je imati kopirajte ovu bazu u stvarnom vremenu. Ako postoji više monitora, tada se automatski osigurava tolerancija na greške, ali u našem slučaju postoji samo jedan monitor, maksimalno dva. Postoji teoretski postupak vraćanja monitora na temelju OSD podataka, pribjegao sam mu tri puta iz raznih razloga i tri puta nije bilo poruka o pogrešci, kao ni podataka. Nažalost, ovaj mehanizam ne funkcionira. Ili upravljamo minijaturnom particijom na OSD-u i sastavljamo RAID za pohranu baze podataka, što će sigurno imati vrlo loš učinak na performanse, ili dodijelimo barem dva pouzdana fizička medija, po mogućnosti USB, kako ne bismo zauzeli portove.

rados-gw - izvozi pohranu objekata preko S3 protokola i slično. Stvara mnogo bazena, nejasno je zašto. Nisam puno eksperimentirao.

ceph-mgr - Prilikom instalacije ove usluge pokreće se nekoliko modula. Jedan od njih je autoscale koji se ne može onemogućiti. Nastoji održati točnu količinu PG/OSD. Ako želite ručno kontrolirati omjer, možete onemogućiti skaliranje za svaki skup, ali u ovom slučaju modul se ruši s dijeljenjem s 0, a status klastera postaje GREŠKA. Modul je napisan u Pythonu, a ako u njemu komentirate potrebnu liniju, to dovodi do njegovog onemogućavanja. Previše lijen za pamćenje detalja.

Popis korištenih izvora:

Instalacija CEPH
Oporavak od potpunog kvara monitora

Popisi skripti:

Instalacija sustava 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

Napravite 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-a (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čun lokacije podataka. Monitori distribuiraju ovaj algoritam klijentima, nakon čega klijenti izravno traže željeni čvor i željeni OSD. CRUSH ne osigurava centralizaciju. To je mala datoteka koju možete čak isprintati i objesiti na zid. Praksa je pokazala da CRUSH nije iscrpna karta. Ako uništite i ponovno stvorite 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 zahtijeva osiguranje njihove sigurnosti, što eliminira uštedu diska instaliranjem sustava na flash pogon i isključuje klastere s manje od tri čvora. Agresivna politika programera u pogledu dodatnih značajki. Daleko od minimalizma. Dokumentacija je na razini “hvala na ovome što imamo, ali je jako, jako oskudno”. Omogućena je mogućnost interakcije s uslugama na niskoj razini, ali dokumentacija se previše površno dotiče ove teme, pa je vjerojatnije ne nego da. Gotovo da nema šanse za oporavak podataka iz hitne situacije.

Mogućnosti za daljnje djelovanje: napustite CEPH i koristite banalne multi-disk btrfs (ili xfs, zfs), saznajte nove informacije o CEPH-u, koje će vam omogućiti da njime upravljate pod navedenim uvjetima, pokušajte napisati vlastitu pohranu kao naprednu trening.

Izvor: www.habr.com

Dodajte komentar