Mantıksal abonelik, ApsaraDB RDS for PostgreSQL örnekleri arasında yarı gerçek zamanlı, tablo düzeyinde ve tek yönlü veri senkronizasyonu sağlar. Bu özelliği bölgeler arası veri paylaşımı, çoklu kaynaktan gelen verilerin merkezi bir veritabanında toplanması veya verilerin ayrı veritabanlarına bölünmesi senaryolarında kullanabilirsiniz.
Ön koşullar
Başlamadan önce aşağıdakilere sahip olduğunuzdan emin olun:
PostgreSQL 10 veya üzeri sürümü çalıştıran ve cloud disk kullanan bir ApsaraDB RDS for PostgreSQL örneği
Yayıncı örneğinde
wal_levelparametresininlogicalolarak ayarlanmış olması — Parametreyi ApsaraDB RDS konsolundaki Parameters sayfasından yapılandırın ve değişikliğin etkili olması için örneği yeniden başlatın(Farklı örnekler arası abonelikler için) Sanal özel cloud (VPC) CIDR bloğunun her iki örneğin IP adresi izin listesine eklenmiş olması — örneğin,
172.16.0.0/16ekleyin. Ayrıntılar için bkz. IP adresi izin listesi yapılandırmards_superuserrolüne sahip bir hesap — yetkili hesap veyaCREATE ROLE xxx WITH SUPERUSERkomutuyla oluşturulan standart bir hesap
Nasıl çalışır
Yayıncı üzerinde, bir veritabanındaki bir veya daha fazla tablo için yayın oluşturun.
Abone üzerinde, yayıncının veritabanına bağlanan ve yayını referans alan bir abonelik oluşturun.
PostgreSQL, yayınlanan tablolardaki satır düzeyindeki değişiklikleri (INSERT, UPDATE, DELETE) yarı gerçek zamanlı olarak aboneye aktarır.
Mantıksal abonelikler, aynı RDS örneği üzerindeki iki veritabanı arasında veya aynı VPC içinde bulunan ve dahili uç noktalar üzerinden bağlı olan iki RDS örneği arasında çalışır.
Altta yatan mekanizma hakkında arka plan bilgisi için bkz. Mantıksal aboneliğin ilkeleri ve en iyi uygulamaları.
Yayıncıda yayın oluşturma
Yayıncı örneğine bağlanın ve yayınlamak istediğiniz veritabanına bağlanın.
-
Bir tablo için yayın oluşturun:
Yalnızca kalıcı temel tablolar yayınlanabilir. Desteklenen nesneler için CREATE PUBLICATION bölümüne bakın.
-- On the publisher database CREATE PUBLICATION <publication_name> FOR TABLE <schema.table_name>;Örnek:
-- On the publisher database (testdb01) CREATE PUBLICATION pub1 FOR TABLE public.t1; -
Yayının oluşturulduğunu doğrulayın:
-- On the publisher database SELECT * FROM pg_publication;Çıktı, yapılandırma ayrıntlarıyla birlikte
pub1yayını listeler.
Abonede abonelik oluşturma
Adımlar, yayıncı ve abonenin aynı RDS örneğinde mi yoksa farklı örneklerde mi bulunduğuna bağlı olarak değişir.
Aynı RDS örneği, farklı veritabanları
Yayıncı ve abone aynı örnekte bulunduğunda, PostgreSQL aynı CREATE SUBSCRIPTION komutu içinde bir çoğaltma yuvası oluşturamaz; bu durum komutun takılmasına neden olur. Bu bir RDS sınırlaması değil, PostgreSQL altyapısı kısıtlamasıdır. Önce yuvayı ayrı olarak oluşturun, ardından abonelikte buna referans verin.
-
Yayıncı veritabanına bağlanın ve mantıksal bir çoğaltma yuvası oluşturun:
-- On the publisher database SELECT pg_create_logical_replication_slot('<slot_name>', 'pgoutput'); Abone veritabanına bağlanın ve yayıncıdaki tabloyla aynı şemaya ve ada sahip bir tablo oluşturun.
-
Abone veritabanına bağlanın ve 1. adımda oluşturduğunuz yuvaya referans veren aboneliği oluşturun. Örnek PostgreSQL 16 veya üzeri sürümünü çalıştırıyorsa:
ÖnemliYayıncı ve abone aynı örnekte bulunduğunda,
WITHyan tümcesine her zamancreate_slot=falseekleyin. Bunu atlamak komutun takılmasına neden olur.-- On the subscriber database CREATE SUBSCRIPTION <subscription_name> CONNECTION 'host=127.0.0.1 port=<port> user=<username> password=<password> dbname=<publisher_db_name>' PUBLICATION <publication_name> WITH (create_slot=false, slot_name=<slot_name>);Örnek PostgreSQL 10 ile 15 arasında bir sürümü çalıştırıyorsa:
-- On the subscriber database CREATE SUBSCRIPTION <subscription_name> CONNECTION 'dbname=<publisher_db_name>' PUBLICATION <publication_name> WITH (create_slot=false, slot_name=<slot_name>); -
Aboneliği doğrulayın:
-- On the subscriber database SELECT * FROM pg_subscription;
Farklı RDS örnekleri
Abone örneğine bağlanın ve abone veritabanına bağlanın.
Yayıncıdaki tabloyla aynı şemaya ve ada sahip bir tablo oluşturun.
-
Aboneliği oluşturun:
-- On the subscriber database CREATE SUBSCRIPTION <subscription_name> CONNECTION 'host=<Internet endpoint of the publisher RDS instance> port=<port> user=<username> password=<password> dbname=<publisher_db_name>' PUBLICATION <publication_name>;Örnek:
-- On the subscriber database (testdb02) CREATE SUBSCRIPTION sub1_from_pub1 CONNECTION 'host=pgm-2ze7n9zb0n1f****.pg.rds.aliyuncs.comm port=5432 user=testdbuser password=****x dbname=testdb01' PUBLICATION pub1 WITH (enabled, create_slot, slot_name='sub1_from_pub1');Kullanılabilen tüm abonelik parametreleri için bkz. CREATE SUBSCRIPTION.
-
Aboneliği doğrulayın:
-- On the subscriber database SELECT * FROM pg_subscription;
Mevcut bir yayına tablo ekleme
Bir yayına tablo ekledikten sonra, abonedeki aboneliği yenileyin; yeni tablolar otomatik olarak algılanmaz.
-- On the subscriber database
ALTER SUBSCRIPTION <subscription_name> REFRESH PUBLICATION;
Çoğaltma yuvalarını izleme
Kullanılmayan çoğaltma yuvaları Write-Ahead Logging (WAL) dosyalarını tutar ve bunların geri dönüşümünü engeller. Bir abone değişiklikleri tüketmeyi durdurursa, WAL dosyaları birikir ve yayıncının depolama alanını doldurarak örneğin kullanılamaz hale gelmesine neden olabilir.
Mantıksal abonelikleri kurduktan sonra:
Yayıncı örneğinde Storage Used değerini izleyin ve anormal artışlar için uyarı ayarlayın.
İşlem kimliği sarma riskini tespit etmek için Maximum Used Transaction IDs değerini izleyin.
-
Artık kullanılmayan herhangi bir çoğaltma yuvasını silin:
-- On the publisher database SELECT pg_drop_replication_slot('<slot_name>');Tüm etkin çoğaltma yuvalarını listelemek için:
-- On the publisher database SELECT * FROM pg_replication_slots;