راهنمای جامع Ceph
Englishشروع کنید

مقدمه

۱۳ دقیقه مطالعه

چرا این کتاب؟

‏Ceph‏ یکی از معدود سامانه‌های ذخیره‌سازی متن‌باز است که بلوک، شیء و فایل را روی یک بستر واحد، بدون نقطه‌ی شکست مرکزی و در مقیاس صدها پتابایت ارائه می‌دهد. همین گستردگی یادگیری آن را دشوار می‌کند. اپراتوری که فقط دستورها را حفظ کرده باشد، در اولین حادثه‌ی جدی (‏PG‏ گیرکرده، ‏OSD‏ کامل، ‏quorum‏ ازدست‌رفته) نمی‌داند در درون سامانه چه می‌گذرد. منابع فارسی منسجم و عمیق درباره‌ی ‏Ceph‏ بسیار کم است. این کتاب تلاشی برای پر کردن بخشی از این خلأ است.

این کتاب یک اثر تألیفی است. متن، مثال‌ها، دستورها، نمودارها، تمرین‌ها و بخش‌های «از درون کد» همه برای همین کتاب نوشته شده‌اند و بر نسخه‌های جاری ‏Ceph‏، یعنی ‏Squid‏ (۱۹.۲)، ‏Tentacle‏ (۲۰.۲) و ‏Umbrella‏ (۲۱.۲)، تکیه دارند. بسیاری از منابع قدیمی‌تر هنوز ‏FileStore‏، ‏ceph-deploy‏ و ابزارهای منسوخ دیگر را آموزش می‌دهند. در این کتاب هر جا لازم بوده، جایگزین امروزی آن‌ها (‏BlueStore‏، ‏cephadm‏، ‏mClock‏ و...) آمده و تفاوت با روش قدیمی گفته شده است.

ساختار کتاب

فصل‌های ۱ تا ۲۱ موضوع‌های اصلی کار با ‏Ceph‏ را پوشش می‌دهند: معماری و نخستین کلاستر، ‏RBD‏، ‏OpenStack‏، ‏RGW‏ و ‏multisite‏، ‏CephFS‏، راهبری کلاستر، ‏CRUSH‏ و درون ‏RADOS‏، داشبورد، سنجش کارایی، استقرار، ‏BlueStore‏، ‏erasure coding‏، ‏librados‏، کلاس‌های ‏RADOS‏، ‏tiering‏، عیب‌یابی، بازیابی از فاجعه، عملیات روزمره، پایش و تنظیم کارایی. بخش ویژه‌ی ۲۲ برای خواننده‌ای است که می‌خواهد ساختار کد ‏Ceph‏ و مسیر کامل درخواست‌ها را تابع به تابع ببیند. بخش سوم، «لایه‌های پایینی» (فصل‌های ۲۳ تا ۳۳)، یک لایه پایین‌تر می‌رود. فصل‌های ۲۳ تا ۲۹ در نسخه‌ی ۱٫۱ و فصل‌های ۳۰ تا ۳۳ در نسخه‌ی ۱٫۲ اضافه شده‌اند. موضوع‌های این بخش: دستگاه بلوکی، ‏bufferlist‏، ‏mempool‏ و ‏crc32c‏؛ قالب روی‌دیسک ‏BlueStore‏ و ‏BlueFS‏ بایت به بایت؛ ‏RocksDB‏ درون ‏BlueStore‏؛ قاب‌های ‏msgr2‏؛ ریاضیات ‏GF(28)\mathrm{GF}(2^8)‏ و ‏Reed-Solomon‏؛ ‏CRUSH‏ در سطح بیت؛ کلاینت‌های هسته‌ی لینوکس؛ ‏Crimson‏ و ‏SeaStore‏؛ ‏SPDK‏ و ‏NVMe‏؛ ‏scrub‏ و ‏recovery‏ در سطح کد؛ و حافظه و ‏CPU‏ درون ‏OSD‏. بخش چهارم، «بخش تخصصی» (فصل‌های ۳۴ تا ۴۲)، که در نسخه‌ی ۱٫۶ اضافه شده، سه زیرسامانه‌ی اصلی را با کد شاخه‌ی ‏main‏ تطبیق می‌دهد: در ‏RADOS‏ مدل شیء و مسیر ‏op‏، ‏pg log‏ و ‏peering‏ و ‏recovery‏، و ‏snapshot‏ و ‏watch/notify‏ و ‏cls‏؛ در ‏RBD‏ چیدمان ‏image‏ و ‏object map‏، مسیر ‏I/O‏ و قفل انحصاری و ‏cache‏ در ‏librbd‏، و درون ‏rbd-mirror‏؛ و در ‏RGW‏ مدل داده و ‏bucket index‏ و نسخه‌بندی و ‏multipart‏، مسیر درخواست و ‏SigV4‏ و سهمیه و ‏gc‏ و ‏lifecycle‏، و درون ‏multisite‏.

