pg.
في هذا الدليل، ستُنشئ تطبيق Rails جديدًا، وتربطه بـ ClickHouse Managed Postgres عبر اتصال TLS موثَّق، ثم تُشغّل عملية ترحيل، وتُتيح مورد Post مُولَّدًا باستخدام أداة هيكل أولي.
المتطلبات الأساسية
- Ruby 3.2 أو أحدث. اختُبر هذا الدليل باستخدام Ruby 4.0.7 وRails 8.1.4 و
pg1.6.3. - حساب على ClickHouse Cloud.
pg إصدارات مُصرَّفة مسبقًا لأنظمة Linux وmacOS وWindows تتضمن libpq، لذا لا حاجة إلى تثبيت PostgreSQL محليًا.
إنشاء خدمة ClickHouse Managed Postgres
في وحدة تحكم ClickHouse Cloud، انقر على New service ثم اختر Postgres. سيصبح المثيل جاهزًا في غضون دقائق قليلة. للاطلاع على شرح مفصّل للخطوات، راجع دليل البدء السريع.الحصول على بيانات الاتصال
افتح خدمتك وانقر على Connect في الشريط الجانبي الأيسر. أبقِ خيار Directly محددًا وفعّل Use SSL. انسخ كلمة المرور واسم مضيف الخادم، ثم انقر على Download CA certificate. شهادة CA خاصة بخدمتك وحدها، ويمكنك أيضًا تنزيلها لاحقًا من Settings → CA Certificate. اتصال مباشر أم عبر PgBouncer؟ خادم Rails عملية طويلة الأمد تحتفظ بمجمّع اتصالات خاص بها (max_connections في config/database.yml، وقيمته الافتراضية خمسة اتصالات لكل عملية)، لذا يعتمد هذا الدليل على الاتصال المباشر بـ Postgres عبر المنفذ 5432.
إذا كنت تشغّل عمليات كثيرة وبلغت الحد الأقصى للاتصالات، فراجع استخدام PgBouncer.
إنشاء تطبيق Rails
ثبّت Rails وأنشئ تطبيقًا يستخدم PostgreSQL:تهيئة اتصال قاعدة البيانات
انقل شهادة CA التي نزّلتها إلى دليلconfig الخاص بالتطبيق، ثم أعد تسميتها إلى ca-certificate.pem.
يُسمّى الملف الذي نزّلته باسم خدمتك، مثل your-service-ca-certificate.pem:
config/database.yml، استبدل القسم development بما يلي:
sslmode: verify-full مكتبة libpq تتحقق من أن شهادة الخادم موقّعة من جهة إصدار الشهادات (CA) الخاصة بخدمتك، ومن تطابقها مع اسم المضيف. يُرجع Rails.root.join مسارًا مطلقًا، ولذلك يعمل الإعداد أيًّا كان الدليل الذي تشغّل Rails منه.
اضبط DATABASE_URL ليشير إلى خدمتك باستخدام اسم قاعدة بيانات جديد. يستخدم هذا الدليل الإرشادي الاسم guide_rails:
احذف سلسلة الاستعلام من
DATABASE_URL. فالمعلمات الواردة في URL تتجاوز المفاتيح المحددة في database.yml، وبالتالي فإن نسخ sslrootcert=your-service-ca-certificate.pem كما هو سيستبدل إعدادك بمسار نسبي إلى الدليل الحالي.db:create سوى قاعدة البيانات المحددة في DATABASE_URL، إذ يتصل بقاعدة البيانات الافتراضية postgres لتنفيذ CREATE DATABASE دون أن يُجري عليها أي تغيير. وعند تعيين DATABASE_URL، يتجاوز Rails أيضًا إنشاء قاعدة بيانات الاختبار المحلية.
إنشاء نموذج وتشغيل الترحيل
أنشئ هيكلًا أوليًا (scaffold) لموردPost وطبّق الترحيل الخاص به. في التطبيقات القائمة، يُنشئ الأمر bin/rails db:migrate كذلك الجداول الحالية لتطبيقك في قاعدة البيانات الجديدة، لكنها تكون فارغة في البداية، إذ لا تُنسخ البيانات الموجودة في SQLite:
الاستعلام عن قاعدة البيانات
أنشئ الملفscript/posts_demo.rb وضمّنه بعض استدعاءات Active Record:
bin/rails runner:
pg_stat_ssl للاتصال الحالي، وهو ما يؤكد أن الـ session مُشفَّرة.
تشغيل التطبيق
شغّل خادم التطوير:guide_rails، واختر الجدول posts.
ينشئ Rails أيضًا الجدولين schema_migrations وar_internal_metadata لتتبّع عمليات الترحيل.
يحتوي الجدول posts على الصفين اللذين أضافهما script/posts_demo.rb:
استخدام PgBouncer
تفتح كل عملية Rails ما يصل إلىmax_connections من الاتصالات المباشرة. فإذا اقترب مجموع اتصالات العمليات الكثيرة من حد الاتصالات في Postgres، فاتصل بدلاً من ذلك عبر PgBouncer المضمَّن: اختر via PgBouncer في نافذة Connect واستخدم المنفذ 6432 في DATABASE_URL.
يعمل PgBouncer في وضع تجميع المعاملات (transaction pooling):
-
العبارات المُعدّة مسبقاً تعمل مع إعدادات Rails الافتراضية إذا كان إصدار gem
pgهو 1.6 أو أحدث، وكان يستخدمlibpqبالإصدار 17 أو أحدث. علماً بأن حزم gem pg1.6 المُصرَّفة مسبقاً تتضمنlibpqبالإصدار 18. ومع هذه الإصدارات، عندما يُخرج Rails عبارةً من ذاكرة التخزين المؤقت الخاصة به، فإنه يحررها عبر رسالةCloseعلى مستوى البروتوكول، وهي رسالة يدعمها PgBouncer المضمَّن. أما الإصدارات الأقدم منpgأوlibpqفترسل بدلاً منها عبارة SQL DEALLOCATE، التي تفشل عبر PgBouncer مع الخطأprepared statement "a1" does not exist. وإذا حدث ذلك داخل معاملة، فستُلغى المعاملة (PG::InFailedSqlTransaction). للتحقق من إصداراتك، شغّل:يجب أن تكون النتيجة1.6.0أو أحدث و170000أو أحدث. وإذا تعذّرت عليك الترقية، فأضفprepared_statements: falseإلى قسمdevelopment. يفعّل Rails العبارات المُعدّة مسبقاً فيproduction، لكنها تكون معطّلة افتراضياً فيdevelopmentلأنquery_log_tags_enabledمفعّل. -
عمليات الترحيل تحصل على قفل استشاري على مستوى الـ session (
pg_try_advisory_lock) لمنع تشغيلها بشكل متزامن. وفي وضع تجميع المعاملات، قد يصل طلب فكّ القفل إلى اتصال Postgres مختلف، فيفشل مع الخطأFailed to release advisory lockويظل القفل قائماً، ومن ثم تفشل عمليات التشغيل اللاحقة مع الخطأCannot run migrations because another migration process is currently running. لذا، إما أن تشغّلbin/rails db:migrateباستخدامDATABASE_URLمباشر على المنفذ5432، أو أن تعطّل القفل:
advisory_locks: false، تأكّد من أن عملية نشر واحدة فقط تُشغّل عمليات الترحيل في أي وقت.
استكشاف الأخطاء وإصلاحها
SSL error: certificate verify failed: لا يشيرsslrootcertإلى شهادة CA الخاصة بخدمتك. نزّلها مجددًا من Settings → CA Certificate. لكل خدمة شهادة CA خاصة بها، ولا تصلح حزم شهادات CA العامة لهذا الغرض.root certificate file "..." does not exist: المسار المحدد فيsslrootcertغير صحيح. تحقّق من وجود الملفconfig/ca-certificate.pem.
الخطوات التالية
- استخدم إعدادَي
sslmodeوsslrootcertنفسيهما في تهيئةproductionلديك. - الاتصال: سلاسل الاتصال وPgBouncer وTLS.
- الإعدادات: غيّر معلمات Postgres وPgBouncer مثل
max_connections. - النسخ المتماثلة للقراءة: وسّع قدرة عمليات القراءة، على سبيل المثال عبر ميزة قواعد البيانات المتعددة في Rails.
- Sync to ClickHouse: انسخ جداول Rails إلى ClickHouse لإجراء التحليلات.