Skip to main content
يمكنك إدراج البيانات من S3 إلى ClickHouse، كما يمكنك استخدام S3 أيضًا كوجهة للتصدير، مما يتيح التفاعل مع معماريات “بحيرة البيانات”. علاوة على ذلك، يمكن أن يوفّر S3 طبقات تخزين “باردة” ويساعد في فصل التخزين عن موارد المعالجة. في الأقسام التالية، نستخدم مجموعة بيانات سيارات الأجرة في مدينة نيويورك لشرح عملية نقل البيانات بين S3 وClickHouse، بالإضافة إلى تحديد معلمات التكوين الرئيسية وتقديم إرشادات لتحسين الأداء.

دوال الجداول S3

تتيح لك دالة الجدول s3 قراءة الملفات وكتابتها من وإلى وحدات تخزين متوافقة مع S3. والصيغة العامة لهذا التركيب هي:
حيث:
  • path — ‏Bucket URL يتضمّن مسار الملف. يدعم هذا محارف البدل التالية في وضع القراءة فقط: *، ?، {abc,def} و {N..M}، حيث إن N و M أرقام، و'abc' و'def' سلاسل نصية. لمزيد من المعلومات، راجع الوثائق حول استخدام محارف البدل في المسار.
  • format — ‏التنسيق الخاص بالملف.
  • structure — بنية الجدول. التنسيق: 'column1_name column1_type, column2_name column2_type, ...'.
  • compression — هذه المعلمة اختيارية. القيم المدعومة: none, gzip/gz, brotli/br, xz/LZMA, zstd/zst. بشكل افتراضي، يُكتشف الضغط تلقائيًا من امتداد الملف.
يتيح استخدام محارف البدل في تعبير المسار الإشارة إلى عدة ملفات، ويفسح المجال للمعالجة المتوازية.

التحضير

قبل إنشاء الجدول في ClickHouse، قد ترغب في إلقاء نظرة عن كثب على البيانات في حاوية S3. يمكنك فعل ذلك مباشرةً من ClickHouse باستخدام تعليمة DESCRIBE:
يجب أن يوضّح لك ناتج عبارة DESCRIBE TABLE كيف يستنتج ClickHouse هذه البيانات تلقائيًا كما تظهر في حاوية S3. لاحظ أنه يتعرّف أيضًا تلقائيًا على تنسيق الضغط gzip ويفك ضغطه:
للتفاعل مع مجموعة البيانات المستندة إلى S3، نُعِدّ جدول MergeTree قياسيًا ليكون وجهتنا. تُنشئ التعليمة أدناه جدولًا باسم trips في قاعدة البيانات default. لاحظ أننا اخترنا تعديل بعض أنواع البيانات هذه كما استُنتج أعلاه، ولا سيما عدم استخدام مُعدِّل نوع البيانات Nullable()، إذ قد يؤدي ذلك إلى تخزين بعض البيانات الإضافية غير الضرورية وإلى بعض العبء الإضافي على الأداء:
لاحظ استخدام التقسيم في الحقل pickup_date. عادةً ما يُستخدم مفتاح التقسيم لإدارة البيانات، لكننا سنستخدم هذا المفتاح لاحقًا لموازاة عمليات الكتابة إلى S3. يمثل كل سجل في مجموعة بيانات سيارات الأجرة لدينا رحلةَ سيارة أجرة. وهذه البيانات منزوعة الهوية، وتتكون من 20 مليون سجل مخزّنًا بشكل مضغوط في حاوية S3 ‏https://datasets-documentation.s3.eu-west-3.amazonaws.com/ ضمن المجلد nyc-taxi. البيانات بتنسيق TSV، وبمعدل يقارب مليون صف لكل ملف.

قراءة البيانات من S3

يمكننا تنفيذ استعلام على بيانات S3 كمصدر من دون الحاجة إلى تخزينها بشكل دائم في ClickHouse. في الاستعلام التالي، نأخذ عينة من 10 صفوف. لاحظ عدم وجود بيانات اعتماد هنا لأن الحاوية متاحة للعامة:
لاحظ أننا لا نحتاج إلى إدراج الأعمدة، لأن تنسيق TabSeparatedWithNames يتضمن أسماء الأعمدة في الصف الأول. أما التنسيقات الأخرى، مثل CSV أو TSV، فستُرجع لهذا الاستعلام أعمدة مُنشأة تلقائيًا، مثل c1 وc2 وc3 وما إلى ذلك. كما تدعم الاستعلامات الأعمدة الافتراضية، مثل _path و_file، والتي توفّر معلومات عن مسار الحاوية واسم الملف، على التوالي. على سبيل المثال:
تحقّق من عدد الصفوف في مجموعة البيانات النموذجية هذه. لاحظ استخدام محارف البدل لتوسيع الملفات، لذا نأخذ الملفات العشرين كلها في الاعتبار. سيستغرق هذا الاستعلام نحو 10 ثوانٍ، وذلك حسب عدد الأنوية في مثيل ClickHouse:
مع أن قراءة البيانات مباشرةً من S3 مفيدة لأخذ عينات من البيانات وتنفيذ استعلامات استكشافية مخصّصة، فإنها ليست شيئًا سترغب في فعله بانتظام. وعندما يحين وقت العمل الجاد، استورد البيانات إلى جدول من نوع MergeTree في ClickHouse.

استخدام clickhouse-local

يتيح لك برنامج clickhouse-local إجراء معالجة سريعة للملفات المحلية دون الحاجة إلى نشر ClickHouse server وتهيئته. ويمكن تنفيذ أي استعلامات تستخدم دالة الجدول s3 باستخدام هذه الأداة. على سبيل المثال:

إدراج البيانات من S3

