Skip to main content
يوفّر محرّكا قواعد البيانات Remote وRemoteSecure وصولًا فوريًا إلى جداول قاعدة بيانات على خادم ClickHouse بعيد عبر بروتوكول TCP الأصلي. وهما نظيرا ClickHouse إلى ClickHouse لمحرّكي قواعد البيانات MySQL وPostgreSQL. تُجلب قائمة الجداول وبنيتها من الخادم البعيد عند الطلب (باستخدام SHOW TABLES وDESCRIBE TABLE داخليًا)، لذا تعكس قاعدة البيانات دائمًا الحالة الحالية للخادم البعيد. يُتاح كل جدول كوحدة تخزين Distributed عبر عنقود مخصّص يُنشأ من العناوين المقدَّمة، ويوجّه استعلامات SELECT وINSERT إلى الخادم البعيد. يفيد ذلك في ربط عدة عناقيد ClickHouse معًا أو في توصيل عنقود ClickHouse أكبر بـ clickhouse-local أو بعنقود أصغر.

إنشاء قاعدة بيانات

يتصل Remote عبر منفذ TCP غير المشفّر (tcp_port، وهو 9000 افتراضيًا) عند عدم تحديد المنفذ.
معلمات المحرك
  • addresses_expr — عنوان خادم بعيد أو تعبير يُنشئ عدة عناوين، بصيغة host أو host:port. يدعم تعبير العنوان أنماط التوسيع نفسها التي تدعمها دالة الجدول remote (مثل {a,b,c} و{N..M} و{a|b} للتوسيع إلى عدة شرائح ونسخ متماثلة). عند عدم تحديد المنفذ، يستخدم Remote منفذ TCP غير المشفّر (tcp_port، وهو 9000 افتراضيًا)، بينما يستخدم RemoteSecure منفذ TCP الآمن (tcp_port_secure، وهو 9440 افتراضيًا).
  • database — اسم قاعدة البيانات على الخادم البعيد.
  • user — اسم المستخدم البعيد. اختياري؛ الافتراضي: default.
  • password — كلمة مرور المستخدم البعيد. اختياري؛ الافتراضي: فارغ.
تُخزَّن العناوين وبيانات الاعتماد في تعريف قاعدة البيانات، لذا تُخفى كلمة المرور في SHOW CREATE DATABASE. وكما هو الحال مع دالة الجدول remote، يُعامل العنوان الذي يشير إلى الخادم الحالي كشريحة محلية: يُنفَّذ SELECT وINSERT مباشرةً باسم المستخدم الحالي — الذي يحتاج بالتالي إلى الامتيازات المناسبة على قاعدة البيانات الأساسية وجداولها — ولا تُستخدم بيانات الاعتماد المخزنة إلا للخوادم البعيدة فعليًا. إذا لم تكن النسخة المتماثلة المحلية لشريحة ما تحتوي على قاعدة البيانات أو أحد الجداول، يعود البحث إلى النسخ المتماثلة البعيدة للشريحة، كما يفعل جدول Distributed. في هذه الحالة، يعرض SHOW CREATE TABLE عناوين الرجوع الفعلية (بعد إزالة النسخ المتماثلة المحلية من شرائحها) بدلًا من العناوين المُهيَّأة، بحيث يعيد تعريف الجدول Remote(...) الناتج إنشاء الكائن الذي يخدم الاستعلامات فعليًا. عندما يصف تعبير العنوان عدة شرائح، يقرأ كل جدول وكيل من جميعها، لكن البيانات الوصفية — قائمة الجداول وبنيتها — تُؤخذ من شريحة عشوائية (مع تفضيل الشريحة المحلية)، تمامًا كما تفعل دالة الجدول remote، بحيث يتطلب عرض القائمة استعلامًا واحدًا بدلًا من استعلام لكل شريحة. لذلك، يُتوقع أن تخدم شرائح العنقود المجموعة نفسها من الجداول؛ أما الجدول الموجود في بعض هذه الشرائح فقط، فيخدمه وكيل تفشل استعلاماته على الشرائح التي لا تحتويه. يرسل INSERT إلى جدول في قاعدة بيانات متعددة الشرائح كل صف إلى شريحة عشوائية (تحمل جداول Distributed الوكيلة مفتاح تقسيم rand() ضمنيًا)؛ ولتثبيت الشريحة لاستعلام ما، عيّن insert_shard_id. لا يوزع المفتاح الضمني سوى الصفوف المُدرجة؛ أما عند القراءة، فيتصرف الجدول كجدول Distributed بلا مفتاح تقسيم (وبالأخص، لا يعامل optimize_skip_unused_shards وforce_optimize_skip_unused_shards هذا المفتاح كمفتاح لتقليم الشرائح). يتضمن SHOW CREATE TABLE المفتاح في تعريف الجدول Remote(...) الناتج، لذا يقبل الجدول المُعاد إنشاؤه منه أيضًا استعلامات INSERT متعددة الشرائح. المجموعات المسماة مدعومة أيضًا:

