Pengalaman dengan CEPH

Ketika ada lebih banyak data daripada yang dapat ditampung dalam satu disk, inilah saatnya memikirkan tentang RAID. Sebagai seorang anak, saya sering mendengar dari orang tua saya: “suatu hari RAID akan menjadi masa lalu, penyimpanan objek akan memenuhi dunia, dan Anda bahkan tidak tahu apa itu CEPH,” jadi hal pertama dalam kehidupan mandiri saya adalah membuat cluster saya sendiri. Tujuan dari percobaan ini adalah untuk mengenal struktur internal ceph dan memahami ruang lingkup penerapannya. Seberapa dibenarkan penerapan ceph di usaha menengah dan kecil? Setelah beberapa tahun beroperasi dan beberapa kehilangan data yang tidak dapat diubah, muncul pemahaman tentang seluk-beluknya bahwa tidak semuanya sesederhana itu. Keunikan CEPH menimbulkan hambatan dalam penerapannya secara luas, dan karena itu, eksperimen menemui jalan buntu. Di bawah ini adalah uraian seluruh langkah yang diambil, hasil yang diperoleh dan kesimpulan yang diambil. Jika orang-orang berpengetahuan berbagi pengalaman mereka dan menjelaskan beberapa poin, saya akan berterima kasih.

Catatan: Para komentator telah mengidentifikasi kesalahan serius dalam beberapa asumsi yang memerlukan revisi seluruh artikel.

Strategi CEPH

Cluster CEPH menggabungkan sejumlah K disk dengan ukuran sewenang-wenang dan menyimpan data di dalamnya, menduplikasi setiap bagian (4 MB secara default) sebanyak N kali.

Mari kita pertimbangkan kasus paling sederhana dengan dua disk identik. Dari mereka Anda dapat 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: sebagian data akan ada di disk 1 dan 2, sebagian lagi ada di disk 1 dan 3, dan sebagian lagi akan berada di disk 2 dan 3. pada 5 dan 5, sedangkan RAID tidak akan melakukannya (Anda dapat merakit RAID seperti itu, tetapi itu akan menjadi penyimpangan). Jika ada lebih banyak disk, maka dimungkinkan untuk membuat RAID 3; CEPH memiliki analog - erasure_code, yang bertentangan dengan konsep awal pengembang, dan oleh karena itu tidak dipertimbangkan. RAID XNUMX mengasumsikan terdapat sejumlah kecil drive, semuanya dalam kondisi baik. Jika salah satu gagal, yang lain harus bertahan hingga disk diganti dan data dikembalikan ke dalamnya. CEPH, dengan N>=XNUMX, mendorong penggunaan disk lama, khususnya, jika Anda menyimpan beberapa disk yang bagus untuk menyimpan satu salinan data, dan menyimpan dua atau tiga salinan sisanya pada sejumlah besar disk lama, maka informasinya akan aman, karena untuk saat ini disk baru masih hidup - tidak ada masalah, dan jika salah satunya rusak, maka kegagalan simultan dari tiga disk dengan masa pakai lebih dari lima tahun, lebih disukai dari server yang berbeda, sangat kecil kemungkinannya. peristiwa.

Ada kehalusan dalam pendistribusian salinannya. Secara default, diasumsikan bahwa data dibagi menjadi lebih banyak (~100 per disk) grup distribusi PG, yang masing-masing diduplikasi pada beberapa disk. Katakanlah K=6, N=2, maka jika ada dua disk yang gagal, data dijamin akan hilang, karena menurut teori probabilitas, setidaknya akan ada satu PG yang ditempatkan di kedua disk tersebut. Dan hilangnya satu grup membuat semua data di pool tidak tersedia. Jika disk dibagi menjadi tiga pasang dan data diperbolehkan untuk disimpan hanya pada disk dalam satu pasangan, maka distribusi seperti itu juga tahan terhadap kegagalan satu disk, tetapi jika dua disk gagal, kemungkinan kehilangan data tidak ada. 100%, tetapi hanya 3/15, dan bahkan jika terjadi kegagalan tiga disk - hanya 12/20. Oleh karena itu, entropi dalam distribusi data tidak berkontribusi terhadap toleransi kesalahan. Perhatikan juga bahwa untuk server file, RAM bebas secara signifikan meningkatkan kecepatan respons. Semakin banyak memori di setiap node, dan semakin banyak memori di semua node, maka akan semakin cepat. Hal ini tidak diragukan lagi merupakan keunggulan cluster dibandingkan satu server dan, terlebih lagi, NAS perangkat keras, yang memiliki sejumlah kecil memori internal.

Oleh karena itu, CEPH adalah cara yang baik untuk menciptakan sistem penyimpanan data puluhan TB yang andal dengan kemampuan untuk menskalakan dengan investasi minimal dari peralatan yang sudah ketinggalan zaman (di sini, tentu saja, biaya akan diperlukan, tetapi kecil dibandingkan dengan sistem penyimpanan komersial).

