تجربة مع CEPH

عندما يكون هناك بيانات أكثر مما يناسب قرص واحد ، فقد حان الوقت للتفكير في RAID. عندما كنت طفلاً ، كثيرًا ما سمعت من كبار السن: "يومًا ما ستصبح RAID شيئًا من الماضي ، وسيغمر تخزين الكائنات العالم ، ولا تعرف حتى ما هو CEPH" ، لذا فإن أول شيء في حياة مستقلة كان ينشئ مجموعتك الخاصة. كان الغرض من التجربة هو التعرف على البنية الداخلية لـ ceph وفهم نطاق تطبيقه. ما مدى مبرر إدخال Ceph في شركة متوسطة ، ولكن في شركة صغيرة؟ بعد عدة سنوات من التشغيل واثنين من خسائر البيانات التي لا رجعة فيها ، نشأ فهم للدقائق أنه ليس كل شيء بهذه البساطة. تخلق ميزات CEPH عقبات أمام توزيعها على نطاق واسع ، وبسببها ، توقفت التجارب. فيما يلي وصف لجميع الخطوات المتخذة والنتيجة التي تم الحصول عليها والاستنتاجات المستخلصة. إذا كان الأشخاص المطلعون سيشاركون خبراتهم ويشرحون بعض النقاط ، سأكون ممتنًا.

ملاحظة: أشار المعلقون إلى أخطاء جسيمة في بعض الافتراضات ، مما يتطلب مراجعة المقال بأكمله.

استراتيجية CEPH

تجمع مجموعة CEPH بين عدد تعسفي K من الأقراص ذات الحجم التعسفي وتخزن البيانات عليها ، مما يؤدي إلى تكرار كل قطعة (4 ميجا بايت افتراضيًا) عددًا معينًا N مرة.

النظر في أبسط حالة مع قرصين متطابقين. يمكنك إما تجميع RAID 1 أو مجموعة مع N = 2 منهم - ستكون النتيجة هي نفسها. إذا كان هناك ثلاثة أقراص ، وكانت ذات أحجام مختلفة ، فمن السهل تجميع مجموعة مع N = 2: ستكون بعض البيانات على القرصين 1 و 2 ، وبعضها على 1 و 3 ، وبعضها على 2 و 3 ، بينما RAID ليس كذلك (يمكنك جمع مثل هذا RAID ، لكنه سيكون تحريفًا). إذا كان هناك المزيد من الأقراص ، فمن الممكن إنشاء RAID 5 ، يحتوي CEPH على رمز محو تماثلي ، والذي يتعارض مع المفاهيم المبكرة للمطورين ، وبالتالي لا يتم أخذها في الاعتبار. يفترض RAID 5 أن هناك عددًا قليلاً من الأقراص وكلها في حالة جيدة. في حالة فشل أحدهما ، يجب أن يستمر الباقي حتى يتم استبدال القرص واستعادة البيانات إليه. يشجع CEPH ، مع N> = 3 ، على استخدام الأقراص القديمة ، على وجه الخصوص ، إذا احتفظت بالعديد من الأقراص الجيدة لتخزين نسخة واحدة من البيانات ، وتخزين النسختين أو الثلاث المتبقية على عدد كبير من الأقراص القديمة ، ثم المعلومات ستكون آمنة ، لأن الأقراص الجديدة لا تزال حية - لا توجد مشاكل ، وإذا تعطل أحدها ، فإن الفشل المتزامن لثلاثة أقراص مع عمر خدمة يزيد عن خمس سنوات ، ويفضل أن يكون ذلك من خوادم مختلفة ، أمر غير محتمل للغاية حدث.

