Underfining mei CEPH

As d'r mear gegevens binne dan op ien skiif passe kinne, is it tiid om te tinken oer RAID. As bern hearde ik faak fan myn âldsten: "ien dei sil RAID in ding fan it ferline wêze, objektopslach sil de wrâld folje, en jo witte net iens wat CEPH is," sa it earste ding yn myn ûnôfhinklike libben wie myn eigen kluster te meitsjen. It doel fan it eksperimint wie om yn 'e kunde te kommen mei de ynterne struktuer fan ceph en begripe de omfang fan syn tapassing. Hoe rjochtfeardige is de ymplemintaasje fan ceph yn middelgrutte bedriuwen en yn lytse bedriuwen? Nei ferskate jierren fan wurking en in pear ûnomkearbere gegevens ferlies, in begryp fan de intricacies ûntstie dat net alles is sa ienfâldich. De eigenaardichheden fan CEPH foarmje barriêres foar har wiidferspraat oannimmen, en fanwege har hawwe eksperiminten in deade ein berikt. Hjirûnder is in beskriuwing fan alle nommen stappen, it krigen resultaat en de lutsen konklúzjes. As betûfte minsken har ûnderfining diele en guon punten útlizze, sil ik tankber wêze.

Opmerking: Kommentatoren hawwe serieuze flaters identifisearre yn guon fan 'e oannames dy't revyzje fan it heule artikel fereaskje.

CEPH Strategy

It CEPH-kluster kombinearret in willekeurich oantal K fan skiven fan willekeurige grutte en bewarret gegevens derop, en duplikearret elk stik (standert 4 MB) in opjûn getal N kear.

