Shard
شاردینگ چیه؟ اصلاً چرا شاردینگ کنیم؟!
وقتی دیتابیسمون بزرگ میشه و دیگه یه دونه سرور جوابگو نیست، باید دیتا رو بین چند تا دیتابیس یا حتی جدول تقسیم کنیم. این میشه همون شاردینگ. حالا بیایم ببینبم روشهاش چیه ---
-
بر اساس رنج (Range-Based) مثلاً دیتا رو بر اساس بازهی آیدی کاربرها تقسیم کنیم: شارد ۱: کاربرهای ۱ تا ۱۰۰۰۰ شارد ۲: کاربرهای ۱۰۰۰۱ تا ۲۰۰۰۰ راحت و سادهست، ولی اگه یه بازه خیلی شلوغ باشه، دیتابیس کلافه میشه!
-
بر اساس هش (Hash-Based) بیا یه فرمول ساده بذاریم:
userID % تعداد شاردها
= شماره شارد اینطوری دیتا تقریباً یکنواخت پخش میشه. ولی اگه یه شارد اضافه یا کم کنیم، کل دیتارو باید دوباره بچینیم. -
بر اساس جغرافیا (Geographic) دیتای هر منطقه رو تو یه شارد بذاریم. مثلاً: شارد ۱: آمریکا شارد ۲: اروپا ولی اگه یه منطقه مثل هند خیلی شلوغ بشه، چی؟!
-
زمانی (Time-Based) دیتا رو بر اساس زمان تقسیم کنیم. مثلاً: شارد ۱: دیتاهای سال ۲۰۲۴ شارد ۲: دیتاهای سال ۲۰۲۵ این عالیه برای لاگها یا دیتاهای تاریخدار، ولی دیتاهای قدیمی رو کمتر کسی میخواد.
انتخاب shard key
البته البته، انتخاب Shard Key درست یکی از مهمترین قدمها توی طراحی دیتابیس مقیاسپذیره! اگه شارد کی اشتباهی انتخاب نکنیم، سیستم میتونه خیلی زود دچار مشکلاتی مثل hotspot یا عدم تعادل در شاردها بشه.
-
کاردینالیته بالا! شارد کی که انتخاب میکنیم باید کاردینالیته بالا داشته باشه. یعنی تعداد مقادیر ممکن باید زیاد باشه تا بتونیم دادهها رو به خوبی بین شاردها تقسیم کنیم. مثلاً یه فیلد booleanخیلی محدود میشه و تعداد شاردها رو به دو تا میرسونه. انتخابهای بهتر مثل userID یا timestamp میتونن کار رو بهتر انجام بدن.
-
توزیع یکنواخت (Frequency) توی انتخاب شارد کی باید مطمئن بشیم که دادهها به طور یکنواخت پخش بشن. مثلاً اگه از سن به عنوان شارد کی استفاده کنیم، ممکنه همه دادهها توی رنج سنی ۳۰ تا ۴۵ جمع بشه و یه شارد شلوغ بشه! پس بهتره از یه شارد کی استفاده کنیم که دادهها توش پخش شده باشن.
-
تغییرات یکنواخت (Monotonic Change) اگه شارد کی یه ویژگی تغییر یکنواخت داشته باشه، مثلاً timestamp که همیشه بیشتر میشه، ممکنه همش دادههای جدید تو یه شارد بریزه. این کار میتونه باعث بشه یه شارد سنگین بشه و بقیه شاردها خالی بمونن. راهحل اینه که شارد کی رو با یه فیلد دیگه ترکیب کنیم.
توی شاردینگ مانیتورینگ هم مهمه علتش اینه که دیتابیس یه موجودیت ثابت نیست و همه اش در حال تغییره باید حواسمون باشه که در طول زمان یه شاردمون بیشتر از همه بار روش نباشه. که اگه بود باید یه rebalancing اتفاق بیافته.
فرق شارد و پارتیشن چیه پارتیشن توی یک دیتابیس و یک سرور جداسازی اتفاق میفته ولی شارد توی چندتا سروره. توی پارتشین اسم جدوال تقسیم شدمون هم عوض میشه [[Partitioning#فرق پارتیشنبندی با شاردینگ (Sharding)]]