الوحدة 2 — المفاهيم الأساسيّة لـElasticsearch: cluster وnœud وindex وshard وdocument
الحقيبة تعمل، وKibana يستجيب. قبل فهرسة مقال واحد، تريد Inès أن يعرف Sami قراءة cluster: كم عقدة، وكم فهرسًا، وكم shard، وأيّ لون، ولماذا. هذه الوحدة تُقدّم القاموس الأدنى الذي يجعل نصف رسائل الخطأ في بقيّة الدّورة بديهيًّا.
القاموس، بترتيب لقائنا به
يعرض Elasticsearch مفاهيمه بتداخلات متتالية. نأخذها من الأعلى نحو الأسفل.
Cluster
Cluster هو مجموعة من خادم واحد أو أكثر يُعلنون انتماءهم إلى المجموعة نفسها. يُسمّى cluster لدينا veille — تقرؤه في docker-compose.yml تحت cluster.name=veille. لكلّ cluster اسم، وصحّة (green أو yellow أو red)، وإصدار، وهو يمتلك جماعيًّا كلّ البيانات.
Nœud
Nœud هو عمليّة Elasticsearch تعمل على خادم انضمّت إلى cluster. تُشغّل الحقيبة عقدة وحيدة، veille-es، في وضع discovery.type=single-node. في الإنتاج، cluster من ثلاث عقد أو أكثر هو القاعدة، لكنّ عقدة وحيدة تكفي تمامًا لاستكشاف المفاهيم ومعالجة 200 853 مقالًا من الكوربوس.
Index
Index هو التّجميع المنطقيّ للمستندات من نوع واحد — مقالات News لدينا تُشكّل الفهرس news. يعرض كلّ فهرس كتلتَين من الإعداد: settings (عدد shards، وعدد replicas، والمحلّلات) وmapping (الحقول ونوعها وخياراتها). ثمّ يعيش الفهرس في shard واحد أو أكثر ماديًّا.
Shard وréplique
Shard هو تقسيم Lucene لفهرس. تُوزَّع مستندات الفهرس بين shards بحساب هاش _id. كلّ shard هو محرّك Lucene كامل ومستقلّ، قادر على استيعاب عدد كبير من المستندات وخدمة الاستعلامات.
Réplique هي نسخة من shard رئيسيّ، مُوضَعة على عقدة أخرى. تخدم غرضَين: تحمّل فقدان عقدة (تَوفّر عالٍ)، واستيعاب حركة القراءة. صفر réplique لا معنى له إلّا في ورشة — عقدة وحيدة لا يمكنها على أيّ حال أن تستضيف نسخة عن shard نفسها. هذه هي حالة الحقيبة.
Document
Document هو كائن JSON مُخزَّن في فهرس. له معرِّف _id (تُقدّمه أنت أو يُولَّد)، و_source (الـJSON كما أرسلتَه)، وبيانات وصفيّة للإصدار (_seq_no، _primary_term). مقال News هو مستند.
المقابلة الذّهنيّة مع العالم العلائقيّ
يُساعد الجدول التّالي، شرط ألّا نتمسّك به: Elasticsearch ليس قاعدة علائقيّة وهذه المكافئات تقريبيّة.
| Elasticsearch | العلائقيّ (تقريبيّ) |
|---|---|
| Cluster | خادم SGBD |
| Nœud | مثيل |
| Index | جدول |
| Shard | تقسيم لجدول |
| Document | س طر |
| حقل | عمود |
_id | مفتاح رئيسيّ |
| Mapping | مخطّط (CREATE TABLE) |
لا يوجد مكافئ في Elasticsearch لـJOIN. الحقل nested (لمحة في الوحدة 4) يسمح بالكائنات المتضمَّنة، لكنّنا لا نربط فهرسَين بمفتاح خارجيّ. هذا خيار: يجب أن يستطيع كلّ shard الرّدّ لوحده حتّى يبقى سريعًا. إن كنت تحتاج إلى علاقات، فذلك من نصيب Neo4j (الوحدات 10 إلى 12).
النّظر إلى cluster
افتح Kibana Dev Tools (Management → Dev Tools). كلّ الاستعلامات أدناه تُلصَق مباشرة في وحدة التّحكّم اليسرى؛ اختصار Ctrl-Entrée (Cmd-Entrée على macOS) يُنفّذها.
GET / — العقدة تُقدّم نفسها
GET /
تحصل على اسم العقدة (veille-es)، واسم cluster (veille)، وإصدار Elasticsearch (9.5.3)، وإصدار Lucene، ومعرِّف UUID الخاصّ بـcluster. هذه هي أقصر نسخة من « أنا حيّ، وأستجيب، وها أنا ».
GET /_cluster/health — النّبض
GET /_cluster/health
مخرج نموذجيّ على حقيبتنا:
{
"cluster_name": "veille",
"status": "green",
"number_of_nodes": 1,
"number_of_data_nodes": 1,
"active_primary_shards": 1,
"active_shards": 1,
"relocating_shards": 0,
"initializing_shards": 0,
"unassigned_shards": 0
}
يأخذ الحقل status ثلاث قيم:
- green: كلّ shards الرّئيسيّة وكلّ replicas مُسنَدة.
- yellow: كلّ الرّئيسيّة مُسنَدة، لكنّ ريبليكا واحدة على الأقلّ ناقصة.
- red: shard رئيسيّ واحد على الأقلّ غير مُسنَد — مستندات لا يمكن الوصول إليها.
الحقيبة green لأنّ الفهرس news أُنشئ بـnumber_of_replicas: 0: لا توجد ريبليكا لوضعها، فلا شيء ناقص. كثير من الدّروس تنطلق بالمعامل الافتراضيّ لريبليكا واحدة وتعرض yellow — فيتساءل Sami حينها عمّا كسره. الجواب: لا شيء، فالعقدة الوحيدة لا يمكنها ببساطة استضافة نسخة عن shard الرّئيسيّ الخاصّ بها.
GET /_cat/nodes?v — مَن يُشكّل cluster
./lab.sh es _cat/nodes?v
أو في Dev Tools:
GET /_cat/nodes?v
ترى عقدة وحيدة، veille-es، وعنوان IP الدّاخليّ لها، ونسبة الذّاكرة وheap المستهلَكَة، وحملها ودورها (cdfhilmrstw: العقدة تفعل كلّ شيء في الوقت نفسه — طبيعيّ في single-node).