الأساسيات · فصل ٥

Consistent Hashing

Hash ring · virtual nodes · cache misses
🎯 الهدف: توزّع المفاتيح على السيرفرات، ولما سيرفر يقع جزء صغير بس من المفاتيح هو اللي يتنقل.

المشكلة: hash % n

لو بتوزع الداتا على السيرفرات بـ serverIndex = hash(key) % N، كله تمام لحد ما سيرفر يتضاف أو يقع. ساعتها N بتتغير، وأغلب المفاتيح تروح لسيرفر تاني — cache misses بالجملة.

الحل: الدايرة

  1. تخيّل كل قيم الـ hash على دايرة.
  2. حط السيرفرات على الدايرة حسب hash بتاعهم.
  3. كل key يمشي مع عقارب الساعة لحد أول سيرفر يقابله.

المكسب: سيرفر اتضاف أو اتشال؟ جزء صغير بس من المفاتيح هو اللي بيتنقل — اللي بين السيرفر ده واللي قبله.

Virtual Nodes

كل سيرفر حقيقي يتمثّل بـ كذا نقطة وهمية على الدايرة (مثلًا ١٠٠–٢٠٠). كل ما عدد النقط يزيد، كل ما التوزيع يبقى أعدل — بس محتاج مساحة أكتر عشان تخزن بيانات النقط. تضبط العدد حسب احتياجك.

Checklist الدايرة

🧠 اختبر نفسك
١) عندك ١٠ سيرفرات وبتستخدم hash % 10. ضفت سيرفر. تقريبًا كام مفتاح هيتنقل؟
أغلب المفاتيح، لأن باقي القسمة اتغير لكل المفاتيح تقريبًا.
٢) في الـ consistent hashing، سيرفر وقع. أنهي مفاتيح بتتنقل؟
المفاتيح اللي كانت ماشية عليه بس — الحتة اللي بينه وبين السيرفر اللي قبله.
٣) ليه virtual nodes؟
عشان التوزيع يبقى أعدل، ووقوع سيرفر يوزّع حمله على الكل مش على جاره بس.
٤) زوّدت عدد الـ virtual nodes من ١٠ لـ ٥٠٠. إيه الـ tradeoff؟
توزيع أعدل، مقابل ميموري أكتر لتخزين النقط.