Mantıksal çoğaltmayı yönetin ve izleyin

Bu sayfa, Lakebase'te mantıksal çoğaltmanın nasıl izleneceğini, replikasyonun sıfıra ölçekleme ve dallarla nasıl etkileşime girdiğini ve yaygın sorunların nasıl çözüleceğini açıklar. Kurulum için, Verileri Lakebase'e çoğaltma ve Lakebase'den verileri çoğaltma bölümüne bakın.

Çoğaltmayı izleme

Herhangi bir Postgres rolü, bu sayfadaki replikasyon kataloglarını sorgulayabilir, iki istisna dışında. pg_subscription öğesinin subconninfo sütunu bağlantı parolasını içerebilir ve kısıtlıdır, bu nedenle SELECT * kullanmak yerine belirli sütunları seçin. pg_stat_replication içinde, rolünüzde databricks_superuser üyelerinde bulunan pg_read_all_stats yoksa sütunların çoğu gizlidir.

Bir abonede, aboneliğin var olduğunu ve etkinleştirilmiş olduğunu doğrulayın:

SELECT subname, subenabled FROM pg_catalog.pg_subscription;

Bir yayımcıda, yayının var olduğunu doğrulayın:

SELECT pubname FROM pg_catalog.pg_publication;

Abonede tablo başına senkronizasyon durumunu kontrol edin. Her tablo Ready (fully live) olarak göründüğünde, ilk kopya tamamlanır ve abonelik akışta:

SELECT
    srrelid::regclass AS table_name,
    CASE srsubstate
        WHEN 'i' THEN 'Initializing'
        WHEN 'd' THEN 'Data copying (in progress)'
        WHEN 's' THEN 'Synchronized (catching up)'
        WHEN 'r' THEN 'Ready (fully live)'
    END AS sync_status
FROM pg_catalog.pg_subscription_rel;

Abonelik durumunu ve gecikmesini kontrol et:

SELECT subname, received_lsn, latest_end_lsn, last_msg_receipt_time
FROM pg_catalog.pg_stat_subscription;

Yayıncı ve abone arasındaki satır sayılarını karşılaştırarak bir tablonun senkronize olduğunu doğrulayın:

SELECT COUNT(*) FROM public.playing_with_lakebase;

Bir yayımcıda, çoğaltma slotlarını ve her birinin ne kadar ilerlediğini listeleyin:

SELECT slot_name, slot_type, active, restart_lsn
FROM pg_catalog.pg_replication_slots;

Lakebase'de sonuçlar ayrıca dahili fiziksel slotları wal_proposer_slot ve wal_retention_slot içerir. Lakebase bu slotları yönetiyor ve bunlar mantıksal çoğaltmanın bir parçası değildir.

Mantıksal çoğaltma ve sıfıra kadar ölçeklendirme

Aktif aboneye sahip bir Lakebase işlem kaynağı sıfıra ölçeklenmez, bu da işlem kaynağı kullanımını artırabilir.

Aktif aboneleri kontrol edin:

SELECT *
FROM pg_catalog.pg_stat_replication
WHERE application_name <> 'walproposer';

Çoğaltma yuvaları ve depolama

Bir çoğaltma slotu, abone değişiklikleri aldığını doğrulayana kadar yayıncının write-ahead logunu (WAL) tutmasını sağlar. Abone değişiklikleri tüketmeyi bırakırsa, örneğin devre dışıysa, bağlantısı kesikse, arızalanıyorsa veya geride kalıyorsa, WAL yayıncıda birikir. Mantıksal çoğaltma ile ilgili ciddi sorunların en yaygın nedeni budur:

  • Yayınevinin depolama alanı tükenebilir. Tutulan WAL, yayımcının depolama alanı dolana kadar büyür, bu da veritabanının yazıları kabul etmesini engelleyebilir ve bir kesintiye yol açabilir.
  • Slotun kaldırılması depolama alanını hemen serbest bırakmaz. Postgres, tutulan WAL'ı ancak sonraki bir kontrol noktasında WAL segmentlerini geri dönüştürdüğünde kaldırır. Yayımcının depolama alanı zaten tükendiyse, bu geri dönüşüm tamamlanmayabilir.
  • Bu risk harici yayıncılar için de geçerlidir. Lakebase harici bir veritabanına abone olduğunda, abonelik değişiklikleri almayı durdurursa WAL o dış kaynakta birikir.

