CEPH ile deneyim

Bir diske sığabilecek miktardan daha fazla veri olduğunda RAID'i düşünmenin zamanı gelmiştir. Çocukken büyüklerimden sık sık şunu duyardım: "Bir gün RAID geçmişte kalacak, nesne depolama dünyayı dolduracak ve siz CEPH'nin ne olduğunu bile bilmiyorsunuz." Bu yüzden bağımsız hayatımdaki ilk şey kendi kümemi oluşturmaktı. Deneyin amacı sef'in iç yapısını tanımak ve uygulamasının kapsamını anlamaktı. Orta ölçekli işletmelerde ve küçük işletmelerde sef'in uygulanması ne kadar haklıdır? Birkaç yıl süren operasyon ve birkaç geri dönüşü olmayan veri kaybından sonra, her şeyin o kadar basit olmadığı konusunda karmaşık bir anlayış ortaya çıktı. CEPH'nin özellikleri yaygın olarak benimsenmesine engel teşkil ediyor ve bu nedenle deneyler çıkmaza girdi. Aşağıda atılan tüm adımların, elde edilen sonuçların ve çıkarılan sonuçların bir açıklaması bulunmaktadır. Bilgili kişiler tecrübelerini paylaşırsa ve bazı noktaları açıklarsa minnettar olacağım.

Not: Yorum yapanlar bazı varsayımlarda, makalenin tamamının gözden geçirilmesini gerektiren ciddi hatalar tespit etmişlerdir.

CEPH Stratejisi

CEPH kümesi, keyfi boyuttaki rastgele sayıda K diski birleştirir ve verileri bunlar üzerinde depolayarak her bir parçayı (varsayılan olarak 4 MB) belirli bir sayıda N kez kopyalar.

İki özdeş diskin olduğu en basit durumu ele alalım. Bunlardan RAID 1'i veya N=2'li bir kümeyi birleştirebilirsiniz - sonuç aynı olacaktır. Üç disk varsa ve bunlar farklı boyutlardaysa, N=2 olan bir küme oluşturmak kolaydır: verilerin bir kısmı disk 1 ve 2'de, bazıları disk 1 ve 3'te ve bazıları da diskte olacaktır. 2 ve 3'te RAID olmaz (böyle bir RAID kurabilirsiniz, ancak bu bir sapkınlık olur). Daha da fazla disk varsa, RAID 5 oluşturmak mümkündür; CEPH'in, geliştiricilerin ilk kavramlarıyla çelişen ve bu nedenle dikkate alınmayan bir analog - silme_kodu vardır. RAID 5, az sayıda sürücünün bulunduğunu ve bunların hepsinin iyi durumda olduğunu varsayar. Biri başarısız olursa, diğerlerinin disk değiştirilene ve veriler ona geri yüklenene kadar dayanması gerekir. CEPH, N>=3 ile eski disklerin kullanımını teşvik eder, özellikle de verinin bir kopyasını depolamak için birkaç iyi disk tutarsanız ve geri kalan iki veya üç kopyayı çok sayıda eski diskte saklarsanız, o zaman bilgi şimdilik yeni diskler hayatta olduğu için güvenli olacak - herhangi bir sorun yok ve bunlardan biri kırılırsa, beş yıldan fazla hizmet ömrüne sahip, tercihen farklı sunuculardan gelen üç diskin aynı anda arızalanması son derece düşük bir ihtimal. etkinlik.

