Kad ir vairāk datu, nekā var ievietot vienā diskā, ir laiks padomāt par RAID. Bērnībā es bieži dzirdēju no saviem vecākajiem: "kādu dienu RAID būs pagātne, objektu glabāšana piepildīs pasauli, un jūs pat nezināt, kas ir CEPH", tātad pirmā lieta manā neatkarīgajā dzīvē. bija izveidot savu kopu. Eksperimenta mērķis bija iepazīties ar cefa iekšējo struktūru un izprast tā pielietojuma apjomu. Cik pamatota ir cefa ieviešana vidējos un mazajos uzņēmumos? Pēc vairāku gadu darbības un pāris neatgriezeniskiem datu zudumiem radās izpratne par sarežģījumiem, ka ne viss ir tik vienkārši. CEPH īpatnības rada šķēršļus tās plašai ieviešanai, un to dēļ eksperimenti ir nonākuši strupceļā. Tālāk ir sniegts visu veikto darbību apraksts, iegūtais rezultāts un izdarītie secinājumi. Ja zinoši cilvēki dalīsies pieredzē un paskaidros dažus punktus, būšu pateicīgs.
Piezīme. Komentētāji ir atklājuši nopietnas kļūdas dažos pieņēmumos, kuru dēļ ir jāpārskata viss raksts.
CEPH stratēģija
CEPH klasteris apvieno patvaļīgu skaitu K patvaļīga izmēra disku un uzglabā tajos datus, dublējot katru gabalu (pēc noklusējuma 4 MB) noteiktu skaitu N reizes.
Apskatīsim vienkāršāko gadījumu ar diviem identiskiem diskiem. No tiem var vai nu samontēt RAID 1 vai klasteru ar N=2 - rezultāts būs tāds pats. Ja ir trīs diski un tie ir dažāda izmēra, tad ir viegli salikt klasteru ar N=2: daļa datu būs 1. un 2. diskā, daļa 1. un 3. diskā, bet daļa būs uz 2 un 3, savukārt RAID nedarīs (var tādu RAID salikt, bet tā būtu perversija). Ja ir vēl vairāk disku, tad ir iespējams izveidot RAID 5; CEPH ir analogs - erasure_code, kas ir pretrunā ar izstrādātāju agrīnajām koncepcijām un tāpēc netiek ņemts vērā. RAID 5 pieņem, ka ir neliels skaits disku, un tie visi ir labā stāvoklī. Ja viens neizdodas, pārējiem jāturas, līdz disks tiek nomainīts un tajā tiek atjaunoti dati. CEPH ar N>=3 mudina izmantot vecos diskus, jo īpaši, ja saglabājat vairākus labus diskus, lai saglabātu vienu datu kopiju, un saglabājat atlikušās divas vai trīs kopijas lielā skaitā veco disku, tad informācija būs drošībā, jo pagaidām jauni diski ir dzīvi - problēmu nav, un, ja kāds no tiem saplīst, tad trīs disku, kuru kalpošanas laiks pārsniedz piecus gadus, vienlaicīga kļūme, vēlams no dažādiem serveriem, ir ārkārtīgi maz ticama. notikumu.
Eksemplāru izplatīšanai ir savs smalkums. Pēc noklusējuma tiek pieņemts, ka dati ir sadalīti vairākās (~100 vienā diskā) PG izplatīšanas grupās, no kurām katra tiek dublēta dažos diskos. Teiksim, K=6, N=2, tad, ja kādi divi diski sabojājas, dati tiek garantēti zaudēti, jo saskaņā ar varbūtības teoriju uz šiem diviem diskiem atradīsies vismaz viens PG. Un vienas grupas zaudēšana padara visus pūlā esošos datus nepieejamus. Ja diski ir sadalīti trīs pāros un datus atļauts glabāt tikai diskos viena pāra ietvaros, tad šāds sadalījums ir izturīgs arī pret jebkura viena diska atteici, bet, ja sabojājas divi diski, datu zuduma iespējamība nav 100%, bet tikai 3/15, un pat atteices gadījumā trīs diski - tikai 12/20. Tādējādi entropija datu sadalē neveicina kļūdu toleranci. Ņemiet vērā arī to, ka failu serverim bezmaksas RAM ievērojami palielina reakcijas ātrumu. Jo vairāk atmiņas katrā mezglā un vairāk atmiņas visos mezglos, jo ātrāk tas būs. Tā neapšaubāmi ir klastera priekšrocība salīdzinājumā ar vienu serveri un, vēl jo vairāk, aparatūras NAS, kurā ir iebūvēts ļoti mazs atmiņas apjoms.
No tā izriet, ka CEPH ir labs veids, kā izveidot uzticamu datu uzglabāšanas sistēmu desmitiem TB ar iespēju mērogot ar minimālām investīcijām no novecojušām iekārtām (šeit, protams, būs vajadzīgas izmaksas, bet nelielas, salīdzinot ar komerciālajām uzglabāšanas sistēmām).
Klastera ieviešana
Eksperimentam ņemsim nojauktu datoru Intel DQ57TM + Intel core i3 540 + 16 GB RAM. Mēs sakārtosim četrus 2 TB diskus tādā veidā kā RAID10, pēc veiksmīgas pārbaudes pievienosim otru mezglu un tikpat daudz disku.
Komplekts LinuxIzplatījumam ir jābūt pielāgojamam un stabilam. Šīs prasības tiek izpildītas, Debian un Suse. Suse ir elastīgāks instalētājs, kas ļauj atspējot jebkuru pakotni; diemžēl es nevarēju saprast, kuras no tām varētu noņemt, nebojājot sistēmu. Mēs instalējām Debian Izmantojot debootstrap buster. Min-base opcija instalē nefunkcionējošu sistēmu, kurai trūkst draiveru. Izmēra atšķirība salīdzinājumā ar pilno versiju nav tik ievērojama, lai būtu vērts ar to ņemties. Tā kā strādāju ar fizisku mašīnu, es vēlētos uzņemt momentuzņēmumus, tāpat kā virtuālajās mašīnās. Šo iespēju nodrošina vai nu LVM, vai btrfs (vai xfs, vai zfs — atšķirība nav tik liela). Momentuzņēmumi nav LVM stiprā puse. Instalēsim btrfs. Un sāknēšanas ielādētājs atrodas MBR. Nav jēgas pārblīvēt 50 MB disku ar FAT nodalījumu, ja to var iespiest 1 MB nodalījumu tabulas apgabalā un visu vietu atvēlēt sistēmai. Tas aizņēma 700 MB diska vietas. Neatceros, cik daudz vietas izmanto pamata SUSE instalācija, bet domāju, ka tas ir aptuveni 1.1 vai 1.4 GB.
Instalējiet CEPH. Ignorējiet 12. versiju repozitorijā. debian un izveidojiet savienojumu tieši no 15.2.3 vietnes. Izpildiet norādījumus sadaļā “CEPH manuāla instalēšana”, ievērojot šādus brīdinājumus:
- Pirms repozitorija pievienošanas jums jāinstalē gnupg wget ca-sertifikāti
- Pēc repozitorija pievienošanas, bet pirms klastera instalēšanas, pakotņu instalēšana tiek izlaista: apt -y --no-install-recommends install ceph-common ceph-mon ceph-osd ceph-mds ceph-mgr
- Instalējot CEPH, nezināmu iemeslu dēļ tas mēģinās instalēt lvm2. Principā nav žēl, bet instalēšana neizdodas, tāpēc arī CEPH neinstalēs.
Šis ielāps palīdzēja:
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
Klasteru pārskats
ceph-osd - ir atbildīgs par datu glabāšanu diskā. Katram diskam tiek palaists tīkla pakalpojums, kas pieņem un izpilda pieprasījumus lasīt vai rakstīt objektos. Diskā tiek izveidoti divi nodalījumi. Viens no tiem satur informāciju par kopu, diska numuru un klastera atslēgām. Šī 1 KB informācija tiek izveidota vienreiz, pievienojot disku, un tā nekad nav mainīta. Otrajam nodalījumam nav failu sistēmas, un tajā tiek saglabāti CEPH binārie dati. Automātiskā instalēšana iepriekšējās versijās izveidoja 100 MB xfs nodalījumu pakalpojuma informācijai. Es konvertēju disku uz MBR un piešķīru tikai 16 MB - pakalpojums nesūdzas. Es domāju, ka xfs bez problēmām varētu aizstāt ar ext. Šis nodalījums ir uzstādīts /var/lib/…, kur pakalpojums nolasa informāciju par OSD, kā arī atrod atsauci uz bloka ierīci, kurā tiek glabāti binārie dati. Teorētiski jūs varat nekavējoties ievietot palīgfailus mapē /var/lib/… un piešķirt visu disku datiem. Veidojot OSD, izmantojot ceph-deploy, tiek automātiski izveidots noteikums, lai uzstādītu nodalījumu mapē /var/lib/…, un ceph lietotājam tiek piešķirtas arī tiesības lasīt vajadzīgo bloka ierīci. Instalējot manuāli, tas jādara pašam; dokumentācijā tas nav teikts. Ir arī ieteicams norādīt osd atmiņas mērķa parametru, lai būtu pietiekami daudz fiziskās atmiņas.
ceph-mds. Zemā līmenī CEPH ir objektu krātuve. Bloku krātuves iespēja ir katra 4 MB bloka kā objekta glabāšana. Failu glabāšana darbojas pēc tāda paša principa. Tiek izveidoti divi pūli: viens metadatiem, otrs datiem. Tie ir apvienoti failu sistēmā. Šobrīd tiek izveidots sava veida ieraksts, tāpēc, ja izdzēsīsiet failu sistēmu, bet saglabāsiet abus pūlus, to nevarēsit atjaunot. Ir procedūra failu izvilkšanai pa blokiem, es to neesmu pārbaudījis. Pakalpojums ceph-mds ir atbildīgs par piekļuvi failu sistēmai. Katrai failu sistēmai ir nepieciešams atsevišķs pakalpojuma gadījums. Ir opcija “indekss”, kas ļauj izveidot vairāku failu sistēmu līdzību vienā - arī nav pārbaudīta.
Ceph-mon — šis pakalpojums saglabā klastera karti. Tas ietver informāciju par visiem OSD, algoritmu PG izplatīšanai OSD un, pats galvenais, informāciju par visiem objektiem (šī mehānisma detaļas man nav skaidras: ir direktorija /var/lib/ceph/mon/…/ store.db, tajā ir liels fails ir 26 MB, un 105 256 objektu klasterī tas ir nedaudz vairāk par 1 baitiem vienam objektam - domāju, ka monitors saglabā visu objektu sarakstu un PG, kuros tie atrodas). Šī direktorija bojājuma rezultātā tiek zaudēti visi klastera dati. Līdz ar to tika izdarīts secinājums, ka CRUSH parāda, kā PG atrodas OSD, un kā objekti atrodas uz PG - tie tiek centralizēti glabāti datu bāzē, neatkarīgi no tā, cik ļoti izstrādātāji izvairās no šī vārda. Tā rezultātā, pirmkārt, mēs nevaram instalēt sistēmu zibatmiņas diskā RO režīmā, jo datu bāze tiek pastāvīgi ierakstīta, tiem ir nepieciešams papildu disks (diez vai vairāk par XNUMX GB), otrkārt, ir nepieciešams kopēt reāllaikā šo bāzi. Ja ir vairāki monitori, tad defektu tolerance tiek nodrošināta automātiski, bet mūsu gadījumā ir tikai viens monitors, maksimums divi. Ir teorētiska procedūra monitora atjaunošanai, pamatojoties uz OSD datiem, trīs reizes dažādu iemeslu dēļ ķēros pie tās, un trīs reizes nebija kļūdu ziņojumu, kā arī nebija datu. Diemžēl šis mehānisms nedarbojas. Vai nu mēs darbinām miniatūru OSD nodalījumu un apkopojam RAID datu bāzes glabāšanai, kas noteikti ļoti slikti ietekmēs veiktspēju, vai arī piešķiram vismaz divus uzticamus fiziskos datu nesējus, vēlams USB, lai neaizņemtu portus.
rados-gw - eksportē objektu krātuvi, izmantojot S3 protokolu un tamlīdzīgi. Izveido daudzus baseinus, nav skaidrs, kāpēc. Es daudz neeksperimentēju.
ceph-mgr - Instalējot šo pakalpojumu, tiek palaisti vairāki moduļi. Viens no tiem ir automātiskā mērogošana, ko nevar atspējot. Tā cenšas uzturēt pareizo PG/OSD daudzumu. Ja vēlaties manuāli kontrolēt attiecību, varat atspējot mērogošanu katram pūlam, taču šajā gadījumā modulis avarē, dalot ar 0, un klastera statuss kļūst par ERROR. Modulis ir rakstīts Python, un, ja tajā komentējat nepieciešamo rindiņu, tas noved pie tā atspējošanas. Pārāk slinks, lai atcerētos detaļas.
Izmantoto avotu saraksts:
Skriptu saraksti:
Sistēmas instalēšana, izmantojot 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 6Izveidojiet kopu
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@rbd1OSD pievienošana (daļa)
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@$osdnumKopsavilkums
Galvenā CEPH mārketinga priekšrocība ir CRUSH – datu atrašanās vietas aprēķināšanas algoritms. Monitori izplata šo algoritmu klientiem, pēc tam klienti tieši pieprasa vajadzīgo mezglu un vēlamo OSD. CRUSH nenodrošina centralizāciju. Tas ir mazs fails, kuru varat pat izdrukāt un piekārt pie sienas. Prakse ir parādījusi, ka CRUSH nav pilnīga karte. Ja iznīcināsit un izveidojat no jauna monitorus, saglabājot visu OSD un CRUSH, tad ar to nepietiek, lai atjaunotu kopu. No tā tiek secināts, ka katrs monitors glabā dažus metadatus par visu klasteru. Nelielais šo metadatu apjoms neuzliek ierobežojumus klastera lielumam, bet prasa nodrošināt to drošību, kas novērš diska ietaupījumus, instalējot sistēmu zibatmiņas diskā, un izslēdz klasterus ar mazāk nekā trim mezgliem. Izstrādātāja agresīvā politika attiecībā uz izvēles funkcijām. Tālu no minimālisma. Dokumentācija ir līmenī "paldies par to, kas mums ir, bet tas ir ļoti, ļoti niecīgs". Iespēja sadarboties ar pakalpojumiem tiek nodrošināta zemā līmenī, taču dokumentācijā šī tēma skarta pārāk virspusēji, tāpēc visticamāk nē, nevis jā. Praktiski nav iespēju atgūt datus no ārkārtas situācijas.
Turpmākās darbības iespējas: atteikties no CEPH un izmantot banālos daudzdisku btrfs (vai xfs, zfs), uzzināt jaunu informāciju par CEPH, kas ļaus to darbināt noteiktos apstākļos, mēģināt uzrakstīt savu krātuvi kā uzlaboto apmācību.
Avots: www.habr.com