Implementasi klaster

Untuk percobaan, mari kita ambil komputer yang dinonaktifkan Intel DQ57TM + Intel core i3 540 + RAM 16 GB. Kami akan mengatur empat disk 2 TB menjadi sesuatu seperti RAID10, setelah pengujian berhasil kami akan menambahkan node kedua dan jumlah disk yang sama.

Menginstal Linux. Distribusi memerlukan kemampuan untuk menyesuaikan dan stabil. Debian dan Suse memenuhi persyaratan. Suse memiliki penginstal yang lebih fleksibel yang memungkinkan Anda menonaktifkan paket apa pun; Sayangnya, saya tidak tahu mana yang bisa dibuang tanpa merusak sistem. Instal Debian menggunakan debootstrap buster. Opsi min-base menginstal sistem rusak yang tidak memiliki driver. Perbedaan ukurannya dibandingkan versi full tidak begitu besar sehingga menyusahkan. Karena pekerjaan dilakukan pada mesin fisik, saya ingin mengambil snapshot seperti pada mesin virtual. Opsi ini disediakan oleh LVM atau btrfs (atau xfs, atau zfs - perbedaannya tidak besar). Snapshot LVM bukanlah kelebihannya. Instal btrfs. Dan bootloadernya ada di MBR. Tidak ada gunanya mengacaukan disk 50 MB dengan partisi FAT ketika Anda dapat memasukkannya ke dalam area tabel partisi 1 MB dan mengalokasikan seluruh ruang untuk sistem. Memakan 700 MB pada disk. Saya tidak ingat berapa ukuran dasar instalasi SUSE, saya kira sekitar 1.1 atau 1.4 GB.

Instal CEPH. Kami mengabaikan versi 12 di repositori debian dan terhubung langsung dari situs 15.2.3. Kami mengikuti instruksi dari bagian “Instal CEPH secara manual” dengan peringatan berikut:

  • Sebelum menghubungkan repositori, Anda harus menginstal sertifikat ca gnupg wget
  • Setelah menghubungkan repositori, tetapi sebelum menginstal cluster, menginstal paket dihilangkan: apt -y --no-install-recommends install ceph-common ceph-mon ceph-osd ceph-mds ceph-mgr
  • Saat memasang CEPH, untuk alasan yang tidak diketahui, ia akan mencoba menginstal lvm2. Prinsipnya tidak sayang, tapi instalasinya gagal, jadi CEPH juga tidak bisa diinstal.

    Tambalan ini membantu:

    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
    

Ikhtisar klaster

ceph-osd - bertanggung jawab untuk menyimpan data pada disk. Untuk setiap disk, layanan jaringan diluncurkan yang menerima dan mengeksekusi permintaan untuk membaca atau menulis ke objek. Dua partisi dibuat pada disk. Salah satunya berisi informasi tentang cluster, nomor disk, dan kunci cluster. Informasi 1KB ini dibuat satu kali saat menambahkan disk dan tidak pernah terlihat ada perubahan. Partisi kedua tidak memiliki sistem file dan menyimpan data biner CEPH. Instalasi otomatis di versi sebelumnya membuat partisi xfs 100MB untuk informasi layanan. Saya mengonversi disk ke MBR dan hanya mengalokasikan 16MB - layanan tidak mengeluh. Saya pikir xfs bisa diganti dengan ext tanpa masalah. Partisi ini dipasang di /var/lib/…, tempat layanan membaca informasi tentang OSD dan juga menemukan referensi ke perangkat blok tempat data biner disimpan. Secara teoritis, Anda dapat segera menempatkan file tambahan di /var/lib/…, dan mengalokasikan seluruh disk untuk data. Saat membuat OSD melalui ceph-deploy, aturan secara otomatis dibuat untuk memasang partisi di /var/lib/…, dan pengguna ceph juga diberikan hak untuk membaca perangkat blok yang diinginkan. Jika Anda menginstal secara manual, Anda harus melakukannya sendiri; dokumentasi tidak menyatakan hal ini. Disarankan juga untuk menentukan parameter target memori osd agar terdapat cukup memori fisik.

ceph-mds. Pada tingkat rendah, CEPH adalah penyimpanan objek. Kemampuan untuk memblokir penyimpanan dikurangi menjadi menyimpan setiap blok 4MB sebagai objek. Penyimpanan file bekerja dengan prinsip yang sama. Dua kumpulan dibuat: satu untuk metadata, yang lainnya untuk data. Mereka digabungkan ke dalam sistem file. Pada saat ini, beberapa jenis catatan dibuat, jadi jika Anda menghapus sistem file, tetapi tetap mempertahankan kedua kumpulan, Anda tidak akan dapat memulihkannya. Ada prosedur untuk mengekstrak file berdasarkan blok, saya belum mengujinya. Layanan ceph-mds bertanggung jawab atas akses ke sistem file. Setiap sistem file memerlukan contoh layanan yang terpisah. Ada opsi "indeks", yang memungkinkan Anda membuat kemiripan beberapa sistem file dalam satu - juga belum diuji.

