CEPH bilan tajriba

Bitta diskda sig'adigandan ko'proq ma'lumot bo'lsa, RAID haqida o'ylash vaqti keldi. Bolaligimda men kattalarimdan tez-tez eshitganman: "bir kun RAID o'tmishda qoladi, ob'ektlarni saqlash dunyoni to'ldiradi va siz hatto CEPH nima ekanligini bilmaysiz", shuning uchun mustaqil hayotimdagi birinchi narsa o'z klasterimni yaratish edi. Tajribaning maqsadi sephning ichki tuzilishi bilan tanishish va uni qo'llash doirasini tushunish edi. O'rta va kichik korxonalarda sephni amalga oshirish qanchalik asosli? Bir necha yillik ish va bir nechta qaytarib bo'lmaydigan ma'lumotlar yo'qotishlaridan so'ng, hamma narsa unchalik oddiy emasligini tushunish paydo bo'ldi. CEPH ning o'ziga xos xususiyatlari uning keng tarqalishiga to'sqinlik qiladi va ular tufayli tajribalar boshi berk ko'chaga yetdi. Quyida olingan barcha qadamlar, olingan natija va xulosalar tavsifi keltirilgan. Agar bilimdonlar o'z tajribalari bilan o'rtoqlashsa va ba'zi fikrlarni tushuntirib berishsa, men minnatdor bo'laman.

Eslatma: Sharhlovchilar butun maqolani qayta ko'rib chiqishni talab qiladigan ba'zi taxminlarda jiddiy xatolarni aniqladilar.

CEPH strategiyasi

CEPH klasteri ixtiyoriy o'lchamdagi disklarning ixtiyoriy K sonini birlashtiradi va ulardagi ma'lumotlarni saqlaydi, har bir bo'lakni (sukut bo'yicha 4 MB) berilgan sonni N marta ko'paytiradi.

Keling, ikkita bir xil diskli eng oddiy holatni ko'rib chiqaylik. Ulardan siz RAID 1 yoki N=2 bo'lgan klasterni yig'ishingiz mumkin - natija bir xil bo'ladi. Agar uchta disk mavjud bo'lsa va ular har xil o'lchamda bo'lsa, u holda N=2 bo'lgan klasterni yig'ish oson: ma'lumotlarning bir qismi 1 va 2 disklarda, ba'zilari 1 va 3 disklarda, ba'zilari esa bo'ladi. 2 va 3 da RAID bo'lmaydi (siz bunday RAIDni yig'ishingiz mumkin, lekin bu buzuqlik bo'ladi). Agar undan ham ko'proq disklar mavjud bo'lsa, unda RAID 5-ni yaratish mumkin; CEPH-da o'xshash - erasure_code mavjud, bu ishlab chiquvchilarning dastlabki tushunchalariga zid keladi va shuning uchun hisobga olinmaydi. RAID 5 kam sonli drayverlar mavjudligini nazarda tutadi, ularning barchasi yaxshi holatda. Agar bittasi muvaffaqiyatsiz bo'lsa, boshqalar disk almashtirilguncha va unga ma'lumotlar tiklanmaguncha ushlab turishi kerak. CEPH, N>=3 bilan, eski disklardan foydalanishni rag'batlantiradi, xususan, agar siz ma'lumotlarning bir nusxasini saqlash uchun bir nechta yaxshi disklarni saqlasangiz va qolgan ikki yoki uch nusxani ko'p sonli eski disklarda saqlasangiz, u holda ma'lumot xavfsiz bo'ladi, chunki hozircha yangi disklar mavjud - hech qanday muammo yo'q va agar ulardan biri buzilgan bo'lsa, xizmat muddati besh yildan ortiq bo'lgan uchta diskning bir vaqtning o'zida ishdan chiqishi, yaxshisi turli serverlardan, juda dargumon. voqea.