Litte wy it ienfâldichste gefal beskôgje mei twa identike skiven. Fan har kinne jo RAID 1 of in kluster gearstalle mei N = 2 - it resultaat sil itselde wêze. As d'r trije skiven binne en se binne fan ferskate grutte, dan is it maklik om in kluster te sammeljen mei N = 2: guon fan 'e gegevens sille op skiven 1 en 2 wêze, guon sille op skiven 1 en 3 wêze, en guon sille wêze on 2 en 3, wylst RAID sil net (do kinst assemble sa'n RAID, mar it soe wêze in perversion). As d'r noch mear skiven binne, dan is it mooglik om RAID 5 oan te meitsjen CEPH hat in analoge - erasure_code, dy't de iere konsepten fan 'e ûntwikkelders tsjinsprekt, en dêrom wurdt net beskôge. RAID 5 giet derfan út dat d'r in lyts oantal skiven binne, dy't allegear yn goede steat binne. As ien mislearret, moatte de oaren úthâlde oant de skiif ferfongen is en de gegevens derop weromset wurde. CEPH, mei N>=3, stimulearret it brûken fan âlde skiven, benammen as jo ferskate goede skiven hâlde om ien kopy fan gegevens op te slaan, en de oerbleaune twa of trije kopyen op in grut oantal âlde skiven opslaan, dan is de ynformaasje sil feilich wêze, om't foar no nije skiven libje - d'r binne gjin problemen, en as ien fan har brekt, dan is it simultane mislearjen fan trije skiven mei in libbenslibben fan mear as fiif jier, by foarkar fan ferskate servers, ekstreem ûnwierskynlik barren.

Der is in subtiliteit oan de fersprieding fan kopyen. Standert wurdt oannommen dat de gegevens wurde ferdield yn mear (~ 100 per skiif) PG distribúsje groepen, elk fan dat wurdt duplicated op guon skiven. Litte we sizze K = 6, N = 2, dan as ien fan twa skiven mislearje, gegevens wurde garandearre ferlern, sûnt neffens kâns teory, der sil wêze op syn minst ien PG dat sil wêze pleatst op dizze twa skiven. En it ferlies fan ien groep makket alle gegevens yn it swimbad net beskikber. As de skiven binne ferdield yn trije pearen en gegevens meie wurde opslein allinnich op skiven binnen ien pear, dan is sa'n distribúsje ek resistint foar it mislearjen fan ien skiif, mar as twa skiven mislearje, de kâns op gegevens ferlies is net 100%, mar allinich 3/15, en sels yn gefal fan mislearring trije skiven - allinich 12/20. Dêrtroch draacht entropy yn gegevensdistribúsje net by oan fouttolerânsje. Tink derom ek dat foar in bestânstsjinner fergees RAM de antwurdsnelheid signifikant fergruttet. Hoe mear ûnthâld yn elke knooppunt, en hoe mear ûnthâld yn alle knooppunten, hoe flugger it sil wêze. Dit is sûnder mis in foardiel fan in kluster boppe in inkele server en, noch mear, in hardware NAS, wêr't in heul lyts bedrach fan ûnthâld is ynboud.

It folget dat CEPH in goede manier is om in betrouber gegevensopslachsysteem foar tsientallen TB te meitsjen mei de mooglikheid om te skaaljen mei minimale ynvestearring fan ferâldere apparatuer (hjir sille fansels kosten nedich wêze, mar lyts yn ferliking mei kommersjele opslachsystemen).

Cluster ymplemintaasje

Foar it eksperimint, lit ús nimme in ôfskaft kompjûter Intel DQ57TM + Intel core i3 540 + 16 GB RAM. Wy sille fjouwer 2 TB-skiven organisearje yn wat as RAID10, nei in suksesfolle test sille wy in twadde knooppunt tafoegje en itselde oantal skiven.

Ynstallearje LinuxDe distribúsje moat oanpasber en stabyl wêze. Oan dizze easken wurdt foldien troch Debian en Suse. Suse hat in fleksibeler ynstallearder, wêrtroch jo elk pakket útskeakelje kinne; spitigernôch koe ik net útfine hokker ik fuortsmite koe sûnder it systeem te beskeadigjen. Wy ynstalleare Debian Mei help fan debootstrap buster. De min-base-opsje ynstallearret in net-funksjoneel systeem sûnder stjoerprogramma's. It ferskil yn grutte yn ferliking mei de folsleine ferzje is net sa wichtich dat it de muoite wurdich is om deroer nei te tinken. Om't ik op in fysike masine wurkje, wol ik graach snapshots meitsje, lykas op firtuele masines. Of LVM of btrfs (of xfs, of zfs - it ferskil is net sa grut) biedt dizze mooglikheid. Snapshots binne net it sterke punt fan LVM. Wy sille btrfs ynstallearje. En de bootloader sit yn 'e MBR. It hat gjin sin om in skiif fan 50 MB te foljen mei in FAT-partysje as jo it yn in partysjetabelgebiet fan 1 MB kinne perse en de hiele romte oan it systeem tawize kinne. It naam 700 MB skiifromte yn beslach. Ik wit net mear hoefolle de basis SUSE-ynstallaasje brûkt, mar ik tink dat it sawat 1.1 of 1.4 GB is.

Ynstallearje CEPH. Negearje ferzje 12 yn it repository. debian en ferbine direkt fan 'e 15.2.3-webside. Folgje de ynstruksjes yn 'e seksje "CEPH manuell ynstallearje", mei de folgjende warskôgings:

  • Foardat jo it repository ferbine, moatte jo gnupg wget ca-sertifikaten ynstallearje
  • Nei it ferbinen fan it repository, mar foar it ynstallearjen fan it kluster, wurdt it ynstallearjen fan pakketten weilitten: apt -y --no-install-recommends install ceph-common ceph-mon ceph-osd ceph-mds ceph-mgr
  • By it ynstallearjen fan CEPH, om ûnbekende redenen, sil it besykje lvm2 te ynstallearjen. Yn prinsipe is it net spitich, mar de ynstallaasje mislearret, dus CEPH sil ek net ynstallearje.

    Dizze patch holp:

    cat << EOF >> /var/lib/dpkg/status
    Package: lvm2
    Status: install ok installed
    Priority: important
    Section: admin
    Installed-Size: 0
    Maintainer: Debian Adduser Developers <adduser@packages.debian.org>
    Architecture: all
    Multi-Arch: foreign
    Version: 113.118
    Description: No-install
    EOF
    

Cluster oersjoch

ceph-osd - is ferantwurdlik foar it bewarjen fan gegevens op skiif. Foar elke skiif wurdt in netwurktsjinst lansearre dy't fersiken om te lêzen of te skriuwen nei objekten akseptearret en útfiert. Twa partysjes wurde makke op 'e skiif. Ien fan harren befettet ynformaasje oer it kluster, skiifnûmer en kaaien foar it kluster. Dizze 1KB-ynformaasje wurdt ien kear oanmakke by it tafoegjen fan in skiif en is nea opmurken om te feroarjen. De twadde dieling hat gjin bestânsysteem en bewarret CEPH-binêre gegevens. Automatyske ynstallaasje yn eardere ferzjes makke in 100MB xfs-partysje foar tsjinstynformaasje. Ik konvertearre de skiif nei MBR en tawiisd mar 16MB - de tsjinst net kleie. Ik tink dat xfs sûnder problemen ferfongen wurde kinne troch ext. Dizze partysje is monteard yn /var/lib/…, wêr't de tsjinst ynformaasje oer it OSD lêst en ek in ferwizing fynt nei it blokapparaat wêr't de binêre gegevens opslein wurde. Teoretysk kinne jo helpbestannen fuortendaliks pleatse yn /var/lib/…, en de folsleine skiif tawize foar gegevens. By it oanmeitsjen fan in OSD fia ceph-deploy, wurdt automatysk in regel makke om de partysje yn /var/lib/... te montearjen, en de ceph-brûker wurdt ek rjochten tawiisd om it winske blokapparaat te lêzen. As jo ​​manuell ynstallearje, moatte jo dit sels dwaan. It is ek oan te rieden om de osd-ûnthâlddoelparameter oan te jaan, sadat der genôch fysyk ûnthâld is.

ceph-mds. Op in leech nivo is CEPH foarwerp opslach. Mooglikheid foar blok opslach komt del op it opslaan fan elk 4MB blok as in objekt. Triem opslach wurket op itselde prinsipe. Twa pools wurde makke: ien foar metadata, de oare foar gegevens. Se wurde kombinearre yn in triemsysteem. Op dit stuit wurdt in soarte fan record oanmakke, dus as jo it bestânsysteem wiskje, mar beide poolen hâlde, kinne jo it net weromsette. D'r is in proseduere foar it ekstrahearjen fan bestannen troch blokken, ik haw it net hifke. De ceph-mds-tsjinst is ferantwurdlik foar tagong ta it bestânsysteem. Elk bestânsysteem fereasket in aparte eksimplaar fan 'e tsjinst. D'r is in opsje "yndeks", wêrtroch jo de skyn fan ferskate bestânsystemen yn ien kinne oanmeitsje - ek net hifke.

Ceph-mon - Dizze tsjinst bewarret in kaart fan it kluster. It befettet ynformaasje oer alle OSD's, in algoritme foar it fersprieden fan PG's yn OSD's en, it wichtichste, ynformaasje oer alle objekten (de details fan dit meganisme binne my net dúdlik: d'r is in map /var/lib/ceph/mon/…/ store.db, it befettet in grutte de triem is 26MB, en yn in kluster fan 105K foarwerpen, it docht bliken in bytsje mear as 256 bytes per foarwerp - ik tink dat de monitor bewarret in list fan alle objekten en de PG wêryn se lizze). Skea oan dizze map resultearret yn it ferlies fan alle gegevens yn it kluster. Dêrtroch waard de konklúzje lutsen dat CRUSH toant hoe't PG's op 'e OSD lizze, en hoe't objekten op PG's lizze - se wurde sintraal opslein yn 'e databank, nettsjinsteande hoefolle de ûntwikkelders dit wurd foarkomme. As gefolch, yn it foarste plak, kinne wy ​​net ynstallearje it systeem op in flash drive yn RO modus, sûnt de databank wurdt hieltyd opnaam, in ekstra skiif is nedich foar dizze (haast mear as 1 GB), twadde is it nedich om te hawwen in kopiearje yn real time dizze basis. As d'r ferskate monitors binne, dan wurdt fouttolerânsje automatysk garandearre, mar yn ús gefal is der mar ien monitor, maksimaal twa. D'r is in teoretyske proseduere foar it werstellen fan in monitor basearre op OSD-gegevens, ik haw it trije kear foar ferskate redenen brûkt, en trije kear wiene d'r gjin flaterberjochten, lykas gjin gegevens. Spitigernôch wurket dit meganisme net. Of wy operearje in miniatuerpartysje op 'e OSD en sammelje in RAID om de databank op te slaan, wat grif in heul min effekt sil hawwe op prestaasjes, of wy allocearje op syn minst twa betroubere fysike media, leafst USB, om gjin havens te besetten.

