Искуство са ЦЕПХ

Када има више података него што може да стане на један диск, време је да размислите о РАИД-у. Као дете, често сам чуо од старијих: „Једног дана РАИД ће бити прошлост, складиштење објеката ће испунити свет, а ви ни не знате шта је ЦЕПХ“, тако да је прва ствар у мом самосталном животу био је да створим сопствени кластер. Сврха експеримента је била да се упозна са унутрашњом структуром цепх-а и разуме обим његове примене. Колико је оправдана примена цепх-а у средњим и малим предузећима? После неколико година рада и неколико неповратних губитака података, појавило се разумевање замршености да није све тако једноставно. Посебности ЦЕПХ-а представљају препреке његовом широком усвајању и због њих су експерименти зашли у ћорсокак. Испод је опис свих предузетих корака, добијених резултата и изведених закључака. Ако упућени људи поделе своје искуство и објасне неке тачке, бићу захвалан.

Напомена: Коментатори су идентификовали озбиљне грешке у неким од претпоставки које захтевају ревизију целог чланка.

ЦЕПХ стратегија

ЦЕПХ кластер комбинује произвољан број К дискова произвољне величине и складишти податке на њима, дуплирајући сваки део (подразумевано 4 МБ) дати број Н пута.

Хајде да размотримо најједноставнији случај са два идентична диска. Од њих можете саставити РАИД 1 или кластер са Н=2 - резултат ће бити исти. Ако постоје три диска и они су различите величине, онда је лако саставити кластер са Н=2: неки од података ће бити на дисковима 1 и 2, неки ће бити на дисковима 1 и 3, а неки ће бити на 2 и 3, док РАИД неће (можете саставити такав РАИД, али то би била перверзија). Ако има још више дискова, онда је могуће креирати РАИД 5; ЦЕПХ има аналог - ерасуре_цоде, што је у супротности са раним концептима програмера, па се стога не разматра. РАИД 5 претпоставља да постоји мали број диск јединица, од којих су сви у добром стању. Ако један не успе, остали морају да издрже док се диск не замени и подаци не врате на њега. ЦЕПХ, са Н>=3, подстиче употребу старих дискова, посебно ако држите неколико добрих дискова за чување једне копије података, а преостале две или три копије чувате на великом броју старих дискова, тада информације ће бити безбедно, пошто су за сада нови дискови живи - нема проблема, а ако се један од њих поквари, онда је истовремени квар три диска са животним веком дужим од пет година, по могућности са различитих сервера, изузетно мало вероватан догађај.

Постоји суптилност у дистрибуцији копија. Подразумевано се претпоставља да су подаци подељени у више (~100 по диску) ПГ дистрибутивних група, од којих је свака дуплирана на неким дисковима. Рецимо К=6, Н=2, онда ако било која два диска покваре, подаци ће гарантовано бити изгубљени, пошто ће према теорији вероватноће постојати најмање један ПГ који ће се налазити на ова два диска. А губитак једне групе чини све податке у групи недоступнима. Ако су дискови подељени у три пара и подаци се смеју чувати само на дисковима унутар једног пара, онда је таква дистрибуција отпорна и на квар било ког диска, али ако два диска покваре, вероватноћа губитка података није 100%, али само 3/15, па чак и у случају квара три диска - само 12/20. Дакле, ентропија у дистрибуцији података не доприноси толеранцији грешака. Такође имајте на уму да за фајл сервер, бесплатна РАМ меморија значајно повећава брзину одговора. Што је више меморије у сваком чвору и што је више меморије у свим чворовима, то ће бити брже. Ово је несумњиво предност кластера у односу на један сервер и, још више, хардверски НАС, где је уграђена веома мала количина меморије.

Из тога следи да је ЦЕПХ добар начин да се створи поуздан систем за складиштење података за десетине ТБ са могућношћу скалирања уз минимална улагања од застареле опреме (овде ће, наравно, бити потребни трошкови, али мали у поређењу са комерцијалним системима за складиштење).

Имплементација кластера

За експеримент, узмимо раскинути рачунар Интел ДК57ТМ + Интел цоре и3 540 + 16 ГБ РАМ-а. Организоваћемо четири диска од 2 ТБ у нешто попут РАИД10, након успешног тестирања додаћемо други чвор и исто толико дискова.

