مخطط نموذجي إلى حد ما في تطوير النظام ، عندما يتركز منطق المعالجة الرئيسي في التطبيق (في حالتنا ، Erlang) ، وبيانات هذا التطبيق (الإعدادات ، ملفات تعريف المستخدمين ، إلخ) في قاعدة البيانات (PostgreSQL). يخبئ تطبيق Erlang الإعدادات في ETS لتسريع المعالجة وتقليل الحمل في قاعدة البيانات عن طريق رفض الطلبات المستمرة. في الوقت نفسه ، يحدث تغيير هذه البيانات من خلال خدمة منفصلة (ربما خارجية).
في مثل هذه الحالات ، ينشأ التحدي المتمثل في تحديث البيانات المخزنة مؤقتًا. هناك طرق مختلفة لحل هذه المشكلة. واحد منهم هو تكرار المنطقية بوستجرس. حول هذا الموضوع وسوف تناقش أدناه.
دفق بروتوكول النسخ المتماثل المنطقي
يستخدم النسخ المتماثل المنطقي بروتوكول النسخ المتماثل لدفق PostgreSQL لتلقي تغييرات البيانات في جداول PostgreSQL من خلال قراءة سجلات WAL ، وتصفية الجداول التي تحتاج إليها ، وإرسال هذه التغييرات إلى المشترك. تشبه هذه الآلية تلك المستخدمة للنسخ المتماثل المادي لإنشاء قاعدة بيانات الاستعداد.
يوفر النسخ المتماثل المنطقي الفوائد التالية:
- تلقي التغييرات دون تأخير في الوقت الحقيقي ؛
- تصفية التغييرات حسب الجداول والعمليات (INSERT / DELETE / UPDATE) ؛
- اكتمال وسلامة البيانات التي يتلقاها المشترك. يتلقى المشترك التغييرات بنفس الترتيب كما حدث في قاعدة البيانات ؛
- عدم فقدان البيانات في حالة توقف مؤقت للمشترك. PostgreSQL يتذكر أين توقف النسخ المتماثل ؛
إعداد قاعدة البيانات
للعمل مع النسخ المتماثل المنطقي ، تحتاج إلى مكون إضافي يقوم بترميز سجلات WAL من الخادم بتنسيق أكثر ملاءمة.
قبل PostgreSQL 10 ، يمكنك استخدام / extension pglogical_output المساعد .
بدءاً من البرنامج المساعد PostgreSQL 10 pgoutput .
هذه المادة سوف تغطي البرنامج المساعد pgoutput.
من جانب PostgreSQL ، يجب عليك إكمال الخطوات التالية:
تعيين المعلمات لدعم النسخ المتماثل المنطقي في
postgresql.conf
wal_level = 'logical' max_replication_slots = 5 max_wal_senders = 5
إنشاء دور لاستخدامه للنسخ المتماثل. يجب أن يكون SUPERUSER
REPLICATION
أو SUPERUSER
.
CREATE USER epgl_test WITH REPLICATION PASSWORD 'epgl_test';
السماح بالوصول لهذا الدور في pg_hba.conf مع database = replication
host replication epgl_test 127.0.0.1/32 trust
إنشاء منشور . عند إنشاء منشور ، نشير إلى الجداول التي نخطط لاستلامها في تطبيق Erlang
CREATE PUBLICATION epgl_test FOR TABLE public.test_table1, public.test_table3; ALTER PUBLICATION epgl_test ADD TABLE public.test_table2;
إرلانج جزء
منذ وقت ليس ببعيد ، تمت إضافة دعم بروتوكول النسخ المتماثل المتدفق إلى مكتبة Erlang الشائعة للعمل مع PostgreSQL EPGSQL . بناءً على هذه المكتبة ، سنقوم ببناء المنطق لتلقي التغييرات في إرلانج.
نظرًا لأن تنسيق البيانات مباشرةً في رسالة XlogData
الخاصة بالبروتوكول يعتمد على المكون الإضافي المستخدم في فتحة النسخ المتماثل ، فإن مكتبة EPGSQL
بفك تشفير البيانات ، ولكنها تستدعي طريقة رد الاتصال أو ترسل الرسالة إلى العملية بشكل غير متزامن.
اتصال DB
يجب إنشاء اتصال النسخ متماثل خاص إلى قاعدة البيانات ، لهذا تحتاج إلى تمرير علامة replication
.
ضمن اتصال قاعدة بيانات النسخ المتماثل ، يمكن تنفيذ أوامر النسخ المتماثل فقط (على سبيل المثال ، DROP_REPLICATION_SLOT ، CREATE_REPLICATION_SLOT).
لا يمكنك تشغيل طلب منتظم من خلال هذا الاتصال.
إنشاء فتحة النسخ المتماثل
يتم استخدام فتحة النسخ المتماثل لتتبع الموضع الحالي لسجل WAL المنقول.
عند إنشاء فتحة نسخ متماثل ، يتم تحديد مكون إضافي لفك التشفير.
يقدم PostgreSQL 10 القدرة على إنشاء فتحات النسخ المتماثل المؤقتة التي يتم حذفها تلقائيًا عند إغلاق اتصال النسخ المتماثل.
إذا كان التطبيق يقرأ الحالة الأولية للجداول في كل مرة يبدأ فيها التشغيل ، فنوصيك باستخدام فتحات النسخ المتماثل المؤقتة ، وفي هذه الحالة لن تضطر إلى القلق بشأن حذف فتحات النسخ المتماثل التي تم إنشاؤها (DROP_REPLICATION_SLOT). تعد إزالة فتحات النسخ المتماثل القديمة / غير المستخدمة مهمة للغاية لأن PostgreSQL لا يحذف سجلات WAL حتى يتلقى المشتركون في جميع فتحات النسخ المتماثل التغيير. في حالة استمرار وجود فتحة للنسخ المتماثل غير نشطة ، فسوف تبدأ سجلات WAL في التراكم ، وفي أسرع وقت أو لاحق ، سيتجاوز نظام الملفات.
الحصول على الحالة الأولية للجداول
عند إنشاء فتحة نسخ متماثل (راجع الخطوة السابقة) ، يتم إنشاء لقطة تلقائيًا توضح حالة قاعدة البيانات في وقت إنشاء الفتحة. يمكن استخدام هذه اللقطة لتحميل الحالة الأولية للجداول ، والتي كانت في بداية النسخ المتماثل.
تتوفر لقطة فقط حتى يتم إغلاق اتصال النسخ المتماثل الذي تم فيه تنفيذ الأمر CREATE_REPLICATION_SLOT
.
لتحميل البيانات الأولية ، يجب إنشاء اتصال منتظم / غير متماثل جديد بقاعدة البيانات ، حيث لا يمكن إجراء SELECT على اتصال النسخ المتماثل. في هذا الصدد ، قم بتعيين اللقطة SET TRANSACTION SNAPSHOT SnapshotName
البيانات اللازمة.
بدء النسخ المتماثل
نبدأ النسخ المتماثل لفتحة النسخ المتماثل التي تم إنشاؤها. عند بدء النسخ المتماثل ، نقوم بتمرير معلمات إضافية للمكون الإضافي ، بالنسبة إلى pgoutput ، هذا هو اسم المنشور الذي تم إنشاؤه.
كل الخطوات معا
start_replication() ->
هناك خياران للتفاعل مع مكتبة EPGSQL
:
متزامن. يتم تمرير اسم الوحدة النمطية كـ رد اتصال. CallbackModule:handle_x_log_data
مكتبة البيانات المستلمة بوظيفة CallbackModule:handle_x_log_data
. يجب أن ترجع الدالة LastFlushedLSN ، LastAppliedLSN ، والتي يتم إرسالها في استجابة PostgreSQL لتتبع الموضع الحالي لفتحة النسخ المتماثل. في مشاريعنا نستخدم هذا الخيار فقط ؛
غير المتزامن. رد الاتصال هو معرف العملية الذي سيتلقى رسائل النموذج {epgsql, self(), {x_log_data, StartLSN, EndLSN, WALRecord}}
. بعد المعالجة ، يجب أن تبلغ العملية عن LSN المعالج من خلال استدعاء epgsql:standby_status_update(Conn, FlushedLSN, AppliedLSN)
؛
بدلا من الاستنتاج
بالإضافة إلى ذلك ، من أجل استخدام النهج الموصوف ، من الضروري تطبيق فك تشفير الرسائل من تنسيق المكون الإضافي لفتحة النسخ المتماثل في هياكل أكثر دراية بـ Erlang. أو استخدم المكتبة مع GitHub ، التي تنفذ فك التشفير لاثنين من المكونات الإضافية وتبسط تنفيذ أوامر النسخ المتماثل.