PostgreSQL için Azure Veritabanı esnek sunucusunda mantıksal çoğaltma ve mantıksal kod çözme

PostgreSQL için Azure Veritabanı esnek sunucu aşağıdaki mantıksal veri ayıklama ve çoğaltma yöntemlerini destekler:

  1. Mantıksal çoğaltma

    1. Veri nesnelerini çoğaltmak için PostgreSQL yerel mantıksal çoğaltma kullanma. Mantıksal çoğaltma, tablo düzeyinde veri çoğaltma da dahil olmak üzere veri çoğaltması üzerinde ayrıntılı denetim sağlar.
    2. Mantıksal akış çoğaltması ve veritabanının ilk şemasını kopyalama, TRUNCATE desteği, DDL'yi çoğaltma gibi daha birçok özellik sağlayan pglogical uzantısını kullanma.
  2. Mantıksal çözümleme, write-ahead log’un (WAL) içeriğinin çözümlenmesiyle uygulanır.

Mantıksal çoğaltmayı ve mantıksal kod çözmeyi karşılaştırma

Mantıksal çoğaltma ve mantıksal kod çözmenin çeşitli benzerlikleri vardır. İkisi de:

İki teknolojinin farklılıkları vardır:

Mantıksal çoğaltma:

  • Çoğaltılacak bir tablo veya tablo kümesi belirtmenize olanak tanır.

Mantıksal kod çözme:

  • Veritabanındaki tüm tablolardaki değişiklikleri ayıklar.

Mantıksal çoğaltma ve mantıksal kod çözme önkoşulları

  1. Portalda parametreler sayfasına gidin.

  2. parametresini wal_level olarak logicalayarlayın.

  3. pglogical uzantısını kullanmak istiyorsanız, shared_preload_libraries ve azure.extensions parametrelerini arayın ve açılır liste kutusundan pglogical seçin.

  4. Parametre değerini en az 16 olarak güncelleştirin max_worker_processes . Aksi takdirde gibi WARNING: out of background worker slotssorunlarla karşılaşabilirsiniz.

  5. Değişiklikleri kaydedin ve değişiklikleri uygulamak için sunucuyu yeniden başlatın.

  6. PostgreSQL için Azure Veri Tabanı esnek sunucunuzun, bağlantı kaynağınızdan gelen ağ trafiğine izin verdiğinden emin olun.

  7. Yönetici kullanıcıya çoğaltma izinleri verin.

    ALTER ROLE <adminname> WITH REPLICATION;
    
  8. Kullandığınız rolün çoğalttığınız şemada ayrıcalıklara sahip olduğundan emin olun. Aksi takdirde gibi Permission denied for schemahatalara karşılaşabilirsiniz.

Uyarı

Çoğaltma kullanıcınızı normal yönetici hesabından ayırmak her zaman iyi bir uygulamadır.

Mantıksal çoğaltma ve mantıksal kod çözme kullanma

Yerel mantıksal çoğaltmayı kullanmak, verileri PostgreSQL için Azure Veri Tabanı esnek sunucunuzdan çoğaltmanın en kolay yoludur. Değişiklikleri kullanmak için SQL arabirimini veya akış protokolünü kullanabilirsiniz. Mantıksal kod çözme kullanarak değişiklikleri kullanmak için SQL arabirimini de kullanabilirsiniz.

Yerel mantıksal çoğaltma

Mantıksal çoğaltma yayımcı ve abone terimlerini kullanır.

  • Yayımlayıcı, veri gönderen PostgreSQL için Azure Veri Tabanı esnek sunucu veritabanıdır.
  • Abone, verileri alan PostgreSQL için Azure Veri Tabanı esnek sunucu veritabanıdır.