للاستفادة من الإمكانات الكاملة لـ ClickHouse، ننتقل بعد ذلك إلى قراءة البيانات وإدراجها في مثيلنا. نستخدم الدالة s3 مع تعليمة INSERT بسيطة لتحقيق ذلك. لاحظ أنه لا يلزمنا سرد الأعمدة، لأن الجدول المستهدف يوفّر البنية المطلوبة. ويتطلب ذلك أن تظهر الأعمدة بالترتيب المحدد في عبارة DDL الخاصة بالجدول، إذ تُطابَق الأعمدة وفقًا لمواضعها في عبارة SELECT. وقد يستغرق إدراج جميع الصفوف البالغ عددها 10m بضع دقائق، وذلك بحسب مثيل ClickHouse. في ما يلي، نُدرج 1M صف لضمان استجابة سريعة. عدّل عبارة LIMIT أو اختيار الأعمدة لاستيراد مجموعات فرعية حسب الحاجة:

الإدراج عن بُعد باستخدام ClickHouse Local

إذا كانت سياسات أمان الشبكة تمنع عنقود ClickHouse لديك من إجراء اتصالات صادرة، فقد تتمكن من إدراج بيانات S3 باستخدام clickhouse-local. في المثال أدناه، نقرأ من حاوية S3 ونُدرج البيانات في ClickHouse باستخدام الدالة remote:
لتنفيذ ذلك عبر اتصال SSL آمن، استخدم الدالة remoteSecure.

تصدير البيانات

يمكنك الكتابة إلى ملفات في S3 باستخدام دالة الجدول s3. ويتطلب ذلك الأذونات المناسبة. نمرّر بيانات الاعتماد اللازمة مع الطلب، ولكن راجع صفحة إدارة بيانات الاعتماد للاطلاع على مزيد من الخيارات. في المثال البسيط أدناه، نستخدم دالة الجدول كوجهة بدلًا من مصدر. هنا نرسل 10,000 صفًا من جدول trips إلى حاوية، مع تحديد ضغط lz4 ونوع الإخراج CSV:
لاحظ هنا كيف يُستنتج تنسيق الملف من الامتداد. كما أننا لا نحتاج إلى تحديد الأعمدة في الدالة s3، إذ يمكن استنتاجها من SELECT.

تقسيم الملفات الكبيرة

من غير المحتمل أن ترغب في تصدير بياناتك في ملف واحد. تحقق معظم الأدوات، بما في ذلك ClickHouse، إنتاجية أعلى عند القراءة من عدة ملفات والكتابة إليها بسبب إمكانية المعالجة المتوازية. يمكننا تنفيذ أمر INSERT عدة مرات مع استهداف مجموعة فرعية من البيانات. ويوفّر ClickHouse طريقة لتقسيم الملفات تلقائيًا باستخدام مفتاح PARTITION. في المثال أدناه، ننشئ عشرة ملفات باستخدام باقي القسمة للدالة rand(). لاحظ كيف يُشار إلى partition ID الناتج في اسم الملف. وينتج عن ذلك عشرة ملفات ذات لاحقة رقمية، مثل trips_0.csv.lz4 وtrips_1.csv.lz4 وما إلى ذلك…:
بدلًا من ذلك، يمكننا الإشارة إلى حقل في البيانات. بالنسبة إلى مجموعة البيانات هذه، يُعدّ payment_type مفتاح تقسيم طبيعيًا بكاردينالية قدرها 5.

استخدام العناقيد

تقتصر جميع الدوال المذكورة أعلاه على التنفيذ على عقدة واحدة. تتوسع سرعات القراءة خطيًا مع عدد أنوية CPU إلى أن تتشبع الموارد الأخرى (وعادةً الشبكة)، مما يتيح للمستخدمين التوسع رأسيًا. ومع ذلك، لهذا النهج حدوده. فمع أنه يمكنك تخفيف بعض الضغط على الموارد عبر الإدراج في جدول موزع عند تنفيذ استعلام INSERT INTO SELECT، فإن هذا يترك عقدةً واحدةً فقط تتولى قراءة البيانات وتحليلها ومعالجتها. ولمواجهة هذا التحدي وإتاحة توسيع عمليات القراءة أفقيًا، لدينا الدالة s3Cluster. تنشئ العقدة التي تستقبل الاستعلام، والمعروفة باسم العقدة البادئة، اتصالًا بكل عقدة في العنقود. ويُحلَّل نمط glob الذي يحدد الملفات المطلوب قراءتها إلى مجموعة من الملفات. ثم توزع العقدة البادئة الملفات على عقد العنقود، التي تعمل بوصفها عُقدًا عاملة. وتطلب هذه العقد العاملة بدورها ملفات لمعالجتها كلما انتهت من عمليات القراءة. وتضمن هذه العملية قدرتنا على توسيع عمليات القراءة أفقيًا. تأخذ الدالة s3Cluster الصيغة نفسها الخاصة بمتغيرات العقدة الواحدة، باستثناء أنه يلزم تحديد عنقود مستهدف للإشارة إلى العقد العاملة:
  • cluster_name — اسم عنقود يُستخدم لبناء مجموعة من العناوين ومعلمات الاتصال بالخوادم البعيدة والمحلية.
  • source — عنوان URL لملف أو لمجموعة من الملفات. يدعم محارف البدل التالية في وضع القراءة فقط: *, ?, {'abc','def'} و {N..M}، حيث إن N و M — أرقام، و abc و def — سلاسل نصية. لمزيد من المعلومات، راجع Wildcards In Path.
  • access_key_id و secret_access_key — مفاتيح تحدد بيانات الاعتماد المطلوب استخدامها مع نقطة النهاية المحددة. اختيارية.
  • formatالتنسيق الخاص بالملف.
  • structure — بنية الجدول. بالتنسيق ‘column1_name column1_type, column2_name column2_type, …’.