ملاحظات

  • المحرك عبارة عن عرض قراءة مباشر للخادم البعيد: لا تُدعم تعليمات DDL مثل CREATE TABLE وDROP TABLE وALTER وما شابهها على قاعدة البيانات Remote. أدِر المخطط مباشرةً على الخادم البعيد.
  • تُطبَّق حقوق الوصول على الخادم البعيد للمستخدم البعيد المُهيأ، ومحليًا عبر الامتيازات المعتادة على قاعدة البيانات وجداولها.
  • يُبلَّغ عن جدول في شريحة محلية لا يُسمح للمستخدم برؤيته باعتباره مفقودًا لا محظورًا، لذا لا يمكن استخدام قاعدة بيانات Remote لاستقصاء أسماء جداول قاعدة بيانات محلية لا يملك المستخدم امتيازات عليها. ينطبق ذلك على سرد الجداول (SHOW TABLES، EXISTS TABLE) وكذلك على تحليلها (DESCRIBE TABLE، SHOW CREATE TABLE، SELECT)، ولا يُتاح هذا الجدول أيضًا عبر النسخ المتماثلة البعيدة لـ شريحة الخاص به: لا يحدث الرجوع الاحتياطي الموضح أعلاه إلا عندما لا تحتوي النسخة المتماثلة المحلية على الجدول فعلًا.
  • يشمل سرد جداول قاعدة بيانات موجودة على النسخة المتماثلة المحلية لـ شريحة أيضًا الجداول الموجودة فقط لدى النسخ المتماثلة البعيدة لذلك شريحة، بحيث يتوافق SHOW TABLES وsystem.tables مع EXISTS TABLE وDESCRIBE TABLE وSELECT، التي تلجأ احتياطيًا إلى تلك النسخ. وعندما لا تستجيب أي من النسخ المتماثلة البعيدة، تُعاد قائمة النسخة المتماثلة المحلية كما هي، لأنها تمثل بالفعل استجابة نسخة متماثلة متاحة.
  • إذا كان الخادم البعيد غير متاح، فإن سرد جداوله (SHOW TABLES، system.tables) يُظهر خطأ الاتصال بدلًا من قائمة جداول فارغة، تمامًا كما يفعل EXISTS TABLE وSELECT على قاعدة البيانات نفسها. لاحظ أن تنفيذ SELECT على system.tables ليشمل جميع قواعد البيانات يفشل أيضًا ما دامت قاعدة بيانات كهذه يتعذر الوصول إليها.
  • قد تشير قاعدة بيانات Remote إلى قاعدة بيانات Remote أخرى على الخادم نفسه. لا يتطلب سرد جداول هذه السلسلة ووصفها امتيازات على قاعدة البيانات الوسيطة، إذ لا تحتفظ ببيانات أو بيانات وصفية خاصة بها، كما أن كل قفزة تتحقق أصلًا من حقوق المستدعي على الكائنات التي توكلها بدورها. أما قراءة البيانات وكتابتها فتتطلب SELECT / INSERT في كل قفزة من السلسلة، لأن الاستعلام يُنفَّذ فعليًا على جدول قاعدة البيانات الوسيطة، تمامًا كما في جدول Distributed فوق جدول Distributed آخر. وتبقى قاعدة الرؤية الموضحة أعلاه سارية عبر السلسلة: فالجدول الذي تخفيه قاعدة البيانات الوسيطة عن المستدعي لا يُتاح أيضًا عبر النسخ المتماثلة البعيدة لقاعدة البيانات الخارجية. وإذا تعذر على قاعدة البيانات الوسيطة في النسخة المتماثلة المحلية الوصول إلى هدفها، فلن تتمكن النسخة المتماثلة المحلية لـ شريحة الخارجي من الاستجابة إطلاقًا، تمامًا كما لو كانت النسخة المتماثلة نفسها متوقفة، وعندها تلجأ قاعدة البيانات الخارجية احتياطيًا إلى النسخ المتماثلة البعيدة لـ شريحة.

مثال

أنشئ قاعدة بيانات Remote تشير إلى قاعدة بيانات system على خادم بعيد، ثم اقرأ منها:
آخر تعديل في ١٤ أغسطس ٢٠٢٦