بلاگ/عیب‌یابی کلاستر Ceph: رفع PG های Stuck و OSD های Down روی سرور اختصاصی
به‌روز شده

عیب‌یابی کلاستر Ceph: رفع PG های Stuck و OSD های Down روی سرور اختصاصی

1405/08/010 بازدید
عیب‌یابی کلاستر Ceph: رفع PG های Stuck و OSD های Down روی سرور اختصاصی

عیب‌یابی کلاستر Ceph: رفع PG های Stuck و OSD های Down روی سرور اختصاصی

یک روز ceph -s را اجرا می‌کنید و به‌جای HEALTH_OK با HEALTH_WARN روبه‌رو می‌شوید. چند OSD داون شده‌اند، چند PG هم stuck مانده‌اند و کلاستر دیگر آن‌طور که باید جواب نمی‌دهد. این مقاله دستورهای تشخیص و رفع این دو مشکل رایج روی سرور اختصاصی را قدم‌به‌قدم نشان می‌دهد.

چرا Ceph به HEALTH_WARN می‌رود؟

Ceph هر چند ثانیه وضعیت سلامت کلاستر را از سه مانیتور اصلی (MON)، دمون‌های OSD و PG ها جمع می‌کند. وقتی چیزی خارج از حالت عادی باشد، وضعیت از HEALTH_OK به HEALTH_WARN یا حتی HEALTH_ERR تغییر می‌کند. برای دیدن جزئیات کافی است این دستور را اجرا کنید:

ceph -s
ceph health detail

خروجی health detail دقیقا می‌گوید کدام OSD پاسخ نمی‌دهد و کدام PG در چه وضعیتی گیر کرده. اکثر مشکلات روی سرور اختصاصی به یکی از این سه دلیل برمی‌گردد: دیسک خراب یا پر شده، شبکهٔ بین نودها قطع یا کند شده، یا دمون OSD به‌خاطر کمبود رم یا CPU از کار افتاده. اگر کلاستر را هنوز راه‌اندازی نکرده‌اید یا می‌خواهید روش استاندارد را ببینید، راه‌اندازی کلاستر Ceph با Cephadm مرحله‌های اول را نشان می‌دهد.

OSD Down روی سرور اختصاصی: علت‌های رایج

وقتی یک یا چند OSD در وضعیت down قرار می‌گیرند، اول باید فهرست کامل را ببینید:

ceph osd tree
ceph osd df

ستون STATUS در ceph osd tree وضعیت هر OSD را نشان می‌دهد. اگر عدد up کمتر از تعداد کل OSD هاست، باید سرویس مربوط را چک کنید. روی هر نود:

systemctl status ceph-osd@<id>
journalctl -u ceph-osd@<id> -n 100 --no-pager

چند علت رایج که در لاگ دیده می‌شود:

علتنشانهٔ معمول در لاگاقدام اول
دیسک پر یا نزدیک به ظرفیتOSD full یا backfillfullفضای خالی روی دیسک را افزایش دهید یا دادهٔ قدیمی را حذف کنید
خرابی فیزیکی دیسکخطای I/O، read error در dmesgبا smartctl -a /dev/sdX سلامت دیسک را بررسی کنید
قطع یا کندی شبکه بین نودهاheartbeat timeoutپینگ و پهنای باند بین نودها را تست کنید
کمبود رم و OOM killپیام oom-kill در dmesgمصرف رم دمون OSD را با free -h و ceph osd df چک کنید

برای خرابی فیزیکی، smartctl -a /dev/sdX را روی دیسک مربوط به آن OSD اجرا کنید؛ اگر Reallocated_Sector_Ct یا Current_Pending_Sector عدد بالایی نشان دهد، دیسک در حال خراب شدن است و باید جایگزین شود، نه فقط ریستارت.

رفع OSD Down گام‌به‌گام

اگر سرویس فقط کرش کرده و دیسک سالم است، این ترتیب را دنبال کنید:

  1. سرویس را ریستارت کنید: systemctl restart ceph-osd@<id>
  2. چند ثانیه صبر کنید و دوباره ceph osd tree را بزنید تا وضعیت به up برگردد.
  3. اگر برنگشت، فضای دیسک را با df -h /var/lib/ceph/osd/ceph-<id> چک کنید.
  4. اگر دیسک پر است، یا دادهٔ قدیمی را پاک کنید یا موقتا فلگ noout را ست کنید تا Ceph شروع به بازتوزیع دادهٔ آن OSD نکند تا شما مشکل را رفع کنید:
ceph osd set noout

بعد از رفع مشکل، این فلگ را بردارید؛ وگرنه حتی اگر آن OSD کاملا از دسترس خارج بماند، کلاستر دادهٔ آن را دوباره توزیع نمی‌کند:

ceph osd unset noout

اگر OSD به‌خاطر دیسک خراب برنمی‌گردد و تصمیم گرفتید آن را کنار بگذارید، به‌جای ریستارت پشت‌سرهم، آن را رسما از کلاستر خارج کنید:

ceph osd out <id>
ceph osd crush remove osd.<id>
ceph auth del osd.<id>
ceph osd rm <id>

این مرحله باعث می‌شود Ceph دادهٔ جایگزین را روی OSD های سالم بازتوزیع کند، به‌جای این‌که منتظر برگشتن یک دیسک خراب بماند.

PG های Stuck: انواع و معنی هر وضعیت

