Skúsenosti s CEPH

Keď je dát viac, ako sa zmestí na jeden disk, je čas popremýšľať o RAID. Ako dieťa som často od svojich starších počúval: „Jedného dňa bude RAID minulosťou, ukladanie predmetov naplní svet a ty ani nevieš, čo je CEPH,“ takže prvá vec v mojom nezávislom živote bolo vytvoriť svoj vlastný klaster. Účelom experimentu bolo zoznámiť sa s vnútornou štruktúrou cephu a pochopiť rozsah jeho aplikácie. Aké opodstatnené je zavedenie ceph v stredných a malých podnikoch? Po niekoľkých rokoch prevádzky a niekoľkých nezvratných stratách údajov sa ukázalo, že nie všetko je také jednoduché. Zvláštnosti CEPH predstavujú bariéry pre jeho široké prijatie a kvôli nim sa experimenty dostali do slepej uličky. Nižšie je uvedený popis všetkých vykonaných krokov, dosiahnutého výsledku a vyvodených záverov. Ak sa znalí ľudia podelia o svoje skúsenosti a vysvetlia niektoré body, budem vďačný.

Poznámka: Komentátori identifikovali vážne chyby v niektorých predpokladoch, ktoré si vyžadujú revíziu celého článku.

Stratégia CEPH

Klaster CEPH kombinuje ľubovoľný počet K diskov ľubovoľnej veľkosti a ukladá na ne údaje, pričom každý kus (štandardne 4 MB) duplikuje daný počet N-krát.

Uvažujme o najjednoduchšom prípade s dvoma rovnakými diskami. Z nich môžete zostaviť buď RAID 1 alebo klaster s N=2 - výsledok bude rovnaký. Ak existujú tri disky a majú rozdielne veľkosti, potom je ľahké zostaviť klaster s N=2: niektoré dáta budú na diskoch 1 a 2, niektoré budú na diskoch 1 a 3 a niektoré budú na 2 a 3, zatiaľ čo RAID nebude (taký RAID môžete zostaviť, ale bola by to zvrátenosť). Ak existuje ešte viac diskov, potom je možné vytvoriť RAID 5; CEPH má analógový kód - erasure_code, ktorý je v rozpore so skorými konceptmi vývojárov, a preto sa neuvažuje. RAID 5 predpokladá, že existuje malý počet jednotiek, z ktorých všetky sú v dobrom stave. Ak jeden zlyhá, ostatné musia vydržať, kým sa disk vymení a dáta sa na ňom neobnovia. CEPH s N>=3 podporuje používanie starých diskov, najmä ak si ponecháte niekoľko dobrých diskov na uloženie jednej kópie údajov a zvyšné dve alebo tri kópie uložíte na veľký počet starých diskov, potom informácie bude v bezpečí, pretože zatiaľ sú nové disky nažive - nie sú žiadne problémy a ak sa jeden z nich pokazí, súčasná porucha troch diskov so životnosťou viac ako päť rokov, najlepšie z rôznych serverov, je extrémne nepravdepodobná udalosť.

Distribúcia kópií je jemná. Štandardne sa predpokladá, že údaje sú rozdelené do viacerých (~100 na disk) distribučných skupín PG, z ktorých každá je duplikovaná na niektorých diskoch. Povedzme K=6, N=2, potom ak zlyhajú akékoľvek dva disky, dáta sa zaručene stratia, keďže podľa teórie pravdepodobnosti bude na týchto dvoch diskoch umiestnený aspoň jeden PG. Strata jednej skupiny spôsobí, že všetky údaje vo fonde budú nedostupné. Ak sú disky rozdelené do troch párov a dáta je možné ukladať len na disky v rámci jedného páru, potom je takéto rozloženie odolné aj proti zlyhaniu ktoréhokoľvek disku, ale ak zlyhajú dva disky, pravdepodobnosť straty dát nie je 100%, ale iba 3/15 a dokonca aj v prípade poruchy tri disky - iba 12/20. Entropia v distribúcii údajov teda neprispieva k odolnosti voči chybám. Všimnite si tiež, že pre súborový server voľná RAM výrazne zvyšuje rýchlosť odozvy. Čím viac pamäte v každom uzle a čím viac pamäte vo všetkých uzloch, tým rýchlejšie to bude. To je nepochybne výhoda klastra oproti jedinému serveru a ešte viac hardvérového NAS, kde je zabudované veľmi malé množstvo pamäte.

Z toho vyplýva, že CEPH je dobrý spôsob, ako vytvoriť spoľahlivý systém na ukladanie dát pre desiatky TB s možnosťou škálovania s minimálnymi investíciami zo zastaraných zariadení (tu budú samozrejme potrebné náklady, ale v porovnaní s komerčnými úložnými systémami malé).

Implementácia klastra