كما هو الحال مع أي من دوال s3، تكون بيانات الاعتماد اختيارية إذا كانت الـ حاوية غير آمنة أو إذا كنت تُعرّف الأمان عبر البيئة، مثل IAM roles. لكن بخلاف دالة s3، يجب تحديد البنية في الطلب اعتبارًا من الإصدار 22.3.1، أي إن المخطط لا يُستنتج. في معظم الحالات، ستُستخدم هذه الدالة كجزء من INSERT INTO SELECT. وفي هذه الحالة، غالبًا ما ستُدرج البيانات في جدول موزّع. نوضح أدناه مثالًا بسيطًا تكون فيه trips_all جدولًا موزّعًا. ومع أن هذا الجدول يستخدم عنقود events، فإن اتساق العُقد المستخدمة في عمليات القراءة والكتابة ليس شرطًا:
ستُجرى عمليات الإدراج على العقدة المُبادِرة. وهذا يعني أنه في حين ستتم عمليات القراءة على كل عقدة، فستُوجَّه الصفوف الناتجة إلى العقدة المُبادِرة لتوزيعها. في السيناريوهات ذات معدل النقل المرتفع، قد يُشكّل ذلك عنق زجاجة. ولمعالجة ذلك، اضبط المعلمة parallel_distributed_insert_select للدالة s3cluster.

محركات جداول S3

في حين تتيح دوال s3 إجراء استعلامات مخصّصة على البيانات المخزّنة في S3، فإن صياغتها مطوّلة. ويجنّبك محرك جداول S3 الحاجة إلى تحديد URL الخاصة بـ الحاوية وبيانات الاعتماد مرارًا وتكرارًا. ولمعالجة ذلك، يوفّر ClickHouse محرك جداول S3.
  • path — ‏حاوية URL مع مسار للملف. يدعم محارف البدل التالية في وضع القراءة فقط: * و ? و {abc,def} و {N..M}، حيث إن N و M — أرقام، و ‘abc’ و ‘def’ — سلاسل نصية. لمزيد من المعلومات، راجع هنا.
  • formatتنسيق الملف.
  • aws_access_key_id, aws_secret_access_key - بيانات اعتماد طويلة الأمد لمستخدم حساب AWS. يمكنك استخدامها لمصادقة طلباتك. هذه المعلمة اختيارية. إذا لم تُحدَّد بيانات الاعتماد، فستُستخدم قيم ملف الإعدادات. لمزيد من المعلومات، راجع إدارة بيانات الاعتماد.
  • compression — نوع الضغط. القيم المدعومة: none, gzip/gz, brotli/br, xz/LZMA, zstd/zst. هذه المعلمة اختيارية. وبشكل افتراضي، سيُكتشَف نوع الضغط تلقائيًا استنادًا إلى امتداد الملف.

قراءة البيانات

في المثال التالي، ننشئ جدولًا باسم trips_raw باستخدام أول عشرة ملفات TSV الموجودة في الحاوية https://datasets-documentation.s3.eu-west-3.amazonaws.com/nyc-taxi/. يحتوي كل ملف منها على مليون صف:
لاحظ استخدام النمط {0..9} لقصره على الملفات العشرة الأولى. وبمجرد إنشائه، يمكننا الاستعلام عن هذا الجدول مثل أي جدول آخر:

إدراج البيانات

يدعم محرك الجدول S3 عمليات القراءة المتوازية. ولا تُدعَم عمليات الكتابة إلا إذا كان تعريف الجدول لا يحتوي على أنماط glob. لذلك، لن يسمح الجدول أعلاه بعمليات الكتابة. لتوضيح الكتابة، أنشئ جدولًا يشير إلى حاوية S3 قابلة للكتابة:
لاحظ أنه لا يمكن insert الصفوف إلا في ملفات جديدة. لا توجد دورات merge أو عمليات split للملفات. بمجرد كتابة ملف، ستفشل عمليات insert اللاحقة. أمام المستخدمين خياران هنا:
  • حدّد الإعداد s3_create_new_file_on_insert=1. سيؤدي ذلك إلى إنشاء ملفات جديدة مع كل عملية insert. ستُضاف لاحقة رقمية إلى نهاية كل ملف، وستزداد تدريجيًا مع كل insert operation. بالنسبة إلى المثال أعلاه، ستؤدي عملية insert لاحقة إلى إنشاء ملف trips_1.bin.
  • حدّد الإعداد s3_truncate_on_insert=1. سيؤدي ذلك إلى truncate الملف، أي إنه بعد اكتمال العملية لن يحتوي إلا على الصفوف المُدرجة حديثًا.
تكون القيمة الافتراضية لكلا هذين الإعدادين 0، ما يفرض على المستخدم تعيين أحدهما. وسيكون لـ s3_truncate_on_insert أولوية إذا جرى تعيين كليهما. بعض الملاحظات حول محرك الجدول S3:
  • بخلاف جدول تقليدي من عائلة MergeTree، فإن dropping جدول S3 لن يحذف البيانات الأساسية.
  • يمكن العثور على الإعدادات الكاملة لهذا النوع من الجداول هنا.
  • انتبه إلى القيود التالية عند استخدام هذا المحرك:
    • استعلامات ALTER غير مدعومة
    • عمليات SAMPLE غير مدعومة
    • لا يوجد مفهوم للفهارس، مثل primary أو skip.

إدارة بيانات الاعتماد