Mantıksal çoğaltmayı denemek için kullanabileceğiniz bazı örnek kodlar aşağıda verilmiştır.

  1. Yayımcı veritabanına bağlanın. Bir tablo oluşturun ve bazı veriler ekleyin.

    CREATE TABLE basic (id INTEGER NOT NULL PRIMARY KEY, a TEXT);
    INSERT INTO basic VALUES (1, 'apple');
    INSERT INTO basic VALUES (2, 'banana');
    
  2. Tablo için bir rapor oluşturun.

    CREATE PUBLICATION pub FOR TABLE basic;
    
  3. Abone veritabanına bağlanın. Yayımcıyla aynı şemaya sahip bir tablo oluşturun.

    CREATE TABLE basic (id INTEGER NOT NULL PRIMARY KEY, a TEXT);
    
  4. Daha önce oluşturduğunuz yayına bağlanan bir abonelik oluşturun.

    CREATE SUBSCRIPTION sub CONNECTION 'host=<server>.postgres.database.azure.com user=<rep_user> dbname=<dbname> password=<password>' PUBLICATION pub;
    
  5. Artık tabloyu abonede sorgulayabilirsiniz. Yayımcıdan veri aldığını görürsünüz.

    SELECT * FROM basic;
    

    Yayımcının tablosuna daha fazla satır ekleyebilir ve değişiklikleri abonede görüntüleyebilirsiniz.

    Verileri göremiyorsanız rolün üyesi azure_pg_admin olan bir kullanıcıya geçin ve tablo içeriğini denetleyin.

Mantıksal çoğaltma hakkında daha fazla bilgi edinmek için PostgreSQL belgelerini ziyaret edin.

Aynı sunucudaki veritabanları arasında mantıksal çoğaltma kullanma

Aynı PostgreSQL için Azure Veri Tabanı esnek sunucudaki farklı veritabanları arasında mantıksal çoğaltma ayarlamak için, uygulama kısıtlamalarını önlemek için belirli yönergeleri izleyin. Şu anda, yalnızca çoğaltma yuvası aynı komut içinde oluşturulmamışsa aynı veritabanı kümesine bağlanan bir abonelik oluşturabilirsiniz. Aksi takdirde, CREATE SUBSCRIPTION çağrı LibPQWalReceiverReceive bekleme olayında takılı kalır. Bu davranış, Postgres altyapısındaki mevcut bir kısıtlamadan kaynaklanır ve bu kısıtlama gelecek sürümlerde kaldırılabilir.

Bu kısıtlamadan kaçınırken aynı sunucudaki "kaynak" ve "hedef" veritabanlarınız arasında mantıksal çoğaltma ayarlamak için şu adımları izleyin:

İlk olarak, hem kaynak hem de hedef veritabanlarında aynı şemaya sahip adlı basic bir tablo oluşturun:

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

Ardından, kaynak veritabanında tablo için bir yayın oluşturun ve ayrıca pg_create_logical_replication_slot işlevini kullanarak bir mantıksal çoğaltma yuvası oluşturun. Bu yaklaşım, slot abonelikle aynı komut içinde oluşturulduğunda genellikle ortaya çıkan kilitlenme sorununu önlemeye yardımcı olur. pgoutput eklentisini kullanın:

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

Ardından hedef veritabanınızda daha önce oluşturulan yayına bir abonelik oluşturun. create_slot öğesini, PostgreSQL için Azure Veri Tabanı esnek sunucunuzun yeni bir yuva oluşturmasını önlemek için false olarak ayarlayın ve önceki adımda oluşturduğunuz yuvanın adını belirtin. Komutu çalıştırmadan önce, bağlantı dizesi yer tutucularını gerçek veritabanı kimlik bilgilerinizle değiştirin:

-- 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');

Mantıksal çoğaltmayı ayarladıktan sonra, kaynak veritabanınızdaki tabloya basic yeni bir kayıt ekleyerek ve ardından hedef veritabanınıza çoğaltıldığını doğrulayarak bunu test edin:

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

-- Run this on the target database
TABLE basic;

