نظرة عامة
توجد طريقتان أساسيتان لترحيل البيانات من ClickHouse ذاتي الإدارة (OSS) إلى ClickHouse Cloud:
- استخدام الدالة
remoteSecure()، حيث تُسحَب البيانات أو تُدفَع مباشرةً. - استخدام أوامر
BACKUP/RESTOREعبر تخزين الكائنات السحابي
يركّز دليل الترحيل هذا على نهج
BACKUP/RESTORE، ويقدّم مثالًا عمليًا على ترحيل قاعدة بيانات أو خدمة كاملة من ClickHouse مفتوح المصدر إلى Cloud عبر حاوية S3.
المتطلبات المسبقة
- أن يكون Docker مثبتًا لديك
- أن تكون لديك حاوية S3 ومستخدم IAM
- أن تكون قادرًا على إنشاء خدمة ClickHouse Cloud جديدة
ولتسهيل متابعة الخطوات الواردة في هذا الدليل وإمكانية تكرارها، سنستخدم إحدى وصفات Docker Compose لعنقود ClickHouse يضم شاردين ونسختين متماثلتين.
التحضير لـ OSS
سننشئ أولًا عنقود ClickHouse باستخدام تهيئة Docker Compose من مستودع الأمثلة الخاص بنا. يمكنك تجاهل إنشاء عنقود ClickHouse إذا كان لديك عنقود يعمل بالفعل.
- استنسخ مستودع الأمثلة إلى جهازك المحلي
- من الطرفية، استخدم
cdللانتقال إلىexamples/docker-compose-recipes/recipes/cluster_2S_2R - تأكد من أن Docker يعمل، ثم ابدأ عنقود ClickHouse:
docker compose upمن المفترض أن ترى:
[+] Running 7/7
✔ Container clickhouse-keeper-01 Created 0.1s
✔ Container clickhouse-keeper-02 Created 0.1s
✔ Container clickhouse-keeper-03 Created 0.1s
✔ Container clickhouse-01 Created 0.1s
✔ Container clickhouse-02 Created 0.1s
✔ Container clickhouse-04 Created 0.1s
✔ Container clickhouse-03 Created 0.1sمن نافذة طرفية جديدة عند جذر المجلد، شغّل الأمر التالي للاتصال بالعقدة الأولى في العنقود:
docker exec -it clickhouse-01 clickhouse-clientمن جدول MergeTree إلى جدول ReplicatedMergeTree
يعمل ClickHouse Cloud مع SharedMergeTree.
وعند استعادة نسخة احتياطية، يحوّل ClickHouse تلقائيًا الجداول التي تستخدم ReplicatedMergeTree إلى جداول SharedMergeTree.
ومن المرجّح أن جداولك تستخدم بالفعل المحرّك ReplicatedMergeTree إذا كنت تشغّل عنقودًا.
وإذا لم يكن الأمر كذلك، فستحتاج إلى تحويل أي جداول MergeTree إلى ReplicatedMergeTree قبل أخذ نسخة احتياطية منها.
ولتوضيح كيفية تحويل جداول MergeTree إلى ReplicatedMergeTree، سنبدأ بجدول MergeTree ثم نحوّله لاحقًا إلى ReplicatedMergeTree.
سنتبع أول خطوتين من دليل بيانات سيارات الأجرة في نيويورك لإنشاء جدول نموذجي وتحميل البيانات إليه.
وقد أُدرجت هاتان الخطوتان أدناه تيسيرًا عليك.
شغّل الأوامر التالية لإنشاء قاعدة بيانات جديدة وإدراج البيانات من حاوية S3 في جدول جديد:
CREATE DATABASE nyc_taxi;
CREATE TABLE nyc_taxi.trips_small_adapted (
trip_id UInt32,
pickup_datetime DateTime,
dropoff_datetime DateTime,
pickup_longitude Nullable(Float64),
pickup_latitude Nullable(Float64),
dropoff_longitude Nullable(Float64),
dropoff_latitude Nullable(Float64),
passenger_count UInt8,
trip_distance Float32,
fare_amount Float32,
extra Float32,
tip_amount Float32,
tolls_amount Float32,
total_amount Float32,
payment_type Enum('CSH' = 1, 'CRE' = 2, 'NOC' = 3, 'DIS' = 4, 'UNK' = 5),
pickup_ntaname LowCardinality(String),
dropoff_ntaname LowCardinality(String)
)
ENGINE = MergeTree
PRIMARY KEY (pickup_datetime, dropoff_datetime);INSERT INTO nyc_taxi.trips_small_adapted
SELECT
trip_id,
pickup_datetime,
dropoff_datetime,
pickup_longitude,
pickup_latitude,
dropoff_longitude,
dropoff_latitude,
passenger_count,
trip_distance,
fare_amount,
extra,
tip_amount,
tolls_amount,
total_amount,
payment_type,
pickup_ntaname,
dropoff_ntaname
FROM s3(
'https://datasets-documentation.s3.eu-west-3.amazonaws.com/nyc-taxi/trips_{0..2}.gz',
'TabSeparatedWithNames'
);نفّذ الأمر التالي لإجراء DETACH للجدول.
DETACH TABLE nyc_taxi.trips_small_adapted;ثم ألحِقه كجدول مكرّر:
ATTACH TABLE nyc_taxi.trips_small_adapted AS REPLICATED;أخيرًا، استعد البيانات الوصفية للنسخة المتماثلة:
SYSTEM RESTORE REPLICA nyc_taxi.trips_small_adapted;تحقّق من تحويله إلى ReplicatedMergeTree:
SELECT engine
FROM system.tables
WHERE name = 'trips_small_adapted' AND database = 'nyc_taxi';┌─engine──────────────┐
│ ReplicatedMergeTree │
└─────────────────────┘أنت الآن جاهز لمتابعة إعداد خدمة Cloud الخاصة بك تمهيدًا لاستعادة نسخة احتياطية لاحقًا من حاوية S3 الخاصة بك.
الجداول الموزعة مع ReplicatedMergeTree
إذا كان إعدادك يستخدم جداول موزعة عبر عدة شوارد، فستحتاج إلى جدول ReplicatedMergeTree محلي على كل عقدة، وإلى جدول Distributed ليكون نقطة دخول للاستعلامات.
شغّل الأمر التالي لإنشاء الجدول المحلي المُكرَّر على جميع عقد العنقود:
CREATE DATABASE IF NOT EXISTS nyc_taxi ON CLUSTER 'cluster_2S_2R';
CREATE TABLE nyc_taxi.trips_small_dist_local ON CLUSTER 'cluster_2S_2R'
(
trip_id UInt32,
pickup_datetime DateTime,
dropoff_datetime DateTime,
pickup_longitude Nullable(Float64),
pickup_latitude Nullable(Float64),
dropoff_longitude Nullable(Float64),
dropoff_latitude Nullable(Float64),
passenger_count UInt8,
trip_distance Float32,
fare_amount Float32,
extra Float32,
tip_amount Float32,
tolls_amount Float32,
total_amount Float32,
payment_type Enum('CSH' = 1, 'CRE' = 2, 'NOC' = 3, 'DIS' = 4, 'UNK' = 5),
pickup_ntaname LowCardinality(String),
dropoff_ntaname LowCardinality(String)
)
ENGINE = ReplicatedMergeTree('/clickhouse/tables/{database}/{table}/{shard}', '{replica}')
PRIMARY KEY (pickup_datetime, dropoff_datetime);ثم أنشئ جدول Distributed فوقه:
CREATE TABLE nyc_taxi.trips_small_dist ON CLUSTER 'cluster_2S_2R'
(
trip_id UInt32,
pickup_datetime DateTime,
dropoff_datetime DateTime,
pickup_longitude Nullable(Float64),
pickup_latitude Nullable(Float64),
dropoff_longitude Nullable(Float64),
dropoff_latitude Nullable(Float64),
passenger_count UInt8,
trip_distance Float32,
fare_amount Float32,
extra Float32,
tip_amount Float32,
tolls_amount Float32,
total_amount Float32,
payment_type Enum('CSH' = 1, 'CRE' = 2, 'NOC' = 3, 'DIS' = 4, 'UNK' = 5),
pickup_ntaname LowCardinality(String),
dropoff_ntaname LowCardinality(String)
)
ENGINE = Distributed('cluster_2S_2R', 'nyc_taxi', 'trips_small_dist_local', rand());أدرِج البيانات عبر الجدول الموزّع:
INSERT INTO nyc_taxi.trips_small_dist
SELECT
trip_id,
pickup_datetime,
dropoff_datetime,
pickup_longitude,
pickup_latitude,
dropoff_longitude,
dropoff_latitude,
passenger_count,
trip_distance,
fare_amount,
extra,
tip_amount,
tolls_amount,
total_amount,
payment_type,
pickup_ntaname,
dropoff_ntaname
FROM s3(
'https://datasets-documentation.s3.eu-west-3.amazonaws.com/nyc-taxi/trips_{0..2}.gz',
'TabSeparatedWithNames'
);التحضير لـ Cloud
ستستعيد بياناتك إلى خدمة Cloud جديدة. اتبع الخطوات أدناه لإنشاء خدمة Cloud جديدة.
افتح Cloud Console
انتقل إلى https://console.clickhouse.cloud/
أنشئ خدمة جديدة

