Kui andmete hulk ĂŒletab ĂŒhe ketta mahutavust, on aeg mĂ”elda RAIDile. Lapsena kuulsin suurte kĂ€est tihti: "Ăhel pĂ€eval kaovad RAID minevikku, objektide salvestuslahendused vallutavad maailma, ja sina ei tea isegi, mis on CEPH," - seega oli minu esimene tegevus iseseisvas elus oma klaster luua. Katse eesmĂ€rk oli tutvuda cephi sisemise struktuuriga ja mĂ”ista selle rakendamise piire. Kuidas on mĂ”istlik CEPH'i juurutada keskmisesse Ă€ri ja vĂ€ikeseesse? PĂ€rast mitme aasta kasutust ja mĂ”nda pöördumatut andmekadu sai selgeks, et asjad pole sugugi lihtsad. CEPH'i eripĂ€rad teevad selle laialdase leviku keeruliseks, ja seetĂ”ttu on katsetused ummikusse jĂ”udnud. Allpool on toodud kĂ”ik lĂ€bitud etapid, saadud tulemused ja tehtud jĂ€reldused. Olen tĂ€nulik, kui teadlikud inimesed jagavad kogemusi ja selgitavad mĂ”ningaid aspekte.
MÀrkus: kommenteerijad on viidanud tÔsistele vigadele mÔnedes eeldustes, mis vajavad kogu artikli lÀbivaatamist.
CEPHi strateegia
CEPH klaster ĂŒhendab suvalise arvu K suvalise suurusega kettaid ja salvestab neile andmeid, dubleerides iga tĂŒkki (vaikimisi 4 MB) mÀÀratud N korda.
Vaatame kĂ”ige lihtsamat juhtumit kahe identse ketta puhul. Nendest saab ehitada kas RAID 1 vĂ”i klusterdada N=2 â tulemus jÀÀb samaks. Kui kettaid on kolm ja need on erineva suurusega, siis klusterdamine N=2 on lihtne: osa andmeid on ketastel 1 ja 2, osa â ketastel 1 ja 3, ning osa â ketastel 2 ja 3; RAID-i puhul ei ole see vĂ”imalik (kuigi sellise RAID-i loomine on vĂ”imalik, oleks see vÀÀrkasutamine). Kui ketaste arv suureneb, siis on vĂ”imalik luua RAID 5; CEPH-l on sellele analoog â erasure_code, mis on vastuolus varasemate arendajate kontseptsioonidega ning seetĂ”ttu ei ole see teemaks. RAID 5 eeldab, et on olemas vĂ€ike arv kettaid ja et kĂ”ik need on heas seisukorras. Ăhe ketta rikke korral peavad ĂŒlejÀÀnud kettaid piisama, kuni defekteeritud ketas vahetatakse ja andmed taastatakse. CEPH aga, kui N>=3, soodustab vanade ketaste kasutamist, eriti juhul, kui hoida mitut head ketast ĂŒhe andmekoopia salvestamiseks, samas kui ĂŒlejÀÀnud kaks-kolm koopiat hoida suurtes vanades kettastes; siis on teave kaitstud, kuna seni, kuni uued kettad on terved â probleeme ei ole, ning kui ĂŒks neist puruneb, siis kolme ĂŒle viie aasta teeninduses oleva ketta samaaegne rike, soovitavalt erinevatelt serveritelt, on ÀÀrmiselt ebatĂ”enĂ€oline.
Kopeeritud andmete jaotamisel on nĂŒanss. Vaikimisi eeldatakse, et andmed jagunevad suurema arvu (~100 plaadi kohta) PG jaotuste gruppide vahel, millest igaĂŒks on dubleeritud mĂ”nedes plaatides. Oletame, et K=6, N=2; siis kui kaks mĂ”nda plaati ebaĂ”nnestub, kaotatakse andmed kindlasti, kuna tĂ”enĂ€osusteooria kohaselt leidub vĂ€hemalt ĂŒks PG, mis asub just nende kahe plaadi peal. Ja ĂŒhe grupi kaotus muudab kĂ”ik andmed basseinist kĂ€ttesaamatuks. Kui aga plaate jagada kolme paari ja lubada andmete salvestamist ainult ĂŒhe paari sees, siis on selline jaotus samuti vastupidav ĂŒhe plaadi ebaĂ”nnestumisele, kuid kahe plaadi ebaĂ”nnestumise korral ei ole andmete kaotamise tĂ”enĂ€osus 100%, vaid vaid 3/15, ja isegi kolme plaadi ebaĂ”nnestumise korral on see vaid 12/20. SeetĂ”ttu ei soodusta andmete jaotuse entropia tĂ”rketaluvust. Samuti tuleb mĂ€rkida, et failiserveri puhul suurendab vabalt kasutatav mĂ€lu oluliselt reageerimisaega. Mida rohkem on mĂ€lu igas sĂ”lmes ja mida rohkem on mĂ€lu kĂ”igis sĂ”lmedes, seda kiirem on sĂŒsteem. See on kindlasti klastrite eelis ĂŒksiku serveri ja veelgi enam riistvaralise NAS-i ees, kuhu paigaldatakse vĂ€ga vĂ€ike mĂ€lu.
Seega on CEPH hea vĂ”imalus kasutada vanade seadmete vĂ€hese investeeringuga usaldusvÀÀrse andmesalvestuse sĂŒsteemi loomiseks kĂŒmnetes TB-des, millel on skaleeritavus (muidugi on vajalikud kulutused, kuid need on vĂ€ikesed vĂ”rreldes kommertsalustel).
Klastri rakendamine
Eksperimendiks vÔtame vananenud arvuti Intel DQ57TM + Intel Core i3 540 + 16 GB RAM. Organiseerime neli 2 TB ketast RAID10 sarnaseks, pÀrast edukat katset lisame teise sÔlme ja veel sama palju kettaid.
Installime Linuxi. Jaotuse puhul on vajalik kohandamise ja stabiilsuse vĂ”imalus. Sobivad nĂ”uetele Debian ja Suse. Susel on paindlikum installija, mis vĂ”imaldab alla laadida mistahes pakett; kahjuks ei suutnud ma aru saada, millised neist vĂ”ib sĂŒsteemist vĂ€lja jĂ€tta ilma kahju tekitamata. Installeerime Debiani debootstrap buster kaudu. Min-base valik installeerib mittetöötava sĂŒsteemi, millest puuduvad draiverid. Erinevus suuruses vĂ”rreldes tĂ€isversiooniga pole niivĂ”rd suur, et sellega tegeleda. Kuna töö toimub fĂŒĂŒsilisel masinal, on soov teha hetkepilte nagu virtuaalmasinatega. Sellist vĂ”imalust pakuvad kas LVM vĂ”i btrfs (vĂ”i xfs vĂ”i zfs â erinevus pole suur). LVM-i hetkepildid pole tugev kĂŒlg. Installeerime btrfs. Ja buutimise laadija â MBR. Pole mĂ”tet tĂ€ita distsipliini 50 MB FAT jaotusega, kui selle vĂ”ib suruda 1 MB jaotustabeli piirkonda ja kogu ruumi eraldada sĂŒsteemile. See vĂ”ttis kettale 700 MB. Kui palju on SUSE bainstalli suurus â ei mĂ€leta, tundub, et umbes 1.1 vĂ”i 1.4 GB.
Paigaldame CEPH. Ignorime debiani hoidla versiooni 12 ja ĂŒhendame otse veebisaidilt versiooni 15.2.3. JĂ€rgime jaotises "paigaldame CEPH kĂ€sitsi" antud juhiseid koos jĂ€rgmiste tĂ€iendustega:
- Enne hoidla ĂŒhendamist tuleb installida gnupg wget ca-certificates
- PĂ€rast hoidla ĂŒhendamist, kuid enne klastrite paigaldamist on vahele jĂ€etud pakettide installimine: apt -y --no-install-recommends install ceph-common ceph-mon ceph-osd ceph-mds ceph-mgr
- CEPHi installimise hetkel ĂŒritab kummalistel pĂ”hjustel paigalduda lvm2. Ăldiselt pole kahetsusvÀÀrne, kuid installatsioon lĂ”peb tĂ”rkega, mistĂ”ttu CEPH ei installi samuti.
See patch aitas:
cat <> /var/lib/dpkg/status Package: lvm2 Status: install ok installed Priority: important Section: admin Installed-Size: 0 Maintainer: Debian Adduser Developers Architecture: all Multi-Arch: foreign Version: 113.118 Description: No-install EOF
Klastri ĂŒlevaade
ceph-osd â vastutab andmete salvestamise eest kettale. Iga ketta jaoks kĂ€ivitatakse vĂ”rguteenuse, mis vĂ”tab vastu ja tĂ€idab objektide lugemise vĂ”i kirjutamise pĂ€ringud. Kettale luuakse kaks jaotust. Ăks neist sisaldab teavet klastrist, ketta numbrist ja samuti klastrivĂ”titest. See 1KB suurune teave luuakse korra, kui ketas lisatakse, ja ma ei ole kunagi mĂ€rganud, et see muutuks. Teisel jaotusel ei ole failisĂŒsteemi ja seal hoitakse CEPH-i binaardata. Automaatne installatsioon eelmistes versioonides lĂ”i xfs jaotuse suurusega 100MB teenusteabe jaoks. Ma konverteerisin ketta MBR-iks ja eraldasin kokku ainult 16MB â teenus ei kurda. Arvan, et xfs vĂ”iks probleemideta asendada ka ext-ga. See jaotus monteeritakse /var/lib/âŠ, kuhu teenus loeb OSD teavet ja leiab ĂŒhenduse sellele vastava plokiseadmest, kus hoitakse binaardata. Teoreetiliselt vĂ”iks abijĂ”ud asetada otse /var/lib/âŠ, ja terve ketas eraldada ainult andmete jaoks. OSD loomisel lĂ€bi ceph-deploy luuakse automaatselt reegel jaotuse monteerimiseks /var/lib/⊠ja mÀÀratakse Ă”igused ceph kasutajale soovitud plokiseadmest lugemiseks. Manuaalse installatsiooni korral on see vajalik ise teha, dokumentatsioonis seda ei öelda. Samuti on soovitatav mÀÀrata parameeter osd memory target, et fĂŒĂŒsilist mĂ€lu jaguks.
ceph-mds. Madal tasemel on CEPH â objektipĂ”hine salvestus. Blokeerimise salvestamise vĂ”imalus tĂ€hendab, et iga 4MB blokk salvestatakse objektina. Sama printsiibi jĂ€rgi töötab ka failisĂŒsteem. Loodud on kaks bassein: ĂŒks metaandmete jaoks ja teine andmete jaoks. Need koondatakse failisĂŒsteemi. Sel hetkel luuakse mingi salvestus, seetĂ”ttu, kui faili sĂŒsteem kustutatakse, kuid mĂ”lemad basseinid sĂ€ilitatakse, siis ei ole selle taastamine vĂ”imalik. TĂ”kkede kaupa failide ekstraheerimiseks on olemas protseduur, mida ei ole testitud. FailisĂŒsteemi juurde pÀÀsemise eest vastutab teenus ceph-mds. Iga failisĂŒsteemi jaoks on vajalik eraldi teenuse eksemplar. On olemas valik "indeks", mis vĂ”imaldab luua sarnaseid mitmeid failisĂŒsteeme ĂŒhe sees â ka seda ei ole testitud.
ceph-mon â see teenus salvestab klastrikaarti. See sisaldab teavet kĂ”igi OSD-de, PG jaotamise algoritmi OSD-des ning, mis kĂ”ige tĂ€htsam, teavet kĂ”igi objektide kohta (selle mehhanismi detailid on mulle ebaselged: on kataloog /var/lib/ceph/mon/.../store.db, kus on suur fail â 26MB, ja klastris 105K objekti, tĂ€hendab see veidi ĂŒle 256 baiti objekti kohta â arvan, et monitoor salvestab kĂ”ikide objektide ja PG-de loendi, kuhu nad kuuluvad). Selle katalooge kahjustamine toob kaasa andmete kaotuse klastris. SeetĂ”ttu on jĂ€reldatud, et CRUSH nĂ€itab, kuidas PG-d on OSD-des ja kuidas objektid asuvad PG-des â need on tsentraliseeritult salvestatud andmebaasi, ĂŒkskĂ”ik kui palju arendajad seda sĂ”na vĂ€ltida pĂŒĂŒavad. Selle tagajĂ€rjeks on, et me ei saa sĂŒsteemi paigaldada mĂ€lupulgale RO-reĆŸiimis, kuna andmebaasi toimub pidev kirjutamine, on vaja lisadiski nende jaoks (ilmtingimata mitte rohkem kui 1 GB), ja teiseks on vajalik reaalajas selle andmebaasi koopia. Kui monitoore on mitu, siis tĂ”rgeteta jĂ€tkamine tagatakse automaatselt, kuid meie puhul on monitoor ĂŒks, maksimum â kaks. On teoreetiline protseduur monitoori taastamiseks OSD andmete pĂ”hjal, olen sellele kolm korda pöördunud erinevatel pĂ”hjustel ning kolm korda pole mingit veateadet, samuti andmeid. Kahjuks see mehhanism ei tööta. Kas siis kasutame miniatuursed sektsioone OSD-l ja kogume RAID andmebaasi salvestamiseks, mis kindlasti halvendab jĂ”udlust, vĂ”i eraldame vĂ€hemalt kaks usaldusvÀÀrset fĂŒĂŒsilist seadmeid, eelistatavalt USB-d, et porti mitte hĂ”ivata.
rados-gw â ekspordib objektide salvestamise S3 protokolli kaudu ja sarnastele. Loodud on palju puule, millel pole selget eesmĂ€rki. Ei ole eriti katsetanud.
ceph-mgr â selle teenuse kĂ€ivitamisel aktiveeritakse mitu moodulit. Ăks neist on kohustuslik autoscale. See pĂŒĂŒab sĂ€ilitada Ă”ige PG/OSD arvu. Kui soovite suhet kĂ€sitsi hallata, saate igas puulus skaleerimise keelata, kuid sel juhul langeb moodul jagamise tĂ”ttu nulli ja klastris on staatus ERROR. Moodul on kirjutatud Pythonis ja kui vajalik rida kommenteerida, toob see kaasa selle keelamise. Ăksikasjad on meelest lĂ€inud.
Kasutatud allikate loetelu:
Skriptiliste loendite:
SĂŒsteemi paigaldamine debootstrap'i kaudu
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 6Klastri loomine
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 < /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@rbd1OSD (osa) lisamine
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@$osdnumKokkuvÔte
CEPH peamine turunduslik eelis on CRUSH â andmete asukoha arvutusalgoritm. Monitoorid edastavad klientidele selle algoritmi, mille jĂ€rel kliendid teevad otse pĂ€ringud soovitud sĂ”lme ja OSD poole. CRUSH tagab keskuse puudumise. See on vĂ€ike fail, mille saab isegi vĂ€lja printida ja seinale riputada. Praktika on nĂ€idanud, et CRUSH ei ole ammendav kaart. Kui monitoorid hĂ€vitada ja uuesti luua, sĂ€ilitades kĂ”ik OSD-d ja CRUSH-i, on sellest ebapiisav klastrite taastamiseks. SeetĂ”ttu jĂ€reldatakse, et igas monitooris hoitakse teatud metaandmeid kogu klastrist. Need metaandmed ei piirata klastrite suurust, kuid nende kaitsmine on vajalik, mis vĂ€listab sĂŒsteemi paigaldamise flash-mĂ€lupulgale ning klastrid, kus on vĂ€hem kui kolm sĂ”lme. Arendaja agressiivne poliitika valikuliste funktsioonide osas. Minimalismist on veel kaugel. Dokumentatsioon on tasemel: "selle eest, mis on, â aitĂ€h, kuid vĂ€ga, vĂ€ga napilt". Madala taseme teenustega suhtlemise vĂ”imalus on olemas, kuid dokumentatsioon kĂ€sitleb seda teemat liiga pinnapealselt, seega on tĂ”enĂ€olisem ei kui jah. Peaaegu pole vĂ”imalusi andmete taastamiseks vĂ€ljaspool tavapĂ€rast olukorda.
Edasi liikuda: loobuda CEPH-i kasutamisest ja kasutada tavalist mitmeketta btrfs (vÔi xfs, zfs), uurida uut teavet CEPH-i kohta, mis vÔimaldab seda antud tingimustes kasutada, vÔi proovida enda oskusi arendada, kirjutades oma salvestuslahenduse.
Allikas: habr.com
