Nalika ana data luwih saka pas siji disk, iku wektu kanggo mikir bab RAID. Minangka bocah, aku kerep krungu saka wong tuwa: "Sawijining dina RAID bakal dadi barang sing kepungkur, panyimpenan obyek bakal ngisi jagad iki, lan sampeyan ora ngerti apa CEPH," mulane sing pertama aku lakoni sajrone urip mandiri yaiku nggawe klompok dhewe. Tujuan saka eksperimen yaiku kanggo ngerteni struktur internal ceph lan ngerti ruang lingkup aplikasi kasebut. Kepiye kabeneran implementasine ceph ing bisnis ukuran menengah, lan ing bisnis cilik? Sawise pirang-pirang taun operasi lan sawetara kerugian data sing ora bisa dibatalake, pangerten babagan subtleties muncul sing ora kabeh gampang banget. Fitur CEPH nggawe alangan kanggo panggunaan sing nyebar, lan amarga eksperimen kasebut tekan buntu. Ing ngisor iki ana katrangan babagan kabeh langkah sing ditindakake, asil sing dipikolehi lan kesimpulan sing digawe. Yen wong pinter nuduhake pengalaman lan njlentrehake sawetara poin, aku bakal matur nuwun.
Cathetan: Komentator wis nuduhake kesalahan serius ing sawetara asumsi sing mbutuhake revisi kabeh artikel.
Strategi CEPH
Kluster CEPH nggabungke jumlah disk sembarang K saka ukuran sembarang lan nyimpen data ing, duplikat saben Piece (4 MB minangka standar) nomer tartamtu N kaping.
Ayo nimbang kasus paling gampang karo rong disk sing padha. Bisa digunakake kanggo nggawe RAID 1 utawa kluster kanthi N = 2 - asil bakal padha. Yen ana telung disk saka macem-macem ukuran, iku gampang kanggo nggawe kluster karo N = 2: sawetara data bakal ing disk 1 lan 2, sawetara ing 1 lan 3, lan sawetara ing 2 lan 3, dene RAID ora bisa (iku bisa kanggo nggawe RAID kuwi, nanging bakal perversion). Yen ana malah luwih disk, iku bisa kanggo nggawe RAID 5; CEPH duwe analog — erasure_code, sing mbantah konsep awal para pangembang lan mulane ora dianggep. RAID 5 nganggep yen ana sawetara disk, lan kabeh ana ing kondisi apik. Yen salah siji gagal, liyane kudu terus metu nganti disk diganti lan data dibalèkaké menyang. CEPH, Nanging, karo N> = 3, nyengkuyung nggunakake disk lawas, utamané, yen sampeyan nyimpen sawetara disk apik kanggo nyimpen siji salinan data, lan nyimpen loro utawa telu salinan isih ing nomer akeh disk lawas, informasi bakal aman, amarga nalika disk anyar isih urip, ora ana masalah, lan yen salah siji saka wong-wong mau rusak, banjur gagal ing wektu sing padha karo limang taun, luwih saka limang taun saka layanan saka server luwih saka telung taun. acara banget ora mungkin.
Ana subtlety ing distribusi salinan. Kanthi gawan, iku dianggep sing data dipérang dadi nomer luwih gedhe (~ 100 saben disk) kelompok distribusi PG, saben kang duplikat ing sawetara disk. Ayo ngomong K = 6, N = 2, banjur yen rong disk gagal, data kasebut dijamin bakal ilang, amarga miturut teori probabilitas, paling ora ana siji PG sing bakal ana ing rong disk kasebut. Lan mundhut siji klompok ndadekake kabeh data ing blumbang ora bisa diakses. Yen disk dipérang dadi telung pasangan lan data diijini disimpen mung ing disk ing siji pasangan, banjur distribusi kuwi uga tahan kanggo Gagal siji disk, nanging yen loro gagal, kemungkinan mundhut data ora 100%, nanging mung 3/15, lan malah yen telung disk gagal, mung 12/20. Mula, entropi ing distribusi data ora nyumbang kanggo toleransi kesalahan. Elinga uga kanggo server file, RAM gratis nambah kacepetan respon. Sing luwih akeh memori ing saben simpul, lan luwih akeh memori ing kabeh simpul, bakal luwih cepet. Iki temtu kauntungan saka kluster liwat server siji lan, utamané, hardware NAS, ngendi jumlah cilik saka memori dibangun ing.
Nderek CEPH minangka cara sing apik kanggo nggawe sistem panyimpenan data sing dipercaya kanggo puluhan TB kanthi kemampuan kanggo skala saka peralatan sing ora ana gunane kanthi investasi minimal (iki mesthi mbutuhake biaya, nanging cilik dibandhingake karo sistem panyimpenan komersial).
Implementasi klaster
Kanggo eksprimen, kita bakal njupuk komputer decommissioned Intel DQ57TM + Intel core i3 540 + 16 GB RAM. Kita bakal ngatur papat disk 2 TB ing jinis RAID10, sawise tes sukses kita bakal nambah simpul kapindho lan jumlah disk sing padha.
Instal LinuxDistribusi kudu bisa disesuaikan lan stabil. Syarat-syarat iki dipenuhi dening Debian lan Suse. Suse duwé installer sing luwih fleksibel, saéngga sampeyan bisa mateni paket apa waé; sayangé, aku ora ngerti endi sing bisa dibusak tanpa ngrusak sistem. Kita nginstal Debian Nggunakake debootstrap buster. Opsi min-base nginstal sistem sing ora fungsional sing ora duwe driver. Bedane ukuran dibandhingake karo versi lengkap ora pati penting nganti pantes direpotake. Amarga aku lagi nggarap mesin fisik, aku pengin njupuk snapshot, kaya ing mesin virtual. LVM utawa btrfs (utawa xfs, utawa zfs—bedane ora pati gedhe) nyedhiyakake kemampuan iki. Snapshot dudu pilihan sing kuat kanggo LVM. Kita bakal nginstal btrfs. Lan bootloader ana ing MBR. Ora ana gunane ngganggu disk 50 MB nganggo partisi FAT nalika sampeyan bisa nyelip menyang area tabel partisi 1 MB lan ngaturake kabeh ruang kanggo sistem. Butuh ruang disk 700 MB. Aku ora kelingan pira akeh sing digunakake instalasi SUSE dhasar, nanging aku mikir udakara 1.1 utawa 1.4 GB.
Instal CEPH. Lalekno versi 12 ing repositori. debian lan nyambung langsung saka situs web 15.2.3. Tindakake pandhuan ing bagean "Nginstal CEPH kanthi Manual", kanthi cathetan ing ngisor iki:
- Sadurunge nyambungake repositori, sampeyan kudu nginstal gnupg wget ca-certificate
- Sawise nyambungake repositori, nanging sadurunge nginstal kluster, instalasi paket diilangi: apt -y --no-install-recommends install ceph-common ceph-mon ceph-osd ceph-mds ceph-mgr
- Sajrone instalasi, CEPH bakal nyoba nginstal lvm2 amarga alasan sing ora dingerteni. Ing asas, iku ora tega, nanging instalasi rampung karo Gagal, supaya CEPH ora bakal diinstal.
Patch iki mbantu:
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
Ringkesan kluster
ceph-osd - tanggung jawab kanggo nyimpen data ing disk. Kanggo saben disk, layanan jaringan diluncurake sing nampa lan nglakokake panjalukan kanggo maca utawa nulis menyang obyek. Rong partisi digawe ing disk. Salah sijine ngemot informasi babagan kluster, nomer disk, lan tombol kluster. Informasi iki, ukurane 1 KB, digawe sapisan nalika nambah disk lan aku ora tau ngeweruhi owah-owahan. Partisi kapindho ora duwe sistem file lan nyimpen data binar CEPH. Instalasi otomatis ing versi sadurunge nggawe partisi xfs 100 MB kanggo informasi layanan. Aku diowahi disk kanggo MBR lan diparengake mung 16 MB - layanan ora sambat. Aku xfs bisa diganti karo ext tanpa masalah. Partisi iki dipasang ing /var/lib/…, ing ngendi layanan kasebut maca informasi babagan OSD, lan uga nemokake link menyang piranti pamblokiran ing ngendi data binar disimpen. Secara teoritis, sampeyan bisa langsung nyelehake tambahan ing / var / lib / ..., lan nyedhiyakake kabeh disk kanggo data. Nalika nggawe OSD liwat ceph-deploy, aturan digawe kanthi otomatis kanggo masang partisi ing /var/lib/..., lan pangguna ceph uga diwenehi hak kanggo maca piranti pemblokiran sing dibutuhake. Nalika nginstal kanthi manual, sampeyan kudu nindakake iki dhewe, dokumentasi ora ngomong apa-apa bab iki. Sampeyan uga dianjurake kanggo nemtokake parameter target memori osd supaya ana memori fisik sing cukup.
ceph-mds. Ing tingkat sing kurang, CEPH minangka panyimpenan obyek. Kemampuan kanggo mblokir panyimpenan mudhun kanggo nyimpen saben blok 4MB minangka obyek. Panyimpenan file dianggo ing prinsip sing padha. Loro pools digawe: siji kanggo metadata, liyane kanggo data. Padha digabungake menyang sistem file. Ing titik iki, sawetara rekaman digawe, dadi yen sampeyan mbusak sistem file nanging nyimpen loro pools, sampeyan ora bakal bisa mulihake. Ana prosedur kanggo ngekstrak file kanthi pamblokiran, aku durung nyoba. Layanan ceph-mds tanggung jawab kanggo ngakses sistem file. Kayata layanan sing kapisah dibutuhake kanggo saben sistem file. Ana opsi "indeks" sing ngidini sampeyan nggawe semblance sawetara sistem file ing siji - uga ora dites.
ceph-mon - layanan iki nyimpen peta kluster. Iki kalebu informasi babagan kabeh OSD, algoritma kanggo nyebarake PG ing OSD, lan, sing paling penting, informasi babagan kabeh obyek (rincian mekanisme iki ora jelas kanggo aku: ana direktori /var/lib/ceph/mon/.../store.db, ngemot file gedhe - 26MB, lan ana 105K obyek ing kluster tinimbang 256 obyek, sing nggawe dhaptar luwih akeh tinimbang 1 obyek. kabeh obyek lan PG sing ana). Kerusakan ing direktori iki nyebabake ilang kabeh data ing kluster. Empu kesimpulan sing CRUSH nuduhake carane PG dumunung dening OSD, lan carane obyek dumunung dening PGs - lagi disimpen ing tengah database, ora ketompo carane gawe supaya tembung iki. Akibaté, pisanan, kita ora bisa nginstal sistem ing flash drive ing mode RO, amarga database terus direkam, disk tambahan dibutuhake kanggo iki (ora luwih saka XNUMX GB), sareh, iku perlu kanggo salinan database iki ing wektu nyata. Yen ana sawetara monitor, banjur toleransi kesalahan diwenehake kanthi otomatis, nanging ing kasus kita ana siji monitor, maksimal - loro. Ana prosedur teoretis kanggo mulihake monitor adhedhasar data OSD, aku nggunakake kaping telu kanggo macem-macem alasan, lan kaping telu ora ana pesen kesalahan, uga data. Sayange, mekanisme iki ora bisa. Salah siji kita nggunakake partisi miniatur ing OSD lan ngumpulake RAID kanggo nyimpen database, kang mesthi bakal duwe efek ala banget ing kinerja, utawa kita nyedhiakke paling loro media fisik dipercaya, luwih USB, supaya ora Occupy bandar.
rados-gw - ngekspor panyimpenan obyek liwat protokol S3 lan padha. Nggawe macem-macem pools, iku ora cetha kok. Ora akeh eksperimen.
ceph-mgr - nalika layanan iki diinstal, sawetara modul diluncurake. Salah sijine yaiku autoscale, sing ora bisa dipateni. Iku nyoba kanggo njaga nomer bener PG / OSD. Yen sampeyan pengin ngatur rasio kanthi manual, sampeyan bisa mateni njongko kanggo saben blumbang, nanging ing kasus iki modul tubrukan karo divisi dening 0, lan status kluster dadi ERROR. Modul ditulis ing Python, lan yen sampeyan komentar metu baris perlu ing, iku bakal dipatèni. Aku kesed kanggo ngelingi rincian.
Dhaptar sumber sing digunakake:
Daftar skrip:
Nginstal sistem liwat 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 6Nggawe kluster
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@rbd1Nambahake OSD (bagean)
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@$osdnumRingkesan
Kauntungan marketing utama CEPH yaiku CRUSH — algoritma kanggo ngitung lokasi data. Monitor nyebarake algoritma iki kanggo klien, sawise klien langsung njaluk simpul sing dibutuhake lan OSD sing dibutuhake. CRUSH njamin ora ana sentralisasi. Iki minangka file cilik sing bisa dicithak lan digantung ing tembok. Praktek wis nuduhake yen CRUSH dudu peta sing lengkap. Yen sampeyan numpes lan nggawe maneh monitor, nyimpen kabeh OSDs lan CRUSH, iki ora cukup kanggo mulihake kluster. Mula, kesimpulan digawe yen saben monitor nyimpen sawetara metadata babagan kabeh kluster. Jumlah metadata sepele iki ora nemtokke Watesan ing ukuran kluster, nanging mbutuhake mesthekake safety, kang ora kalebu tabungan disk kanthi nginstal sistem ing flash drive lan ora kalebu klompok kurang saka telung kelenjar. Kabijakan pangembang agresif babagan fitur opsional. Adoh saka minimalism. Dokumentasi ing tingkat: "Thanks kanggo apa sing kita duwe, nanging banget, banget miskin." Ana kamungkinan kanggo sesambungan karo layanan ing tingkat kurang, nanging dokumentasi banget cethek bab topik iki, dadi tinimbang ya. Meh ora ana kasempatan kanggo mbalekake data saka kahanan darurat.
Pilihan kanggo tumindak luwih: nilar CEPH lan nggunakake btrfs multi-disk banal (utawa xfs, zfs), sinau informasi anyar babagan CEPH sing bakal ngidini kanggo digunakake ing kahanan tartamtu, nyoba kanggo nulis panyimpenan dhewe minangka latihan majeng.
Source: www.habr.com
