النسخ المتماثل المنطقي وفك التشفير المنطقي في Azure Database for PostgreSQL - Flexible Server

يطبق على: قاعدة بيانات Azure لـ PostgreSQL - الخادم المرن

يدعم خادم Azure Database for PostgreSQL المرن منهجيات استخراج البيانات المنطقية والنسخ المتماثل التالية:

  1. النسخ المتماثل المنطقي

    1. باستخدام النسخ المتماثل المنطقي الأصلي PostgreSQL لنسخ عناصر البيانات نسخًا متماثلاً. يسمح النسخ المتماثل المنطقي بالتحكم الدقيق في النسخ المتماثل للبيانات، بما في ذلك النسخ المتماثل للبيانات على مستوى الجدول.
    2. استخدام ملحق pglogical الذي يوفر النسخ المتماثل المنطقي للبث والمزيد من الإمكانات مثل نسخ المخطط الأولي لقاعدة البيانات، ودعم TRUNCATE، والقدرة على نسخ DDL، وما إلى ذلك.
  2. فك التشفير المنطقي والذي يتم تنفيذه بواسطة فك تشفير محتوى سجل الكتابة المسبقة (WAL).

مقارنة النسخ المتماثل المنطقي وفك التشفير المنطقي

النسخ المتماثل المنطقي وفك التشفير المنطقي لهما العديد من أوجه التشابه. كلاهما:

هناك اختلافات بين التقنيتين:

النسخ المتماثل المنطقي:

  • يسمح لك بتحديد جدول أو مجموعة من الجداول ليتم نسخها نسخًا متماثلاً.

فك التشفير المنطقي:

  • يستخرج التغييرات عبر كافة الجداول في قاعدة بيانات.

المتطلبات الأساسية للنسخ المتماثل المنطقي وفك التشفير المنطقي

  1. انتقل إلى صفحة معلمات الخادم على المدخل.

  2. قم بتعيين معلمة الخادم wal_level إلى logical.

  3. إذا كنت تريد استخدام ملحق pglogical، فابحث shared_preload_librariesعن المعلمات و azure.extensions ، وحدد pglogical من مربع القائمة المنسدلة.

  4. قم بتحديث قيمة المعلمة max_worker_processes إلى 16 على الأقل. وإلا، فقد تواجه مشكلات مثل WARNING: out of background worker slots.

  5. احفظ التغييرات ثم أعد تشغيل الخادم لتطبيق التغييرات.

  6. تأكد من أن مثيل خادم Azure Database for PostgreSQL المرن يسمح بنسبة استخدام الشبكة من مورد الاتصال.

  7. امنح المستخدم المسؤول أذونات النسخ المتماثل.

    ALTER ROLE <adminname> WITH REPLICATION;
    
  8. قد تحتاج إلى التأكد من أن الدور الذي تستخدمه له امتيازات على المخطط الذي تقوم بنسخه نسخا متماثلا. وإلا، فقد تواجه أخطاء مثل Permission denied for schema.

إشعار

من الممارسات الجيدة دائما فصل مستخدم النسخ المتماثل عن حساب المسؤول العادي.

استخدام النسخ المتماثل المنطقي وفك التشفير المنطقي

استخدام النسخ المتماثل المنطقي الأصلي هو أبسط طريقة لنسخ البيانات نسخا متماثلا من قاعدة بيانات Azure لخادم PostgreSQL المرن. يمكنك استخدام واجهة SQL أو بروتوكول الدفق لاستهلاك التغييرات. يمكنك أيضا استخدام واجهة SQL لاستهلاك التغييرات باستخدام فك التشفير المنطقي.

النسخ المتماثل المنطقي الأصلي

يستخدم النسخ المتماثل المنطقي مصطلحي «الناشر» و«المشترك».

  • الناشر هو قاعدة بيانات Azure لقاعدة بيانات الخادم المرن PostgreSQL التي ترسل البيانات منها.
  • المشترك هو قاعدة بيانات Azure لقاعدة بيانات خادم PostgreSQL المرنة التي ترسل البيانات إليها.

