شاردینگ (Sharding)

شاردینگ: تقسیم داده بین چند دیتابیس؛ انتخاب کلید شارد، مشکلات Hotspot و Rebalancing و راه‌حل‌ها

شاردینگ چیست؟

وقتی «یک دیتابیس» جا نمی‌شود (داده یا نوشتن)، داده را افقی تقسیم می‌کنیم بین چند سرور مستقل — هر کدام «شارد» با زیرمجموعه داده.

کاربران A-J → شارد ۱
کاربران K-S → شارد ۲
کاربران T-Z → شارد ۳

کلید شارد — مهم‌ترین تصمیم

چگونه تصمیم بگیریم داده کجا برود؟

استراتژیایدهمشکل
Rangeبازه (A-J)Hotspot: همه به یک بازه!
Hashhash(id) % nتوزیع یکنواخت ✓ اما rebalance سخت
Directoryجدول نگاشت مرکزیانعطاف ✓ اما خودش تک‌نقطه!
Geoجغرافیاتأخیر محلی ✓ اما داده نامتوازن

مشکلات شاردینگ

۱. Hotspot (نقطه داغ)

کلید بد = همه بار روی یک شارد. مثال: شارد بر اساس «تاریخ» → امروز همه! یا سلبریتی با ۱۰M فالوور در یک شارد.

۲. Cross-Shard Query

کوئری روی «همه داده» = پرسش از همه شاردها + ادغام:

«۵ پست محبوب کل سایت» → ۳ کوئری به ۳ شارد → merge

Join بین شاردها؟ عملاً مرده!

۳. Rebalancing

شارد ۱ پر شد → داده جابه‌جا → با hash ساده (mod n)، همه داده‌ها جابه‌جا می‌شوند! راه‌حل: Consistent Hashing (مبحث آینده) یا شاردینگ با «بازه‌های مجازی».

۴. تراکنش توزیع‌شده

نوشتن در دو شارد = دو فاز commit (2PC) — کند و پیچیده! طراحی بهتر: داده مرتبط در یک شارد (user_id کلید، نه post_id).

چه زمانی شارد کنیم؟

  1. کش و بهینه‌سازی تمام شد؟
  2. Replica خواندن را حل کرد اما نوشتن گلوگاه است؟
  3. ذخیره‌سازی از سرعت رشد عقب است؟

شاردینگ آخرین راه است — پیچیدگی بزرگ! اول: کش، ایندکس، Read Replica، جداسازی جدول.

هشدار: شاردینگ «برگشت‌ناپذیر» است! بعد از شرد شدن، بازگشت به تک‌دیتابیس تقریباً غیرممکن. با طراحی کلید درست از روز اول شروع کنید.

جمع‌بندی

این مبحث بخشی از دوره آموزش کامل طراحی سیستم (System Design) است.

ابزارهای مرتبط