Korunan WAL'ı izle

Yayıncıda, her mantıklı slotun ne kadar WAL tuttuğuna ve aktif olup olmadığını kontrol edin:

SELECT slot_name, active, wal_status,
       pg_catalog.pg_size_pretty(pg_catalog.pg_wal_lsn_diff(pg_catalog.pg_current_wal_lsn(), restart_lsn)) AS retained_wal
FROM pg_catalog.pg_replication_slots
WHERE slot_type = 'logical';

Bu sorguyu tekrarlama aktifken düzenli olarak çalıştırın. retained_wal büyümeye devam ettiğinde veya activefalse olduğunda araştırın. wal_status extended değeri, yuvanın yayıncının normalde tuttuğundan daha fazla WAL tuttuğunu gösterir. wal_status değerinin unreserved veya lost olması, slotun max_slot_wal_keep_size aştığı ve ihtiyaç duyduğu WAL'ı kaybediyor veya kaybetmiş olduğu anlamına gelir, bu yüzden abonelik yeniden oluşturulmalıdır.

WAL birikiminden kurtulma

  1. Monitor retained WAL içindeki sorguyla WAL'ı tutan slotu bulun.

  2. Abone iyileşebiliyorsa, nedeni düzeltin, örneğin ağ sorunu, devre dışı bırakılan abonelik veya başarısız bir apply işlemi gibi, böylece abone yetişir ve slot ilerler.

  3. Aboneliğe artık ihtiyacınız yoksa, abonelikten çıkarın. Aboneye ulaşılamıyorsa, slotu doğrudan yayıncıya bırakın. Bir slotun onu bırakabilmeniz için etkisiz olması gerekir:

    SELECT pg_catalog.pg_drop_replication_slot('<slot_name>');
    
  4. Yayımcının tutulan WAL'ı yeniden kullanmasını bekle. Depolama alanı tükenmek üzere olan kendi kendini yöneten bir yayımcıda, geri dönüşümün tamamlanabilmesi için önce depolama ekleyin.

Lakebase'deki aktif olmayan slotların otomatik olarak kaldırılması

Lakebase yayıncı olduğunda, yaklaşık 40 saattir aktif olmayan bir replikasyon slotunu otomatik olarak kaldırır ve böylece slotun WAL'ı süresiz olarak korumasını engeller. Bir slot, abonesi değişiklikleri tüketmeyi bıraktığında ve slot ilerlemeyi durdurduğunda inaktif hale gelir. Bu, abonenin devre dışı bırakıldığında veya erişilemez hale geldiğinde ya da abonenin uzun bir çoğaltma gecikmesiyle yapılandırıldığında meydana gelebilir.

Bir slotun kaldırılmasını önlemek için, abonesinin bağlantılı kaldığından ve değişiklikleri tüketmeye devam ettiğinden emin olun. Abone yapılandırılabilir bir çoğaltma gecikmesi veya frekansı kullanıyorsa, slotun ilerlemeye devam etmesi için 40 saatin altında tutulmalıdır. Bir yuva kaldırılırsa ve hâlâ ihtiyacınız varsa, abone üzerinde aboneliği yeniden oluşturun.

Dış yayıncılar ise aktif olmayan slotları otomatik olarak kaldırmaz. Kendi kendini yöneten bir yayıncıda, bir slotun tutabileceği WAL miktarını sınırlamak için max_slot_wal_keep_size değerini ayarlayın. Bir slot limiti aşarsa, Postgres onu geçersiz kılar ve aboneliği yeniden oluşturmanız gerekir.

Dal geri yükleme replikasyon yuvalarını kaldırır

