Pengalaman operasi CEPH

Ketika ada lebih banyak data daripada yang cocok pada satu disk, saatnya untuk berpikir tentang RAID. Sebagai seorang anak, saya sering mendengar dari orang tua saya: "Suatu hari RAID akan menjadi sesuatu dari masa lalu, penyimpanan objek akan mengisi dunia, dan Anda bahkan tidak tahu apa itu CEPH," jadi langkah pertama dalam kehidupan mandiri adalah membuat cluster Anda sendiri. Tujuan dari percobaan ini adalah untuk berkenalan dengan struktur internal ceph dan memahami ruang lingkup penerapannya. Bagaimana dibenarkan pengenalan ceph dalam bisnis menengah, tetapi dalam bisnis kecil? Setelah beberapa tahun beroperasi dan beberapa kehilangan data yang ireversibel, pemahaman tentang seluk-beluk timbul bahwa tidak semuanya begitu sederhana. Fitur-fitur CEPH menciptakan hambatan untuk distribusi yang luas, dan karena itu, percobaan terhenti. Di bawah ini adalah deskripsi dari semua langkah yang diambil, hasil yang diperoleh dan kesimpulan yang diambil.Jika orang yang berpengetahuan luas berbagi pengalaman mereka dan mengklarifikasi beberapa hal, saya akan berterima kasih.



Catatan: Komentator telah menunjukkan kesalahan serius dalam beberapa asumsi yang memerlukan revisi seluruh artikel.



Strategi CEPH



Cluster CEPH menggabungkan jumlah acak K disk dengan ukuran acak dan menyimpan data pada mereka, menduplikasi masing-masing bagian (4 MB secara default) sejumlah tertentu N kali.



Pertimbangkan case paling sederhana dengan dua disk yang identik. Dari mereka, Anda bisa merakit RAID 1, atau cluster dengan N = 2 - hasilnya akan sama. Jika ada tiga disk dan ukurannya berbeda, maka mudah untuk merakit sebuah cluster dengan N = 2: beberapa data akan ada di disk 1 dan 2, beberapa di disk 1 dan 3, dan beberapa di disk 1 dan 3, dan beberapa di disk 2 dan 3, sedangkan RAID tidak akan (Anda dapat mengumpulkan RAID seperti itu, tetapi itu akan menjadi penyimpangan). Jika ada lebih banyak disk, maka dimungkinkan untuk membuat RAID 5, CEPH memiliki analog - erasure_code, yang bertentangan dengan konsep awal pengembang, dan karenanya tidak dipertimbangkan. RAID 5 mengasumsikan bahwa Anda memiliki sejumlah kecil disk dan semuanya dalam kondisi baik. Jika salah satu gagal, sisanya harus bertahan sampai disk diganti dan data dikembalikan ke sana. CEPH, untuk N> = 3, mendorong penggunaan disk lama, khususnya,jika Anda menyimpan beberapa disk bagus untuk menyimpan satu salinan data, dan menyimpan sisa dua atau tiga salinan pada sejumlah besar disk lama, maka informasinya akan aman, karena selama disk baru masih hidup, tidak ada masalah, dan jika salah satunya rusak, maka kegagalan serentak tiga disk dengan masa pakai lebih dari lima tahun, lebih disukai dari server yang berbeda - peristiwa yang sangat tidak mungkin.



Ada kehalusan dalam mendistribusikan salinan. Secara default, diasumsikan bahwa data dibagi menjadi jumlah yang lebih besar (~ 100 per disk) dari grup distribusi PG, yang masing-masing diduplikasi pada beberapa disk. Misalkan K = 6, N = 2, maka jika ada dua disk gagal, data dijamin akan hilang, karena, menurut teori probabilitas, akan ada setidaknya satu PG yang akan terletak di dua disk ini. Dan hilangnya satu grup membuat semua data di pool tidak dapat diakses. Jika disk dibagi menjadi tiga pasangan dan hanya memungkinkan data disimpan pada disk dalam satu pasangan, maka distribusi tersebut juga tahan terhadap kegagalan satu disk, tetapi jika dua gagal, kemungkinan kehilangan data tidak 100%, tetapi hanya 3/15, dan bahkan dalam kasus kegagalan tiga disk - hanya 12/20. Oleh karena itu, entropi dalam distribusi data tidak berkontribusi terhadap toleransi kesalahan. Juga mencatatbahwa untuk server file, RAM bebas secara signifikan meningkatkan kecepatan respons. Semakin banyak memori di setiap node, dan semakin banyak memori di semua node, semakin cepat. Ini tidak diragukan lagi keuntungan dari cluster lebih dari satu server dan, apalagi, perangkat keras NAS, di mana sejumlah kecil memori dibangun.