Nusxalarni tarqatishda noziklik bor. Odatiy bo'lib, ma'lumotlar ko'proq (har bir disk uchun ~ 100) PG tarqatish guruhlariga bo'lingan deb taxmin qilinadi, ularning har biri ba'zi disklarda takrorlanadi. Aytaylik, K=6, N=2, agar ikkita disk ishlamay qolsa, ma'lumotlar yo'qolishi kafolatlanadi, chunki ehtimollik nazariyasiga ko'ra, bu ikkita diskda kamida bitta PG joylashadi. Va bitta guruhning yo'qolishi hovuzdagi barcha ma'lumotlarni mavjud bo'lmaydi. Agar disklar uch juftga bo'lingan bo'lsa va ma'lumotlar faqat bitta juftlikdagi disklarda saqlanishi mumkin bo'lsa, unda bu tarqatish har qanday diskning ishdan chiqishiga ham chidamli bo'ladi, lekin ikkita disk ishlamay qolsa, ma'lumotlarning yo'qolishi ehtimoli 100 emas. %, lekin faqat 3/15 va hatto ishlamay qolganda uchta disk - faqat 12/20. Shunday qilib, ma'lumotlarni taqsimlashda entropiya xatolarga chidamliligiga hissa qo'shmaydi. Shuni ham yodda tutingki, fayl serveri uchun bepul RAM javob tezligini sezilarli darajada oshiradi. Har bir tugundagi xotira qancha ko'p bo'lsa va barcha tugunlarda qancha xotira ko'p bo'lsa, u tezroq bo'ladi. Bu, shubhasiz, klasterning bitta serverga va undan ham ko'proq, juda kichik hajmdagi xotira o'rnatilgan apparat NAS-ga nisbatan afzalligi.

Bundan kelib chiqadiki, CEPH o'nlab TB uchun ishonchli ma'lumotlarni saqlash tizimini yaratishning yaxshi usuli bo'lib, eskirgan uskunalardan minimal investitsiyalar bilan masshtablash qobiliyatiga ega (bu erda, albatta, xarajatlar talab qilinadi, ammo tijorat saqlash tizimlariga nisbatan kichik).

Klasterni amalga oshirish

Tajriba uchun ishdan chiqarilgan kompyuter Intel DQ57TM + Intel core i3 540 + 16 GB operativ xotirani olaylik. Biz RAID2 kabi to'rtta 10 TB diskni tashkil qilamiz, muvaffaqiyatli sinovdan so'ng biz ikkinchi tugunni va bir xil miqdordagi disklarni qo'shamiz.

Linux o'rnatilmoqda. Tarqatish moslashtirish va barqaror bo'lish qobiliyatini talab qiladi. Debian va Suse talablarga javob beradi. Suse-da har qanday paketni o'chirish imkonini beruvchi yanada moslashuvchan o'rnatuvchi mavjud; Afsuski, men tizimga zarar bermasdan qaysi biri tashlab yuborilishi mumkinligini aniqlay olmadim. Debootstrap buster yordamida Debian-ni o'rnating. Min-base opsiyasi drayverlarga ega bo'lmagan buzilgan tizimni o'rnatadi. To'liq versiyaga nisbatan o'lchamdagi farq bezovta qiladigan darajada katta emas. Ish jismoniy mashinada amalga oshirilganligi sababli, virtual mashinalarda bo'lgani kabi, suratga olishni xohlayman. Ushbu parametr LVM yoki btrfs (yoki xfs yoki zfs - farq unchalik katta emas) tomonidan taqdim etiladi. LVM snapshotlari kuchli nuqta emas. btrfs-ni o'rnating. Va yuklash moslamasi MBRda. 50 MB diskni FAT bo'limi bilan chalkashtirib yuborishning ma'nosi yo'q, agar siz uni 1 MB bo'lim jadvali maydoniga surib, tizim uchun barcha joy ajratsangiz. Diskda 700 MB joy egalladi. SUSE-ning asosiy o'rnatilishi qancha ekanligini eslay olmayman, menimcha, bu taxminan 1.1 yoki 1.4 GB.

CEPH ni o'rnating. Biz debian omborida 12-versiyani e'tiborsiz qoldiramiz va to'g'ridan-to'g'ri 15.2.3 saytidan ulanamiz. Biz quyidagi ogohlantirishlar bilan "CEPHni qo'lda o'rnatish" bo'limidagi ko'rsatmalarga amal qilamiz:

  • Repozitariyni ulashdan oldin siz gnupg wget ca-sertifikatlarini o'rnatishingiz kerak
  • Omborni ulagandan so'ng, lekin klasterni o'rnatishdan oldin paketlarni o'rnatish o'tkazib yuboriladi: apt -y --no-install-recommends install ceph-common ceph-mon ceph-osd ceph-mds ceph-mgr
  • CEPH o'rnatilganda, noma'lum sabablarga ko'ra, u lvm2 ni o'rnatishga harakat qiladi. Aslida, bu achinarli emas, lekin o'rnatish muvaffaqiyatsiz tugadi, shuning uchun CEPH ham o'rnatilmaydi.

    Ushbu patch yordam berdi:

    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
    

Klasterga umumiy nuqtai