هناك دقة في توزيع النسخ. بشكل افتراضي ، من المفترض أن البيانات مقسمة إلى مجموعات توزيع PG أكثر (~ 100 لكل قرص) ، كل منها مكرر على بعض الأقراص. لنفترض أن K = 6 ، N = 2 ، ثم في حالة فشل أي قرصين ، يتم ضمان فقدان البيانات ، لأنه وفقًا لنظرية الاحتمال ، سيكون هناك PG واحد على الأقل موجود على هذين القرصين. وفقدان مجموعة واحدة يجعل جميع البيانات الموجودة في المجمع غير قابلة للوصول. إذا تم تقسيم الأقراص إلى ثلاثة أزواج والسماح لها بتخزين البيانات فقط على أقراص داخل زوج واحد ، فإن مثل هذا التوزيع يكون أيضًا مقاومًا لفشل أي قرص واحد ، ولكن إذا فشل اثنان ، فإن احتمال فقدان البيانات ليس 100٪ ، ولكن فقط 3/15 ، وحتى في حالة الفشل ثلاثة أقراص - فقط 12/20. ومن ثم ، فإن الانتروبيا في توزيع البيانات لا تساهم في التسامح مع الخطأ. لاحظ أيضًا أنه بالنسبة لخادم الملفات ، تعمل ذاكرة الوصول العشوائي المجانية على زيادة الاستجابة بشكل كبير. كلما زادت الذاكرة في كل عقدة ، وزادت الذاكرة في جميع العقد ، كلما كانت أسرع. هذه بلا شك ميزة الكتلة على خادم واحد ، علاوة على ذلك ، NAS للأجهزة ، حيث يتم بناء كمية صغيرة جدًا من الذاكرة.

ويترتب على ذلك أن CEPH هي طريقة جيدة لإنشاء نظام تخزين موثوق لعشرات السل مع إمكانية التوسع بأقل قدر من الاستثمار من المعدات القديمة (هنا ، بالطبع ، ستكون التكاليف مطلوبة ، ولكنها صغيرة مقارنة بأنظمة التخزين التجارية).

تنفيذ الكتلة

للتجربة ، لنأخذ جهاز كمبيوتر تم إيقاف تشغيله Intel DQ57TM + Intel core i3 540 + 16 جيجابايت من ذاكرة الوصول العشوائي. ننظم أربعة أقراص سعة 2 تيرابايت في شيء مثل RAID10 ، وبعد إجراء اختبار ناجح ، سنضيف عقدة ثانية ونفس عدد الأقراص.

قم بتثبيت Linux. يجب أن يكون التوزيع قابلاً للتخصيص ومستقرًا. تناسب كل من Debian و Suse المتطلبات. لدى Suse مثبت أكثر مرونة يسمح لك بتعطيل أي حزمة ؛ لسوء الحظ ، لم أستطع فهم أي منها يمكن التخلص منه دون الإضرار بالنظام. قم بتثبيت Debian عبر debootstrap buster. يقوم خيار min-base بتثبيت نظام لا يعمل ويفتقر إلى برامج التشغيل. الاختلاف في الحجم مقارنة بالنسخة الكاملة ليس كبيرًا لدرجة الإزعاج. نظرًا لأن العمل يتم على جهاز مادي ، فأنا أرغب في التقاط لقطات ، تمامًا مثل الأجهزة الافتراضية. يوفر إما LVM أو btrfs (أو xfs أو zfs - الفرق ليس كبيرًا) مثل هذه الفرصة. اللقطات ليست موطن قوة LVM. قم بتثبيت btrfs. ومحمل الإقلاع موجود في MBR. ليس من المنطقي سد قرص بحجم 50 ميجابايت بقسم FAT عندما يمكنك دفعه إلى منطقة جدول تقسيم 1 ميجابايت وتخصيص كل المساحة للنظام. استغرق الأمر 700 ميغا بايت على القرص. ما مقدار التثبيت الأساسي لـ SUSE - لا أتذكر ، على ما يبدو ، حوالي 1.1 أو 1.4 جيجابايت.

قم بتثبيت CEPH. نتجاهل الإصدار 12 في مستودع دبيان ونتصل مباشرة من الموقع 15.2.3. نتبع التعليمات الواردة في قسم "تثبيت CEPH يدويًا" مع التحذيرات التالية:

  • قبل توصيل المستودع ، يجب عليك تثبيت شهادات gnupg wget ca
  • بعد توصيل المستودع ، ولكن قبل تثبيت الكتلة ، تم حذف تثبيت الحزمة: apt -y - no-install-recommended install ceph-common ceph-mon ceph-osd ceph-mds ceph-mgr
  • في وقت تثبيت CEPH ، لأسباب غير معروفة ، سيحاول تثبيت lvm2. من حيث المبدأ ، هذا ليس مؤسفًا ، لكن التثبيت فشل ، لذلك لن يتم تثبيت CEPH أيضًا.

    ساعد هذا التصحيح:

    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
    

نظرة عامة على الكتلة