اضبط الإعدادات وأنشئ خدمة
اختر المنطقة والتكوين المطلوبين، ثم انقر على Create service

أنشئ دور وصول
افتح SQL Console

إعداد الوصول إلى S3
لاستعادة النسخة الاحتياطية من S3، ستحتاج إلى تهيئة وصول آمن بين ClickHouse Cloud وحاوية S3 الخاصة بك.
-
اتبع الخطوات الواردة في "Accessing S3 data securely" لإنشاء دور وصول والحصول على ARN الخاص بالدور.
-
حدّث سياسة حاوية S3 التي أنشأتها في "How to create an S3 bucket and IAM role" بإضافة ARN الخاص بالدور من الخطوة السابقة.
ستبدو السياسة المحدّثة لحاوية S3 على النحو التالي تقريبًا:
{
"Version": "2012-10-17",
"Id": "Policy123456",
"Statement": [
{
"Sid": "abc123",
"Effect": "Allow",
"Principal": {
"AWS": [
"arn:aws:iam::123456789123:role/ClickHouseAccess-001",
"arn:aws:iam::123456789123:user/docs-s3-user"
]
},
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::ch-docs-s3-bucket",
"arn:aws:s3:::ch-docs-s3-bucket/*"
]
}
]
}تتضمن السياسة كِلا ARNين:
- مستخدم IAM (
docs-s3-user): يتيح لعنقود ClickHouse ذاتي الإدارة لديك أخذ نسخة احتياطية إلى S3 - ClickHouse Cloud role (
ClickHouseAccess-001): يتيح لخدمة Cloud لديك الاستعادة من S3
أخذ نسخة احتياطية (في النشر ذاتي الإدارة)
يجب أخذ نسخة احتياطية لكل شارد بشكل مستقل. اتصل بعقدة في كل شارد، ثم شغّل أمر النسخ الاحتياطي باستخدام مسار وجهة فريد لكل شارد.
استبدل BUCKET_URL وKEY_ID وSECRET_KEY ببيانات اعتماد AWS الخاصة بك.
يوضح لك الدليل "كيفية إنشاء حاوية S3 ودور IAM"
كيفية الحصول عليها إذا لم تكن لديك بعد.
الشارد 1:
BACKUP DATABASE nyc_taxi
TO S3(
'BUCKET_URL/backup_s1.zip',
'KEY_ID',
'SECRET_KEY'
)الشارد 2:
BACKUP DATABASE nyc_taxi
TO S3(
'BUCKET_URL/backup_s2.zip',
'KEY_ID',
'SECRET_KEY'
)إذا كان كل شيء مُعدًّا على نحو صحيح، فسترى استجابة مشابهة لما هو موضح أدناه، تتضمن معرّفًا فريدًا مُخصَّصًا للنسخة الاحتياطية وحالة النسخة الاحتياطية.
Query id: efcaf053-75ed-4924-aeb1-525547ea8d45
┌─id───────────────────────────────────┬─status─────────┐
│ e73b99ab-f2a9-443a-80b4-533efe2d40b3 │ BACKUP_CREATED │
└──────────────────────────────────────┴────────────────┘إذا تفقدت حاوية S3 التي كانت فارغة سابقًا، فسترى الآن ظهور بعض المجلدات:

إذا كنت تُجري ترحيلًا كاملًا، فيمكنك تشغيل الأمر التالي لإنشاء نسخة احتياطية من الخادم بالكامل:
BACKUP
TABLE system.users,
TABLE system.roles,
TABLE system.settings_profiles,
TABLE system.row_policies,
TABLE system.quotas,
TABLE system.functions,
ALL EXCEPT DATABASES INFORMATION_SCHEMA, information_schema, system
TO S3(
'BUCKET_ID',
'KEY_ID',
'SECRET_ID'
)
SETTINGS
compression_method='lzma',
compression_level=3;يأخذ الأمر أعلاه نسخة احتياطية مما يلي:
- جميع قواعد بيانات المستخدم والجداول
- حسابات المستخدمين وكلمات المرور
- الأدوار والأذونات
- ملفات تعريف الإعدادات
- سياسات الصفوف
- الحصص
- الدوال المعرّفة من قبل المستخدم
إذا كنت تستخدم موفّر خدمات Cloud (CSP) آخر، فيمكنك استخدام الصيغة TO S3() (لكلٍّ من AWS وGCP) وTO AzureBlobStorage().
بالنسبة إلى قواعد البيانات الكبيرة جدًا، فكّر في استخدام ASYNC لتشغيل النسخ الاحتياطي في الخلفية:
BACKUP DATABASE my_database
TO S3('https://your-bucket.s3.amazonaws.com/backup.zip', 'key', 'secret')
ASYNC;
-- Returns immediately with backup ID
-- Example result:
-- ┌─id──────────────────────────────────┬─status────────────┐
-- │ abc123-def456-789 │ CREATING_BACKUP │
-- └─────────────────────────────────────┴───────────────────┘يمكن بعد ذلك استخدام معرّف النسخة الاحتياطية لمتابعة تقدّم عملية النسخ الاحتياطي:
SELECT *
FROM system.backups
WHERE id = 'abc123-def456-789'يمكن أيضًا إجراء نسخ احتياطية تزايدية. لمزيد من التفاصيل عن النسخ الاحتياطية عمومًا، يُرجى الرجوع إلى وثائق النسخ الاحتياطي والاستعادة.
الاستعادة إلى ClickHouse Cloud
استعِد النسخة الاحتياطية لكل شارد على حدة إلى خدمة Cloud الخاصة بك. اضبط ROLE_ARN على
القيمة التي تم الحصول عليها من "الوصول إلى بيانات S3 بأمان".
استخدم SETTINGS allow_non_empty_tables=true في عملية الاستعادة الثانية (وأي عملية استعادة لاحقة)
بحيث تُضاف بيانات الشارد إلى الجداول التي تمت استعادتها بالفعل بدلًا من فشل العملية بسبب تعارض:
الشارد 1:
RESTORE DATABASE nyc_taxi
FROM S3(
'BUCKET_URL/backup_s1.zip',
extra_credentials(role_arn = 'ROLE_ARN')
)الشارد 2:
RESTORE DATABASE nyc_taxi
FROM S3(
'BUCKET_URL/backup_s2.zip',
extra_credentials(role_arn = 'ROLE_ARN')
)
SETTINGS allow_non_empty_tables=true;وبالمثل، يمكنك إجراء استعادة كاملة للخدمة:
RESTORE
TABLE system.users,
TABLE system.roles,
TABLE system.settings_profiles,
TABLE system.row_policies,
TABLE system.quotas,
ALL EXCEPT DATABASES INFORMATION_SCHEMA, information_schema, system
FROM S3(
'BUCKET_URL',
extra_credentials(role_arn = 'ROLE_ARN')
)بعد اكتمال عملية الاستعادة، يمكنك التحقق من توفّر البيانات في Cloud:
-- ClickHouse Cloud restores everything in your local table
SELECT count() from nyc_taxi.trips_small_dist_local;
3000317نظرًا إلى أن ClickHouse Cloud يستخدم SharedMergeTree داخليًا، لم تعد هناك حاجة إلى الجدول الموزّع القديم. يمكنك حذفه واستبداله بعرض يحتفظ باسم الجدول الأصلي لاستعلاماتك:
DROP TABLE drop table nyc_taxi.trips_small_dist;
CREATE VIEW nyc_taxi.trips_small_dist AS SELECT * FROM nyc_taxi.trips_small_dist_local;
SELECT count() from nyc_taxi.trips_small_dist;
3000317ستُستعاد جداول ReplicatedMergeTree غير الموزعة كجداول SharedMergeTree:
SELECT count() FROM nyc_taxi.trips_small_adapted;
3000317