ceph-osd - diskdagi ma'lumotlarni saqlash uchun javobgardir. Har bir disk uchun ob'ektlarni o'qish yoki yozish uchun so'rovlarni qabul qiluvchi va bajaradigan tarmoq xizmati ishga tushiriladi. Diskda ikkita bo'lim yaratilgan. Ulardan birida klaster, disk raqami va klaster kalitlari haqidagi ma'lumotlar mavjud. Ushbu 1 KB ma'lumot diskni qo'shganda bir marta yaratiladi va hech qachon o'zgarmagan. Ikkinchi bo'limda fayl tizimi yo'q va CEPH ikkilik ma'lumotlarini saqlaydi. Oldingi versiyalarda avtomatik o'rnatish xizmat ma'lumotlari uchun 100MB xfs bo'limini yaratdi. Men diskni MBR ga aylantirdim va faqat 16 MB ajratdim - xizmat shikoyat qilmaydi. Menimcha, xfs hech qanday muammosiz ext bilan almashtirilishi mumkin. Ushbu bo'lim /var/lib/… da o'rnatilgan bo'lib, u erda xizmat OSD haqidagi ma'lumotlarni o'qiydi va ikkilik ma'lumotlar saqlanadigan blok qurilmasiga havolani topadi. Nazariy jihatdan, siz darhol /var/lib/… ga yordamchi fayllarni joylashtirishingiz va ma'lumotlar uchun butun diskni ajratishingiz mumkin. Ceph-deploy orqali OSD yaratishda /var/lib/…-ga bo'limni o'rnatish uchun qoida avtomatik ravishda yaratiladi va ceph foydalanuvchisiga kerakli blok qurilmani o'qish huquqi ham beriladi. Agar siz qo'lda o'rnatsangiz, buni o'zingiz qilishingiz kerak, hujjatlarda bu aytilmagan. Shuningdek, etarli jismoniy xotira bo'lishi uchun osd xotira maqsadli parametrini belgilash tavsiya etiladi.

seph-mds. Past darajada, CEPH ob'ektni saqlashdir. Saqlashni bloklash qobiliyati har bir 4MB blokni ob'ekt sifatida saqlashga to'g'ri keladi. Fayllarni saqlash xuddi shu printsip asosida ishlaydi. Ikkita hovuz yaratiladi: biri metadata uchun, ikkinchisi ma'lumotlar uchun. Ular fayl tizimiga birlashtirilgan. Ayni paytda qandaydir yozuv yaratilmoqda, shuning uchun agar siz fayl tizimini o'chirib tashlasangiz, lekin ikkala hovuzni saqlasangiz, uni qayta tiklay olmaysiz. Fayllarni bloklar bo'yicha chiqarish tartibi mavjud, men uni sinab ko'rmadim. Ceph-mds xizmati fayl tizimiga kirish uchun javobgardir. Har bir fayl tizimi xizmatning alohida nusxasini talab qiladi. Bir nechta fayl tizimlarining o'xshashligini bitta faylda yaratishga imkon beradigan "indeks" opsiyasi mavjud - sinovdan o'tmagan.