Bir dalın geri yüklenmesi, o daldaki tüm replikasyon yuvalarını silir. Bir dal geri yüklemesinden sonra yayınları ve abonelikleri yeniden oluşturun.

Alt şubeler abonelikleri devralmaz

Bir ana şubede tanımlanan abonelikler, onun alt şubelerinde yinelenmez. Lakebase, bunları o dalın hesaplaması başlamadan önce bir alt daldan kaldırır, böylece iki hesaplama aynı aboneliği çoğaltmaz. Bu, bir alt dal oluşturduğunuzda, sıfırladığınızda veya geri yüklediğinizde geçerlidir. Eğer çoğaltma ihtiyacın varsa aboneliği alt şubede yeniden oluştur.

Bir abone veritabanını silmek yayıncıdaki yuvayı boş bırakır

Lakebase App, Databricks CLI veya REST API kullanarak abonelikleri olan bir veritabanını sildiğinizde, Lakebase önce bu abonelikleri kaldırır, ancak yayıncıdaki replikasyon slotlarını kaldırmaz. Her slot yayımcı sunucuda kalır ve WAL'ı tutmaya devam ederek yayımcı sunucunun depolama alanını doldurabilir. Bir göç durumunda, yayımcı genellikle üretim veritabanınızdır.

Bir SQL DROP DATABASE komutu, standart Postgres'te olduğu gibi davranır: veritabanında abonelikler varken database "<name>" is being used by logical replication subscription hatasıyla başarısız olur.

Bir slot bırakmamak için, veritabanını silmeden önce her yayını bırakın. Yayımcıya erişilebildiğinde, DROP SUBSCRIPTION yayımcıdaki slotu da kaldırır. Bkz. Bir aboneliği veya yayını kaldırma.

Veritabanını zaten sildiyseniz, yayımcıdaki kalan slotu kaldırın. Varsayılan olarak, aboneliğin slotu abonelikle aynı isme sahiptir. Aboneliği oluştururken slot_name ayarladıysanız, onun yerine o ismi kullanın. Bir veritabanını silmeden önce slot isimlerini kaydetmek için, o veritabanında SELECT subname, subslotname FROM pg_catalog.pg_subscription; komutunu çalıştırın. slotun var olduğunu ve aktif olmadığını doğrulayın:

SELECT slot_name, database, plugin, active
FROM pg_catalog.pg_replication_slots
WHERE slot_type = 'logical' AND slot_name = '<slot_name>';

Sadece silinmiş aboneliğe ait olan slotu kaldırın. Diğer aktif olmayan slotlar abonelere ait olabilir veya geçici olarak bağlantısı kesilmiş değişiklik verisi yakalama araçlarına ait olabilir ve bunları bırakmak çoğaltmalarını bozar. Yuvaya bırakın:

SELECT pg_catalog.pg_drop_replication_slot('<slot_name>');

Çoğaltma rolleri

Atanmış bir çoğaltma rolünün bu REPLICATION özniteliğe sahip olması gerekir. Lakebase App, Azure Databricks CLI veya REST API'de oluşturulan roller, databricks_superuser üyesi olsun ya da olmasın bu özözniteliğe sahiptir. SQL ile oluşturulan roller bu REPLICATION özniteliği otomatik olarak almaz. SQL ile bir tane oluşturmak için özniteliği ekleyin, örneğin CREATE ROLE replication_user WITH LOGIN REPLICATION PASSWORD '<password>';. Mevcut bir role eklemek için ALTER ROLE <role_name> REPLICATION; çalıştırın. Her iki ifade de, proje sahibinin rolü gibi, REPLICATION ve CREATEROLE niteliklerine sahip bir rol gerektirir.

Bir rolün ayrıcalıklarını kontrol edin:

SELECT rolname, rolreplication
FROM pg_catalog.pg_roles
WHERE rolname = '<role_name>';

Dekoder eklentileri

Lakebase, iki mantıksal kod çözme çıkış eklentisini destekler:

  • pgoutput: yerleşik Postgres mantıksal çoğaltma eklentisi ve varsayılan olan. Standart Postgres-to-Postgres replikasyonu için kullanın.
  • wal2json: değişiklik verilerini JSON biçiminde işleyen sistemler için WAL değişikliklerini JSON olarak çıkarır.