Her şey doğru yapılandırıldıysa, hedef veritabanınızdaki kaynak veritabanındaki yeni kaydı görürsünüz ve mantıksal çoğaltmanın başarılı kurulumunu onaylarsınız.

pglogical uzantısı

Aşağıda sağlayıcı veritabanı sunucusunda ve abonede pglogical yapılandırma örneği verilmiştır. Daha fazla ayrıntı için pglogical extension belgelerine bakın. Ayrıca, daha önce listelenen önkoşul görevlerini tamamladığınızdan emin olun.

  1. Hem sağlayıcıya hem de abone veritabanı sunucularına veritabanına pglogical uzantısını yükleyin.

    \c myDB
    CREATE EXTENSION pglogical;
    
  2. Çoğaltma kullanıcısı sunucu yönetimi kullanıcısı değilse (sunucuyu oluşturan kullanıcı), kullanıcıya rol üyeliği azure_pg_admin verin ve ÇOĞALTMA ve LOGIN özniteliklerini kullanıcıya atayın. Ayrıntılar için pglogical belgelerine bakın.

    GRANT azure_pg_admin to myUser;
    ALTER ROLE myUser REPLICATION LOGIN;
    
  3. Sağlayıcı (kaynak/yayımcı) veritabanı sunucusunda sağlayıcı düğümünü oluşturun.

    select pglogical.create_node( node_name := 'provider1',
    dsn := ' host=myProviderServer.postgres.database.azure.com port=5432 dbname=myDB user=myUser password=<password>');
    
  4. Çoğaltma kümesi oluşturun.

    select pglogical.create_replication_set('myreplicationset');
    
  5. Veritabanındaki tüm tabloları çoğaltma kümesine ekleyin.

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

    Alternatif bir yöntem olarak, belirli bir şemadan (örneğin testUser) varsayılan çoğaltma kümesine tablolar da ekleyebilirsiniz.

    SELECT pglogical.replication_set_add_all_tables('default', ARRAY['testUser']);
    
  6. Abone veritabanı sunucusunda bir abone düğümü oluşturun.

    select pglogical.create_node( node_name := 'subscriber1',
    dsn := ' host=mySubscriberServer.postgres.database.azure.com port=5432 dbname=myDB user=myUser password=<password>' );
    
  7. Eşitlemeyi ve çoğaltma işlemini başlatmak için bir abonelik oluşturun.

    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=<password>');
    
  8. Abonelik durumunu doğrulayın.

    SELECT subscription_name, status FROM pglogical.show_subscription_status();
    

Dikkat

Pglogical şu anda otomatik DDL çoğaltmayı desteklemez. kullanarak pg_dump --schema-onlyilk şemayı el ile kopyalayabilirsiniz. pglogical.replicate_ddl_command işlevini kullanarak DDL deyimlerini sağlayıcıda ve abonede aynı anda çalıştırabilirsiniz. Uzantının burada listelenen diğer sınırlamalarını unutmayın.

Mantıksal kod çözme

Akış protokolü veya SQL arabirimi aracılığıyla mantıksal kod çözme kullanabilirsiniz.

Akış protokolü

Değişiklikleri akış protokolünü kullanarak işlemek genellikle tercih edilir. Kendi tüketicinizi veya bağlayıcınızı oluşturabilir veya Debezium gibi bir üçüncü taraf hizmeti kullanabilirsiniz.

ile pg_recvlogicalakış protokolünü kullanan bir örnek için wal2json belgelerine bakın: pg_recvlogical ile akış protokolünü kullanan bir örnek.

SQL arabirimi