Oleh karena itu CEPH adalah cara yang baik dengan investasi minimal dari peralatan usang untuk membuat sistem penyimpanan yang andal untuk puluhan TB dengan skalabilitas (tentu saja, ini akan membutuhkan biaya, tetapi kecil dibandingkan dengan sistem penyimpanan komersial).



Implementasi cluster



Untuk percobaan, ambil komputer Intel DQ57TM + Intel core i3 540 + 16 GB yang dinonaktifkan. Kami mengatur empat disk 2 TB dalam bentuk RAID10, setelah tes yang berhasil kami menambahkan node kedua dan jumlah disk yang sama.



Instal Linux. Distribusi membutuhkan penyesuaian dan stabilitas. Persyaratannya adalah Debian dan Suse. Suse memiliki penginstal yang lebih fleksibel yang memungkinkan Anda untuk menonaktifkan paket apa pun; Sayangnya, saya tidak dapat menemukan yang dapat dibuang tanpa merusak sistem. Kami menginstal Debian melalui buster debootstrap. Opsi min-base menginstal sistem tidak berfungsi yang tidak memiliki driver. Perbedaan ukuran dibandingkan dengan versi lengkap tidak begitu besar untuk mengganggu. Karena pekerjaan dilakukan pada mesin fisik, saya ingin melakukan snapshot, seperti pada mesin virtual. Baik LVM atau btrfs (atau xfs atau zfs - perbedaannya tidak besar) memberikan kesempatan seperti itu. Snapshots bukan poin kuat untuk LVM. Kami menempatkan btrfs. Dan bootloader ada di MBR. Tidak masuk akal untuk menyumbat disk 50 MB dengan partisi FAT,ketika Anda bisa mendorongnya ke area 1 MB dari tabel partisi dan mengalokasikan semua ruang untuk sistem. Digunakan pada disk 700 MB. Berapa banyak instalasi dasar SUSE - Saya tidak ingat, tampaknya, sekitar 1,1 atau 1,4 GB.



Instal CEPH. Abaikan versi 12 di repositori debian dan sambungkan langsung dari situs 15.2.3. Kami mengikuti instruksi dari bagian "Instal CEPH secara manual" dengan peringatan berikut:



  • Sebelum menghubungkan repositori, Anda harus menginstal gnupg wget ca-sertifikat
  • Setelah menghubungkan repositori, tetapi sebelum menginstal cluster, instalasi paket dihilangkan: apt -y --tidak-install-merekomendasikan instal ceph-mon ceph-mon ceph-osd ceph-mds ceph-mgr
  • Pada saat instalasi, ceph-osd untuk alasan (sudah dapat dimengerti) akan mencoba menginstal lvm2. Tidak ada kebutuhan mendesak untuk ini. Jika Anda memiliki masalah dalam menginstal paket, Anda dapat menolaknya dengan menghapus dependensi di / var / lib / dpkg / status untuk ceph-osd.



    Patch yang kurang manusiawi digunakan saat menulis artikel:
    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
    




Ikhtisar kelompok