ceph-osd - مسؤول عن تخزين البيانات على القرص. لكل قرص ، يتم بدء تشغيل خدمة الشبكة التي تقبل وتنفذ طلبات القراءة أو الكتابة على الكائنات. يتم إنشاء قسمين على القرص. يحتوي أحدها على معلومات حول الكتلة ورقم القرص ومفاتيح الكتلة. يتم إنشاء معلومات 1KB هذه مرة واحدة عند إضافة قرص ولم يتم ملاحظة تغييرها مرة أخرى. لا يحتوي القسم الثاني على نظام ملفات ويخزن بيانات CEPH الثنائية. أدى التثبيت التلقائي في الإصدارات السابقة إلى إنشاء قسم xfs بحجم 100 ميجابايت للحصول على معلومات الخدمة. لقد قمت بتحويل القرص إلى MBR وخصصت 16 ميغا بايت فقط - الخدمة لا تشكو. أعتقد أنه بدون مشاكل ، يمكن استبدال xfs بـ ext. يتم تثبيت هذا القسم في / var / lib / ... حيث تقرأ الخدمة معلومات حول OSD وتجد أيضًا ارتباطًا بجهاز الحظر حيث يتم تخزين البيانات الثنائية. نظريًا ، يمكنك وضع العناصر المساعدة على الفور في / var / lib / ... ، وتخصيص القرص بأكمله للبيانات. عند إنشاء OSD عبر ceph-publish ، يتم إنشاء قاعدة تلقائيًا لتركيب قسم في / var / lib /… ، ويتم تعيين حقوق مستخدم ceph لقراءة جهاز الحظر المطلوب. مع التثبيت اليدوي ، تحتاج إلى القيام بذلك بنفسك ، والوثائق لا تشير إلى ذلك. يُنصح أيضًا بتحديد المعلمة الهدف لذاكرة osd بحيث توجد ذاكرة فعلية كافية.

سيف- MDS. عند مستوى منخفض ، CEPH هو تخزين كائن. تتلخص إمكانية تخزين الكتلة في حفظ كل كتلة بحجم 4 ميجابايت ككائن. تخزين الملفات يعمل على نفس المبدأ. يتم إنشاء مجموعتين: أحدهما للبيانات الوصفية والآخر للبيانات. يتم دمجها في نظام ملفات. في هذه اللحظة ، يتم إنشاء نوع من السجلات ، لذلك إذا قمت بحذف نظام الملفات ، ولكنك قمت بحفظ كلتا المجموعتين ، فلن تتمكن من استعادته. هناك إجراء لاستخراج الملفات في كتل ، لم أختبره. خدمة ceph-mds هي المسؤولة عن الوصول إلى نظام الملفات. يتطلب كل نظام ملفات مثيل منفصل للخدمة. يوجد خيار "فهرس" يسمح لك بإنشاء ما يشبه العديد من أنظمة الملفات في نظام واحد - ولم يتم اختباره أيضًا.

ceph-mon - تحتفظ هذه الخدمة بخريطة الكتلة. يتضمن معلومات حول جميع OSDs ، وخوارزمية توزيع PG في OSD ، والأهم من ذلك ، معلومات حول جميع الكائنات (تفاصيل هذه الآلية غير واضحة بالنسبة لي: هناك / var / lib / ceph / mon / ... / store.db ، يحتوي على ملف كبير يبلغ 26 ميجابايت ، وفي مجموعة مكونة من 105 آلاف عنصر ، يتضح أن ما يزيد قليلاً عن 256 بايت لكل كائن - أعتقد أن الشاشة تحتفظ بقائمة بجميع الكائنات و PG فيها إنهم يكذبون). ينتج عن تلف هذا الدليل فقدان جميع البيانات الموجودة في الكتلة. من هنا تم استنتاج أن CRUSH يوضح كيفية تحديد مواقع PG وفقًا لـ OSD ، وكيف يتم تحديد موقع الكائنات وفقًا لـ PG - يتم تخزينها مركزيًا داخل قاعدة البيانات ، بغض النظر عن كيفية تجنب المطورين لهذه الكلمة. نتيجة لذلك ، أولاً ، لا يمكننا تثبيت النظام على محرك أقراص محمول في وضع RO ، نظرًا لأن قاعدة البيانات تتم كتابتها باستمرار ، يلزم قرص إضافي لهذه (بالكاد أكثر من 1 جيجابايت) ، وثانيًا ، من الضروري أن يكون لديك نسخة في الوقت الحقيقي من هذه القاعدة. إذا كان هناك العديد من الشاشات ، فسيتم توفير التسامح مع الخطأ تلقائيًا ، ولكن في حالتنا هناك شاشة واحدة فقط ، واثنتان كحد أقصى. هناك إجراء نظري لاستعادة الشاشة بناءً على بيانات OSD ، وقد لجأت إليها ثلاث مرات لأسباب مختلفة ، وثلاث مرات لا توجد رسائل خطأ ، وكذلك البيانات أيضًا. لسوء الحظ ، هذه الآلية لا تعمل. إما أننا نقوم بتشغيل قسم OSD مصغر ونقوم بتجميع RAID لتخزين قاعدة البيانات ، والذي من المحتمل أن يكون له تأثير سيء للغاية على الأداء ، أو نقوم بتخصيص اثنين على الأقل من الوسائط المادية الموثوقة ، ويفضل USB ، بحيث لا تستهلك المنافذ.