Ceph-mon - Bu xizmat klaster xaritasini saqlaydi. U barcha OSD-lar haqidagi ma'lumotlarni, PG-larni OSD-larda tarqatish algoritmini va eng muhimi, barcha ob'ektlar haqida ma'lumotni o'z ichiga oladi (bu mexanizmning tafsilotlari menga tushunarsiz: /var/lib/ceph/mon/…/ katalogi mavjud. store.db, u 26 MB hajmdagi katta faylni o'z ichiga oladi va 105 ming ob'ekt klasterida har bir ob'ekt uchun 256 baytdan bir oz ko'proq bo'ladi - menimcha, monitor barcha ob'ektlar va PGlar ro'yxatini saqlaydi. ular joylashgan). Ushbu katalogning shikastlanishi klasterdagi barcha ma'lumotlarning yo'qolishiga olib keladi. Demak, shunday xulosaga keldikki, CRUSH PG-larning OSD-da qanday joylashganligini va PG-larda ob'ektlar qanday joylashganligini ko'rsatadi - ular ishlab chiquvchilar bu so'zdan qanchalik qochishmasin, ular ma'lumotlar bazasida markazlashtirilgan holda saqlanadi. Natijada, birinchidan, biz tizimni RO rejimida flesh-diskga o'rnatolmaymiz, chunki ma'lumotlar bazasi doimiy ravishda yozib olinadi, bular uchun qo'shimcha disk kerak (deyarli 1 Gb dan ortiq), ikkinchidan, bo'lishi kerak real vaqtda ushbu bazani nusxalash. Agar bir nechta monitor mavjud bo'lsa, unda nosozliklarga chidamlilik avtomatik ravishda ta'minlanadi, ammo bizning holatlarimizda faqat bitta monitor, maksimal ikkitasi bor. OSD ma'lumotlari asosida monitorni qayta tiklashning nazariy tartibi mavjud, men unga turli sabablarga ko'ra uch marta murojaat qildim va uch marta xato xabarlari, shuningdek, ma'lumotlar yo'q edi. Afsuski, bu mexanizm ishlamaydi. Yoki biz OSD-da miniatyura bo'limini ishlatamiz va ma'lumotlar bazasini saqlash uchun RAID yig'amiz, bu albatta ishlashga juda yomon ta'sir qiladi yoki portlarni egallamaslik uchun kamida ikkita ishonchli jismoniy vositani, yaxshisi USB-ni ajratamiz.

rados-gw - S3 protokoli va shunga o'xshashlar orqali ob'ektni saqlashni eksport qiladi. Ko'p hovuzlarni yaratadi, nima uchun noma'lum. Men ko'p tajriba o'tkazmadim.

ceph-mgr - Ushbu xizmatni o'rnatishda bir nechta modullar ishga tushiriladi. Ulardan biri avtomatik o'lchovdir, uni o'chirib bo'lmaydi. U to'g'ri PG/OSD miqdorini saqlab qolishga intiladi. Agar siz nisbatni qo'lda nazorat qilmoqchi bo'lsangiz, har bir hovuz uchun masshtablashni o'chirib qo'yishingiz mumkin, ammo bu holda modul 0 ga bo'linish bilan ishlamay qoladi va klaster holati ERROR bo'ladi. Modul Python-da yozilgan va agar siz undagi kerakli qatorni izohlasangiz, bu uning o'chirilishiga olib keladi. Tafsilotlarni eslab qolish uchun juda dangasa.

Foydalanilgan manbalar ro'yxati:

CEPHni o'rnatish
To'liq monitor xatosidan tiklanish

Skriptlar ro'yxati:

Debootstrap orqali tizimni o'rnatish

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

Klaster yarating

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 qo'shish (qism)

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

Xulosa

CEPH ning asosiy marketing afzalligi CRUSH - ma'lumotlarning joylashishini hisoblash algoritmidir. Monitorlar ushbu algoritmni mijozlarga tarqatadilar, shundan so'ng mijozlar to'g'ridan-to'g'ri kerakli tugunni va kerakli OSDni so'rashadi. CRUSH markazlashtirishning yo'qligini ta'minlaydi. Bu hatto chop etishingiz va devorga osib qo'yishingiz mumkin bo'lgan kichik fayl. Amaliyot shuni ko'rsatdiki, CRUSH to'liq xarita emas. Agar siz barcha OSD va CRUSH-ni saqlagan holda monitorlarni yo'q qilsangiz va qayta yaratsangiz, bu klasterni tiklash uchun etarli emas. Bundan kelib chiqadiki, har bir monitor butun klaster haqidagi ba'zi metama'lumotlarni saqlaydi. Ushbu metama'lumotlarning kichik miqdori klaster hajmiga cheklovlar qo'ymaydi, lekin ularning xavfsizligini ta'minlashni talab qiladi, bu tizimni flesh-diskga o'rnatish orqali diskni tejashni yo'q qiladi va uchta tugundan kam bo'lgan klasterlarni istisno qiladi. Ishlab chiquvchining ixtiyoriy funksiyalarga nisbatan tajovuzkor siyosati. Minimalizmdan uzoq. Hujjatlar "bizda bor narsa uchun rahmat, lekin bu juda, juda kam" darajasida. Xizmatlar bilan past darajada o'zaro aloqa qilish imkoniyati taqdim etiladi, ammo hujjatlar bu mavzuga juda yuzaki ta'sir qiladi, shuning uchun "ha"dan ko'ra "yo'q" bo'lishi mumkin. Favqulodda vaziyatdan ma'lumotlarni qayta tiklash imkoniyati deyarli yo'q.

Keyingi harakatlar uchun variantlar: CEPH-dan voz keching va banal ko'p diskli btrfs (yoki xfs, zfs) dan foydalaning, CEPH haqida yangi ma'lumotlarni bilib oling, bu sizga uni belgilangan sharoitlarda ishlatishga imkon beradi, o'z xotirangizni kengaytirilgan xotira sifatida yozishga harakat qiling. trening.

Manba: www.habr.com

a Izoh qo'shish