ceph-osd - bertanggung jawab untuk menyimpan data pada disk. Layanan jaringan dimulai untuk setiap disk, yang menerima dan mengeksekusi permintaan untuk membaca atau menulis ke objek. Artikel ini membahas penyimpanan bluestore sebagai level terendah. File layanan dibuat di direktori layanan yang menggambarkan ID cluster, penyimpanan, jenisnya, dll., Serta file blok yang diperlukan - file-file ini tidak diubah. Jika file tersebut bersifat fisik, maka osd akan membuat sistem file di dalamnya dan akan mengumpulkan data. Jika file tersebut adalah sebuah tautan, maka data akan berada di perangkat yang ditunjuk oleh tautan itu. Selain perangkat utama, block.db - metadata (RocksDB) dan block.wal - log (RocksDB write-ahead log) juga dapat ditentukan. Jika perangkat tambahan tidak ditentukan, maka metadata dan log akan disimpan di perangkat utama.Sangat penting untuk memantau ketersediaan ruang kosong untuk RocksDB, jika tidak OSD tidak akan mulai!

Dalam pembuatan osd standar dalam versi lama, disk dibagi menjadi dua bagian: yang pertama adalah 100 MB xfs, dipasang di / var / lib / ... dan berisi informasi layanan, yang kedua diberikan ke penyimpanan utama. Versi baru menggunakan lvm.

Secara teoritis, Anda tidak dapat me-mount partisi miniatur, tetapi menempatkan file di / var / lib / ..., menduplikasi mereka di semua node, dan mengalokasikan seluruh disk untuk data tanpa membuat header GPT atau LVM. Ketika menambahkan OSD secara manual, Anda perlu memastikan bahwa pengguna ceph memiliki akses tulis ke perangkat blok data, dan direktori data layanan secara otomatis dipasang di / var / lib ... jika Anda memutuskan untuk meletakkannya di sana. Dianjurkan juga untuk menentukan parameter target memori osd sehingga ada cukup memori fisik.



ceph-mds. Pada level rendah, CEPH adalah penyimpanan objek. Kemungkinan penyimpanan blok dikurangi untuk menyimpan setiap blok 4MB sebagai objek. Penyimpanan file bekerja dengan cara yang sama. Dua kumpulan dibuat: satu untuk metadata dan satu untuk data. Mereka digabungkan menjadi sistem file. Pada saat ini, beberapa jenis catatan dibuat, jadi jika Anda menghapus sistem file, tetapi menyimpan kedua kumpulan, maka Anda tidak akan dapat memulihkannya. Ada prosedur untuk mengekstraksi file dalam blok, saya belum mengujinya. Layanan ceph-mds bertanggung jawab untuk mengakses sistem file. Setiap sistem file memerlukan instance layanan yang terpisah. Ada opsi "peringkat", yang memungkinkan Anda membuat kemiripan beberapa sistem file dalam satu - juga tidak diuji.



ceph-mon - Layanan ini menyimpan peta cluster. Ini termasuk informasi tentang semua OSD, algoritma distribusi PG di OSD dan, yang paling penting, informasi tentang semua objek (rincian mekanisme ini tidak jelas bagi saya: ada direktori /var/lib/ceph/mon/.../store.db, di dalamnya ada file besar - 26MB, dan dalam sekelompok 105K objek, ternyata sedikit lebih dari 256 byte per objek - Saya pikir monitor menyimpan daftar semua objek dan PG di mana mereka berada). Kerusakan pada direktori ini menyebabkan hilangnya semua data di cluster. Oleh karena itu, disimpulkan bahwa CRUSH menunjukkan bagaimana PG terletak pada OSD, dan bagaimana objek ditempatkan pada PG - dalam database (kesimpulannya ternyata tidak benar, apa yang sebenarnya terkandung di dalamnya, memerlukan klarifikasi). Sebagai konsekuensinya, pertama-tama, kita tidak dapat menginstal sistem pada USB flash drive dalam mode RO, karena database terus ditulis,Anda memerlukan disk tambahan untuk data ini (tidak lebih dari 1 GB), dan kedua, Anda harus memiliki salinan database ini secara real time. Jika ada beberapa monitor, maka toleransi kesalahan disediakan atas biaya mereka, tetapi jika hanya ada satu monitor, maksimum dua, maka perlu untuk memastikan perlindungan data. Ada prosedur teoretis untuk memulihkan monitor berdasarkan data OSD, saat ini telah dipulihkan di tingkat objek, sistem file belum dipulihkan saat ini. Sejauh ini, seseorang tidak dapat mengandalkan mekanisme ini.saat ini, ternyata dikembalikan pada tingkat objek, sistem file saat ini tidak dapat dipulihkan. Sejauh ini, Anda tidak dapat mengandalkan mekanisme ini.saat ini telah dipulihkan pada tingkat objek, sistem file belum dipulihkan pada saat ini. Sejauh ini, Anda tidak dapat mengandalkan mekanisme ini.