Publisher ayarları

Lakebase'de max_wal_senders ve max_replication_slots her ikisi de şu şekilde 10ayarlanmıştır:

max_wal_senders = 10
max_replication_slots = 10

max_wal_senders abonelere değişiklikleri aktaran eşzamanlı WAL gönderici süreçlerini ve max_replication_slots abone ilerlemesini takip eden replikasyon slotlarını sınırlar. Her abone için birer tane öngörün. Farklı değerler talep etmek için Databricks ile iletişime geçin.

Özel bir çoğaltma yuvası oluşturun

Bazı veri servisleri, önceden oluşturduğunuz bir çoğaltma slotu gerektirir. Standart Postgres fonksiyonuyla bir tane oluşturun ve kod çözücü eklentisine şu adı verin:

SELECT pg_catalog.pg_create_logical_replication_slot('my_replication_slot', 'pgoutput');

Abonelik veya yayını kaldırın

Artık ihtiyacınız olmadığında aboneden aboneliği kaldırın. Yayıncıya ulaşılabilir olduğunda, abonelik bırakıldığında yayıncıyla bağlantı kesilir ve yayıncıdaki çoğaltma yuvası kaldırılır. Çoğaltılan veriler abone veritabanında kalır.

DROP SUBSCRIPTION my_subscription;

Yayıncı ulaşılamazsa, DROP SUBSCRIPTION uzak slotu kaldırmak için bağlanamadığı için tamamlanmaz. Önce slotun ilişkilendirmesini kaldırın, sonra abonmanı bırakın:

ALTER SUBSCRIPTION my_subscription DISABLE;
ALTER SUBSCRIPTION my_subscription SET (slot_name = NONE);
DROP SUBSCRIPTION my_subscription;

Bu durumda replikasyon yuvası yayımcıda kalır ve WAL'ı tutmaya devam eder. WAL'ı serbest bırakmak için yayıncıda kaldırın:

SELECT pg_catalog.pg_drop_replication_slot('<slot_name>');

Yayınevine bir yayın öğesi bırakın:

DROP PUBLICATION my_publication;

Troubleshooting

Belirti Neden ve çözüm
Abonelik bağlanamıyor. Yayıncının ulaşılabilir olduğunu ve bağlantı dizesi, role ile şifrenin doğru olduğunu doğrulayın. Lakebase abone taraf olduğunda, yayıncı uç noktasının hesabın ağ ilkesi izin listesinde olduğunu doğrulayın. Bkz. Verileri Lakebase’e çoğaltma.
Başka bir Lakebase veritabanına abonelik askıda kalır ve bağlanmaz. Aynı bölgedeki Lakebase veritabanları arasında çoğaltma desteklenmemektedir. Kaynak ve hedef farklı bölgelerde olmalıdır. Bkz. Sınırlamalar.
CREATE SUBSCRIPTION, restricted by Account Network Policies ile başarısız oluyor. Hesabınız bir ağ politikasını uygular ve yayımcı ana bilgisayarı izin verilen internet hedefleri arasında değildir. Ana bilgisayarı hesap ağ politikasına ekleyin. Bkz. Verileri Lakebase’e çoğaltma.
Depolama büyür ve boşaltılmaz. Bir replikasyon slotu, abonesi değişiklikleri tüketmediği için WAL'ı tutar. Sorun çözülmezse, yayınevinin depolama alanı tükenebilir. Tutulan WAL'ı kontrol edin, sonra aboneyi yeniden bağlayın ya da slotu silin. Depolama, yayıncı WAL'ı geri dönüştürdükten sonra serbest bırakılır. Bkz. Replikasyon slotları ve depolama.
Satırlar aboneye ulaşmaz. Hedef tabloların mevcut olduğunu, adlarının ve sütunlarının eşleştiğini ve yayının beklediğiniz tabloları içerdiğini doğrulayın.

Sonraki Adımlar