بازگشت به کتابخانهکتابخانه3.4Sharding و Consistent Hashing
طراحی سیستم نرم‌افزاریSYSTEM DESIGNاز صفر تا تسلط
v1.0.0
01مبانی و تصویر بزرگ
02Scalability و ظرفیت
03لایه داده
04Cache، Queue و جریان
05معماری نرم‌افزار
06قابلیت اطمینان و عملیات
07متد طراحی
08Case Study های واقعی
09سیستم‌های توزیع‌شده عمیق
10مهندسی تولید: داده، امنیت و کارایی
11تمرین پیشرفته و کیس‌استادی‌های مکمل
12زیر کاپوت دیتابیس و معماری داده
13وب بلادرنگ و پروتکل‌های مدرن
14سیستم‌های توزیع‌شده پیشرفته
15SaaS ،SRE ،امنیت و شبکه پیشرفته
16طراحی سیستم در عصر AI
17Case Study های تکمیلی
LESSON 3.4فصل ۳لایه داده

Sharding و Consistent Hashing

  • ~۱۲ دقیقه
  • ۴ پرسش
  • متن را انتخاب کن تا هایلایت شود

انبار فروشگاه پر شده. ساختمان دوم اجاره می‌کنی و جنس را تقسیم می‌کنی: هر ساختمان مالک بخشی از کالاست. سؤال حیاتی: این جعبه به کدام ساختمان برود؟ در دیتابیس به این تقسیم می‌گویند Sharding.

وقتی داده یا نرخ نوشتن از توان یک ماشین گذشت، هر Shard برشی از داده را برمی‌دارد. انتخاب کلید، سرنوشت کوئری‌ها را تعیین می‌کند. کلید بد یعنی یا یک ساختمان داغ می‌شود، یا هر سؤال باید به همه ساختمان‌ها برود.

انبار پر و تقسیم جعبه بین ساختمان‌ها
انبار اول جا ندارد؛ مسئول با دفترچه جعبه را به ساختمان درست می‌فرستد. Sharding یعنی تکه کردن مالکیت، نه فقط قفسه بیشتر در همان سقف.

جعبه به کدام ساختمان؟

سه استراتژی رایج است. هر کدام یک شغل دارد و یک درد.

استراتژیروشقوتضعف
RangeA–M به Shard 1، N–Z به Shard 2کوئری بازه‌ای عالیHot Spot: داده‌های جدید یا محبوب یک‌جا جمع می‌شوند
Hashhash(key) % Nتوزیع یکنواختکوئری بازه‌ای سخت؛ عوض کردن N فاجعه است
Geo / Entityهر منطقه یا مشتری در Shard خودشداده نزدیک کاربر، ایزولهعدم توازن مناطق

مشکل hash % N و راه‌حلش

با hash(key) % 4، افزودن سرور پنجم یعنی تقریباً همه کلیدها جابه‌جا شوند — یک شب کابوس. Consistent Hashing حلش می‌کند: سرورها و کلیدها روی یک حلقه می‌نشینند؛ هر کلید به اولین سرور در جهت عقربه‌ها می‌رود. افزودن یا حذف یک سرور فقط همسایه‌هایش را جابه‌جا می‌کند — حدود 1/N داده. با Virtual Node — هر سرور فیزیکی صدها نقطه روی حلقه — توزیع هم یکنواخت می‌شود.

DIAGRAMحلقه Consistent Hashing
key "user:81" → hash
حلقه 0..2³²
نزدیک‌ترین Node در جهت حرکت

دردسرهای Sharding

تکه کردن انبار، پیچیدگی را برای همیشه به سیستم اضافه می‌کند. این سه تا را از روز اول ببین.

  • Hot Key / Celebrity: پست یک سلبریتی همه ترافیک را به یک Shard می‌ریزد. Cache جلوی آن، یا شکستن کلید — key#1 تا key#10.
  • کوئری بین‌-ShardJOIN سراسری، تراکنش سراسری — گران است. کلید را طوری انتخاب کن که ۹۵٪ کوئری‌ها تک‌Shard باشند. برای داده کاربری معمولاً user_id.
  • Rebalancing باید تدریجی و آنلاین باشد. ابزار مدرن — Vitess، Citus، خود Cassandra — همین را می‌دهد؛ جابه‌جایی یک‌شبه نه.

به زبان ساده

Sharding یعنی انبار را بین چند ساختمان تقسیم کنی؛ کلید تقسیم باید با سؤال رایج جور باشد.

مثال واقعی

پیام‌های یک گفتگو را با conversation_id روی یک Shard می‌گذاری تا تاریخچه تک‌ساختمانی بماند.

دانش‌سنجی

آزمون درس

۴ Q
01
مشکل اصلی hash(key) % N برای انتخاب Shard؟
02
Range Sharding روی created_at برای پیام‌ها چه مشکلی می‌سازد؟
03
Virtual Node ها برای چه‌اند؟
04
بهترین دفاع در برابر Hot Key سلبریتی؟