في الأمثلة السابقة، مرّرنا بيانات الاعتماد في الدالة s3 أو في تعريف جدول S3. ومع أن هذا قد يكون مقبولًا للاستخدام العرضي، فإن المستخدمين في بيئات production يحتاجون إلى آليات authentication أقل صراحة. ولمعالجة ذلك، يوفّر ClickHouse عدة خيارات:
  • حدِّد تفاصيل الاتصال في config.xml أو في ملف تهيئة مكافئ ضمن conf.d. ويظهر أدناه محتوى ملف Example، بافتراض التثبيت باستخدام حزمة debian.
    ستُستخدم بيانات الاعتماد هذه لأي طلبات يكون فيها endpoint أعلاه مطابقًا تمامًا كبادئة لـ URL المطلوب. ولاحظ أيضًا في هذا المثال إمكانية تعريف header للتفويض كبديل عن مفتاح الوصول والمفتاح السري. ويمكن العثور على قائمة كاملة بالإعدادات المدعومة هنا.
  • يوضّح المثال أعلاه توفّر مُعامِل التهيئة use_environment_credentials. ويمكن أيضًا ضبط مُعامِل التهيئة هذا على المستوى العام ضمن s3:
    يفعّل هذا الإعداد محاولة استرداد بيانات اعتماد S3 من البيئة، مما يتيح الوصول عبر IAM roles. وعلى وجه التحديد، يُتَّبع ترتيب الاسترداد التالي:
    • البحث عن متغيرات البيئة AWS_ACCESS_KEY_ID وAWS_SECRET_ACCESS_KEY وAWS_SESSION_TOKEN
    • إجراء تحقق في $HOME/.aws
    • بيانات اعتماد مؤقتة يتم الحصول عليها عبر خدمة AWS Security Token Service، أي عبر واجهة برمجة تطبيقات AssumeRole
    • التحقق من بيانات الاعتماد في متغيرات بيئة ECS: AWS_CONTAINER_CREDENTIALS_RELATIVE_URI أو AWS_CONTAINER_CREDENTIALS_FULL_URI وAWS_ECS_CONTAINER_AUTHORIZATION_TOKEN.
    • الحصول على بيانات الاعتماد عبر بيانات metadata الخاصة بمثيل Amazon EC2، ما لم تكن القيمة AWS_EC2_METADATA_DISABLED مضبوطة على true.
    • يمكن أيضًا ضبط هذه الإعدادات نفسها لنقطة endpoint محددة، باستخدام قاعدة مطابقة البادئة نفسها.

تحسين الأداء

للتعرّف على كيفية تحسين عمليات القراءة والإدراج باستخدام دالة S3، راجع دليل الأداء المخصّص.

ضبط تخزين S3

داخليًا، تستخدم MergeTree في ClickHouse تنسيقَي تخزين أساسيين: Wide and Compact. وبينما يستخدم التنفيذ الحالي السلوك الافتراضي في ClickHouse (ويُتحكَّم فيه عبر الإعدادات min_bytes_for_wide_part وmin_rows_for_wide_part)، نتوقع أن يختلف هذا السلوك مع S3 في الإصدارات المستقبلية، مثل اعتماد قيمة افتراضية أكبر لـ min_bytes_for_wide_part بما يشجع أكثر على استخدام التنسيق Compact، وبالتالي تقليل عدد الملفات. وقد ترغب الآن في ضبط هذه الإعدادات عند استخدام تخزين S3 فقط.

MergeTree المعتمد على S3

تتيح لنا دوال s3 ومحرك الجدول المرتبط بها الاستعلام عن البيانات في S3 باستخدام صياغة ClickHouse المألوفة. ومع ذلك، فهي محدودة من حيث ميزات إدارة البيانات وأداء الاستعلامات. فلا يوجد دعم للفهارس الأساسية أو no-cache، كما يجب على المستخدم إدارة عمليات إدراج الملفات. يدرك ClickHouse أن S3 يمثّل حل تخزين جذابًا، خاصةً عندما تكون سرعة الاستعلام على البيانات “الأبرد” أقل أهمية، وعندما يسعى المستخدمون إلى فصل التخزين عن الحوسبة. وللمساعدة في تحقيق ذلك، يتوفر دعم لاستخدام S3 كوحدة تخزين لمحرك MergeTree. ويتيح لك هذا الاستفادة من مزايا قابلية التوسع والتكلفة التي يوفرها S3، إلى جانب أداء الإدراج والاستعلام الذي يقدمه محرك MergeTree.

طبقات التخزين

تتيح وحدات التخزين في ClickHouse فصل الأقراص المادية عن محرك جداول MergeTree. ويمكن أن تتكوّن أي وحدة تخزين واحدة من مجموعة مرتبة من الأقراص. وبينما يتيح ذلك أساسًا استخدام عدة أجهزة كتلية لتخزين البيانات، فإن هذا التجريد يتيح أيضًا استخدام أنواع أخرى من التخزين، بما في ذلك S3. ويمكن نقل أجزاء بيانات ClickHouse بين وحدات التخزين وفقًا لسياسات التخزين ومعدلات الامتلاء، مما يرسّخ مفهوم طبقات التخزين. تُتيح طبقات التخزين اعتماد معماريات التخزين الساخن-البارد، حيث لا تتطلب أحدث البيانات، التي تكون عادةً الأكثر ورودًا في الاستعلامات، سوى مساحة صغيرة على وسائط تخزين عالية الأداء، مثل أقراص NVMe SSD. ومع تقادم البيانات، تصبح متطلبات اتفاقية مستوى الخدمة لزمن الاستعلام أقل صرامة، كما ينخفض تكرار الاستعلامات عليها. ويمكن تخزين هذا الذيل الطويل من البيانات على وسائط تخزين أبطأ وأقل أداءً، مثل HDD، أو على تخزين الكائنات مثل S3.

إنشاء قرص

لاستخدام حاوية S3 كقرص، يجب أولاً التصريح بها ضمن ملف إعدادات ClickHouse. يمكن إما توسيع config.xml أو، وهو الخيار المفضّل، إنشاء ملف جديد ضمن conf.d. يرد أدناه مثال على تعريف قرص S3:
يمكن العثور على قائمة كاملة بالإعدادات ذات الصلة بتعريف هذا القرص هنا. لاحظ أنه يمكن إدارة بيانات الاعتماد هنا باستخدام الأساليب نفسها الموضحة في إدارة بيانات الاعتماد، أي يمكن تعيين use_environment_credentials إلى true في كتلة الإعدادات أعلاه لاستخدام IAM roles.

إنشاء سياسة تخزين

بعد تهيئته، يمكن استخدام هذا “القرص” من خلال وحدة تخزين مُعرَّفة ضمن سياسة. في المثال أدناه، نفترض أن S3 هو وسيلة التخزين الوحيدة لدينا. يتجاهل هذا السيناريو معماريات التخزين الساخن-البارد الأكثر تعقيدًا، حيث يمكن نقل البيانات استنادًا إلى قيم TTL ومعدلات الامتلاء.

إنشاء جدول

