تجربه با 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 دارای یک آنالوگ - erasure_code است که با مفاهیم اولیه توسعه دهندگان در تضاد است و بنابراین در نظر گرفته نمی شود. RAID 5 فرض می کند که تعداد کمی دیسک وجود دارد و همه آنها در شرایط خوبی هستند. اگر یکی از کار بیفتد، بقیه باید تا زمانی که دیسک جایگزین شود و اطلاعات به آن بازگردانده شود، باقی بماند. CEPH، با N>=3، استفاده از دیسک های قدیمی را تشویق می کند، به ویژه، اگر چندین دیسک خوب را برای ذخیره یک کپی از داده ها نگه دارید و دو یا سه نسخه باقی مانده را روی تعداد زیادی دیسک قدیمی ذخیره کنید، اطلاعات ایمن خواهد بود، زیرا در حال حاضر دیسک های جدید زنده هستند - هیچ مشکلی وجود ندارد، و اگر یکی از آنها خراب شود، خرابی همزمان سه دیسک با عمر مفید بیش از پنج سال، ترجیحا از سرورهای مختلف، بسیار بعید است. رویداد.

ظرافتی در توزیع نسخه ها وجود دارد. به‌طور پیش‌فرض، فرض بر این است که داده‌ها به گروه‌های توزیع PG بیشتر (~ 100 در هر دیسک) تقسیم می‌شوند که هر کدام از آنها در برخی از دیسک‌ها تکرار می‌شوند. فرض کنید K=6، N=2، سپس اگر هر دو دیسک از کار بیفتد، داده ها تضمین می شود که از بین بروند، زیرا طبق تئوری احتمال، حداقل یک PG وجود خواهد داشت که روی این دو دیسک قرار می گیرد. و از دست دادن یک گروه باعث می شود که تمام داده های موجود در استخر غیرقابل دسترسی باشد. اگر دیسک‌ها به سه جفت تقسیم شوند و اجازه ذخیره داده‌ها را فقط روی دیسک‌های درون یک جفت داده شود، چنین توزیعی در برابر خرابی هر یک از دیسک‌ها نیز مقاوم است، اما اگر دو دیسک از کار بیفتند، احتمال از دست رفتن داده‌ها 100٪ نیست. اما فقط 3/15 و حتی در صورت خرابی سه دیسک - فقط 12/20. بنابراین، آنتروپی در توزیع داده ها به تحمل خطا کمک نمی کند. همچنین توجه داشته باشید که برای یک سرور فایل، رم رایگان، پاسخگویی را تا حد زیادی افزایش می دهد. هرچه حافظه در هر گره بیشتر باشد و در همه گره ها حافظه بیشتر باشد، سرعت آن بیشتر می شود. این بدون شک مزیت یک کلاستر نسبت به یک سرور واحد و علاوه بر این، یک NAS سخت افزاری است که در آن مقدار بسیار کمی حافظه در آن تعبیه شده است.

نتیجه این است که CEPH راه خوبی برای ایجاد یک سیستم ذخیره سازی قابل اعتماد برای ده ها TB با امکان مقیاس بندی با حداقل سرمایه گذاری از تجهیزات قدیمی است (البته در اینجا هزینه ها مورد نیاز خواهد بود، اما در مقایسه با سیستم های ذخیره سازی تجاری ناچیز).

پیاده سازی خوشه

برای آزمایش، بیایید یک رایانه از کار افتاده Intel DQ57TM + Intel core i3 540 + 16 گیگابایت رم را انتخاب کنیم. ما چهار دیسک 2 ترابایتی را در چیزی شبیه RAID10 سازماندهی می کنیم، پس از یک آزمایش موفقیت آمیز، یک گره دوم و به همان تعداد دیسک اضافه می کنیم.