Na experiment si zoberme vyradený počítač Intel DQ57TM + Intel core i3 540 + 16 GB RAM. Štyri 2 TB disky usporiadame do niečoho ako RAID10, po úspešnom teste pridáme druhý uzol a rovnaký počet diskov.

Inštalácia Linuxu. Distribúcia vyžaduje schopnosť prispôsobiť sa a byť stabilná. Debian a Suse spĺňajú požiadavky. Suse má flexibilnejší inštalačný program, ktorý vám umožňuje zakázať akýkoľvek balík; Bohužiaľ sa mi nepodarilo zistiť, ktoré by sa dali vyhodiť bez poškodenia systému. Nainštalujte Debian pomocou debootstrap buster. Možnosť min-base nainštaluje poškodený systém, ktorý nemá ovládače. Rozdiel vo veľkosti oproti plnej verzii nie je taký veľký, aby obťažoval. Keďže práca sa vykonáva na fyzickom počítači, chcem robiť snímky, ako na virtuálnych strojoch. Túto možnosť poskytuje buď LVM alebo btrfs (alebo xfs, alebo zfs – rozdiel nie je veľký). Snímky LVM nie sú silnou stránkou. Nainštalujte btrfs. A bootloader je v MBR. Nemá zmysel zahlcovať 50 MB disk oddielom FAT, keď ho môžete vložiť do oblasti tabuľky oddielov s veľkosťou 1 MB a alokovať celý priestor pre systém. Na disku zaberal 700 MB. Nepamätám si, koľko má základná inštalácia SUSE, myslím, že je to asi 1.1 alebo 1.4 GB.

Nainštalujte CEPH. Ignorujeme verziu 12 v úložisku debianu a pripájame sa priamo zo stránky 15.2.3. Postupujeme podľa pokynov v časti „Manuálna inštalácia CEPH“ s nasledujúcimi upozorneniami:

  • Pred pripojením úložiska musíte nainštalovať gnupg wget ca-certificates
  • Po pripojení úložiska, ale pred inštaláciou klastra, je inštalácia balíkov vynechaná: apt -y --no-install-recommends install ceph-common ceph-mon ceph-osd ceph-mds ceph-mgr
  • Pri inštalácii CEPH sa z neznámych dôvodov pokúsi nainštalovať lvm2. V zásade to nie je škoda, ale inštalácia zlyhá, preto nenainštaluje ani CEPH.

    Tento patch pomohol:

    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
    

Prehľad klastra

ceph-osd - je zodpovedný za ukladanie údajov na disk. Pre každý disk sa spustí sieťová služba, ktorá prijíma a vykonáva požiadavky na čítanie alebo zápis do objektov. Na disku sú vytvorené dva oddiely. Jeden z nich obsahuje informácie o klastri, čísle disku a kľúčoch ku klastri. Tieto informácie s veľkosťou 1 kB sa vytvoria raz pri pridávaní disku a nikdy nebolo zaznamenané, že by sa zmenili. Druhý oddiel nemá súborový systém a obsahuje binárne údaje CEPH. Automatická inštalácia v predchádzajúcich verziách vytvorila 100 MB xfs oblasť pre servisné informácie. Previedol som disk na MBR a pridelil len 16MB - služba sa nesťažuje. Myslím, že xfs by sa dalo bez problémov nahradiť ext. Tento oddiel je pripojený do /var/lib/…, kde služba číta informácie o OSD a tiež nájde odkaz na blokové zariadenie, kde sú uložené binárne dáta. Teoreticky môžete okamžite umiestniť pomocné súbory do /var/lib/… a prideliť celý disk pre dáta. Pri vytváraní OSD cez ceph-deploy sa automaticky vytvorí pravidlo na pripojenie oddielu do /var/lib/… a používateľovi ceph sa pridelia aj práva na čítanie požadovaného blokového zariadenia. Ak inštalujete manuálne, musíte to urobiť sami, dokumentácia to nehovorí. Odporúča sa tiež zadať cieľový parameter osd pamäte, aby bolo k dispozícii dostatok fyzickej pamäte.

ceph-mds. Na nízkej úrovni je CEPH objektové úložisko. Schopnosť blokovať úložisko spočíva v ukladaní každého 4 MB bloku ako objektu. Ukladanie súborov funguje na rovnakom princípe. Vytvoria sa dve oblasti: jedna pre metadáta a druhá pre údaje. Sú spojené do súborového systému. V tomto momente sa vytvorí nejaký záznam, takže ak vymažete súborový systém, ale ponecháte si oba fondy, nebudete ho môcť obnoviť. Existuje postup na extrahovanie súborov po blokoch, nemám to odskúšané. Služba ceph-mds je zodpovedná za prístup k systému súborov. Každý súborový systém vyžaduje samostatnú inštanciu služby. K dispozícii je možnosť „index“, ktorá vám umožňuje vytvoriť zdanie niekoľkých súborových systémov v jednom - tiež netestované.