Kopyaların dağıtımında bir incelik var. Varsayılan olarak, verilerin daha fazla (disk başına ~100) PG dağıtım grubuna bölündüğü ve bunların her birinin bazı disklerde çoğaltıldığı varsayılır. K=6, N=2 diyelim, eğer herhangi iki disk arızalanırsa verinin kaybolması garantidir, çünkü olasılık teorisine göre bu iki diskte en az bir PG bulunacaktır. Ve bir grubun kaybı, havuzdaki tüm verilerin kullanılamaz hale gelmesine neden olur. Diskler üç çifte bölünmüşse ve verilerin yalnızca bir çift içindeki disklerde saklanmasına izin veriliyorsa, bu tür bir dağıtım aynı zamanda herhangi bir diskin arızasına karşı da dayanıklıdır, ancak iki disk arızalanırsa veri kaybı olasılığı %100, ancak yalnızca 3/15 ve arıza durumunda bile üç disk - yalnızca 12/20. Dolayısıyla veri dağıtımındaki entropi hata toleransına katkıda bulunmaz. Ayrıca bir dosya sunucusu için boş RAM'in yanıt hızını önemli ölçüde artırdığını unutmayın. Her düğümde ne kadar çok bellek ve tüm düğümlerde ne kadar çok bellek olursa, o kadar hızlı olur. Bu hiç şüphesiz bir kümenin tek bir sunucuya ve hatta çok az miktarda belleğin yerleşik olduğu bir donanım NAS'a göre avantajıdır.

Buradan CEPH'nin, güncelliğini kaybetmiş ekipmanlardan minimum yatırımla ölçeklendirme yeteneğine sahip, onlarca TB için güvenilir bir veri depolama sistemi oluşturmanın iyi bir yolu olduğu sonucu çıkıyor (burada elbette maliyetler gerekli olacak, ancak ticari depolama sistemleriyle karşılaştırıldığında küçük).

Küme uygulaması

Deney için, hizmet dışı bırakılmış bir Intel DQ57TM + Intel core i3 540 + 16 GB RAM bilgisayarını alalım. Dört adet 2 TB'lık diski RAID10 gibi bir şey halinde düzenleyeceğiz, başarılı bir testin ardından ikinci bir düğüm ve aynı sayıda disk ekleyeceğiz.

Linux'u kurmak. Dağıtım, kişiselleştirme ve istikrarlı olma yeteneğini gerektirir. Debian ve Suse gereksinimleri karşılıyor. Suse, herhangi bir paketi devre dışı bırakmanıza olanak tanıyan daha esnek bir yükleyiciye sahiptir; Ne yazık ki sisteme zarar vermeden hangilerinin atılabileceğini çözemedim. Debian'ı debootstrap engelleyiciyi kullanarak yükleyin. Min-base seçeneği, sürücüleri olmayan bozuk bir sistem kurar. Tam sürüme göre boyut farkı rahatsız edecek kadar büyük değil. İş fiziksel bir makine üzerinde yürütüldüğü için sanal makinelerde olduğu gibi anlık görüntüler almak istiyorum. Bu seçenek LVM veya btrfs (veya xfs veya zfs - fark büyük değildir) tarafından sağlanır. LVM anlık görüntüleri güçlü bir nokta değildir. Btrfs'yi yükleyin. Ve önyükleyici MBR'de. 50 MB'lık bir diski, 1 MB'lık bir bölüm tablosu alanına itip sisteme tüm alanı ayırabildiğiniz zaman, FAT bölümüyle doldurmanın hiçbir anlamı yoktur. Diskte 700 MB yer kapladı. Temel SUSE kurulumunun ne kadar olduğunu hatırlamıyorum, sanırım 1.1 veya 1.4 GB civarında.

CEPH'yi yükleyin. Debian deposundaki sürüm 12'yi göz ardı ediyoruz ve doğrudan 15.2.3 sitesinden bağlanıyoruz. “CEPH'yi manuel olarak kurun” bölümündeki talimatları aşağıdaki uyarılarla takip ediyoruz:

  • Depoyu bağlamadan önce gnupg wget ca-certificates'i yüklemelisiniz
  • Depoyu bağladıktan sonra, ancak kümeyi kurmadan önce, paketlerin kurulumu atlanır: apt -y --no-install-recommends install ceph-common ceph-mon ceph-osd ceph-mds ceph-mgr
  • CEPH kurulurken bilinmeyen nedenlerden dolayı lvm2 kurulmaya çalışılacaktır. Prensip olarak üzücü değil ama kurulum başarısız oluyor, dolayısıyla CEPH de kurulmayacak.

    Bu yama yardımcı oldu:

    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
    

Kümeye genel bakış