rados-gw - يقوم بتصدير تخزين الكائنات باستخدام بروتوكول S3 وما شابه. ينشئ الكثير من المسابح ، وليس من الواضح سبب ذلك. لم أجرب حقًا.

ceph-mgr - يبدأ تثبيت هذه الخدمة في عدة وحدات نمطية. واحد منهم هو مقياس تلقائي لغير المعوقين. تسعى جاهدة للحفاظ على العدد الصحيح من PG / OSDs. إذا كنت تريد التحكم في النسبة يدويًا ، فيمكنك تعطيل التحجيم لكل مجموعة ، ولكن في هذه الحالة ، تقع الوحدة النمطية مع قسمة على 0 ، وتصبح حالة الكتلة خطأ. الوحدة مكتوبة بلغة python ، وإذا قمت بالتعليق على السطر الضروري فيها ، فسيؤدي ذلك إلى إيقاف تشغيلها. كسول جدا لتذكر التفاصيل.

قائمة المصادر المستخدمة:

تركيب CEPH
التعافي من فشل كامل في الشاشة

قوائم البرنامج النصي:

تركيب النظام عن طريق 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

قم بإنشاء كتلة

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

ملخص

الميزة التسويقية الرئيسية لـ CEPH هي CRUSH ، وهي خوارزمية لحساب موقع البيانات. تنشر الشاشات هذه الخوارزمية للعملاء ، وبعد ذلك يطلب العملاء مباشرة العقدة المطلوبة و OSD المطلوب. لا يوفر CRUSH أي مركزية. إنه ملف صغير يمكنك حتى طباعته وتعليقه على الحائط. أظهرت الممارسة أن CRUSH ليست خريطة شاملة. لا يكفي تدمير وإعادة إنشاء الشاشات مع الاحتفاظ بجميع OSDs و CRUSH لاستعادة المجموعة. من هذا نستنتج أن كل شاشة تخزن بعض البيانات الوصفية حول الكتلة بأكملها. إن الكمية الضئيلة من هذه البيانات الوصفية لا تفرض قيودًا على حجم الكتلة ، ولكنها تتطلب سلامتها ، مما يلغي توفير القرص بسبب تثبيت النظام على محرك أقراص فلاش ويستبعد المجموعات التي تحتوي على أقل من ثلاث عقد. سياسة مطور صارمة فيما يتعلق بالميزات الاختيارية. بعيدًا عن التبسيط. التوثيق على المستوى: "شكرًا لك على ما هو عليه ، ولكن بشكل ضئيل جدًا". يتم توفير القدرة على التفاعل مع الخدمات بمستوى منخفض ، لكن الوثائق سطحية للغاية حول هذا الموضوع ، لذا فمن المرجح أن لا يكون نعم. عمليا لا توجد فرصة لاستعادة البيانات من حالة الطوارئ.

خيارات لمزيد من الإجراءات: التخلي عن CEPH واستخدام btrfs متعدد الأقراص العادي (أو xfs ، zfs) ، وتعلم معلومات جديدة حول CEPH ، والتي ستتيح لك تشغيلها في الظروف المحددة ، وحاول كتابة التخزين الخاص بك كتدريب متقدم .

المصدر: www.habr.com

إضافة تعليق