تازه‌های نسخه‌ی ۱٫۶

  • بخش چهارم: «بخش تخصصی» با نه فصل تازه (۳۴ تا ۴۲) درباره‌ی ‏RADOS‏، ‏RBD‏ و ‏RGW‏، با کادرهای الگوریتم از کد منبع، شکل‌های بایت‌به‌بایت، مرجع کامل دستورها با خروجی نمونه، تنظیم و عیب‌یابی، تمرین و پاسخ.
  • ۱۸۸ کادر «الگوریتم» و ۳۷۵ شکل در کل کتاب. در نسخه‌ی ۱٫۵ این عددها ۱۴۳ و ۳۵۰ بود.
  • واژه‌نامه (اصطلاح‌های ‏OLH‏، ‏bilog‏، ‏period‏، ‏SigV4‏، ‏SnapSet‏، ‏PastIntervals‏ و…) و کتاب‌نامه به‌روز شدند.

تازه‌های نسخه‌ی ۱٫۴

  • ۱۴۳ کادر «الگوریتم» و ۳۵۰ شکل در کل کتاب. در نسخه‌ی ۱٫۳ این عددها ۱۲۹ و ۳۳۲ بود. کادرها و شکل‌های تازه در فصل‌های ۸، ۹، ۱۰، ۱۵، ۱۷، ۱۹، ۲۲، ۲۴ و ۳۳ آمده‌اند.
  • عددها از کلاستر واقعی، نه مدل. بیشتر عددهای تازه روی یک کلاستر آزمایشی کوچک با ‏Ceph 18.2.7‏ (Reef) اندازه‌گیری شده‌اند: یک ‏mon‏، یک ‏mgr‏ و سه ‏OSD‏ روی ‏BlueStore‏. کلاستر روی یک ماشین مجازی اجرا شد، پس فقط روندها و نسبت‌ها معتبرند، نه عددهای مطلق. بخشی دیگر هم دقیقاً از نقشه‌های ‏CRUSH‏ واقعی با ‏crushtool‏ و ‏osdmaptool‏ محاسبه شده است. فهرست این اندازه‌گیری‌ها: خروجی واقعی ‏rbd du‏، با و بدون ‏--exact‏؛ ‏copyset‏ و زمان بازسازی، با تعداد دقیق سه‌تایی‌ها و ‏fan-out‏؛ جابه‌جایی داده با افزودن میزبان و تغییر وزن؛ اثر ‏upmap balancer‏ و دوبرابر کردن ‏pg_num‏؛ خط زمانی وضعیت ‏PG‏ها و از کار افتادن یک تا سه میزبان؛ قانون ‏Little‏ و جاروی اندازه‌ی بلوک؛ رخدادهای ‏OpTracker‏ و ترتیب ‏commit‏؛ برچسب واقعی ‏BlueStore‏، بایت به بایت، و نقشه‌ی فضای آزاد؛ رشد ‏pglog‏ و هزینه‌ی هر آیتم در ‏mempool‏؛ مقایسه‌ی شمارنده‌ی ‏cls_numops‏ با خواندن و نوشتن از کلاینت؛ هزینه‌ی ‏cls_lua‏؛ کهنگی آمار ‏mgr‏ و هزینه‌ی ‏pg dump‏.
  • ‏PromQL‏ دقیق‌تر: نام متریک‌ها و عبارت‌های هشدار در فصل ۲۰ با ‏module.py‏ ماژول ‏prometheus‏ و ‏prometheus_alerts.yml‏ در ‏ceph-mixin‏ تطبیق داده شده‌اند.
  • یافته‌های تازه: دو برابر کردن ‏pg_num‏ حدود ۴۹٪ داده را جابه‌جا می‌کند. با سه‌نسخه‌ای و ‏min_size=2‏، از کار افتادن دو میزبان از ده میزبان تقریباً همه‌ی کلاینت‌های یک ‏image‏ را متوقف می‌کند. حتی پس از ثابت ماندن طول ‏log‏، رشد حافظه‌ی ‏pglog‏ از راه ‏dups‏ ادامه دارد. هزینه‌ی هر آیتم ‏bluestore_alloc‏ برابر ۸۰ بایت اندازه‌گیری شد. در محیط ما ‏Lua‏ درون ‏OSD‏ فقط زیر حدود ۰٫۶ تا ۱٫۶ گیگابیت بر ثانیه از خواندن کامل شیء سریع‌تر بود.
  • اصلاح‌ها: در ‏cls_lua‏ نام جدول سراسری ‏objclass‏ است، نه ‏cls‏. نمونه‌ی فصل ۱۵ اصلاح شد و روی کلاستر آزمایش شد. سرآیند نسخه در همه‌ی فصل‌ها به ۱٫۴ به‌روز شد.