بافتراض أنك أعددت القرص لاستخدام حاوية S3 مع صلاحية الكتابة، ينبغي أن تتمكن من إنشاء جدول كما في المثال أدناه. وللاختصار، نستخدم مجموعة فرعية من أعمدة سيارات الأجرة في نيويورك ونرسل البيانات مباشرةً إلى الجدول المستند إلى S3:
اعتمادًا على العتاد، قد يستغرق تنفيذ عملية الإدخال الأخيرة هذه لـ 1m صفًا بضع دقائق. يمكنك التحقق من التقدم عبر جدول system.processes. لا تتردد في تعديل عدد الصفوف حتى الحد الأقصى البالغ 10m واستكشاف بعض الاستعلامات النموذجية.

تعديل جدول

قد تحتاج أحيانًا إلى تعديل سياسة التخزين لجدول معيّن. ورغم أن ذلك ممكن، فإنه ينطوي على بعض القيود. يجب أن تتضمن السياسة الهدف الجديدة جميع الأقراص ووحدات التخزين الموجودة في السياسة السابقة، أي إن البيانات لن تُنقل لمواكبة هذا التغيير في السياسة. وعند التحقق من هذه القيود، سيجري التعرف على وحدات التخزين والأقراص بأسمائها، وأي محاولة لمخالفتها ستؤدي إلى ظهور خطأ. ومع ذلك، وبافتراض أنك تستخدم الأمثلة السابقة، فإن التغييرات التالية صالحة.
هنا نعيد استخدام وحدة التخزين الرئيسية في سياسة s3_tiered الجديدة، ونضيف وحدة تخزين ساخنة جديدة. ويستخدم ذلك القرص الافتراضي، الذي يتألف من قرص واحد فقط مُهيّأ عبر المعلَمة <path>. لاحظ أن أسماء وحدات التخزين والأقراص لا تتغير. ستبقى عمليات الإدراج الجديدة في جدولنا على القرص الافتراضي حتى يصل إلى القيمة move_factor * disk_size، وعندها ستُنقل البيانات إلى S3.

التعامل مع النسخ المتماثل

يمكن تنفيذ النسخ المتماثل مع أقراص S3 باستخدام محرك الجدول ReplicatedMergeTree. راجع دليل نسخ شظية واحدة عبر منطقتين من AWS باستخدام تخزين الكائنات في S3 للاطّلاع على التفاصيل.

القراءة والكتابة

تتناول الملاحظات التالية كيفية تنفيذ تفاعلات S3 مع ClickHouse. ورغم أنها معلوماتية في الغالب، فقد تساعد القرّاء عند تحسين الأداء:
  • افتراضيًا، يساوي الحد الأقصى لعدد خيوط معالجة الاستعلام التي يمكن لأي مرحلة من مراحل مسار معالجة الاستعلام استخدامها عددَ الأنوية. بعض المراحل أكثر قابليةً للتوازي من غيرها، لذا تمثل هذه القيمة حدًا أعلى. وقد تُنفَّذ عدة مراحل من الاستعلام في الوقت نفسه لأن البيانات تُبث من القرص. لذلك قد يتجاوز العدد الفعلي للخيوط المستخدمة في الاستعلام هذا الحد. يمكن تعديل ذلك عبر الإعداد max_threads.
  • تكون عمليات القراءة من S3 غير متزامنة افتراضيًا. ويُحدَّد هذا السلوك بواسطة الإعداد remote_filesystem_read_method، المضبوط افتراضيًا على القيمة threadpool. عند خدمة طلب ما، يقرأ ClickHouse الحبيبات ضمن شرائط. وقد يحتوي كل شريط على العديد من الأعمدة. ويقرأ أحد الخيوط الأعمدة الخاصة بحبيباته واحدًا تلو الآخر. وبدلًا من تنفيذ ذلك بشكل متزامن، يُجرى جلب مسبق لجميع الأعمدة قبل انتظار البيانات. ويوفر ذلك تحسينات كبيرة في الأداء مقارنةً بالانتظار المتزامن لكل عمود. لن تحتاج إلى تغيير هذا الإعداد في معظم الحالات - راجع تحسين الأداء.
  • تُنفَّذ عمليات الكتابة بالتوازي، بحد أقصى يبلغ 100 خيط متزامن لكتابة الملفات. يتحكم max_insert_delayed_streams_for_parallel_write، الذي تبلغ قيمته الافتراضية 1000، في عدد كائنات S3 المكتوبة بالتوازي. وبما أن كل ملف تتم كتابته يتطلب مخزنًا مؤقتًا (~1MB)، فإن ذلك يحد فعليًا من استهلاك الذاكرة لعملية INSERT. وقد يكون من المناسب خفض هذه القيمة عندما تكون ذاكرة الخادم محدودة.

استخدم تخزين الكائنات في S3 كقرص لـ ClickHouse

إذا كنت بحاجة إلى إرشادات تفصيلية خطوة بخطوة لإنشاء حاويات S3 ودور IAM، فيُرجى الرجوع إلى “كيفية إنشاء مستخدم AWS IAM وحاوية S3”

اضبط ClickHouse لاستخدام حاوية S3 كقرص

يعتمد المثال التالي على حزمة Deb لنظام Linux مُثبّتة كخدمة، مع أدلة ClickHouse الافتراضية.
  1. أنشئ ملفًا جديدًا في دليل config.d الخاص بـ ClickHouse لتخزين تهيئة التخزين.
  1. أضِف ما يلي ضمن تهيئة التخزين، مع استبدال مسار الـ حاوية ومفتاح الوصول والمفاتيح السرية المذكورة في الخطوات السابقة
