مقدمه
چرا این کتاب؟
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؛ ریاضیات و 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 روی ؛ قاعدهی تصمیم 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 را اجرا میکنند یا روی آن نرمافزار میسازند. آشنایی با لینوکس، شبکه و مفاهیم پایهی ذخیرهسازی فرض شده است.
رامین نجارباشی · آبان ۱۴۰۵