Sharding یا شاردینگ یعنی تقسیم افقی رکوردهای یک مجموعه داده میان چند دیتابیس یا گره مستقل. در یک فروشگاه با چند میلیون مشتری، میتوان سفارشهای هر مشتری را در شاردی نگهداری کرد که از روی شناسه مشتری تعیین میشود. هدف ممکن است افزایش ظرفیت ذخیرهسازی، توزیع بار خواندن و نوشتن یا مدیریت رشد داده باشد.
پارتیشنبندی با شاردینگ چه تفاوتی دارد؟
در پارتیشنبندی، داده به چند قسمت تقسیم میشود ولی ممکن است تمام قسمتها در یک سرور و یک دیتابیس باشند. در شاردینگ معمولاً قسمتها روی منابع مستقل توزیع میشوند. Replication هم نسخههای مشابه داده میسازد و معادل شاردینگ نیست.
روشهای رایج شاردینگ
| روش | تقسیم داده | مزیت | ریسک |
|---|---|---|---|
| Range | شناسه ۱ تا ۱۰۰ هزار روی شارد A و بقیه روی B | کوئری بازهای مناسب | Hotspot در داده مرتب |
| Hash | هش کلید شارد برای توزیع | توزیع نسبتاً یکنواختتر | جابجایی داده هنگام تغییر تعداد شاردها |
| Directory-based | نگاشت Tenant به شارد در جدول راهنما | تغییر محل یک مشتری سادهتر | نیاز به سرویس نگاشت قابل اعتماد |
| Geographic | منطقه یا کشور مشتری | نزدیکی داده به کاربران | توزیع نامتوازن و محدودیت انتقال داده |
مثال ساده تعیین شارد با پایتون
SHARDS = ("orders_east", "orders_west", "orders_central")
def shard_for_customer(customer_id: int) -> str:
return SHARDS[customer_id % len(SHARDS)]
print(shard_for_customer(1538))
این تابع صرفاً نحوه مسیریابی را نشان میدهد. در Production استفاده از باقیمانده تقسیم مستقیم ممکن است هنگام افزایش تعداد شاردها باعث جابهجایی گسترده رکوردها شود. Consistent Hashing و سرویس نگاشت، دو راه برای مدیریت بهتر این مسئله هستند.
کوئری تکشاردی و چندشاردی
-- The router already selected the shard using customer_id.
SELECT id, total, status
FROM orders
WHERE customer_id = 1538
ORDER BY created_at DESC
LIMIT 20;
اگر کلید شارد در کوئری معلوم باشد، مسیریاب معمولاً فقط یک شارد را بررسی میکند. اما گزارش مجموع فروش تمام مشتریان نیازمند اجرای کوئری روی چند شارد و ادغام نتیجه است. Join بینشاردی، حفظ Referential Integrity سراسری و تراکنش چندشاردی هزینه زیادی دارند.
چه وقت شاردینگ انتخاب بدی است؟
اگر مشکل اصلی یک کوئری بدون ایندکس باشد، شاردینگ جایگزین بهینهسازی کوئری نیست. قبل از آن ایندکس، Replication، پارتیشنبندی و آرشیو داده را بسنجید. معیار تصمیم باید ظرفیت واقعی، نرخ رشد و محدودیت یک گره باشد.
کلید شارد را با دقت انتخاب کنید
انتخاب یک شناسه با توزیع بسیار نامتوازن ممکن است تمام درخواستها را روی یک شارد داغ جمع کند. پیش از طراحی، توزیع داده و الگوی Queryها را اندازهگیری کنید.
اصطلاحات فنی: پارتیشنبندی، ایندکسینگ، سیستم توزیعشده، رپلیکیشن.
منبع آموزشی: راهنمای دیتابیس توزیعشده AWS.