تازه‌های نسخه‌ی ۱٫۳

  • ۱۲۹ کادر «الگوریتم» و ۳۳۲ شکل در کل کتاب (در نسخه‌ی ۱٫۲: ۷۷ کادر و ۲۷۱ شکل). کادرها و شکل‌های تازه در فصل‌های ۱ تا ۷، ۱۱ تا ۱۴، ۱۸، ۲۰ و ۲۱ آمده‌اند و پیوست ز به‌روز شده است.
  • مثال‌های عددی تازه که از روی فرمول‌های کد دوباره محاسبه شده‌اند. نمونه‌ها: هش ‏ceph_str_hash_linux‏ برای شاردهای ‏bucket index‏ و ‏reshard‏؛ ‏choose_oid‏ در ‏datalog‏ و ‏mdlog‏؛ شماره‌گذاری ‏inode‏ و انتخاب ‏dirfrag‏ با ‏rjenkins‏ در ‏CephFS‏؛ آستانه‌های ‏split‏ و ‏merge‏ و ‏DecayCounter‏؛ ‏check_failure‏ و ‏grace‏ در ‏OSDMonitor‏؛ بودجه‌ی عملیات و ‏watch/notify‏ در ‏librados‏؛ امتیاز ‏ConnectionTracker‏ و انتخابات ‏connectivity‏؛ ماتریس ‏RS‏ در ‏ISA-L‏ روی ‏GF(28)\mathrm{GF}(2^8)‏؛ قاعده‌ی تصمیم ‏PDW‏؛ آزمون پذیرش فشرده‌سازی و اثر ‏min_alloc_size‏ در ‏BlueStore‏؛ و مدل ‏copyset‏ برای احتمال ازدست‌رفتن داده.
  • یافته‌های تازه: هش مقصد ‏datalog‏ و ‏mdlog‏ فقط به بیت‌های بالایی نویسه‌ها بستگی دارد و برای نام‌های هم‌الگو همه‌ی شاردها را پر نمی‌کند. این تحلیل خودِ این راهنماست و ادعای رسمی پروژه نیست. یافته‌های دیگر: شاخه‌ی ریشه‌ی ‏CephFS‏ هرگز تکه نمی‌شود؛ ‏timeout‏ کوتاه‌تر از یک ثانیه در ‏notify‏ به پیش‌فرض برمی‌گردد؛ ماتریس ‏Vandermonde‏ در ‏ISA-L‏ برای برخی ‏k‏ و ‏m‏ شرط ‏MDS‏ را ندارد و به همین دلیل ‏Cauchy‏ توصیه می‌شود؛ و با ‏min_alloc_size‏ برابر ۶۴‏K‏، یک ‏blob 64K‏ هرگز فشرده نمی‌شود.
  • اصلاح‌ها: وارونگی ‏evict‏ در ‏cache tiering‏ با کد دوباره وارسی و جدول آن اصلاح شد. اندازه‌ی ‏range_seg_t‏ به ۸۰ بایت تصحیح شد. نام تابع ‏rbd du‏، شرایط ‏can_fragment‏ و دستور دیدن آمار ‏BlueFS‏ (ceph daemon) هم درست شدند. یک خطای ساخت سند که جدول‌های بسته‌نشده باعثش می‌شدند و متن بعدی را می‌بلعیدند نیز برطرف شد.