Ceph-mon – Táto služba ukladá mapu klastra. Zahŕňa informácie o všetkých OSD, algoritmus na distribúciu PG v OSD a čo je najdôležitejšie, informácie o všetkých objektoch (podrobnosti tohto mechanizmu mi nie sú jasné: existuje adresár /var/lib/ceph/mon/…/ store.db, obsahuje veľký súbor má 26 MB a v zhluku 105 256 objektov je to niečo cez 1 bajtov na objekt - myslím, že monitor ukladá zoznam všetkých objektov a PG, v ktorých sú umiestnené). Poškodenie tohto adresára má za následok stratu všetkých údajov v klastri. Preto sa dospelo k záveru, že CRUSH ukazuje, ako sú PG umiestnené na OSD a ako sú objekty umiestnené na PG - sú centrálne uložené v databáze, bez ohľadu na to, ako veľmi sa vývojári tomuto slovu vyhýbajú. Výsledkom je, že po prvé nemôžeme nainštalovať systém na flash disk v režime RO, pretože databáza sa neustále zaznamenáva, na tieto je potrebný ďalší disk (sotva viac ako XNUMX GB), po druhé je potrebné mať kopírovať túto základňu v reálnom čase. Ak je monitorov viacero, odolnosť voči poruchám je zabezpečená automaticky, ale v našom prípade je len jeden monitor, maximálne dva. Existuje teoretický postup na obnovenie monitora na základe údajov OSD, trikrát som sa k nemu uchýlil z rôznych dôvodov a trikrát sa nevyskytli žiadne chybové hlásenia a žiadne údaje. Bohužiaľ, tento mechanizmus nefunguje. Buď sprevádzkujeme miniatúrnu partíciu na OSD a zostavíme RAID na uloženie databázy, čo bude mať určite veľmi zlý vplyv na výkon, alebo vyčleníme aspoň dve spoľahlivé fyzické médiá, najlepšie USB, aby sme nezaberali porty.

rados-gw - exportuje úložisko objektov cez protokol S3 a podobne. Vytvára veľa bazénov, nie je jasné prečo. Moc som neexperimentoval.

ceph-mgr - Pri inštalácii tejto služby sa spustí niekoľko modulov. Jedným z nich je automatické škálovanie, ktoré nemožno vypnúť. Snaží sa udržiavať správne množstvo PG/OSD. Ak chcete pomer ovládať manuálne, môžete zakázať škálovanie pre každú oblasť, ale v tomto prípade modul zlyhá s delením 0 a stav klastra sa zmení na CHYBNÝ. Modul je napísaný v Pythone a ak v ňom zakomentujete potrebný riadok, vedie to k jeho vypnutiu. Príliš lenivý pamätať si detaily.

Zoznam použitých zdrojov:

Inštalácia CEPH
Obnova po úplnom zlyhaní monitora

Zoznamy skriptov:

Inštalácia systému cez 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 <[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

Vytvorte 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

Pridanie OSD (časť)

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

Zhrnutie

Hlavnou marketingovou výhodou CEPH je CRUSH - algoritmus na výpočet polohy dát. Monitory distribuujú tento algoritmus klientom, po ktorých klienti priamo požiadajú o požadovaný uzol a požadované OSD. CRUSH nezabezpečuje žiadnu centralizáciu. Je to malý súbor, ktorý si môžete dokonca vytlačiť a zavesiť na stenu. Prax ukázala, že CRUSH nie je vyčerpávajúca mapa. Ak zničíte a znovu vytvoríte monitory, pričom zachováte všetky OSD a CRUSH, potom to na obnovenie klastra nestačí. Z toho sa usudzuje, že každý monitor ukladá nejaké metadáta o celom klastri. Malé množstvo týchto metadát nespôsobuje obmedzenia veľkosti klastra, ale vyžaduje zaistenie ich bezpečnosti, čo eliminuje úsporu disku inštaláciou systému na flash disk a vylučuje klastre s menej ako tromi uzlami. Agresívna politika vývojára týkajúca sa voliteľných funkcií. Ďaleko od minimalizmu. Dokumentácia je na úrovni „ďakujem za to, čo máme, ale je to veľmi, veľmi skromné“. Schopnosť interagovať so službami na nízkej úrovni je poskytovaná, ale dokumentácia sa tejto témy dotýka príliš povrchne, takže je pravdepodobnejšie nie ako áno. Neexistuje prakticky žiadna šanca na obnovenie údajov z núdzovej situácie.

Možnosti ďalšieho postupu: opustiť CEPH a použiť banálne viacdiskové btrfs (alebo xfs, zfs), zistiť nové informácie o CEPH, ktoré vám umožnia prevádzkovať ho za špecifikovaných podmienok, skúste si napísať vlastné úložisko ako pokročilé školenia.

Zdroj: hab.com

Pridať komentár