إن الوسمين s3_disk وs3_cache داخل الوسم <disks> هما مُسميان اختياريان. يمكن تعيينهما إلى قيم أخرى، ولكن يجب استخدام المُسمّى نفسه في علامة التبويب <disk> ضمن علامة التبويب <policies> للإشارة إلى القرص. كما أن الوسم <S3_main> اختياري أيضًا، وهو اسم السياسة التي ستُستخدم كمُعرّف لوجهة التخزين عند إنشاء الموارد في ClickHouse.الإعداد الموضّح أعلاه مخصّص لإصدار ClickHouse 22.8 أو أحدث. وإذا كنت تستخدم إصدارًا أقدم، فيرجى مراجعة وثائق تخزين البيانات.لمزيد من المعلومات حول استخدام S3: دليل التكاملات: S3 Backed MergeTree
  1. حدّث مالك الملف إلى المستخدم والمجموعة clickhouse
  1. أعد تشغيل مثيل ClickHouse حتى تدخل التغييرات حيّز التنفيذ.

الاختبار

  1. اتصل باستخدام ClickHouse client، كما في المثال التالي
  1. أنشئ جدولًا وحدِّد سياسة تخزين S3 الجديدة
  1. تأكّد من أن الجدول أُنشئ باستخدام السياسة الصحيحة
  1. أدرِج صفوفًا تجريبية في الجدول
  1. اعرض الصفوف
  1. في وحدة تحكم AWS، انتقل إلى الحاويات وحدد الحاوية الجديدة والمجلد. ينبغي أن ترى شيئًا مشابهًا لما يلي:

تكرار شظية واحدة عبر منطقتين في AWS باستخدام تخزين الكائنات في S3

يُستخدم تخزين الكائنات افتراضيًا في ClickHouse Cloud، لذلك لا تحتاج إلى اتباع هذا الإجراء إذا كنت تستخدم ClickHouse Cloud.

خطّط لعملية النشر

يعتمد هذا الدليل العملي على نشر عقدتَي ClickHouse Server وثلاث عقد ClickHouse Keeper على AWS EC2. ويُستخدَم S3 كمخزن بيانات لخوادم ClickHouse. وتُستخدَم منطقتا AWS، مع ClickHouse Server وحاوية S3 في كل منطقة، لدعم التعافي من الكوارث. تكون جداول ClickHouse مكرّرة عبر الخادمين، وبالتالي عبر المنطقتين.

تثبيت البرامج

عُقد خادم ClickHouse

راجع تعليمات التثبيت عند تنفيذ خطوات النشر على عُقد خادم ClickHouse.

نشر ClickHouse

انشر ClickHouse على مضيفين؛ وفي التكوينات النموذجية يُسمَّيان chnode1 وchnode2. ضع chnode1 في منطقة AWS واحدة، وchnode2 في منطقة أخرى.

نشر ClickHouse Keeper

قم بنشر ClickHouse Keeper على ثلاثة مضيفات. وفي تهيئات الأمثلة، تحمل هذه المضيفات الأسماء keepernode1 وkeepernode2 وkeepernode3. يمكن نشر keepernode1 في نفس المنطقة التي يوجد فيها chnode1، وkeepernode2 مع chnode2، وkeepernode3 في أي من المنطقتين، ولكن في منطقة توافر تختلف عن عقدة ClickHouse في تلك المنطقة. راجِع إرشادات التثبيت عند تنفيذ خطوات النشر على عقد ClickHouse Keeper.

إنشاء حاويات S3

أنشئ حاويتين في S3، واحدة في كل منطقة وضعت فيها chnode1 وchnode2. إذا كنت بحاجة إلى إرشادات خطوة بخطوة لإنشاء الحاويات ودور IAM، فوسّع إنشاء حاويات S3 ودور IAM واتبع التعليمات:
يستعرض هذا المقال الأساسيات المتعلقة بكيفية تهيئة مستخدم AWS IAM، وإنشاء S3 bucket، وتهيئة ClickHouse لاستخدام هذا الـ bucket بوصفه S3 disk. يُنصح بالتنسيق مع فريق الأمان لديك لتحديد الصلاحيات المطلوبة، واعتبار هذه الإعدادات نقطةَ انطلاق.

إنشاء مستخدم AWS IAM

في الخطوات التالية، ستقوم بإنشاء مستخدم حساب خدمة (لا مستخدم تسجيل دخول).
  1. سجّل الدخول إلى AWS IAM Management Console.
  2. من قائمة Users، اختر Create user
AWS IAM Management Console - إضافة مستخدم جديد
  1. أدخل اسم المستخدم، ثم اضبط نوع بيانات الاعتماد على Access key - Programmatic access، واختر Next: Permissions
تحديد اسم المستخدم ونوع الوصول لمستخدم IAM
  1. لا تُضِف المستخدم إلى أي مجموعة؛ اختر Next: Tags
تخطي إسناد المجموعة إلى مستخدم IAM
  1. إذا لم تكن بحاجة إلى إضافة أي وسوم، فاختر Next: Review
تخطي إسناد الوسوم إلى مستخدم IAM
  1. اختر Create User
يمكن تجاهل رسالة التحذير التي تفيد بأن المستخدم ليس لديه أذونات؛ إذ ستُمنَح له الأذونات على الـbucket في القسم التالي
إنشاء مستخدم IAM مع تحذير بعدم وجود أذونات
  1. تم الآن إنشاء المستخدم؛ انقر على show وانسخ مفتاح الوصول والمفتاح السري.
احتفِظ بالمفاتيح في مكانٍ آخر؛ فهذه هي المرة الوحيدة التي سيكون فيها مفتاح الوصول السري متاحًا.
عرض مفاتيح الوصول الخاصة بـ IAM user ونسخها
  1. انقر على «إغلاق»، ثم ابحث عن المستخدم في شاشة المستخدمين.
العثور على IAM user المُنشأ حديثًا في قائمة المستخدمين
  1. انسخ ARN ‏(Amazon Resource Name) واحفظه لاستخدامه عند إعداد سياسة الوصول إلى الـ bucket.
نسخ ARN لمستخدم IAM

إنشاء حاوية S3

  1. ضمن قسم حاوية S3، اختر Create bucket
بدء إنشاء حاوية S3
  1. أدخل اسم الـ bucket واترك الخيارات الأخرى على الإعدادات الافتراضية