Aşağıdaki örnekte wal2json eklentisiyle SQL arabirimini kullanın.

  1. Slot oluşturun.

    SELECT * FROM pg_create_logical_replication_slot('test_slot', 'wal2json');
    
  2. SQL komutlarını verme. Örneğin:

    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. Değişiklikleri kullanma.

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

    Çıktı şuna benzer:

    {
          "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. Kullanımınız bittiğinde yuvayı bırakın.

    SELECT pg_drop_replication_slot('test_slot');
    

Mantıksal kod çözme hakkında daha fazla bilgi edinmek için PostgreSQL belgelerine bakın: mantıksal kod çözme.

Monitor

Mantıksal kod çözmeyi izlemeniz gerekir. Kullanılmayan çoğaltma yuvalarını bırakın. Slotlar, değişiklikler okunana kadar Postgres WAL günlüklerini ve ilgili sistem kataloglarını saklar. Aboneniz veya tüketiciniz başarısız olursa ya da yanlış yapılandırılmışsa, tüketilmemiş günlükler birikip depolamanızı doldurur. Ayrıca, tüketilmemiş günlükler işlem kimliği kaydırma riskini artırır. Her iki durum da sunucunun kullanılamaz duruma gelmesine neden olabilir. Bu nedenle, mantıksal çoğaltma yuvalarını sürekli olarak kullanmanız gerekir. Mantıksal çoğaltma yuvası artık kullanılmıyorsa, hemen silin.

active Görünümdeki sütun, yuvaya pg_replication_slots bağlı bir tüketici olup olmadığını gösterir.

SELECT * FROM pg_replication_slots;

Değerler normal eşikleri aştığında sizi bilgilendirmek için En Fazla Kullanılan İşlem Kimlikleri ve Kullanılan Depolama Ölçümleri uyarılarını ayarlayın.

Sınırlamalar

  • Mantıksal çoğaltma sınırlamaları burada belgelendiği gibi uygulanır.

  • Yuvalar ve HA yük devretmesi - PostgreSQL 16 ve önceki sürümlerde, PostgreSQL için Azure Veri Tabanı sahip yüksek kullanılabilirlik (HA) özellikli sunucular kullanıldığında, yük devretme olayları sırasında mantıksal çoğaltma yuvaları korunmaz. Mantıksal çoğaltma yuvalarını korumak ve yük devretme sonrasında veri tutarlılığını sağlamak için PG Failover Slots uzantısını kullanın ve hot_standby_feedback = on gibi destekleyici ayarları yapılandırın. Bu uzantıyı etkinleştirme hakkında daha fazla bilgi için belgelere bakın.

Mantıksal çoğaltma yuvaları için yük devretme desteği

PostgreSQL 17 ve sonraki sürümlerde slot senkronizasyonu yerleşik olarak desteklenir. Doğru PostgreSQL yapılandırmalarını (sync_replication_slots, hot_standby_feedback) etkinleştirirseniz, mantıksal çoğaltma yuvaları yük devretmeden sonra otomatik olarak korunur ve uzantı gerekmez.

Uyarı

Slot senkronizasyonu etkinleştirildikten sonra, yalnızca yük devretme seçeneği etkinleştirilerek oluşturulan mantıksal çoğaltma slotları yedek sunucuya senkronize edilir.

Önemli

Karşılık gelen abone artık yoksa, mantıksal çoğaltma yuvasını birincil sunucudan kaldırmanız gerekir. Aksi takdirde WAL dosyaları birincil dosyada birikerek depolama alanını doldurur. Depolama kullanımı yüzde 95'e ulaştığında veya kullanılabilir kapasite 5 GiB'den az olduğunda birincil sunucu otomatik olarak salt okunur moda geçer. Depolama eşiği belirli bir sınırı aşarsa ve mantıksal çoğaltma yuvası kullanımda değilse (kullanılamayan abone nedeniyle), PostgreSQL için Azure Veri Tabanı esnek sunucu bu kullanılmayan mantıksal çoğaltma yuvasını otomatik olarak bırakır. Bu eylem birikmiş WAL dosyalarını serbest bırakır ve depolamanın dolu olması nedeniyle sunucunuzun kullanılamaz duruma gelmesini önler.