المعمارية · فصل ٧

Shards و Replicas لما العدد يكبر

Shards · replicas · cluster · horizontal scaling
🎯 الهدف: تفهم إزاي البحث بيتقسم على أجزاء الإندكس، وليه تزود الشاردز مش زرار سرعة.

الطلب الواحد بيبقى كام بحث صغير

لما المنتجات تبقى عشرات الملايين، إندكس واحد على آلة واحدة له سقف: ديسك، RAM، ووقت البحث. Elasticsearch يقسّم الإندكس لـ shards. كل shard قطعة من المستندات، وفهرسها لوحدها (جوه Lucene). القطع تتوزع على nodes جوه cluster.

طلب البحث يوصل لـ node تنسّق: تبعت السؤال للشاردز، كل shard ترجّع أحسن نتايجها، والمنسّق يدمجها ويرتّبها ويرد لك صفحة واحدة.

طلب واحد يتوزع وبعدين النتائج تتلم
  1. Express ← Node منسّق: search
  2. Node منسّق ← Shard 0: دور
  3. Node منسّق ← Shard 1: دور
  4. Node منسّق ← Shard 2: دور

ده horizontal scaling: تضيف آلة للـ cluster بدل ما تكبّر سيرفر واحد للأبد. البحث لسه نفس الـ API من ناحية Express. التوزيع جوه Elasticsearch.

الـ Replica نسخة حية مش باك أب على الرف

Replica shard نسخة من shard أساسي على node تانية. لو آلة وقعت، النسخة تتقدّم ويكمّل البحث. والنسخ كمان تقدر ترد على البحث، فالقراءة بتتوسع مش بس الأمان.

الكتابة بتعدي على الـ primary وبعدين تتطبق على النسخ. تقدر تزود عدد النسخ وانت شغال. عدد الـ primary shards أصعب يتغير بعد ما الإندكس اتخلق: غالبًا بتعمل إندكس جديد وتنقل الداتا. من Elasticsearch 7 الافتراضي بقى shard أساسية واحدة مش خمس، عشان الناس كانت بتفتح شاردز زيادة من أول يوم.

Primary

بتستقبل الكتابة. عددها قرار وأنت بتعمل الإندكس، وبيتوزع المستندات عليها.

Replica

بتقرأ وبتستنى مكان الـ primary لو وقعت. متقدرش تتحط على نفس الـ node بتاعة أصلها.

أكتر shards مش معناها أسرع

كل shard ليها تكلفة: ذاكرة، ملفات، وحمل على الـ cluster حتى لو فاضية. عشر شاردز على داتا تدخل في واحدة بيبطّأوا التنسيق من غير ما يسرّعوا البحث.

قاعدة تخطيط مش قانون: كتير من التشغيل بيستهدف حجم shard في حدود عشرات الجيجا، مش مئات الميجا ولا مئات الجيجا. قيس على منتجاتك. مستند المنتج فيه نص ومواصفات، فحجمه غير لوج صغير. راجع دليل الحجم الحالي قبل ما تثبت الرقم في الإنتاج.

في التطوير، shard واحدة على Docker كفاية للأمثلة. متصممش cluster الإنتاج على إعداد اللابتوب.

🧪 Lab

من غير ما تبني تلات آلات، اسأل الإندكس عن شكله:

curl -s localhost:9200/_cat/shards/products?v

هتشوف اسم الشارد، أهي primary ولا replica، وأنهي node. بعدين من إعدادات الإندكس غيّر عدد النسخ لصفر وارجعه لواحد (لو عندك node واحدة، النسخة هتفضل unassigned وده متوقع). الكتابة والقراءة لسه شغالين على الـ primary.

✅ الخلاصة — Checklist

🧠 اختبر نفسك
١) طلب البحث بيعدّي على shard واحدة ولا على أجزاء الإندكس؟
على الشاردز بتاعة الإندكس، وبعدين node منسّق تدمج الـ top hits.
٢) الـ replica بتفيد في إيه غير لو آلة وقعت؟
تقدر ترد على طلبات البحث، فالقراءة بتتوسع.
٣) ليه عشرين shard على إندكس صغير قرار وحش؟
كل shard ليها تكلفة ذاكرة وتنسيق، والندرة في BM25 بتتقطع معاها.