فيما يلي بعض نماذج التعليمات البرمجية التي يمكنك استخدامها لتجربة النسخ المتماثل المنطقي.

  1. اتصل بقاعدة بيانات الناشر. أنشئ جدولاً وأضف بعض البيانات.

    CREATE TABLE basic (id INTEGER NOT NULL PRIMARY KEY, a TEXT);
    INSERT INTO basic VALUES (1, 'apple');
    INSERT INTO basic VALUES (2, 'banana');
    
  2. أنشئ منشورًا للجدول.

    CREATE PUBLICATION pub FOR TABLE basic;
    
  3. اتصل بقاعدة بيانات المشترك. أنشئ جدولاً بنفس المخطط الموجود على الناشر.

    CREATE TABLE basic (id INTEGER NOT NULL PRIMARY KEY, a TEXT);
    
  4. إنشاء اشتراك يتصل بالمنشورات التي أنشأتها سابقا.

    CREATE SUBSCRIPTION sub CONNECTION 'host=<server>.postgres.database.azure.com user=<rep_user> dbname=<dbname> password=<password>' PUBLICATION pub;
    
  5. يمكنك الآن الاستعلام عن الجدول على المشترك. ترى أنه قد تلقى بيانات من الناشر.

    SELECT * FROM basic;
    

    يمكنك إضافة المزيد من الصفوف إلى جدول الناشر وعرض التغييرات على المشترك.

    إذا لم تتمكن من رؤية البيانات، فمكن امتياز تسجيل الدخول وتحقق azure_pg_admin من محتوى الجدول.

    ALTER ROLE azure_pg_admin login;
    

تفضل بزيارة وثائق PostgreSQL لفهم المزيد حول النسخ المتماثل المنطقي.

استخدام النسخ المتماثل المنطقي بين قواعد البيانات على نفس الخادم

عندما تهدف إلى إعداد النسخ المتماثل المنطقي بين قواعد البيانات المختلفة الموجودة على نفس قاعدة بيانات Azure لمثيل خادم PostgreSQL المرن، من الضروري اتباع إرشادات محددة لتجنب قيود التنفيذ الموجودة حاليا. اعتبارا من الآن، لن ينجح إنشاء اشتراك يتصل بنفس نظام مجموعة قاعدة البيانات إلا إذا لم يتم إنشاء فتحة النسخ المتماثل داخل نفس الأمر؛ وإلا، يتوقف CREATE SUBSCRIPTION الاتصال، في LibPQWalReceiverReceive حدث انتظار. يحدث هذا بسبب تقييد موجود داخل محرك Postgres، والذي قد تتم إزالته في الإصدارات المستقبلية.

لإعداد النسخ المتماثل المنطقي بشكل فعال بين قواعد البيانات "المصدر" و"الهدف" على نفس الخادم مع التحايل على هذا التقييد، اتبع الخطوات الموضحة أدناه:

أولا، أنشئ جدولا باسم "أساسي" بمخطط متطابق في كل من قواعد البيانات المصدر والهدف:

-- Run this on both source and target databases
CREATE TABLE basic (id INTEGER NOT NULL PRIMARY KEY, a TEXT);

بعد ذلك، في قاعدة البيانات المصدر، قم بإنشاء منشور للجدول وإنشاء فتحة نسخ متماثل منطقية بشكل منفصل باستخدام pg_create_logical_replication_slot الدالة ، مما يساعد على تجنب المشكلة المعلقة التي تحدث عادة عند إنشاء الفتحة في نفس الأمر مثل الاشتراك. تحتاج إلى استخدام pgoutput المكون الإضافي:

-- Run this on the source database
CREATE PUBLICATION pub FOR TABLE basic;
SELECT pg_create_logical_replication_slot('myslot', 'pgoutput');

بعد ذلك، في قاعدة البيانات الهدف، أنشئ اشتراكا في المنشور الذي تم إنشاؤه مسبقا، مع create_slot التأكد من تعيينه لمنع false خادم Azure Database for PostgreSQL المرن من إنشاء فتحة جديدة، وتحديد اسم الفتحة الذي تم إنشاؤه في الخطوة السابقة بشكل صحيح. قبل تشغيل الأمر، استبدل العناصر النائبة في سلسلة الاتصال ببيانات اعتماد قاعدة البيانات الفعلية:

-- Run this on the target database
CREATE SUBSCRIPTION sub
   CONNECTION 'dbname=<source dbname> host=<server>.postgres.database.azure.com port=5432 user=<rep_user> password=<password>'
   PUBLICATION pub
   WITH (create_slot = false, slot_name='myslot');