rados-gw - eksportearret objekt opslach fia it S3-protokol en ferlykber. Makket in protte swimbaden, it is ûndúdlik wêrom. Ik eksperimintearre net folle.

ceph-mgr - By it ynstallearjen fan dizze tsjinst wurde ferskate modules lansearre. Ien fan harren is autoscale dat kin net útskeakele. It stribbet dernei om it juste bedrach fan PG / OSD te behâlden. As jo ​​wolle kontrolearje de ferhâlding mei de hân, kinne jo útskeakelje skaalfergrutting foar eltse pool, mar yn dit gefal crashes de module mei in divyzje troch 0, en de kluster status wurdt ERROR. De module is skreaun yn Python, en as jo de nedige line dêryn kommentaar jaan, liedt dit ta it útskeakeljen. Te lui om de details te ûnthâlden.

List fan brûkte boarnen:

Ynstallaasje fan CEPH
Herstel fan in folsleine monitorfout

Skriptlistings:

Ynstallearje it systeem fia 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 <adduser@packages.debian.org>
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 <adduser@packages.debian.org>
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

Meitsje in kluster

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 tafoegje (diel)

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

Gearfetting

It wichtichste marketingfoardiel fan CEPH is CRUSH - in algoritme foar it berekkenjen fan de lokaasje fan gegevens. Monitors distribuearje dit algoritme oan kliïnten, wêrnei't kliïnten direkt de winske knooppunt en de winske OSD freegje. CRUSH soarget foar gjin sintralisaasje. It is in lyts bestân dat jo sels útdrukke kinne en oan 'e muorre hingje kinne. Oefenjen hat sjen litten dat CRUSH gjin útputtende kaart is. As jo ​​​​de monitors ferneatigje en opnij oanmeitsje, alle OSD en CRUSH hâlde, dan is dit net genôch om it kluster te herstellen. Dêrút wurdt konkludearre dat elke monitor wat metadata oer it hiele kluster opslacht. De lytse hoemannichte fan dizze metadata stelt gjin beheiningen op de grutte fan it kluster, mar fereasket it garandearjen fan harren feiligens, dy't elimineert skiif besparring troch it ynstallearjen fan it systeem op in flash drive en útsluten klusters mei minder as trije knopen. It agressyf belied fan 'e ûntwikkelder oangeande opsjonele funksjes. Fier fan minimalisme. De dokumintaasje is op it nivo fan "tankewol foar wat wy hawwe, mar it is heul, heul mager." De mooglikheid om ynteraksje mei tsjinsten op in leech nivo wurdt levere, mar de dokumintaasje rekket dit ûnderwerp te oerflakkich, dus it is wierskynliker in nee dan in ja. D'r is praktysk gjin kâns om gegevens te herstellen fan in needsituaasje.

Opsjes foar fierdere aksje: ferlitte CEPH en brûk de banale multi-disk btrfs (of xfs, zfs), fyn nije ynformaasje oer CEPH, wêrtroch jo it kinne operearje ûnder de spesifisearre betingsten, besykje jo eigen opslach te skriuwen as in avansearre trening.

Boarne: www.habr.com

Keapje betroubere hosting foar siden mei DDoS-beskerming, VPS VDS-tsjinners 🔥 Keapje betroubere websidehosting mei DDoS-beskerming, VPS VDS-tsjinners | ProHoster