Aracılığıyla paylaş


PostgreSQL için Azure Veritabanı - Esnek Sunucuda mantıksal çoğaltma ve mantıksal kod çözme

ŞUNLAR IÇIN GEÇERLIDIR: PostgreSQL için Azure Veritabanı - Esnek Sunucu

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ğaltması da dahil olmak üzere veri çoğaltma işlemleri üzerinde ayrıntılı denetime olanak 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 fazla özellik sağlayan pglogical uzantısını kullanma.
  2. Önceden yazma günlüğünün (WAL) içeriğinin kodunu çözerek uygulanan mantıksal kod çözme.

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 sunucu parametreleri sayfasına gidin.

  2. Sunucu parametresini wal_level olarak logicalayarlayın.

  3. Pglogical uzantısı kullanmak istiyorsanız, ve parametrelerini arayın shared_preload_librariesve açılan liste kutusundan seçinpglogical.azure.extensions

  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 Veritabanı esnek sunucu örneğinizin 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 olmak isteyebilirsiniz. Aksi takdirde gibi Permission denied for schemahatalara karşılaşabilirsiniz.

Not

Ç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

Verileri PostgreSQL için Azure Veritabanı esnek sunucudan çoğaltmanın en kolay yolu yerel mantıksal çoğaltma kullanmaktır. 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ımcı, veri gönderdiğiniz PostgreSQL için Azure Veritabanı esnek sunucu veritabanıdır.
  • Abone, veri gönderdiğiniz PostgreSQL için Azure Veritabanı 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 yayın 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, için oturum açma ayrıcalığını azure_pg_admin etkinleştirin ve tablo içeriğini denetleyin.

    ALTER ROLE azure_pg_admin login;
    

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 Veritabanı esnek sunucu örneğinde bulunan farklı veritabanları arasında mantıksal çoğaltmayı ayarlamayı hedefliyorsanız, şu anda mevcut olan uygulama kısıtlamalarından kaçınmak için belirli yönergeleri izlemeniz önemlidir. Şu andan itibaren, aynı veritabanı kümesine bağlanan bir abonelik oluşturma işlemi ancak çoğaltma yuvası aynı komut içinde oluşturulmazsa başarılı olur; aksi takdirde, CREATE SUBSCRIPTION bir bekleme olayında çağrı yanıt vermiyor LibPQWalReceiverReceive . Bunun nedeni Postgres altyapısındaki mevcut bir kısıtlamadır ve gelecek sürümlerde kaldırılabilir.

Bu kısıtlamayı atlatırken aynı sunucudaki "kaynak" ve "hedef" veritabanlarınız arasında mantıksal çoğaltmayı etkili bir şekilde ayarlamak için aşağıdaki adımları izleyin:

İlk olarak, hem kaynak hem de hedef veritabanlarında aynı şemaya sahip "basic" adlı 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 işlevini kullanarak pg_create_logical_replication_slot ayrı olarak bir mantıksal çoğaltma yuvası oluşturun. Bu, yuva abonelikle aynı komutta oluşturulduğunda oluşan asılı sorunu gidermeye yardımcı olur. Eklentiyi pgoutput kullanmanız gerekir:

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

Bundan sonra hedef veritabanınızda daha önce oluşturulan yayına bir abonelik oluşturarak create_slot esnek PostgreSQL için Azure Veritabanı sunucunun yeni bir yuva oluşturmasını engelleyecek şekilde ayarlandığından false emin olun ve önceki adımda oluşturulan yuva adını doğru bir şekilde 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 "temel" tabloya yeni bir kayıt ekleyerek ve ardından hedef veritabanınıza çoğaltıldığını doğrulayarak bunu test edebilirsiniz:

-- 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ından mantıksal çoğaltmanın başarılı kurulumunu onaylayan yeni kayda tanık olmanız gerekir.