Инсталирање Линук-а. Дистрибуција захтева могућност прилагођавања и стабилности. Дебиан и Сусе испуњавају услове. Сусе има флексибилнији инсталатер који вам омогућава да онемогућите било који пакет; Нажалост, нисам могао да схватим које се могу бацити без оштећења система. Инсталирајте Дебиан користећи дебоотстрап бустер. Опција мин-басе инсталира покварени систем коме недостају драјвери. Разлика у величини у односу на пуну верзију није толико велика да би сметала. Пошто се рад обавља на физичкој машини, желим да направим снимке, као на виртуелним машинама. Ову опцију пружа или ЛВМ или бтрфс (или кфс, или зфс - разлика није велика). ЛВМ снимци нису јача страна. Инсталирајте бтрфс. А боотлоадер је у МБР-у. Нема смисла затрпати диск од 50 МБ ФАТ партицијом када га можете гурнути у област табеле партиција од 1 МБ и доделити сав простор систему. Заузео је 700 МБ на диску. Не сећам се колико има основна СУСЕ инсталација, мислим да је око 1.1 или 1.4 ГБ.

Инсталирајте ЦЕПХ. Ми игноришемо верзију 12 у дебиан спремишту и повезујемо се директно са 15.2.3 сајта. Пратимо упутства из одељка „Ручно инсталирајте ЦЕПХ“ са следећим упозорењима:

  • Пре повезивања спремишта, морате инсталирати гнупг вгет ца-сертификате
  • Након повезивања спремишта, али пре инсталирања кластера, инсталирање пакета је изостављено: апт -и --но-инсталл-рецоммендс инсталл цепх-цоммон цепх-мон цепх-осд цепх-мдс цепх-мгр
  • Приликом инсталирања ЦЕПХ-а, из непознатих разлога, покушаће да инсталира лвм2. У принципу, није штета, али инсталација не успева, тако да се ни ЦЕПХ неће инсталирати.

    Ова закрпа је помогла:

    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
    

Преглед кластера

цепх-осд - одговоран је за чување података на диску. За сваки диск се покреће мрежни сервис који прихвата и извршава захтеве за читање или писање објеката. На диску се креирају две партиције. Један од њих садржи информације о кластеру, броју диска и кључевима за кластер. Ова информација од 1 КБ се креира једном приликом додавања диска и никада није примећена да се мења. Друга партиција нема систем датотека и складишти ЦЕПХ бинарне податке. Аутоматска инсталација у претходним верзијама креирала је кфс партицију од 100 МБ за сервисне информације. Конвертовао сам диск у МБР и доделио само 16МБ - услуга се не жали. Мислим да би кфс могао бити замењен ект без икаквих проблема. Ова партиција је монтирана у /вар/либ/…, где сервис чита информације о ОСД-у и такође проналази референцу на блок уређај где се чувају бинарни подаци. Теоретски, можете одмах поставити помоћне датотеке у /вар/либ/… и доделити цео диск за податке. Када креирате ОСД путем цепх-деплои-а, аутоматски се креира правило за монтирање партиције у /вар/либ/…, а цепх кориснику се такође додељују права да чита жељени блок уређај. Ако инсталирате ручно, то морате учинити сами; документација то не каже. Такође је препоручљиво да одредите циљни параметар осд меморије тако да има довољно физичке меморије.

цепх-мдс. На ниском нивоу, ЦЕПХ је складиште објеката. Могућност блокирања меморије своди се на чување сваког блока од 4МБ као објекта. Складиштење датотека ради на истом принципу. Креирају се два скупа: један за метаподатке, други за податке. Они су комбиновани у систем датотека. У овом тренутку се креира нека врста записа, па ако избришете систем датотека, али задржите оба пула, нећете моћи да га вратите. Постоји процедура за издвајање датотека по блоковима, нисам је тестирао. Цепх-мдс сервис је одговоран за приступ систему датотека. Сваки систем датотека захтева посебну инстанцу услуге. Постоји опција „индекс“, која вам омогућава да креирате изглед неколико система датотека у једном - такође није тестирано.