بعد إعداد النسخ المتماثل المنطقي، يمكنك الآن اختباره عن طريق إدراج سجل جديد في الجدول "الأساسي" في قاعدة البيانات المصدر ثم التحقق من أنه ينسخ نسخا متماثلا إلى قاعدة البيانات الهدف:

-- Run this on the source database
INSERT INTO basic SELECT 3, 'mango';

-- Run this on the target database
TABLE basic;

إذا تم تكوين كل شيء بشكل صحيح، يجب أن تشاهد السجل الجديد من قاعدة البيانات المصدر في قاعدة البيانات الهدف، مما يؤكد الإعداد الناجح للنسخ المتماثل المنطقي.

ملحق pglogical

فيما يلي مثال على تكوين pglogical في خادم قاعدة بيانات الموفر والمشترك. راجع وثائق ملحق pglogical للحصول على مزيد من التفاصيل. تأكد أيضا من تنفيذ مهام المتطلبات الأساسية المذكورة أعلاه.

  1. قم بتثبيت ملحق pglogical في قاعدة البيانات في كل من الموفر وخوادم قاعدة بيانات المشترك.

    \c myDB
    CREATE EXTENSION pglogical;
    
  2. إذا كان مستخدم النسخ المتماثل غير مستخدم إدارة الخادم (الذي أنشأ الخادم)، فتأكد من منح العضوية في دور azure_pg_admin للمستخدم وتعيين سمات REPLICATION وLOGIN للمستخدم. راجع وثائق pglogical للحصول على التفاصيل.

    GRANT azure_pg_admin to myUser;
    ALTER ROLE myUser REPLICATION LOGIN;
    
  3. في خادم قاعدة بيانات الموفر (المصدر/الناشر)، أنشئ عقدة الموفر.

    select pglogical.create_node( node_name := 'provider1',
    dsn := ' host=myProviderServer.postgres.database.azure.com port=5432 dbname=myDB user=myUser password=myPassword');
    
  4. أنشئ مجموعة النسخ المتماثل.

    select pglogical.create_replication_set('myreplicationset');
    
  5. أضف كافة الجداول في قاعدة البيانات إلى مجموعة النسخ المتماثل.

    SELECT pglogical.replication_set_add_all_tables('myreplicationset', '{public}'::text[]);
    

    كأسلوب بديل، يمكنك أيضًا إضافة جداول من مخطط معين (على سبيل المثال، testUser) إلى مجموعة النسخ المتماثل الافتراضية.

    SELECT pglogical.replication_set_add_all_tables('default', ARRAY['testUser']);
    
  6. في خادم قاعدة بيانات المشترك، أنشئ عقدة مشترك.

    select pglogical.create_node( node_name := 'subscriber1',
    dsn := ' host=mySubscriberServer.postgres.database.azure.com port=5432 dbname=myDB user=myUser password=myPasword' );
    
  7. أنشئ اشتراكًا لبدء المزامنة وعملية النسخ المتماثل.

    select pglogical.create_subscription (
    subscription_name := 'subscription1',
    replication_sets := array['myreplicationset'],
    provider_dsn := 'host=myProviderServer.postgres.database.azure.com port=5432 dbname=myDB user=myUser password=myPassword');
    
  8. يمكنك بعد ذلك التحقق من حالة الاشتراك.

    SELECT subscription_name, status FROM pglogical.show_subscription_status();
    

تنبيه

لا يدعم Pglogical حاليا النسخ المتماثل التلقائي ل DDL. يمكن نسخ المخطط الأولي يدويا باستخدام pg_dump --schema-only. يمكن تنفيذ عبارات DDL على الموفر والمشترك في وقت واحد باستخدام الدالة pglogical.replicate_ddl_command. يرجى الانتباه إلى القيود الأخرى للملحق المدرج هنا.

فك التشفير المنطقي

يمكن استهلاك فك التشفير المنطقي عبر بروتوكول البث أو واجهة SQL.

بروتوكول دفق البيانات

غالبا ما يكون استهلاك التغييرات باستخدام بروتوكول دفق البيانات أفضل. يمكنك إنشاء المستهلك / الموصل الخاص بك، أو استخدام خدمة تابعة لجهة خارجية مثل Debezium.

تفضل بزيارة وثائق wal2json للحصول على مثال باستخدام بروتوكول دفق البيانات مع pg_recvlogical.

واجهة SQL