pglogical extension

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 yukarıda listelenen önkoşul görevlerini gerçekleştirdiğinizden emin olun.

  1. Hem sağlayıcıda hem de abone veritabanı sunucularında 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ından (sunucuyu oluşturan) başka bir kullanıcıysa, kullanıcıya bir rolde azure_pg_admin üyelik ve kullanıcıya ÇOĞALTMA ve LOGIN öznitelikleri atadığınızdan emin olun. 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=myPassword');
    
  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=myPasword' );
    
  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=myPassword');
    
  8. Daha sonra abonelik durumunu doğrulayabilirsiniz.

    SELECT subscription_name, status FROM pglogical.show_subscription_status();
    

Dikkat

Pglogical şu anda otomatik DDL çoğaltmayı desteklememektedir. İlk şema, pg_dump --schema-only kullanılarak el ile kopyalanabilir. DDL deyimleri sağlayıcı ve abone üzerinde aynı anda pglogical.replicate_ddl_command işlevi kullanılarak yürütülebilir. Lütfen burada listelenen uzantının diğer sınırlamalarına dikkat edin.

Mantıksal kod çözme

Mantıksal kod çözme, akış protokolü veya SQL arabirimi aracılığıyla kullanılabilir.

Akış protokolü

Akış protokollerini kullanarak değişiklikleri kullanmak genellikle tercih edilir. Kendi tüketicinizi / bağlayıcınızı oluşturabilir veya Debezium gibi bir üçüncü taraf hizmeti kullanabilirsiniz.

pg_recvlogical ile akış protokolünü kullanan bir örnek için wal2json belgelerini ziyaret edin.

SQL arabirimi

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

  1. Yuva 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. Kullanmayı bitirdikten sonra yuvayı bırakın.

    SELECT pg_drop_replication_slot('test_slot');
    

Mantıksal kod çözme hakkında daha fazla bilgi edinmek için PostgreSQL belgelerini ziyaret edin.

İzleyici

Mantıksal kod çözmeyi izlemeniz gerekir. Kullanılmayan çoğaltma yuvaları bırakılmalıdır. Yuvalar, değişiklikler okunana kadar Postgres WAL günlüklerini ve ilgili sistem kataloglarını tutar. Aboneniz veya tüketiciniz başarısız olursa veya yanlış yapılandırılmışsa, tutarsız günlükler birikip depolama alanınızı doldurur. Ayrıca, tamamlanmamış 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ın sürekli olarak tüketilmesi gerekir. Mantıksal çoğaltma yuvası artık kullanılmıyorsa, hemen bırakın.

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

SELECT * FROM pg_replication_slots;

Kullanılan İşlem Kimlikleri Üst Sınırı ve Kullanılan Depolama alanı PostgreSQL için Azure Veritabanı esnek sunucu ölçümleriyle ilgili uyarılar ayarlayarak, değerler normal eşikleri aştığında sizi bilgilendirin.

Sınırlamalar

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

  • Yuvalar ve HA yük devretmesi - PostgreSQL için Azure Veritabanı esnek sunucu ile yüksek kullanılabilirlik (HA) özellikli sunucular kullanırken, yük devretme olayları sırasında mantıksal çoğaltma yuvalarının korunmadığını unutmayın. Mantıksal çoğaltma yuvalarını korumak ve yük devretme sonrasında veri tutarlılığını sağlamak için PG Yük Devretme Yuvaları uzantısının kullanılması önerilir. Bu uzantıyı etkinleştirme hakkında daha fazla bilgi için lütfen belgelere bakın.

Önemli

İlgili abone artık yoksa, mantıksal çoğaltma yuvasını birincil sunucuya bırakmanız gerekir. Aksi takdirde WAL dosyaları birincil dosyada birikerek depolama alanını doldurur. Depolama eşiğinin belirli bir eşiği aştığını ve mantıksal çoğaltma yuvasının kullanımda olmadığını (kullanılamayan abone nedeniyle) varsayalım. Bu durumda, PostgreSQL için Azure Veritabanı esnek sunucu örneği 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.