تازه‌های نسخه‌ی ۱٫۲

  • چهار فصل تازه (۳۰ تا ۳۳): ‏Crimson‏ و ‏Seastar‏ و ‏SeaStore‏؛ ‏SPDK‏، صف‌های ‏NVMe‏ و درگاه ‏NVMe-oF‏؛ ‏scrub‏، ‏recovery‏، ‏backfill‏ و ‏repair‏ در سطح کد؛ و حافظه و ‏CPU‏ درون ‏OSD‏، از ‏mempool‏ و ‏PriorityCache‏ تا ‏NUMA‏ و پروفایل‌گیری.
  • ۷۷ کادر «الگوریتم» در سراسر کتاب. هر کادر توضیح فارسی، شبه‌کد، پیچیدگی، یک مثال عددی کارشده و دست‌کم یک شکل دارد و به فایل و تابع مشخصی از کد ارجاع می‌دهد. پیوست تازه‌ی «فهرست الگوریتم‌ها» (پیوست ز) همه را با شماره‌ی صفحه فهرست می‌کند. نمونه‌ها: جدول‌های ‏log/exp‏ میدان گالوا و ضرب ‏PSHUFB‏ در ‏ISA-L‏؛ ‏skiplist‏، گروه نوشتن، ‏Bloom‏ و سطوح پویای ‏RocksDB‏؛ طول روی‌سیم و ‏nonce‏ در ‏msgr2‏؛ ‏MSR‏ در ‏CRUSH‏؛ زمان‌بندی ‏scrub‏ با توزیع نرمال؛ گرد کردن ‏PG‏ با کوله‌پشتی در ‏Umbrella‏؛ و انتخاب ‏info‏ معتبر در ‏peering‏.
  • ۲۷۱ شکل در کل کتاب، همه طراحی اختصاصی این راهنما، با زیرنویس بلند و پاراگراف توضیح. نمودارهای بایتی قالب‌های روی‌دیسک و روی‌سیم، نمودارهای عددی برای فرمول‌ها و خط‌های زمانی برای پروتکل‌ها.
  • گسترش فصل‌ها با بخش‌های «با عدد». فصل‌های ۹، ۱۰، ۱۵، ۱۶، ۱۷، ۱۹ و ۲۳ تا ۲۹ بخش‌های تازه‌ای دارند که سازوکار را تا سطح حلقه و ثابت‌های کد باز می‌کنند. نمونه‌ها: ‏io_uring‏ و ‏libaio‏؛ تلاش دوباره‌ی ‏submit‏؛ روزهای انقضای ‏lifecycle‏؛ ‏evict_effort‏ در ‏cache tiering‏؛ ‏volume selector‏ در ‏BlueFS‏؛ قفل ‏cls_lock‏؛ هشدار ‏slow request‏؛ ‏allocator‏ در ‏BlueStore‏؛ ظرفیت و پروفایل‌های ‏mClock‏؛ و سیاست رمز و قفل حساب در ‏Dashboard‏.
  • اصلاح‌ها: چند رفتار وابسته به نسخه صریح‌تر علامت خورده‌اند، از جمله ‏MSR‏ فقط از ‏Squid‏ و نبود آن در کلاینت هسته، و کوله‌پشتی ‏autoscaler‏ فقط در ‏v21.2.0‏. جایی که کد و مستندات با هم نمی‌خوانند، این ناسازگاری صریحاً گفته شده است.