Цепх-мон - Ова услуга чува мапу кластера. Укључује информације о свим ОСД-овима, алгоритам за дистрибуцију ПГ-ова у ОСД-овима и, што је најважније, информације о свим објектима (детаљи овог механизма ми нису јасни: постоји директоријум /вар/либ/цепх/мон/…/ сторе.дб, садржи велику датотеку од 26МБ, а у групи од 105 објеката испада нешто више од 256 бајтова по објекту – мислим да монитор чува листу свих објеката и ПГ-ова у којима налазе се). Оштећење овог директоријума доводи до губитка свих података у кластеру. Отуда је извучен закључак да ЦРУСХ показује како се ПГ-ови налазе на ОСД-у, а како се објекти налазе на ПГ-овима - они се централно чувају унутар базе података, ма колико програмери избегавали ову реч. Као резултат тога, прво, не можемо да инсталирамо систем на флеш диск у РО режиму, пошто се база података стално снима, за њих је потребан додатни диск (тешко више од 1 ГБ), друго, потребно је имати копирајте ову базу у реалном времену. Ако постоји више монитора, онда је отпорност на грешке обезбеђена аутоматски, али у нашем случају постоји само један монитор, максимално два. Постоји теоријска процедура за враћање монитора у првобитно стање на основу података на екрану, прибегао сам јој три пута из разних разлога, а три пута није било порука о грешци, као ни података. Нажалост, овај механизам не функционише. Или ћемо управљати минијатурном партицијом на ОСД-у и саставити РАИД за складиштење базе података, што ће сигурно имати веома лош утицај на перформансе, или ћемо доделити најмање два поуздана физичка медија, најбоље УСБ, како не би заузели портове.

радос-гв - извози складиште објеката преко С3 протокола и сл. Ствара много базена, нејасно је зашто. Нисам много експериментисао.

цепх-мгр - Приликом инсталирања ове услуге покреће се неколико модула. Један од њих је аутоматско скалирање које се не може онемогућити. Настоји да одржи тачну количину ПГ/ОСД. Ако желите да контролишете однос ручно, можете да онемогућите скалирање за сваки скуп, али у овом случају модул пада са дељењем са 0, а статус кластера постаје ГРЕШКА. Модул је написан у Питхон-у и ако у њему коментаришете неопходну линију, то доводи до његовог онемогућавања. Превише је лењ да се сети детаља.

Списак коришћених извора:

Инсталација ЦЕПХ-а
Опоравак од потпуног квара монитора

Листе скрипти:

Инсталирање система преко дебоотстрап-а

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

Направите кластер

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

Додавање ОСД (део)

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

Резиме

Главна маркетиншка предност ЦЕПХ-а је ЦРУСХ – алгоритам за израчунавање локације података. Монитори дистрибуирају овај алгоритам клијентима, након чега клијенти директно траже жељени чвор и жељени ОСД. ЦРУСХ не обезбеђује централизацију. То је мала датотека коју чак можете одштампати и окачити на зид. Пракса је показала да ЦРУСХ није исцрпна мапа. Ако уништите и поново креирате мониторе, задржавајући све ОСД и ЦРУСХ, онда то није довољно за враћање кластера. Из овога се закључује да сваки монитор чува неке метаподатке о целом кластеру. Мала количина ових метаподатака не намеће ограничења на величину кластера, али захтева да се обезбеди њихова безбедност, што елиминише уштеде на диску инсталирањем система на флеш диск и искључује кластере са мање од три чвора. Агресивна политика програмера у вези са опционим функцијама. Далеко од минимализма. Документација је на нивоу „хвала за оно што имамо, али је веома, веома оскудна“. Могућност интеракције са услугама на ниском нивоу је обезбеђена, али документација се дотиче ове теме превише површно, тако да је вероватније не него да. Практично нема шансе за опоравак података из ванредне ситуације.

Опције за даље радње: напустите ЦЕПХ и користите банални мулти-диск бтрфс (или кфс, зфс), сазнајте нове информације о ЦЕПХ-у које ће вам омогућити да њиме радите под наведеним условима, покушајте да напишете сопствену меморију као напредну обука.

Извор: ввв.хабр.цом

Додај коментар