rados-gw - Mengekspor penyimpanan objek lebih dari S3 dan sejenisnya. Menciptakan banyak kolam renang, tidak jelas mengapa. Tidak banyak bereksperimen.



ceph-mgr - Saat memasang layanan ini, beberapa modul dimulai. Salah satunya adalah autoscale yang tidak dapat dilepaskan. Dia berusaha untuk mempertahankan jumlah PG / OSD yang tepat. Jika Anda ingin mengontrol rasio secara manual, Anda dapat menonaktifkan penskalaan untuk setiap kelompok, tetapi dalam kasus ini, modul jatuh dengan pembagian dengan 0, dan status cluster menjadi KESALAHAN. Modul ini ditulis dengan python, dan jika Anda mengomentari baris yang diperlukan di dalamnya, ini mengarah pada pemutusannya. Detail terlalu malas untuk diingat.



Referensi:



Menginstal CEPH

Memulihkan dari kegagalan monitor lengkap

Artikel tentang BlueStore di Ceph

Deskripsi arsitektur ceph. Sage A. Weil



Daftar skrip:



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 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




OSD ()
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






Keuntungan pemasaran utama CEPH adalah CRUSH, sebuah algoritma untuk menghitung lokasi data. Monitor mendistribusikan algoritma ini ke klien, setelah itu klien secara langsung meminta host yang diinginkan dan OSD yang diinginkan. CRUSH memberikan kurangnya sentralisasi. Ini adalah file kecil yang setidaknya bisa Anda cetak dan gantung di dinding. Praktek telah menunjukkan bahwa CRUSH bukan kartu yang lengkap. Jika Anda menghancurkan dan membuat ulang monitor, mempertahankan semua OSD dan CRUSH, maka ini tidak cukup untuk mengembalikan cluster. Dari sini disimpulkan bahwa setiap monitor menyimpan beberapa metadata tentang seluruh cluster. Jumlah yang tidak signifikan dari metadata ini tidak memaksakan batasan pada ukuran cluster, tetapi mengharuskan untuk memastikan keselamatan mereka, yang menghilangkan penghematan disk dengan menginstal sistem pada USB flash drive dan mengecualikan cluster dengan kurang dari tiga node.Kebijakan pengembang yang agresif mengenai fitur opsional. Jauh ke minimalis. Dokumentasi di tingkat: "untuk apa itu - terima kasih sudah, tetapi sangat, sangat langka." Kemungkinan berinteraksi dengan layanan pada tingkat rendah disediakan, tetapi dokumentasi itu terlalu dangkal terkait dengan topik ini, karena itu, bukan tidak daripada ya. Praktis tidak ada peluang untuk memulihkan data dalam situasi darurat (berkat penjelasan masyarakat, peluang masih ada).Hampir tidak ada peluang pemulihan data dalam situasi darurat (berkat penjelasan komunitas, masih ada peluang).Hampir tidak ada peluang pemulihan data dalam situasi darurat (berkat penjelasan masyarakat, masih ada peluang).



Opsi untuk tindakan lebih lanjut: tinggalkan CEPH dan gunakan btrf multi-disk dangkal (atau xfs, zfs), cari tahu informasi baru tentang CEPH, yang akan memungkinkan Anda untuk menggunakannya dalam kondisi ini, cobalah menulis repositori Anda sendiri sebagai pelatihan lebih lanjut.



All Articles