تازه‌های نسخه‌ی ۱٫۱

  • هفت فصل تازه‌ی ۲۳ تا ۲۹ با مثال‌های عددی کارشده (‏crc‏، کدگذاری ‏lba‏ و ‏varint‏، قاب ‏KEEPALIVE2‏، کدگذاری ‏RS‏ با ‏k=4‏ و ‏m=2‏، انتخاب ‏straw2‏ برای یک شیء واقعی و ‏striping‏). همه‌ی این مثال‌ها با کد مستقل یا کد کامپایل‌شده‌ی ‏Ceph‏ محاسبه شده‌اند.
  • گسترش فصل‌های ۱۳، ۱۴، ۱۶، ۱۸، ۲۰ و ۲۱ با بخش‌های «لایه‌ی پایین‌تر» و نمودارهای تازه: ‏backend‏ مربوط به ‏EC‏ و ‏rollback‏؛ پیام ‏MOSDOp‏، ‏Objecter‏ و ‏backoff‏؛ چیدمان شیء ‏RGW‏ و ‏lifecycle‏؛ قالب ‏journal‏ در ‏RBD‏ و ماشین حالت ‏stretch mode‏؛ ‏perf counter‏ها و پروتکل ‏admin socket‏؛ حلقه‌ی کنترل حافظه و ‏throttle‏ در ‏BlueStore‏.
  • اصلاح جزئیات وابسته به نسخه (از جمله پیش‌فرض شاردهای ‏HDD‏ از ‏v19.2.1‏)، واژه‌نامه و نمایه‌ی گسترش‌یافته و جدول عیب‌یابی خواناتر.
  • قلمرو نقل کد: نام توابع و قالب رشته‌های هسته‌ی لینوکس (‏GPL-2.0‏) و ‏RocksDB‏ (Apache-۲.۰/GPL-۲.۰) فقط به‌صورت کوتاه و با ذکر مسیر آمده‌اند. الگوریتم‌ها با شبه‌کد خود کتاب بازنویسی شده‌اند.

هر فصل با چند بخش ثابت همراه است: کادرهای «نکته»، «هشدار»، «عمیق‌تر» و «عیب‌یابی»؛ بخش «از درون کد» با ساختارها، الگوریتم‌ها، شبه‌کد و نمودارهای جزئی؛ بخش «تکمیلی و به‌روز» برای تغییرات نسخه‌های اخیر؛ «تمرین عملی»؛ «پرسش‌های مرور» (پاسخ‌ها در پیوست)؛ و «منابع این فصل».

قراردادها

  • نام‌های فایل، کلاس و تابع با شاخه‌ی ‏main‏ مخزن رسمی ‏ceph/ceph‏ و ‏tag‏های نسخه‌ها تطبیق داده شده‌اند. تکه‌های کوتاه کد با ذکر «‏from ceph/ceph, LGPL‏» و مسیر فایل آورده شده‌اند. بقیه‌ی کدها شبه‌کد یا مثال خود این راهنما هستند.
  • پیش‌فرض گزینه‌ها از فایل‌های ‏src/common/options/*.yaml.in‏ استخراج شده‌اند. هر جا رفتار بین نسخه‌ها فرق دارد، نسخه صریحاً ذکر شده است.
  • مثال‌ها، نام میزبان‌ها و سناریوهای حادثه ساختگی یا بی‌نام‌شده‌اند.

برای چه کسی؟

مهندسان ‏SRE‏ و عملیات، معماران زیرساخت و توسعه‌دهندگانی که ‏Ceph‏ را اجرا می‌کنند یا روی آن نرم‌افزار می‌سازند. آشنایی با لینوکس، شبکه و مفاهیم پایه‌ی ذخیره‌سازی فرض شده است.

رامین نجارباشی · آبان ۱۴۰۵