يجب أن يكون اسم الـ bucket فريدًا على مستوى AWS بأكملها، وليس داخل المؤسسة فقط، وإلا فستظهر رسالة خطأ.
  1. اترك Block all Public Access مفعّلًا؛ فلا حاجة إلى إتاحة الوصول العام.
ضبط إعدادات حاوية S3 مع حظر الوصول العام
  1. اختر Create Bucket في أسفل الصفحة
إتمام إنشاء حاوية S3
  1. حدِّد الرابط، وانسخ قيمة ARN، واحفظها لاستخدامها عند تكوين سياسة الوصول إلى الـ S3 bucket.
  2. بعد إنشاء الـ S3 bucket، اعثر على الـ S3 bucket الجديد في قائمة الـ S3 bucket وحدِّد الرابط
العثور على حاوية S3 التي أُنشئت حديثًا في قائمة الحاويات
  1. اختر إنشاء مجلد
إنشاء مجلد جديد في حاوية S3
  1. أدخل اسم المجلد الذي سيكون الوجهة لقرص S3 في ClickHouse، ثم اختر Create folder
تعيين اسم المجلد لاستخدام قرص S3 في ClickHouse
  1. يجب أن يظهر المجلد الآن في قائمة الحاويات
عرض المجلد الذي تم إنشاؤه حديثًا في حاوية S3
  1. حدِّد مربع الاختيار الخاص بالمجلد الجديد، ثم انقر على Copy URL واحفظ عنوان URL المنسوخ لاستخدامه في إعدادات تخزين ClickHouse في القسم التالي.
نسخ عنوان URL لمجلد S3 لإعداد ClickHouse
  1. اختر علامة التبويب Permissions، ثم انقر على الزر Edit في قسم Bucket Policy
الوصول إلى إعدادات سياسة حاوية S3
  1. أضِف سياسة للحاوية، كما في المثال أدناه:
يجب أن تعمل مع فريق الأمن لديك لتحديد الأذونات التي ينبغي استخدامها؛ واعتبر ما يلي نقطة انطلاق. لمزيد من المعلومات حول السياسات والإعدادات، راجع وثائق AWS: https://docs.aws.amazon.com/AmazonS3/latest/userguide/access-policy-language-overview.html
  1. احفظ تكوين السياسة.
ستُوضَع ملفات التكوين بعد ذلك في /etc/clickhouse-server/config.d/. وفيما يلي ملف تكوين نموذجي لإحدى الحاويتين، أما الأخرى فهي مشابهة له مع اختلاف الأسطر الثلاثة المميزة:
/etc/clickhouse-server/config.d/storage_config.xml
ستطلب منك العديد من الخطوات في هذا الدليل وضع ملف تهيئة في /etc/clickhouse-server/config.d/. هذا هو الموقع الافتراضي على أنظمة Linux لملفات تجاوز التهيئة. عند وضع هذه الملفات في ذلك الدليل، سيستخدم ClickHouse محتواها لتجاوز التهيئة الافتراضية. ومن خلال وضع هذه الملفات في دليل التجاوز، ستتجنب فقدان تهيئتك أثناء الترقية.

تهيئة ClickHouse Keeper

عند تشغيل ClickHouse Keeper في وضع مستقل (منفصلًا عن خادم ClickHouse)، تكون التهيئة عبارة عن ملف XML واحد. في هذا الدليل العملي، يكون الملف هو /etc/clickhouse-keeper/keeper_config.xml. تستخدم خوادم Keeper الثلاثة ملف التهيئة نفسه مع اختلاف إعداد واحد فقط؛ <server_id>. يشير server_id إلى المعرّف الذي سيُخصَّص للمضيف الذي يُستخدَم عليه ملف التهيئة. في المثال أدناه، قيمة server_id هي 3، وإذا نظرت إلى أسفل الملف في قسم <raft_configuration>، فسترى أن الخادم 3 يحمل اسم المضيف keepernode3. وبهذه الطريقة تعرف عملية ClickHouse Keeper الخوادم الأخرى التي يجب الاتصال بها عند اختيار العقدة القائدة وفي سائر الأنشطة الأخرى.
/etc/clickhouse-keeper/keeper_config.xml
انسخ ملف إعداد ClickHouse Keeper إلى مكانه الصحيح (مع تذكّر تعيين <server_id>):

إعداد خادم ClickHouse

تحديد عنقود

تُحدَّد عناقيد ClickHouse في قسم <remote_servers> من ملف التكوين. في هذا المثال، يُحدَّد عنقود واحد، cluster_1S_2R، ويتكوّن من جزء بيانات واحد ونسختين متماثلتين. وتقع النسختان المتماثلتان على المضيفين chnode1 وchnode2.
/etc/clickhouse-server/config.d/remote-servers.xml
عند العمل مع العناقيد، من المفيد تعريف وحدات ماكرو تُدرِج إعدادات العنقود، والشريحة، والنسخة المتماثلة في استعلامات DDL. يتيح لك هذا المثال تحديد استخدام محرك الجدول Replicated من دون الحاجة إلى توفير تفاصيل shard وreplica. وعندما تنشئ جدولًا، يمكنك رؤية كيفية استخدام وحدات الماكرو shard وreplica من خلال الاستعلام عن system.tables.
/etc/clickhouse-server/config.d/macros.xml
تعريفات الماكرو أعلاه خاصة بـ chnode1، وعلى chnode2 اضبط replica على replica_2.

تعطيل zero-copy replication

في إصدارات ClickHouse 22.7 وما دون، يكون الإعداد allow_remote_fs_zero_copy_replication مضبوطًا على true افتراضيًا لأقراص S3 وHDFS. يجب ضبط هذا الإعداد على false في سيناريو التعافي من الكوارث هذا، وفي الإصدار 22.8 وما بعده يكون مضبوطًا على false افتراضيًا. يجب أن تكون قيمة هذا الإعداد false لسببين: 1) هذه الميزة ليست جاهزة لبيئات الإنتاج؛ 2) في سيناريو التعافي من الكوارث، يجب تخزين كلٍّ من البيانات والبيانات الوصفية في عدة مناطق. اضبط allow_remote_fs_zero_copy_replication على false.
/etc/clickhouse-server/config.d/remote-servers.xml
يتولى ClickHouse Keeper تنسيق النسخ المتماثل للبيانات عبر عقد ClickHouse. ولإعلام ClickHouse بعُقد ClickHouse Keeper، أضف ملف تهيئة إلى كل عقدة من عقد ClickHouse.
/etc/clickhouse-server/config.d/use_keeper.xml