ceph-osd - verileri diskte depolamaktan sorumludur. Her disk için, nesnelere okuma veya yazma isteklerini kabul eden ve yürüten bir ağ hizmeti başlatılır. Diskte iki bölüm oluşturulur. Bunlardan biri küme, disk numarası ve kümenin anahtarları hakkında bilgi içerir. Bu 1KB bilgi, bir disk eklenirken bir kez oluşturulur ve hiçbir zaman değiştirildiği fark edilmemiştir. İkinci bölümün dosya sistemi yoktur ve CEPH ikili verilerini depolar. Önceki sürümlerdeki otomatik kurulum, servis bilgileri için 100 MB'lık bir xfs bölümü oluşturdu. Diski MBR'ye dönüştürdüm ve yalnızca 16 MB ayırdım - hizmet şikayet etmiyor. Xfs'nin herhangi bir sorun olmadan ext ile değiştirilebileceğini düşünüyorum. Bu bölüm, hizmetin OSD hakkındaki bilgileri okuduğu ve ayrıca ikili verilerin depolandığı blok aygıtına bir referans bulduğu /var/lib/… dizinine monte edilir. Teorik olarak, yardımcı dosyaları hemen /var/lib/... dizinine yerleştirebilir ve tüm diski veriler için ayırabilirsiniz. Ceph-deploy aracılığıyla bir OSD oluştururken, bölümü /var/lib/... dizinine bağlamak için otomatik olarak bir kural oluşturulur ve ceph kullanıcısına ayrıca istenen blok cihazını okuma hakları da atanır. Eğer manuel kurulum yapıyorsanız bunu kendiniz yapmalısınız; dokümantasyonda böyle bir şey söylenmiyor. Yeterli fiziksel belleğin olması için osd bellek hedefi parametresinin de belirtilmesi önerilir.

seph-mds. Düşük düzeyde CEPH nesne depolamadır. Depolamayı engelleme yeteneği, her 4 MB'lık bloğun bir nesne olarak depolanmasına bağlıdır. Dosya depolama aynı prensipte çalışır. İki havuz oluşturulur: biri meta veriler için, diğeri veriler için. Bir dosya sisteminde birleştirilirler. Şu anda bir tür kayıt yaratılıyor, bu nedenle dosya sistemini silerseniz ancak her iki havuzu da saklarsanız, onu geri yükleyemezsiniz. Dosyaları bloklar halinde çıkarmak için bir prosedür var, onu test etmedim. Dosya sistemine erişimden ceph-mds hizmeti sorumludur. Her dosya sistemi, hizmetin ayrı bir örneğini gerektirir. Birkaç dosya sisteminin benzerliğini tek bir dosyada oluşturmanıza olanak tanıyan bir "indeks" seçeneği vardır - ayrıca test edilmemiştir.

