PostgreSQL, Change Data Capture (CDC) özelliğini etkinleştirmek için replikasyon yuvalarını kullanarak yerel destek sağlar. Bu konuda, bir ApsaraDB RDS for PostgreSQL örneğinde CDC'nin nasıl yapılandırılacağı açıklanmaktadır.
Ön koşullar
Bir ApsaraDB RDS for PostgreSQL örneğiniz bulunmalıdır. Daha fazla bilgi için bkz. ApsaraDB RDS for PostgreSQL örneği oluşturma.
İstemcinin ApsaraDB RDS for PostgreSQL örneğine erişmesine izin vermek için bir izin listesi yapılandırmış olmalısınız. Daha fazla bilgi için bkz. IP adresi izin listesini yapılandırma.
PostgreSQL komut satırı istemcisini yüklemiş olmalısınız. Daha fazla bilgi için resmi PostgreSQL belgelerine bakın.
Kullanım notları
CDC'yi yalnızca birincil örnekte etkinleştirebilir ve veri değişikliklerini tüketebilirsiniz. Bu özellik salt okunur örneklerde desteklenmez.
ApsaraDB RDS for PostgreSQL, Mantıksal Replikasyon Yuvası Yük Devretme özelliğini destekler. Birincil-ikincil geçişi CDC'yi etkilemez. Daha fazla bilgi için bkz. Mantıksal Replikasyon Yuvası Yük Devretme.
CDC'yi etkinleştirmeden önce ApsaraDB RDS for PostgreSQL örneğiniz için bir parametreyi değiştirmeniz gerekir. Bu işlem, örneğin yeniden başlatılmasına neden olur. Hizmet kesintilerini önlemek için bu işlemi yoğun olmayan saatlerde gerçekleştirin.
-
ApsaraDB RDS for PostgreSQL örneğinde CDC kullanırken aşağıdaki hususlara dikkat edin:
CDC, WAL günlükleri için daha fazla depolama alanı gerektirir. Veri tüketimi anormal durumdaysa veya durursa örnek WAL günlüklerini otomatik olarak temizlemez. Bu durum, günlüklerin birikmesine ve tüm kullanılabilir disk alanını tüketmesine yol açarak örneğin kilitlenmesine neden olabilir. Kilitlenen bir örnek salt okunur hale gelir ve yazma işlemlerini reddeder.
-
Eski veri satırlarının uzun süre saklanması, örnekteki tüm yazma işlemlerini engelleyen bir işlem kimliği sarma sorununa yol açabilir. Hata günlüğünde aşağıdaki mesajlar görülebilir:
“HINT: Close open transactions soon to avoid wraparound problems. You might also need to commit or roll back old prepared transactions, or drop stale replication slots.” “WARNING: oldest xmin is far in the past.”
PostgreSQL çekirdeğinin eski WAL günlüklerini ve veri satırlarını otomatik olarak temizlemesine olanak tanımak için replikasyon yuvasını manuel olarak silebilirsiniz. Daha fazla bilgi için bkz. CDC'yi devre dışı bırakma.
NotÖrneğinizin WAL günlük boyutunu ve disk alanı kullanımını düzenli olarak izleyin ve ilgili uyarıları yapılandırın. Daha fazla bilgi için bkz. Gelişmiş İzleme verilerini görüntüleme ve Uyarı kurallarını yönetme.
CDC'yi etkinleştirme
Adım 1: Test veritabanı oluşturma
Instances sayfasına gidin. Üst gezinme çubuğunda RDS örneğinin bulunduğu bölgeyi seçin. Ardından RDS örneğini bulun ve örneğin kimliğine tıklayın.
Sol gezinme bölmesinde Databases öğesini seçin.
-
Create Database öğesine tıklayın.
testdbveritabanı oluşturulduktan sonra durumu Running olarak değişir ve karakter kümesi UTF8 olur.NotBu örnekte testdb adlı bir veritabanı oluşturulmuştur. Ayrıntılı talimatlar için bkz. Veritabanı oluşturma.
Adım 2: Test hesapları oluşturma ve izinleri yapılandırma
Sol gezinme bölmesinde Accounts öğesini seçin.
-
Yetkili bir hesap (db_admin) ve CDC için standart bir hesap (cdc_user) oluşturmak üzere Create Account öğesine tıklayın.
NotBu konuda kullanılan hesap adları yalnızca gösterim amaçlıdır. Özel adlar belirtebilirsiniz. Hesap oluşturma hakkında daha fazla bilgi için bkz. Hesap oluşturma.
-
db_admin hesabını kullanarak ApsaraDB RDS for PostgreSQL örneğine bağlanın.
psql -h <endpoint of the ApsaraDB RDS for PostgreSQL instance> -p 5432 -U db_admin -d testdbNotBir örneğin uç noktasını elde etme hakkında daha fazla bilgi için bkz. Uç noktayı ve bağlantı noktası numarasını görüntüleme veya değiştirme.
-
cdc_user hesabını replikasyon rolüne eklemek için aşağıdaki komutu çalıştırın:
ALTER USER cdc_user WITH REPLICATION;Sonucu kontrol etmek için aşağıdaki komutu çalıştırabilirsiniz:
SELECT rolreplication FROM pg_roles WHERE rolname='cdc_user';Örnek çıktı:
rolreplication ---------------- t (1 row) -
cdc_user hesabına izin vermek için aşağıdaki komutu çalıştırın:
GRANT SELECT ON ALL TABLES IN SCHEMA PUBLIC to cdc_user;
Adım 3: Örnek parametrelerini değiştirme
-
Geçerli parametre ayarlarını sorgulamak için aşağıdaki komutu çalıştırın:
SELECT name, setting, short_desc, source FROM pg_settings WHERE name ='wal_level';Örnek çıktı:
name | setting | short_desc | source -----------------------+---------+-------------------------------------------------------------------------+-------------------- wal_level | replica | Sets the level of information written to the WAL. | configuration file (1 rows)wal_level parametresi, PostgreSQL'in WAL günlüğüne yazdığı bilgi miktarını kontrol eder. Varsayılan değer replica'dır. Bu parametre yalnızca sunucu başlatıldığında ayarlanabilir. Geçerli değerler şunlardır:
minimal: Yalnızca bir çökmeden veya acil kapatmadan kurtarmak için gereken bilgileri yazar. Bu düzeyde, bir temel yedekleme ve WAL günlüklerinden veritabanı geri yükleyemezsiniz.
replica: WAL arşivlemeyi ve replikasyonu desteklemek için yeterli bilgiyi yazar; buna bir bekleme sunucusunda salt okunur sorgular çalıştırma dahildir.
logical: Mantıksal kod çözme için gereken bilgileri ekler.
Instances sayfasına gidin. Üst gezinme çubuğunda RDS örneğinin bulunduğu bölgeyi seçin. Ardından RDS örneğini bulun ve örneğin kimliğine tıklayın.
Sol gezinme bölmesinde Parameters öğesini seçin.
-
wal_level parametresini logical olarak ayarlayın.
NotÖrnek parametrelerini değiştirme hakkında daha fazla bilgi için bkz. ApsaraDB RDS for PostgreSQL örneğinin parametrelerini değiştirme.
Parametre değişikliğini gönderdikten sonra ApsaraDB RDS for PostgreSQL örneğiniz yeniden başlar. Hizmet kesintilerini önlemek için bu işlemi yoğun olmayan saatlerde gerçekleştirin.
Adım 4: Mantıksal replikasyon yuvası oluşturma
Adım 3 içindeki parametre değişikliği, ApsaraDB RDS for PostgreSQL örneğinizin yeniden başlatılmasına neden olur. Bu adıma yalnızca örnek yeniden başlatıldıktan ve durumu Running olduktan sonra devam edin.
-
db_admin hesabını kullanarak ApsaraDB RDS for PostgreSQL örneğine bağlanın.
psql -h <endpoint of the ApsaraDB RDS for PostgreSQL instance> -p 5432 -U db_admin -d testdb -
cdc_replication_slotadında bir replikasyon yuvası oluşturmak içintest_decodingçıkış eklentisini kullanarak aşağıdaki komutu çalıştırın:SELECT pg_create_logical_replication_slot('cdc_replication_slot', 'test_decoding');NotYuva adı
cdc_replication_slotyalnızca gösterim amaçlıdır. Özel bir ad belirtebilirsiniz.PostgreSQL,
test_decodingçıkış eklentisini yerel olarak sağladığından herhangi bir değişiklik gerekmez.
Örnek çıktı:
pg_create_logical_replication_slot ------------------------------------ (cdc_replication_slot,1/14003428) (1 row)Yuvanın oluşturulup oluşturulmadığını kontrol etmek için aşağıdaki komutu çalıştırabilirsiniz:
SELECT * FROM pg_replication_slots;Örnek çıktı:
slot_name | plugin | slot_type | datoid | database | temporary | active | active_pid | xmin | catalog_xmin | restart_lsn | confirmed_flush_lsn | wal_status | safe_wal_size | two_phase ----------------------+---------------+-----------+--------+----------+-----------+--------+------------+------+--------------+-------------+---------------------+------------+----------------+----------- cdc_replication_slot | test_decoding | logical | 18822 | testdb | f | f | | | 22356 | 1/140033F0 | 1/14003428 | reserved | | f (1 row)
Adım 5: Test verisi oluşturma
Üretim ortamını simüle etmek için test verisi oluşturmak amacıyla aşağıdaki komutları çalıştırın:
CREATE TABLE public.tb_test(
id int NOT NULL PRIMARY KEY
);
ALTER TABLE public.tb_test ADD name varchar(1) NULL;
INSERT INTO public.tb_test SELECT 1, 'A';
Adım 6: Yuvadan veri okuma
-
cdc_user hesabını kullanarak ApsaraDB RDS for PostgreSQL örneğine bağlanın.
psql -h <endpoint of the ApsaraDB RDS for PostgreSQL instance> -p 5432 -U cdc_user -d testdb -
Değişiklikleri replikasyon yuvasından okumak için aşağıdaki komutu çalıştırın:
SELECT * FROM pg_logical_slot_peek_changes('cdc_replication_slot', null, null);Örnek çıktı:
lsn | xid | data ------------+-------+------------------------------------------------------------------------- 1/14003D90 | 22376 | BEGIN 22376 1/1401DDE8 | 22376 | COMMIT 22376 1/1401DDE8 | 22377 | BEGIN 22377 1/1401E100 | 22377 | COMMIT 22377 1/1401E2A8 | 22382 | BEGIN 22382 1/1401E2A8 | 22382 | table public.tb_test: INSERT: id[integer]:1 name[character varying]:'A' 1/1401E3C0 | 22382 | COMMIT 22382 (7 rows)
Adım 7: Veri değişikliklerini tüketme
Veritabanı bağlantısından çıkmak için
\qkomutunu çalıştırın.-
Veri değişikliklerini tüketmek için aşağıdaki komutu çalıştırın:
Notpg_recvlogicalkomutunu postgres kullanıcısı olarak çalıştırmanız gerekir. su - postgres komutunu çalıştırarak kullanıcıları değiştirebilirsiniz.-bash: pg_recvlogical: command not foundhatasıyla karşılaşırsanız çözüm için SSS bölümüne bakın.pg_recvlogical -h <endpoint of the ApsaraDB RDS for PostgreSQL instance> -U <privileged account> -d <test database> --create-slot --if-not-exists --slot=cdc_replication_slot --plugin=test_decoding --start -f -Komut örneği:
pg_recvlogical -h pgm-*****.pgsql.singapore.rds.aliyuncs.com -U db_admin -d testdb --create-slot --if-not-exists --slot=cdc_replication_slot --plugin=test_decoding --start -f -Örnek çıktı:
BEGIN 22376 COMMIT 22376 BEGIN 22377 COMMIT 22377 BEGIN 22382 table public.tb_test: INSERT: id[integer]:1 name[character varying]:'A' COMMIT 22382
CDC'yi devre dışı bırakma
Veri tüketimi anormal durumdaysa veya durursa WAL günlükleri birikebilir ve tüm kullanılabilir disk alanını tüketerek sonunda örneği kilitleyebilir. Bu sorunu çözmek için pasif replikasyon yuvalarını manuel olarak silebilirsiniz; bu işlem, PostgreSQL çekirdeğinin eski WAL günlüklerini temizlemesine olanak tanır.
Pasif replikasyon yuvalarını konsoldan, bir API çağrısı yoluyla veya bir SQL komutu çalıştırarak silebilirsiniz:
Konsolda: WAL günlüklerini yönetme.
API kullanımı: DeleteSlot.
-
SQL komutu kullanımı:
-
db_admin hesabını kullanarak ApsaraDB RDS for PostgreSQL örneğine bağlanın.
psql -h <endpoint of the ApsaraDB RDS for PostgreSQL instance> -p 5432 -U db_admin -d testdb -
Pasif yuvaların adlarını ve bilgilerini görüntülemek için aşağıdaki komutu çalıştırın:
SELECT slot_name, slot_type, database, active, safe_wal_size FROM pg_replication_slots WHERE active = 'f';Örnek çıktı:
slot_name | slot_type | database | active | safe_wal_size ----------------------+-----------+----------+--------+--------------- cdc_replication_slot | logical | testdb | f | (1 row) -
Mantıksal replikasyon yuvasını silmek için aşağıdaki komutu çalıştırın:
SELECT pg_drop_replication_slot('cdc_replication_slot');
-
SSS
-
S: Veri tüketirken
-bash: pg_recvlogical: command not foundhatası alırsam ne yapmalıyım?C:
pg_recvlogical, varsayılantest_decodingçıkış eklentisini kullanan PostgreSQL için yerel bir mantıksal kod çözme aracıdır. Bu eklenti, PostgreSQL kaynak kodu paketinin contrib/test_decoding dizininde bulunur. PostgreSQL'i kaynak kodundan derleyip yükleyin. Kurulumdan sonrapg_recvlogicalaracı, istemci yükleme yolunun /bin dizininde yer alır. PostgreSQL'i kaynaktan yükleme hakkında daha fazla bilgi için bkz. Kaynak Koddan Yükleme. -
S: Bir replikasyon yuvasını manuel olarak sildim ancak sistem WAL günlüklerini otomatik olarak temizlemedi ve bunlar disk alanını tüketmeye devam ediyor. Ne yapmalıyım?
C: Saklanan günlük dosyası sayısını azaltmak için
wal_keep_segmentsparametresini varsayılan değeri olan128olarak değiştirebilirsiniz. Örnek parametrelerini değiştirme hakkında daha fazla bilgi için bkz. ApsaraDB RDS for PostgreSQL örneğinin parametrelerini değiştirme.