PG (Placement Group) واحد توزیع داده در Ceph است. وقتی یک PG بیش از حد انتظار در یک حالت می‌ماند، به آن stuck می‌گویند. همین مکانیزم توزیع داده پشت استفاده‌های دیگر Ceph هم هست؛ مثلا وقتی از RBD به‌عنوان بک‌اند ذخیره‌سازی ماشین‌های KVM یا CephFS برای ذخیره‌سازی اشتراکی بین چند سرور استفاده می‌کنید، باز هم داده روی همین PG ها پخش می‌شود. برای دیدن فهرست کامل PG های stuck:

ceph pg dump_stuck
ceph pg stat

هر وضعیت معنی متفاوتی دارد:

وضعیت PGمعنیعلت معمول
stuck inactivePG آماده پذیرش خواندن/نوشتن نیستOSD های لازم برای peering در دسترس نیستند
stuck uncleanPG کپی کامل داده را نداردOSD داون یا در حال recovery کند
stuck stalePG مدتی گزارش جدید ندادهOSD میزبان آن از کار افتاده یا شبکه قطع است
degradedتعداد کپی‌ها کمتر از مقدار تنظیم‌شده استیک یا چند OSD از دسترس خارج شده
incompleteداده برای بازسازی کافی نیستحذف چند OSD هم‌زمان قبل از پایان recovery

برای بررسی یک PG خاص:

ceph pg <pgid> query

خروجی این دستور نشان می‌دهد PG منتظر کدام OSD است و در کدام مرحله از peering یا recovery گیر کرده.

خروجی دستور ceph pg query در ترمینال برای بررسی مرحلهٔ peering و recovery یک PG

رفع PG های Stuck

اگر علت stuck شدن، یک OSD داون است، با برگرداندن آن OSD طبق بخش بالا معمولا PG هم خودش جمع می‌شود. اگر نه، این دستورها را به ترتیب امتحان کنید:

ceph pg repair <pgid>

این دستور برای PG هایی که دادهٔ ناسازگار بین کپی‌ها دارند (معمولا بعد از scrub error) استفاده می‌شود، نه برای PG های صرفا منتظر OSD.

اگر PG در وضعیت incomplete مانده و مطمئن هستید دادهٔ آن قابل بازیابی نیست (مثلا بعد از حذف چند OSD هم‌زمان)، آخرین راه این است:

ceph osd force-create-pg <pgid>

این دستور PG جدید و خالی می‌سازد و دادهٔ قبلی آن از بین می‌رود؛ فقط وقتی استفاده کنید که مطمئن شده‌اید دادهٔ اصلی در جای دیگری هم نیست. قبل از اجرا، ceph pg <pgid> query را دوباره بخوانید و ببینید کدام OSD ها در لیست recovery_state هستند؛ اگر یکی از آن‌ها قابل برگشت است، اول آن را امتحان کنید.

پیشگیری: مانیتورینگ و تنظیمات کلاستر

بیشتر این مشکلات زمانی سراغتان می‌آید که یک نگهداری برنامه‌ریزی‌شده (مثل ریستارت یک نود یا آپدیت سیستم) باعث OSD down موقت می‌شود. برای این حالت، قبل از شروع نگهداری:

ceph osd set noout
ceph osd set noscrub
ceph osd set nodeep-scrub

و بعد از اتمام کار، همهٔ این فلگ‌ها را بردارید. این سه خط کلاستر را از بازتوزیع بی‌مورد داده و اجرای scrub در وسط نگهداری باز می‌دارد.

برای پیشگیری بلندمدت، سلامت دیسک‌ها را به‌صورت دوره‌ای با smartctl چک کنید و مصرف رم دمون‌های OSD را روی هر نود زیر نظر داشته باشید؛ یک OSD که به‌خاطر کمبود رم بالا و پایین می‌شود، PG های اطرافش را هم به‌مرور وارد وضعیت degraded می‌کند. اگر هنوز داشبورد مشخصی برای این اعداد ندارید، راه‌اندازی مانیتورینگ سرور با Prometheus و Grafana راه‌اندازی آن را نشان می‌دهد.

اگر کلاستر Ceph روی یک سرور اختصاصی اجرا می‌شود، ثبات سخت‌افزار زیرساخت هم مستقیما روی این مشکلات اثر دارد؛ دیسک و شبکهٔ پایدار یعنی تعداد کمتر OSD down غیرمنتظره (برای انتخاب مشخصات مناسب، راهنمای خرید سرور اختصاصی برای دیتابیس معیارهای رم، دیسک NVMe و CPU را توضیح می‌دهد). سرورهای اختصاصی آریانت را از این صفحه ببینید.

سؤالات متداول

چرا بعد از برگرداندن یک OSD، کلاستر هنوز HEALTH_WARN نشان می‌دهد؟ چون recovery و backfill زمان می‌برد. با ceph -s پیشرفت درصد recovery را ببینید؛ تا تمام نشود وضعیت هشدار باقی می‌ماند.

فلگ noout چه فرقی با noscrub دارد؟ noout از بازتوزیع داده هنگام خروج موقت یک OSD جلوگیری می‌کند؛ noscrub و nodeep-scrub اجرای بررسی صحت داده را موقتا متوقف می‌کنند. هر دو برای نگهداری برنامه‌ریزی‌شده مفید هستند.

آیا force-create-pg همیشه امن است؟ نه. این دستور دادهٔ قبلی PG را پاک می‌کند و فقط برای PG هایی که دادهٔ قابل بازیابی ندارند مناسب است. قبل از اجرا با ceph pg query مطمئن شوید راه دیگری نیست.

چطور بفهمم مشکل از دیسک است یا از شبکه؟ با smartctl -a سلامت دیسک را چک کنید و با پینگ و تست پهنای باند بین نودها وضعیت شبکه را ببینید. اگر چند OSD روی نودهای مختلف هم‌زمان stale شدند، احتمال مشکل شبکه بیشتر از خرابی دیسک است.