تهيئة الشبكة

راجِع قائمة منافذ الشبكة عند تهيئة إعدادات الأمان في AWS، بحيث تتمكن خوادمك من التواصل مع بعضها البعض، وتتمكن أنت أيضًا من التواصل معها. يجب أن تستمع الخوادم الثلاثة جميعها لاتصالات الشبكة حتى تتمكن من التواصل فيما بينها ومع S3. بشكل افتراضي، يستمع ClickHouse فقط على عنوان الاسترجاع المحلي (loopback)، لذا يجب تغيير ذلك. يُضبط هذا في /etc/clickhouse-server/config.d/. فيما يلي مثال يهيئ ClickHouse وClickHouse Keeper للاستماع على جميع واجهات IPv4. راجع الوثائق أو ملف الإعدادات الافتراضي /etc/clickhouse/config.xml لمزيد من المعلومات.
/etc/clickhouse-server/config.d/networking.xml

شغِّل الخوادم

تشغيل ClickHouse Keeper

على كل خادم Keeper، شغّل الأوامر المناسبة لنظام التشغيل لديك، على سبيل المثال:

تحقّق من حالة ClickHouse Keeper

أرسل أوامر إلى ClickHouse Keeper باستخدام netcat. على سبيل المثال، يُرجع mntr حالة عنقود ClickHouse Keeper. وإذا شغّلت الأمر على كل عقدة من عقد Keeper، فسترى أن إحداها هي القائد، وأن العقدتين الأخريين تابعتان:

شغّل خادم ClickHouse

على كل خادم ClickHouse، نفِّذ ما يلي

تحقّق من خادم ClickHouse

عند إضافة إعدادات العنقود، جرى تعريف shard واحدة مكرّرة عبر عقدتَي ClickHouse. في خطوة التحقّق هذه، ستتأكد من أن العنقود قد أُنشئ عند بدء تشغيل ClickHouse، ثم ستنشئ جدولًا مكرّرًا باستخدام ذلك العنقود.
  • تحقّق من وجود العنقود:
  • أنشئ جدولًا في العنقود باستخدام محرك الجداول ReplicatedMergeTree:
  • تعرّف على كيفية استخدام الـ ماكرو التي عُرّفت سابقًا سبق تعريف الـ ماكرو shard وreplica، ويمكنك في السطر المميز أدناه رؤية المواضع التي تُستبدل فيها القيم على كل عقدة ClickHouse. بالإضافة إلى ذلك، تُستخدم القيمة uuid؛ ولا يجري تعريف uuid ضمن الـ ماكرو لأنها تُولَّد من النظام.
يمكنك تخصيص مسار ZooKeeper 'clickhouse/tables/{uuid}/{shard} الظاهر أعلاه من خلال ضبط default_replica_path وdefault_replica_name. تتوفر الوثائق هنا.

التحقق

ستتحقق هذه الاختبارات من أن البيانات تُكرَّر بين الخادمين، وأنها مخزَّنة في حاويات S3 وليس على القرص المحلي.
  • أضف بيانات من مجموعة بيانات سيارات الأجرة لمدينة نيويورك:
  • تحقّق من أن البيانات مخزَّنة في S3. يوضّح هذا الاستعلام حجم البيانات على القرص، والسياسة المستخدمة لتحديد القرص المستخدم.
    تحقّق من حجم البيانات على القرص المحلي. كما ترى أعلاه، يبلغ الحجم على القرص لملايين الصفوف المخزَّنة 36.42 MiB. يفترض أن تكون هذه البيانات على S3، لا على القرص المحلي. كما يبيّن لنا الاستعلام أعلاه أيضًا مكان تخزين البيانات والبيانات الوصفية على القرص المحلي. تحقّق من البيانات المحلية:
    تحقّق من بيانات S3 في كل حاوية S3 (لا تظهر القيم الإجمالية، لكن كلتا الحاويتين تحتويان على نحو 36 MiB من البيانات المخزَّنة بعد عمليات الإدراج):

S3Express

S3Express هي فئة تخزين جديدة عالية الأداء ضمن منطقة توافر واحدة في Amazon S3. يمكنك الرجوع إلى هذه التدوينة للاطّلاع على تجربتنا في اختبار S3Express مع ClickHouse.
يخزّن S3Express البيانات داخل منطقة توافر واحدة (AZ). وهذا يعني أن البيانات لن تكون متاحة في حال تعطل منطقة التوافر.

قرص S3

يتطلب إنشاء جدول بتخزين يستند إلى حاوية من نوع S3Express الخطوات التالية:
  1. أنشئ حاوية من النوع Directory
  2. طبّق سياسة حاوية المناسبة لمنح مستخدم S3 الخاص بك جميع الأذونات المطلوبة (على سبيل المثال: "Action": "s3express:*" للسماح بوصول غير مقيّد)
  3. عند تهيئة سياسة التخزين، يُرجى توفير المعلَمة region
تهيئة التخزين مماثلة لما هي عليه في S3 العادي، وقد تبدو مثل التالي:
ثم أنشئ جدولًا في وحدة التخزين الجديدة:

تخزين S3

يدعم أيضًا تخزين S3، ولكن فقط للمسارات من نوع Object URL. مثال:
ويتطلب ذلك أيضًا تحديد منطقة الـ حاوية في ملف الإعدادات:

النسخ الاحتياطية

يمكن تخزين نسخة احتياطية على القرص الذي أنشأناه أعلاه:
آخر تعديل في ٣ يوليو ٢٠٢٦