Postgres CDC bağlayıcısı, bir PostgreSQL veritabanının tam anlık görüntüsünü okur ve ardından kesin-bir-kez işleme semantiğiyle değişen verileri yakalar.
Genel Bakış
Postgres CDC bağlayıcısı aşağıdaki yetenekleri destekler:
|
Kategori |
Ayrıntılar |
|
Desteklenen türler |
SQL kaynağı, Flink CDC kaynağı Not
Hedef tablolar ve arama (boyut) tabloları için JDBC bağlayıcısını kullanın. |
|
Çalıştırma modu |
Akış |
|
Veri biçimi |
Uygulanamaz |
|
Ölçümler |
|
|
API türleri |
SQL ve Flink CDC YAML |
|
Hedef güncelleme/silme |
Uygulanamaz |
Özellikler
VVR 8.0.6 sürümünden itibaren Postgres CDC bağlayıcısı, artımlı anlık görüntü çerçevesiyle entegre çalışır. Tam geçmiş verileri okur ve ardından kesin-bir-kez semantiğiyle WAL'deki değişiklik günlüklerini otomatik olarak okumaya geçer. Postgres CDC kaynak tabloları, tam verilerin eşzamanlı okunmasını, kilitsiz okumayı ve aktarımın kesinti noktasından devam ettirilmesini destekler.
Temel özellikler:
Birleşik akış ve toplu işleme. Tek bir işte hem tam hem de artımlı verileri okur.
Eşzamanlı anlık görüntü okuma. Daha hızlı performans için yatay ölçeklendirme sağlar.
Kesintisiz tamdan-artımlıya geçiş. Kaynak kullanımını azaltmak için otomatik olarak ölçeği küçültür.
Devam ettirilebilir okuma. Kararlılığı artırmak için anlık görüntü aşamasında kesinti noktalarından devam eder.
Kilitsiz okuma. Kilit gerektirmez, çevrimiçi işlemleri etkilemez.
Ön Koşullar
Postgres CDC bağlayıcısı, PostgreSQL mantıksal çoğaltma aracılığıyla CDC akışlarını okur. ApsaraDB RDS for PostgreSQL, Amazon RDS for PostgreSQL ve kendi kendine yönetilen PostgreSQL ortamlarını destekler.
Yapılandırma dağıtım türüne göre farklılık gösterir. Postgres Yapılandırması.
Yapılandırmadan sonra şunları doğrulayın:
Mantıksal kod çözmeyi etkinleştirmek için wal_level parametresi
logicalolarak ayarlanmıştır.-
Abone olunan her tablonun REPLICA IDENTITY değeri
FULLolarak ayarlanmıştır; böyleceINSERTveUPDATEolayları veri tutarlılığı için önceki sütun değerlerini içerir.NotREPLICA IDENTITYdeğeri,INSERTveUPDATEolaylarının önceki sütun değerlerini içerip içermeyeceğini kontrol eden bir PostgreSQL tablo düzeyi ayarıdır. REPLICA IDENTITY. max_wal_sendersvemax_replication_slotsdeğerleri, kullanılan yuva sayısı ile Flink işinin gerektirdiği yuva sayısının toplamından fazladır.Hesabın
SUPERUSERayrıcalıkları veya hemLOGINhem deREPLICATIONizinleri vardır ve abone olunan tablolar üzerindeSELECTizni bulunur.
Postgres tablonuz oluşturulmuş sütunlar içeriyorsa, yuvayı oluştururken publish_generated_columns parametresini
storedolarak ayarlayın. Aksi takdirde, anlık görüntü ve artımlı aşama şemaları farklılık gösterebilir.
Kullanım notları
Artımlı anlık görüntü özelliği VVR 8.0.6 veya sonraki bir sürümü gerektirir.
Çoğaltma yuvaları
Flink PostgreSQL CDC işleri, WAL verilerinin erken temizlenmesini önlemek ve veri tutarlılığını sağlamak için çoğaltma yuvalarını kullanır. Kötü yönetilen yuvalar aşırı disk kullanımına veya okuma gecikmelerine neden olabilir. En iyi uygulamalar:
-
Kullanılmayan yuvaları hemen temizleyin
Flink, WAL veri kaybını önlemek amacıyla bir iş durduğunda veya durumu olmayan bir şekilde yeniden başlatıldığında çoğaltma yuvalarını otomatik olarak silmez.
-
Bir iş yeniden başlatılmayacaksa, disk alanını boşaltmak için ilgili çoğaltma yuvasını manuel olarak silin.
ÖnemliYaşam döngüsü yönetimi: Çoğaltma yuvalarını iş düzeyinde kaynaklar olarak ele alın ve bunları işlerin başlatılması ve durdurulmasıyla birlikte yönetin.
-
Eski yuvaları yeniden kullanmaktan kaçının
Her zaman yeni bir yuva adı kullanın. Eski bir yuvayı yeniden kullanmak, işin başlangıçta birikmiş geçmiş WAL verilerini okumasına ve yeni veri işlemenin gecikmesine neden olur.
-
PostgreSQL, bağlantı başına bir yuva gerektirir. Her iş benzersiz bir yuva adı kullanmalıdır.
ÖnemliAdlandırma kuralı:
slot.nameparametresini özelleştirirken, geçici yuvalarla çakışmayı önlemek içinmy_slot_1gibi sayısal son ekler içeren adlardan kaçının.
-
Artımlı anlık görüntüler etkinleştirildiğinde yuva davranışı
Ön koşullar: Kontrol noktaları etkinleştirilmeli ve kaynak tablosunda birincil anahtar tanımlanmış olmalıdır.
-
Yuva oluşturma kuralları:
Artımlı anlık görüntü devre dışı: Yalnızca paralellik 1 desteklenir. Tek bir genel yuva kullanılır.
-
Artımlı anlık görüntü etkin:
Anlık görüntü aşaması: Her eşzamanlı kaynak alt görevi geçici bir yuva oluşturur. Adlandırma biçimi
${slot.name}_${task_id}şeklindedir.Artımlı aşama: Tüm geçici yuvalar otomatik olarak geri kazanılır. Yalnızca tek bir genel yuva korunur.
Maksimum yuva sayısı: Kaynak paralelliği + 1 (anlık görüntü aşaması sırasında)
-
Kaynaklar ve performans
Kullanılabilir yuva veya disk alanı sınırlıysa, daha az geçici yuva kullanmak için anlık görüntü paralelliğini azaltın. Bu durum anlık görüntü okuma hızını düşürür.
-
Aşağı akış hedefi idempotent yazmaları destekliyorsa, anlık görüntü aşamasında WAL geri doldurmayı atlamak ve başlatmayı hızlandırmak için
scan.incremental.snapshot.backfill.skip = trueolarak ayarlayın.Bu ayar yalnızca en-az-bir-kez semantiği sağlar ve gerekli geçmiş değişikliklerin kaybolabileceği durum bilgisi içeren hesaplamalar (toplamalar veya arama birleştirmeleri) için uygun değildir.
-
Artımlı anlık görüntüler devre dışı bırakıldığında, anlık görüntü aşaması sırasında kontrol noktaları desteklenmez.
Postgres aboneliğini yeniden kullanma
Postgres CDC pgoutput kullanırken, hangi tablo değişikliklerinin okunabileceğini bir yayın belirler.
Birden çok iş aynı yayını paylaşıyorsa, yayınların işlerin okuması gereken tüm tabloları kapsadığından emin olun. Aksi takdirde, bazı tabloların artımlı değişiklikleri senkronize edilmeyebilir.
Dikkat edilmesi gerekenler
debezium.publication.autocreate.mode parametresinin varsayılan değeri all_tables şeklindedir. Bu modda:
Yayın mevcut değilse, bağlayıcı otomatik olarak
FOR ALL TABLESyayını oluşturur.Yayın zaten mevcutsa, bağlayıcı onu olduğu gibi yeniden kullanır ve tablo kapsamını kontrol etmez veya değiştirmez.
Bu seçenek filtered olarak ayarlanırsa, bağlayıcı mevcut işin tablo filtreleme kurallarına göre yayını oluşturur veya günceller. Birden çok iş aynı yayını paylaştığında, daha sonra başlayan bir iş tablo kapsamını üzerine yazarak diğer işlerin okuma işlemlerini etkileyebilir.
Öneriler
-
Üretim ortamında yayınları manuel olarak oluşturun ve bakımını yapın; otomatik yayın oluşturma ve güncellemelerini devre dışı bırakın.
-- Create a publication named my_flink_pub that includes all tables (or specified tables, creating one publication per job) CREATE PUBLICATION my_flink_pub FOR TABLE table_a, table_b; -- Or more simply, include all tables in the database CREATE PUBLICATION my_flink_pub FOR ALL TABLES;NotBir veritabanındaki tüm tablolara abone olmayın. Çok sayıda tablo içeren çok büyük bir veritabanı için bu işlem ağ bant genişliğini boşa harcar ve Flink tarafındaki CPU tüketimini artırır.
-
Aşağıdaki Flink yapılandırmalarını ekleyin:
debezium.publication.name = 'my_flink_pub'(Yayın adını belirtir)debezium.publication.autocreate.mode = 'disabled'(Flink'in başlatma sırasında yayını oluşturmasını veya değiştirmesini önler)
Bu ayar, birden çok işin birbirinin yayın yapılandırmalarını üzerine yazmasını önler.
SQL
Sözdizimi
CREATE TABLE postgrescdc_source (
id INT NOT NULL,
name STRING,
description STRING,
weight DECIMAL(10,3)
) WITH (
'connector' = 'postgres-cdc',
'hostname' = '<host name>',
'port' = '<port>',
'username' = '<user name>',
'password' = '<password>',
'database-name' = '<database name>',
'schema-name' = '<schema name>',
'table-name' = '<table name>',
'decoding.plugin.name'= 'pgoutput',
'scan.incremental.snapshot.enabled' = 'true',
-- Skipping backfill can speed up reads and reduce resource usage, but it may cause data duplication. Enable this if the downstream sink is idempotent.
'scan.incremental.snapshot.backfill.skip' = 'false',
-- In a production environment, set this to 'filtered' or 'disabled' and manage the publication manually instead of through Flink.
'debezium-publication.autocreate.mode' = 'disabled'
-- If you have multiple sources, configure a different publication for each source.
--'debezium.publication.name' = 'my_flink_pub'
);
Bağlayıcı seçenekleri
|
Seçenek |
Açıklama |
Veri türü |
Gerekli |
Varsayılan |
Açıklamalar |
|
connector |
Bağlayıcı adı. |
STRING |
Evet |
– |
Değer |
|
hostname |
PostgreSQL veritabanının IP adresi veya ana bilgisayar adı. |
STRING |
Evet |
– |
– |
|
username |
PostgreSQL veritabanı hizmeti kullanıcı adı. |
STRING |
Evet |
– |
– |
|
password |
PostgreSQL veritabanı hizmeti parolası. |
STRING |
Evet |
– |
– |
|
database-name |
PostgreSQL veritabanı adı. |
STRING |
Evet |
– |
Veritabanının adı. |
|
schema-name |
PostgreSQL şema adı. Regex desteklenir. |
STRING |
Evet |
– |
Şema adı, birden çok şemadan veri okumak için normal ifadeleri destekler. |
|
table-name |
PostgreSQL tablo adı. Regex desteklenir. |
STRING |
Evet |
– |
Tablo adı, birden çok tablodan veri okumak için normal ifadeleri destekler. |
|
port |
Bağlantı noktası numarası. |
INTEGER |
Hayır |
5432 |
– |
|
decoding.plugin.name |
PostgreSQL mantıksal kod çözme eklentisinin adı. |
STRING |
Hayır |
decoderbufs |
Bu, PostgreSQL hizmetine yüklenen eklenti tarafından belirlenir. Desteklenen eklentiler şunlardır:
|
|
slot.name |
Mantıksal kod çözme yuvası adı. |
STRING |
VVR 8.0.1 ve sonraki sürümler için gereklidir. Önceki sürümler için isteğe bağlıdır. |
|
|
|
debezium.* |
Debezium özellikleri ve parametreleri |
STRING |
Hayır |
– |
Debezium istemcisinin davranışı üzerinde daha ince ayarlı kontrol sağlar. Örneğin, |
|
scan.incremental.snapshot.enabled |
Artımlı anlık görüntülerin etkinleştirilip etkinleştirilmeyeceğini belirtir. |
BOOLEAN |
Hayır |
false |
Geçerli değerler:
Not
|
|
scan.startup.mode |
Veri tüketimi için başlatma modu. |
STRING |
Hayır |
initial |
Geçerli değerler:
|
|
changelog-mode |
Akış değişikliklerini kodlamak için kullanılan değişiklik günlüğü modu. |
String |
Hayır |
all |
Desteklenen değişiklik günlüğü modları:
|
|
heartbeat.interval.ms |
Kalp atışı paketlerinin gönderilme aralığı. |
Duration |
Hayır |
30s |
Birim milisaniyedir. Postgres CDC bağlayıcısı, yuva ofsetini ilerletmek için veritabanına aktif olarak kalp atışı gönderir. Tablo değişiklikleri seyrek olduğunda, bu değerin ayarlanması WAL günlüklerinin zamanında geri kazanılmasını sağlar. |
|
scan.incremental.snapshot.chunk.key-column |
Anlık görüntü aşamasında parçaları bölmek için anahtar sütun olarak kullanılacak bir sütun belirtir. |
STRING |
Hayır |
– |
Varsayılan olarak, birincil anahtarın ilk sütunu seçilir. |
|
scan.incremental.close-idle-reader.enabled |
Anlık görüntü tamamlandıktan sonra boşta kalan okuyucuların kapatılıp kapatılmayacağını belirtir. |
Boolean |
Hayır |
false |
Bu yapılandırmayı etkinleştirmek için |
|
scan.incremental.snapshot.backfill.skip |
Anlık görüntü aşamasında günlüklerin okunmasının atlanıp atlanmayacağını belirtir. |
Boolean |
Hayır |
false |
Geçerli değerler:
|
Tür eşlemeleri
PostgreSQL'den Flink'e tür eşlemeleri:
|
PostgreSQL CDC |
Flink |
|
SMALLINT |
SMALLINT |
|
INT2 |
|
|
SMALLSERIAL |
|
|
SERIAL2 |
|
|
INTEGER |
INT |
|
SERIAL |
|
|
BIGINT |
BIGINT |
|
BIGSERIAL |
|
|
REAL |
FLOAT |
|
FLOAT4 |
|
|
FLOAT8 |
DOUBLE |
|
DOUBLE PRECISION |
|
|
NUMERIC(p, s) |
DECIMAL(p, s) |
|
DECIMAL(p, s) |
|
|
BOOLEAN |
BOOLEAN |
|
DATE |
DATE |
|
TIME [(p)] [WITHOUT TIMEZONE] |
TIME [(p)] [WITHOUT TIMEZONE] |
|
TIMESTAMP [(p)] [WITHOUT TIMEZONE] |
TIMESTAMP [(p)] [WITHOUT TIMEZONE] |
|
CHAR(n) |
STRING |
|
CHARACTER(n) |
|
|
VARCHAR(n) |
|
|
CHARACTER VARYING(n) |
|
|
TEXT |
|
|
BYTEA |
BYTES |
Örnek
CREATE TABLE source (
id INT NOT NULL,
name STRING,
description STRING,
weight DECIMAL(10,3)
) WITH (
'connector' = 'postgres-cdc',
'hostname' = '<host name>',
'port' = '<port>',
'username' = '<user name>',
'password' = '<password>',
'database-name' = '<database name>',
'schema-name' = '<schema name>',
'table-name' = '<table name>'
);
SELECT * FROM source;
Flink CDC
VVR V11.4+, PostgreSQL bağlayıcısını Flink CDC kaynağı olarak destekler.
Sözdizimi
source:
type: postgres
name: PostgreSQL Source
hostname: localhost
port: 5432
username: pg_username
password: pg_password
tables: db.scm.tbl
slot.name: test_slot
scan.startup.mode: initial
server-time-zone: UTC
connect.timeout: 120s
decoding.plugin.name: decoderbufs
sink:
type: ...
Bağlayıcı seçenekleri
|
Seçenek |
Açıklama |
Gerekli |
Veri türü |
Varsayılan |
Açıklamalar |
|
type |
Bağlayıcı adı. |
Evet |
STRING |
– |
|
|
name |
Veri kaynağı adı. |
Hayır |
STRING |
– |
– |
|
hostname |
PostgreSQL veritabanı sunucusunun alan adı veya IP adresi. |
Evet |
STRING |
– |
– |
|
port |
PostgreSQL veritabanı bağlantı noktası. |
Hayır |
INTEGER |
5432 |
– |
|
username |
PostgreSQL kullanıcı adı. |
Evet |
STRING |
– |
– |
|
password |
PostgreSQL parolası. |
Evet |
STRING |
– |
– |
|
tables |
Yakalanacak tablo adları. Regex desteklenir. |
Evet |
STRING |
– |
Önemli
Şu anda yalnızca aynı veritabanındaki tablolar yakalanabilir. Nokta (.) tam nitelikli ad için ayırıcı olarak kabul edilir. Herhangi bir karakteri eşleştirmek için normal ifadede nokta (.) kullanmak isterseniz, ters eğik çizgi ile kaçış karakteri olarak belirtin. Örnek: |
|
slot.name |
PostgreSQL çoğaltma yuvası adı. |
Evet |
STRING |
– |
Ad, PostgreSQL çoğaltma yuvası adlandırma kurallarına uygun olmalı ve küçük harf, sayı ve alt çizgi içerebilir. |
|
decoding.plugin.name |
Sunucuda yüklü olan PostgreSQL mantıksal kod çözme eklentisinin adı. |
Hayır |
STRING |
|
Geçerli değerler: |
|
tables.exclude |
Hariç tutulacak tablolar. Bu seçenek |
Hayır |
STRING |
– |
Bkz. |
|
server-time-zone |
Veritabanı sunucusunun oturum saat dilimi, örneğin "Asia/Shanghai". |
Hayır |
STRING |
– |
Ayarlanmazsa, sistem varsayılan saat dilimi ( |
|
scan.incremental.snapshot.chunk.size |
Artımlı anlık görüntü çerçevesindeki her bir parçanın boyutu (satır sayısı). |
Hayır |
INTEGER |
8096 |
Artımlı anlık görüntü etkinleştirildiğinde, tablo okuma için birden çok parçaya bölünür. Bir parçanın verisi tamamen tüketilmeden önce bellekte önbelleğe alınır. Daha küçük bir parça, tablo için daha büyük toplam parça sayısına yol açar. Bu durum hata kurtarma granülerliğini azaltsa da bellek yetersizliği (OOM) hatalarına ve genel aktarım hızının düşmesine neden olabilir. Bu nedenle, dengeli bir yaklaşım benimseyerek makul bir parça boyutu ayarlamanız gerekir. |
|
scan.snapshot.fetch.size |
Bir tablonun tam verilerini okurken tek seferde getirilecek maksimum kayıt sayısı. |
Hayır |
INTEGER |
1024 |
– |
|
scan.startup.mode |
Veri tüketimi için başlatma modu. |
Hayır |
STRING |
initial |
Geçerli değerler:
|
|
scan.incremental.close-idle-reader.enabled |
Anlık görüntü tamamlandıktan sonra boşta kalan okuyucuların kapatılıp kapatılmayacağını belirtir. |
Hayır |
BOOLEAN |
false |
Bu yapılandırmayı etkinleştirmek için |
|
scan.lsn-commit.checkpoints-num-delay |
LSN ofsetlerini işlemeye başlamadan önce geciktirilecek kontrol noktası sayısı. |
Hayır |
INTEGER |
3 |
Durumdan kurtulamama sorununu önlemek için kontrol noktası LSN ofsetleri döngüsel olarak işlenir. |
|
connect.timeout |
Bağlayıcının PostgreSQL veritabanı sunucusuna bağlanmak için zaman aşımına uğramadan önce beklediği maksimum süre. |
Hayır |
DURATION |
30s |
Bu değer 250 milisaniyeden az olamaz. |
|
connect.max-retries |
Bağlayıcının bağlantı kurmak için yapacağı maksimum yeniden deneme sayısı. |
Hayır |
INTEGER |
3 |
– |
|
connection.pool.size |
Bağlantı havuzu boyutu. |
Hayır |
INTEGER |
20 |
– |
|
jdbc.properties.* |
Kullanıcıların özel JDBC URL özellikleri iletmesine olanak tanır. |
Hayır |
STRING |
20 |
Kullanıcılar |
|
heartbeat.interval |
En son kullanılabilir WAL günlük ofsetini izlemek için kalp atışı olaylarının gönderilme aralığı. |
Hayır |
DURATION |
30s |
– |
|
debezium.* |
PostgreSQL sunucusundan veri değişikliklerini yakalamak için kullanılan Debezium Gömülü Motoruna Debezium özelliklerini iletir. |
Hayır |
STRING |
– |
Debezium PostgreSQL bağlayıcı özellikleri: Debezium belgeleri. |
|
chunk-meta.group.size |
Parça meta verisinin boyutu. |
Hayır |
STRING |
1000 |
Meta veri bu değerden büyükse, birden çok parça halinde iletilir. |
|
metadata.list |
Aşağı akışa aktarılan ve dönüştürme modülünde kullanılabilecek okunabilir meta veri listesi. |
Hayır |
STRING |
false |
Ayırıcı olarak virgül (,) kullanın. Aşağıdaki meta veriler kullanılabilir:
Not
Meta veri sütunları yalnızca VVR 11.9 ve sonraki sürümlerde kullanılabilir. |
|
scan.incremental.snapshot.unbounded-chunk-first.enabled |
Anlık görüntü okuma aşaması sırasında sınırsız parçayı önce gönderir. |
Hayır |
STRING |
false |
Geçerli değerler:
Önemli
Bu deneysel bir özelliktir. Etkinleştirilmesi, TaskManager'ın anlık görüntü aşamasında son parçayı senkronize etmesi sırasındaki bellek yetersizliği (OOM) hatası riskini azaltır. İş ilk kez başlatılmadan önce bu parametreyi eklemenizi öneririz. |
|
schema-change.enabled |
Bağlayıcının şema değişikliklerini otomatik olarak çıkarıp çıkarmayacağını belirtir. |
Hayır |
BOOLEAN |
false |
Bu özellik etkinleştirildikten sonra, bağlayıcı Not
Çıkarılabilen şema değişiklikleri arasında sütun ekleme, sütun silme, sütun yeniden adlandırma ve sütun veri türlerini değiştirme yer alır. Bu parametre yalnızca VVR 11.9 ve sonraki sürümlerde kullanılabilir. |
Referanslar
Apache Flink için Gerçek Zamanlı Hesaplama tarafından desteklenen bağlayıcıların listesi için bkz. Desteklenen bağlayıcılar.
Verileri PolarDB for PostgreSQL (Oracle Uyumlu) 1.0 hedef tabloya yazmak için bkz. PolarDB for PostgreSQL (Oracle Uyumlu) 1.0 (kullanımdan kaldırılıyor).
ApsaraDB RDS for MySQL, PolarDB for MySQL veya kendi kendine yönetilen MySQL veritabanlarından veri okumak ve bu veritabanlarına veri yazmak için MySQL bağlayıcısını kullanın.