الطلب الواحد بيبقى كام بحث صغير
لما المنتجات تبقى عشرات الملايين، إندكس واحد على آلة واحدة له سقف: ديسك، RAM، ووقت البحث. Elasticsearch يقسّم الإندكس لـ shards. كل shard قطعة من المستندات، وفهرسها لوحدها (جوه Lucene). القطع تتوزع على nodes جوه cluster.
طلب البحث يوصل لـ node تنسّق: تبعت السؤال للشاردز، كل shard ترجّع أحسن نتايجها، والمنسّق يدمجها ويرتّبها ويرد لك صفحة واحدة.
- Express ← Node منسّق: search
- Node منسّق ← Shard 0: دور
- Node منسّق ← Shard 1: دور
- Node منسّق ← Shard 2: دور
ده horizontal scaling: تضيف آلة للـ cluster بدل ما تكبّر سيرفر واحد للأبد. البحث لسه نفس الـ API من ناحية Express. التوزيع جوه Elasticsearch.
الـ Replica نسخة حية مش باك أب على الرف
Replica shard نسخة من shard أساسي على node تانية. لو آلة وقعت، النسخة تتقدّم ويكمّل البحث. والنسخ كمان تقدر ترد على البحث، فالقراءة بتتوسع مش بس الأمان.
الكتابة بتعدي على الـ primary وبعدين تتطبق على النسخ. تقدر تزود عدد النسخ وانت شغال. عدد الـ primary shards أصعب يتغير بعد ما الإندكس اتخلق: غالبًا بتعمل إندكس جديد وتنقل الداتا. من Elasticsearch 7 الافتراضي بقى shard أساسية واحدة مش خمس، عشان الناس كانت بتفتح شاردز زيادة من أول يوم.
بتستقبل الكتابة. عددها قرار وأنت بتعمل الإندكس، وبيتوزع المستندات عليها.
بتقرأ وبتستنى مكان الـ primary لو وقعت. متقدرش تتحط على نفس الـ node بتاعة أصلها.
أكتر shards مش معناها أسرع
كل shard ليها تكلفة: ذاكرة، ملفات، وحمل على الـ cluster حتى لو فاضية. عشر شاردز على داتا تدخل في واحدة بيبطّأوا التنسيق من غير ما يسرّعوا البحث.
قاعدة تخطيط مش قانون: كتير من التشغيل بيستهدف حجم shard في حدود عشرات الجيجا، مش مئات الميجا ولا مئات الجيجا. قيس على منتجاتك. مستند المنتج فيه نص ومواصفات، فحجمه غير لوج صغير. راجع دليل الحجم الحالي قبل ما تثبت الرقم في الإنتاج.
في التطوير، shard واحدة على Docker كفاية للأمثلة. متصممش cluster الإنتاج على إعداد اللابتوب.
🧪 Lab
من غير ما تبني تلات آلات، اسأل الإندكس عن شكله:
curl -s localhost:9200/_cat/shards/products?v
هتشوف اسم الشارد، أهي primary ولا replica، وأنهي node. بعدين من إعدادات الإندكس غيّر عدد النسخ لصفر وارجعه لواحد (لو عندك node واحدة، النسخة هتفضل unassigned وده متوقع). الكتابة والقراءة لسه شغالين على الـ primary.