لینوکس را نصب کنید. توزیع باید قابل تنظیم و پایدار باشد. 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-car را نصب کنید
  • پس از اتصال مخزن، اما قبل از نصب کلاستر، نصب بسته حذف می شود: apt -y --no-install-recommends 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 - مسئول ذخیره داده ها روی دیسک است. برای هر دیسک، یک سرویس شبکه راه‌اندازی می‌شود که درخواست‌های خواندن یا نوشتن روی اشیاء را می‌پذیرد و اجرا می‌کند. دو پارتیشن روی دیسک ایجاد می شود. یکی از آنها حاوی اطلاعاتی درباره خوشه، شماره دیسک و کلیدهای کلاستر است. این اطلاعات 1 کیلوبایتی یک بار هنگام افزودن دیسک ایجاد می شود و دیگر متوجه تغییر آن نشد. پارتیشن دوم هیچ سیستم فایلی ندارد و داده های باینری CEPH را ذخیره می کند. نصب خودکار در نسخه های قبلی یک پارتیشن xfs 100 مگابایتی برای اطلاعات سرویس ایجاد کرد. من دیسک را به MBR تبدیل کردم و فقط 16 مگابایت اختصاص دادم - سرویس شکایت نمی کند. من فکر می کنم، بدون مشکل، xfs را می توان با ext جایگزین کرد. این پارتیشن در /var/lib/... نصب می‌شود، جایی که سرویس اطلاعات مربوط به OSD را می‌خواند و همچنین پیوندی به دستگاه بلوکی که در آن داده‌های باینری ذخیره می‌شود، پیدا می‌کند. از نظر تئوری، می توانید فوراً موارد کمکی را در / var / lib / ... قرار دهید و کل دیسک را برای داده ها اختصاص دهید. هنگام ایجاد یک OSD از طریق ceph-deploy، یک قانون به طور خودکار برای نصب پارتیشن در /var/lib/… ایجاد می‌شود و حقوق به کاربر ceph برای خواندن دستگاه بلوک مورد نظر اختصاص می‌یابد. با نصب دستی، باید خودتان این کار را انجام دهید، اسناد در مورد آن چیزی نمی گوید. همچنین توصیه می شود پارامتر هدف حافظه osd را مشخص کنید تا حافظه فیزیکی کافی وجود داشته باشد.

ceph-mds. در سطح پایین، CEPH ذخیره سازی اشیا است. قابلیت ذخیره سازی بلوک به ذخیره هر بلوک 4 مگابایتی به عنوان یک شی خلاصه می شود. ذخیره سازی فایل بر اساس همان اصل کار می کند. دو مخزن ایجاد می شود: یکی برای ابرداده، دیگری برای داده. آنها در یک سیستم فایل ترکیب می شوند. در این لحظه، نوعی رکورد ایجاد می شود، بنابراین اگر سیستم فایل را حذف کنید، اما هر دو استخر را ذخیره کنید، دیگر نمی توانید آن را بازیابی کنید. روشی برای استخراج فایل ها در بلوک وجود دارد، من آن را تست نکرده ام. سرویس ceph-mds مسئول دسترسی به سیستم فایل است. هر فایل سیستم به یک نمونه جداگانه از سرویس نیاز دارد. یک گزینه "شاخص" وجود دارد که به شما امکان می دهد ظاهری از چندین سیستم فایل را در یک ایجاد کنید - همچنین آزمایش نشده است.

ceph-mon - این سرویس نقشه ای از خوشه را نگه می دارد. این شامل اطلاعات مربوط به همه OSD ها، الگوریتم توزیع 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/OSD را حفظ کند. اگر می خواهید نسبت را به صورت دستی کنترل کنید، می توانید مقیاس گذاری را برای هر Pool غیرفعال کنید، اما در این حالت ماژول با تقسیم بر 0 سقوط می کند و وضعیت خوشه ERROR می شود. ماژول به زبان پایتون نوشته شده است و اگر خط لازم را در آن نظر دهید، منجر به خاموش شدن آن می شود. برای به خاطر سپردن جزئیات بسیار تنبل است.

فهرست منابع مورد استفاده:

نصب و راه اندازی 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 یک نقشه جامع نیست. از بین بردن و ایجاد مجدد مانیتورها در حالی که همه OSD ها و CRUSH را نگه می دارید برای بازیابی کلاستر کافی نیست. از این نتیجه می‌شود که هر مانیتور مقداری فراداده را در مورد کل خوشه ذخیره می‌کند. مقدار ناچیز این ابرداده محدودیتی در اندازه خوشه ایجاد نمی کند، اما ایمنی آنها را می طلبد، که باعث حذف صرفه جویی در دیسک به دلیل نصب سیستم بر روی فلش مموری و حذف خوشه هایی با کمتر از سه گره می شود. خط مشی تهاجمی توسعه دهنده در مورد ویژگی های اختیاری. به دور از مینیمالیسم مستندات در سطح: "از آنچه هست متشکرم، اما بسیار بسیار ناچیز." توانایی تعامل با خدمات در سطح پایین ارائه شده است، اما مستندات در مورد این موضوع بسیار سطحی است، بنابراین به احتمال زیاد نه از بله. عملا هیچ شانسی برای بازیابی اطلاعات از یک وضعیت اضطراری وجود ندارد.

گزینه هایی برای اقدامات بیشتر: CEPH را رها کنید و از btrfs چند دیسک پیش پا افتاده (یا xfs، zfs) استفاده کنید، اطلاعات جدیدی در مورد CEPH بیاموزید، که به شما امکان می دهد آن را در شرایط مشخص شده کار کنید، سعی کنید ذخیره سازی خود را به عنوان یک آموزش پیشرفته بنویسید. .

منبع: www.habr.com

اضافه کردن نظر