في المثال أدناه، نستخدم واجهة SQL مع المكون الإضافي wal2json.

  1. إنشاء فتحة.

    SELECT * FROM pg_create_logical_replication_slot('test_slot', 'wal2json');
    
  2. إصدار أوامر SQL. على سبيل المثال:

    CREATE TABLE a_table (
       id varchar(40) NOT NULL,
       item varchar(40),
       PRIMARY KEY (id)
    );
    
    INSERT INTO a_table (id, item) VALUES ('id1', 'item1');
    DELETE FROM a_table WHERE id='id1';
    
  3. استهلك التغييرات.

    SELECT data FROM pg_logical_slot_get_changes('test_slot', NULL, NULL, 'pretty-print', '1');
    

    يبدو الإخراج مثل:

    {
          "change": [
          ]
    }
    {
          "change": [
                   {
                            "kind": "insert",
                            "schema": "public",
                            "table": "a_table",
                            "columnnames": ["id", "item"],
                            "columntypes": ["character varying(40)", "character varying(40)"],
                            "columnvalues": ["id1", "item1"]
                   }
          ]
    }
    {
          "change": [
                   {
                            "kind": "delete",
                            "schema": "public",
                            "table": "a_table",
                            "oldkeys": {
                                  "keynames": ["id"],
                                  "keytypes": ["character varying(40)"],
                                  "keyvalues": ["id1"]
                            }
                   }
          ]
    }
    
  4. قم بإفلات الفتحة بمجرد الانتهاء من استخدامها.

    SELECT pg_drop_replication_slot('test_slot');
    

تفضل بزيارة وثائق PostgreSQL لفهم المزيد حول فك التشفير المنطقي.

Monitor

يجب مراقبة فك التشفير المنطقي. يجب قطع أي فتحة نسخ متماثل غير مستخدمة. تحتفظ الفتحات بسجلات Postgres WAL وكتالوجات النظام ذات الصلة حتى تتم قراءة التغييرات. إذا فشل المشترك أو المستهلك أو إذا تم تكوينه بشكل غير صحيح، تتراكم السجلات غير المكتملة وتملأ التخزين الخاص بك. أيضا، تزيد السجلات غير المكتملة من خطر التفاف معرف العملية. يمكن أن يتسبب كلا الموقفين في تعذر توفر الخادم. لذلك، يجب استهلاك فتحات النسخ المتماثل المنطقي بشكل مستمر. إن لم تعد فتحة النسخ المتماثل المنطقية مستخدمة، اقطعها على الفور.

يشير العمود "النشط" في pg_replication_slots طريقة العرض إلى ما إذا كان هناك مستهلك متصل بفتحة.

SELECT * FROM pg_replication_slots;

قم بتعيين تنبيهات على الحد الأقصى لمعرفات المعاملات المستخدمة ومقاييس الخادم المرن لقاعدة بيانات Azure المستخدمة ل PostgreSQL لإعلامك عندما تزيد القيم عن الحدود العادية.

القيود

  • تنطبق قيود النسخ المتماثل المنطقي كما هو موثق هنا.

  • الفتحات وتجاوز فشل قابلية الوصول العالية - عند استخدام الخوادم الممكنة ذات قابلية الوصول العالية (HA) مع قاعدة بيانات Azure لخادم PostgreSQL المرن، يجب أن تدرك أنه لا يتم الاحتفاظ بفتحات النسخ المتماثل المنطقية أثناء أحداث تجاوز الفشل. للحفاظ على فتحات النسخ المتماثل المنطقية وضمان تناسق البيانات بعد تجاوز الفشل، يوصى باستخدام ملحق PG Failover Slots. لمزيد من المعلومات حول تمكين هذا الملحق، يرجى الرجوع إلى الوثائق.

هام

يجب إسقاط فتحة النسخ المتماثل المنطقية في الخادم الأساسي إذا لم يعد المشترك المقابل موجودا. وإلا، تتراكم ملفات WAL في الأساسي، ما يملأ التخزين. لنفترض أن حد التخزين يتجاوز حدا معينا، وأن فتحة النسخ المتماثل المنطقية غير مستخدمة (بسبب مشترك غير متوفر). في هذه الحالة، يقوم مثيل خادم Azure Database for PostgreSQL المرن تلقائيا بإسقاط فتحة النسخ المتماثل المنطقية غير المستخدمة. يصدر هذا الإجراء ملفات WAL المتراكمة ويتجنب عدم توفر الخادم الخاص بك بسبب ملء موقف التخزين.