Ceph-mon - Layanan ini menyimpan peta cluster. Ini mencakup informasi tentang semua OSD, algoritma untuk mendistribusikan PG di OSD dan, yang paling penting, informasi tentang semua objek (detail mekanisme ini tidak jelas bagi saya: ada direktori /var/lib/ceph/mon/…/ store.db, ini berisi file besar 26MB, dan dalam cluster 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 mengakibatkan hilangnya seluruh data dalam cluster. Oleh karena itu disimpulkan bahwa CRUSH menunjukkan bagaimana PG ditempatkan di OSD, dan bagaimana objek ditempatkan di PG - mereka disimpan secara terpusat di dalam database, tidak peduli seberapa banyak pengembang menghindari kata ini. Akibatnya, pertama, kita tidak dapat menginstal sistem pada flash drive dalam mode RO, karena database terus-menerus direkam, diperlukan disk tambahan untuk ini (hampir tidak lebih dari 1 GB), dan kedua, kita perlu memiliki a salin secara real time basis ini. Jika ada beberapa monitor, maka toleransi kesalahan dipastikan secara otomatis, tetapi dalam kasus kami hanya ada satu monitor, maksimal dua. Ada prosedur teoretis untuk memulihkan monitor berdasarkan data OSD, saya melakukannya tiga kali karena berbagai alasan, dan tiga kali tidak ada pesan kesalahan, serta tidak ada data. Sayangnya mekanisme ini tidak berjalan. Entah kita mengoperasikan partisi mini pada OSD dan merakit RAID untuk menyimpan database, yang tentunya akan berdampak sangat buruk pada kinerja, atau kita mengalokasikan setidaknya dua media fisik yang dapat diandalkan, sebaiknya USB, agar tidak menempati port.

rados-gw - mengekspor penyimpanan objek melalui protokol S3 dan sejenisnya. Membuat banyak kumpulan, tidak jelas alasannya. Saya tidak banyak bereksperimen.

ceph-mgr - Saat menginstal layanan ini, beberapa modul diluncurkan. Salah satunya adalah autoscale yang tidak bisa dinonaktifkan. Ia berusaha untuk mempertahankan jumlah PG/OSD yang benar. Jika Anda ingin mengontrol rasio secara manual, Anda dapat menonaktifkan penskalaan untuk setiap kumpulan, tetapi dalam kasus ini modul mengalami crash dengan pembagian sebesar 0, dan status cluster menjadi ERROR. Modul ini ditulis dengan Python, dan jika Anda mengomentari baris yang diperlukan di dalamnya, ini akan menyebabkan penonaktifannya. Terlalu malas untuk mengingat detailnya.

Daftar sumber yang digunakan:

Pemasangan CEPH
Pemulihan dari kegagalan monitor total

Daftar skrip:

Menginstal sistem melalui 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

Buat sebuah cluster

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

Menambahkan OSD (bagian)

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

Ringkasan

Keuntungan pemasaran utama CEPH adalah CRUSH - sebuah algoritma untuk menghitung lokasi data. Monitor mendistribusikan algoritma ini ke klien, setelah itu klien langsung meminta node yang diinginkan dan OSD yang diinginkan. CRUSH memastikan tidak ada sentralisasi. Ini adalah file kecil yang bahkan dapat Anda cetak dan gantung di dinding. Praktek telah menunjukkan bahwa CRUSH bukanlah peta yang lengkap. Jika Anda menghancurkan dan membuat ulang monitor, mempertahankan semua OSD dan CRUSH, ini tidak cukup untuk memulihkan cluster. Dari sini disimpulkan bahwa setiap monitor menyimpan beberapa metadata tentang keseluruhan cluster. Sejumlah kecil metadata ini tidak membatasi ukuran cluster, namun memerlukan keamanannya, yang menghilangkan penghematan disk dengan menginstal sistem pada flash drive dan mengecualikan cluster dengan kurang dari tiga node. Kebijakan agresif pengembang mengenai fitur opsional. Jauh dari minimalis. Dokumentasinya berada pada level “terima kasih atas apa yang kami miliki, tetapi jumlahnya sangat-sangat sedikit.” Kemampuan untuk berinteraksi dengan layanan pada tingkat rendah disediakan, namun dokumentasinya menyentuh topik ini terlalu dangkal, sehingga kemungkinan besar jawabannya adalah tidak daripada ya. Praktis tidak ada peluang untuk memulihkan data dari situasi darurat.

Opsi untuk tindakan lebih lanjut: tinggalkan CEPH dan gunakan btrfs multi-disk dangkal (atau xfs, zfs), cari tahu informasi baru tentang CEPH, yang memungkinkan Anda mengoperasikannya dalam kondisi yang ditentukan, coba tulis penyimpanan Anda sendiri sebagai penyimpanan tingkat lanjut pelatihan.

Sumber: www.habr.com

Tambah komentar