Ceph-mon - Bu hizmet kümenin haritasını saklar. Tüm OSD'ler hakkında bilgi, PG'leri OSD'lerde dağıtmak için bir algoritma ve en önemlisi tüm nesneler hakkında bilgi içerir (bu mekanizmanın ayrıntıları benim için net değil: /var/lib/ceph/mon/…/ dizini var) Store.db, 26MB boyutunda büyük bir dosya içeriyor ve 105K nesne kümesinde, nesne başına 256 bayttan biraz fazla olduğu ortaya çıkıyor - monitörün içindeki tüm nesnelerin ve PG'lerin bir listesini sakladığını düşünüyorum. bulunurlar). Bu dizinin hasar görmesi, kümedeki tüm verilerin kaybolmasına neden olur. Dolayısıyla, CRUSH'un PG'lerin OSD'de nasıl konumlandığını ve nesnelerin PG'lerde nasıl konumlandığını gösterdiği sonucuna varıldı; geliştiriciler bu kelimeden ne kadar kaçınırsa kaçınsın, bunlar veritabanı içinde merkezi olarak depolanır. Sonuç olarak öncelikle sistemi RO modunda bir flash belleğe kuramıyoruz, çünkü veritabanı sürekli kayıt altında, bunlar için ek bir diske ihtiyaç var (neredeyse 1 GB'den fazla), ikinci olarak bir flash sürücüye sahip olmak gerekiyor. bu üssü gerçek zamanlı olarak kopyalayın. Birden fazla monitör varsa, hata toleransı otomatik olarak sağlanır, ancak bizim durumumuzda yalnızca bir monitör vardır, maksimum iki. OSD verilerine dayanarak bir monitörü geri yüklemek için teorik bir prosedür var, buna çeşitli nedenlerle üç kez başvurdum ve üç kez hiçbir hata mesajı ve veri yoktu. Ne yazık ki bu mekanizma çalışmıyor. Ya OSD üzerinde minyatür bir bölüm çalıştırıyoruz ve veritabanını depolamak için bir RAID oluşturuyoruz ki bu kesinlikle performans üzerinde çok kötü bir etkiye sahip olacaktır ya da bağlantı noktalarını işgal etmemek için en az iki güvenilir fiziksel ortam, tercihen USB tahsis ediyoruz.

rados-gw - nesne depolamayı S3 protokolü ve benzeri aracılığıyla dışa aktarır. Birçok havuz oluşturuyor, nedeni belli değil. Çok fazla deneme yapmadım.

ceph-mgr - Bu hizmeti yüklerken birkaç modül başlatılır. Bunlardan biri devre dışı bırakılamayan otomatik ölçeklendirmedir. Doğru miktarda PG/OSD'yi korumaya çalışır. Oranı manuel olarak kontrol etmek istiyorsanız her havuz için ölçeklendirmeyi devre dışı bırakabilirsiniz ancak bu durumda modül 0'a bölünerek çöker ve küme durumu HATA olur. Modül Python'da yazılmıştır ve içindeki gerekli satırı yorumladığınızda bu, modülün devre dışı bırakılmasına yol açar. Ayrıntıları hatırlayamayacak kadar tembelim.

Kullanılan kaynakların listesi:

CEPH'in kurulumu
Tam bir monitör arızasından kurtarma

Komut dosyası listeleri:

Sistemin debootstrap aracılığıyla kurulması

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

Bir küme oluşturun

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 (parça) ekleme

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

Özet

CEPH'in ana pazarlama avantajı, verilerin konumunu hesaplamaya yönelik bir algoritma olan CRUSH'tur. Monitörler bu algoritmayı istemcilere dağıtır ve ardından istemciler doğrudan istenen düğümü ve istenen OSD'yi talep eder. CRUSH hiçbir merkezileşmeyi garanti etmez. Hatta çıktısını alıp duvara asabileceğiniz küçük bir dosyadır. Uygulama, CRUSH'un kapsamlı bir harita olmadığını göstermiştir. Tüm OSD ve CRUSH'u koruyarak monitörleri yok edip yeniden oluşturursanız, bu, kümeyi geri yüklemek için yeterli değildir. Buradan her monitörün kümenin tamamı hakkında bazı meta verileri depoladığı sonucuna varılır. Bu meta verilerin küçük miktarı, kümenin boyutuna kısıtlama getirmez, ancak güvenliğinin sağlanmasını gerektirir; bu, sistemi bir flash sürücüye kurarak disk tasarrufunu ortadan kaldırır ve üçten az düğüme sahip kümeleri hariç tutar. Geliştiricinin isteğe bağlı özelliklerle ilgili agresif politikası. Minimalizmden uzak. Belgeler, "Sahip olduklarımız için teşekkür ederiz, ancak bu çok çok yetersiz" düzeyindedir. Hizmetlerle düşük düzeyde etkileşim kurma yeteneği sağlanmıştır, ancak belgeler bu konuya çok yüzeysel olarak değinmektedir, bu nedenle evet yerine hayır olması daha olasıdır. Acil bir durumdan veri kurtarma şansı neredeyse yoktur.

Daha ileri eylem seçenekleri: CEPH'den vazgeçin ve banal çoklu disk btrfs'yi (veya xfs, zfs) kullanın, CEPH hakkında belirtilen koşullar altında çalıştırmanıza izin verecek yeni bilgiler öğrenin, kendi depolamanızı gelişmiş olarak yazmaya çalışın eğitim.

Kaynak: habr.com

Yorum ekle