AnalyticDB for PostgreSQL PostgreSQL'in mantıksal çoğaltma özelliğini temel alan, tam ve artımlı verilere abone olabilen kendi geliştirdiği Change Data Capture (CDC) bağlayıcısını sunar. Bu bağlayıcı Flink ile sorunsuz bir şekilde entegre olur. Gerçek zamanlı veri senkronizasyonu ve akış işleme için kaynak tablolardaki gerçek zamanlı veri değişikliklerini verimli bir şekilde yakalar. Bu sayede işletmeler dinamik veri gereksinimlerine hızlı yanıt verebilir. Bu konuda, Realtime Compute for Apache Flink CDC kullanılarak AnalyticDB for PostgreSQL verilerine gerçek zamanlı olarak nasıl abone olunacağı açıklanmaktadır.
Sınırlamalar
-
Bu özellik yalnızca 7.2.1.4 veya sonraki küçük motor sürümünü çalıştıran AnalyticDB for PostgreSQL V7.0 örneklerinde kullanılabilir.
NotKonsolda örneğin Basic Information sayfasında küçük motor sürümünü görüntüleyebilirsiniz. Sürüm yukarıdaki gereksinimleri karşılamıyorsa küçük motor sürümünü yükseltmeniz gerekir.
AnalyticDB for PostgreSQL sunucusuz modu desteklenmez.
Ön Koşullar
AnalyticDB for PostgreSQL örneği ile tam yönetilen Flink çalışma alanı aynı VPC içinde bulunmalıdır.
-
AnalyticDB for PostgreSQL örneği için parametre ayarlarını aşağıdaki gibi yapmanız gerekir:
Mantıksal çoğaltmayı etkinleştirmek için
wal_levelparametresinilogicalolarak ayarlayın.Bir High-availability Edition AnalyticDB for PostgreSQL örneği kullanıyorsanız
hot_standby,hot_standby_feedbackvesync_replication_slotsparametrelerini on konumuna getirmeniz gerekir. Bu ayar, birincil/ikincil yük devretme sırasında mantıksal aboneliğin kesintiye uğramamasını sağlar.
AnalyticDB for PostgreSQL örneği için bir başlangıç hesabı veya RDS_SUPERUSER iznine sahip yetkili kullanıcı kullanmanız gerekir. Kullanıcıya REPLICATION ayrıcalığı verilmiş olmalıdır:
ALTER USER <username> WITH REPLICATION;.Flink çalışma alanının CIDR bloğu AnalyticDB for PostgreSQL örneğinin izin listesine eklenmelidir.
flink-sql-connector-adbpg-cdc-3,3.jar dosyasını indirmeniz ve CDC bağlayıcısını Flink çalışma alanınıza yüklemeniz gerekir.
Yordam
Adım 1: Test tablosu ve test verilerini hazırlama
AnalyticDB for PostgreSQL konsoluna giriş yapın ve hedef örneği bulun. Örnek kimliğine tıklayın.
Basic Information sayfasının sağ alt köşesinde Log On to Database seçeneğine tıklayın.
-
Bir test veritabanı ve
adbpg_source_tableadlı bir kaynak tablo oluşturun. Ardından kaynak tabloya 50 satır veri ekleyin.-- Create a test database. CREATE DATABASE testdb; -- Switch to the testdb database and create a schema. CREATE SCHEMA testschema; -- Create a source table named adbpg_source_table. CREATE TABLE testschema.adbpg_source_table( id int, username text, PRIMARY KEY(id) ); -- Insert 50 rows of data into the adbpg_source_table table. INSERT INTO testschema.adbpg_source_table(id, username) SELECT i, 'username'||i::text FROM generate_series(1, 50) AS t(i); -
Flink'in sonuç verilerini yazması için
adbpg_sink_tableadlı bir havuz tablosu oluşturun.CREATE TABLE testschema.adbpg_sink_table( id int, username text, score int );
Adım 2: Flink işi oluşturma
Realtime Compute konsoluna giriş yapın. Fully Managed Flink sekmesinde hedef çalışma alanını bulun ve Actions sütunundaki Console seçeneğine tıklayın.
Sol gezinme bölmesinde yolunu izleyin.
-
Üst menü çubuğunda
simgesine tıklayın. New Blank Stream Draft seçeneğini belirleyin ve aşağıdaki parametreleri ayarlayın.İş parametresi
Açıklama
Örnek
Name
İşin adı.
Notİş adı mevcut proje içinde benzersiz olmalıdır.
adbpg-test
Location
İşin kod dosyasının depolandığı klasör.
Mevcut bir klasörün yanındaki
simgesine tıklayarak da alt klasör oluşturabilirsiniz.Job Drafts
Engine Version
İş tarafından kullanılan Flink motor sürümü. Motor sürüm numaraları, sürüm eşlemeleri ve yaşam döngüsü kilometre taşları hakkında daha fazla bilgi için bkz. Flink motor sürümleri.
vvr-6.0.7-flink-1.15
Create seçeneğine tıklayın.
Adım 3: İş kodunu yazma ve işi dağıtma
-
Analog veri oluşturmak için
datagen_sourceadlı bir kaynak ve AnalyticDB for PostgreSQL veritabanındaki gerçek zamanlı veri değişikliklerini yakalamak içinsource_adbpgadlı bir kaynak oluşturun. Ardından bu iki kaynağı birleştirin ve sonuçlarısink_adbpgadlı bir havuz tablosuna yazın. İşlenen veriler AnalyticDB for PostgreSQL üzerine yazılır.Aşağıdaki iş kodunu düzenleyiciye kopyalayın.
---Create a Datagen source table to generate streaming data using the Datagen connector. CREATE TEMPORARY TABLE datagen_source ( id INT, score INT ) WITH ( 'connector' = 'datagen', 'fields.id.kind'='sequence', 'fields.id.start'='1', 'fields.id.end'='100', 'fields.score.kind'='random', 'fields.score.min'='70', 'fields.score.max'='100' ); --Create an adbpg source table to capture data changes of the adbpg_source_table table based on slot.name and pgoutput using the adbpg-cdc connector. CREATE TEMPORARY TABLE source_adbpg( id int, username varchar, PRIMARY KEY(id) NOT ENFORCED ) WITH( 'connector' = 'adbpg-cdc', 'hostname' = 'gp-bp16v8cgx46ns****-master.gpdb.rds.aliyuncs.com', 'port' = '5432', 'username' = 'account****', 'password' = 'password****', 'database-name' = 'testdb', 'schema-name' = 'testschema', 'table-name' = 'adbpg_source_table', 'slot.name' = 'flink', 'decoding.plugin.name' = 'pgoutput' ); --Create an adbpg sink table to write the processed results to the destination table adbpg_sink_table in the database. CREATE TEMPORARY TABLE sink_adbpg ( id int, username varchar, score int ) WITH ( 'connector' = 'adbpg', 'url' = 'jdbc:postgresql://gp-bp16v8cgx46ns****-master.gpdb.rds.aliyuncs.com:5432/testdb', 'tablename' = 'testschema.adbpg_sink_table', 'username' = 'account****', 'password' = 'password****', 'maxRetryTimes' = '2', 'batchsize' = '5000', 'conflictMode' = 'ignore', 'writeMode' = 'insert', 'retryWaitTime' = '200' ); -- Write the join results of the datagen_source and source_adbpg tables to the adbpg sink table. INSERT INTO sink_adbpg SELECT ts.id,ts.username,ds.score FROM datagen_source AS ds JOIN source_adbpg AS ts ON ds.id = ts.id;Parametreler
Parametre
Gerekli
Veri türü
Açıklama
connector
Evet
STRING
Bağlayıcı türü. Kaynak tablo için değeri
adbpg-cdc, havuz tablo içinadbpgolarak ayarlayın.hostname
Evet
STRING
AnalyticDB for PostgreSQL örneğinin iç uç noktası. Örneğin Basic Information sayfasından iç uç noktayı edinebilirsiniz.
username
Evet
STRING
AnalyticDB for PostgreSQL örneğinin veritabanı hesabı ve parolası.
password
Evet
STRING
database-name
Evet
STRING
Veritabanının adı.
schema-name
Evet
STRING
Şemanın adı. Bu parametre normal ifadeleri destekler. Aynı anda birden çok şemaya abone olabilirsiniz.
table-name
Evet
STRING
Tablonun adı. Bu parametre normal ifadeleri destekler. Aynı anda birden çok tabloya abone olabilirsiniz.
port
Evet
INTEGER
AnalyticDB for PostgreSQL bağlantı noktası. Değer 5432 olarak sabittir.
decoding.plugin.name
Evet
STRING
PostgreSQL mantıksal kod çözme eklentisinin adı. Değer pgoutput olarak sabittir.
slot.name
Evet
STRING
Mantıksal kod çözme yuvasının adı.
-
Aynı Flink işindeki kaynak tablolar için
slot.namedeğerini aynı tutun. -
Farklı Flink işleri aynı tabloyu içeriyorsa her iş için benzersiz bir
slot.nameayarlayın. Bu durum aşağıdaki hatayı önler:PSQLException: ERROR: replication slot "debezium" is active for PID 974.
debezium.*
Hayır
STRING
Debezium istemcisini daha ince granülerlikte kontrol eder. Örneğin
'debezium.snapshot.mode' = 'never'ayarı anlık görüntü özelliğini devre dışı bırakır. Daha fazla bilgi için bkz. yapılandırma özellikleri.scan.incremental.snapshot.enabled
Hayır
BOOLEAN
Artımlı anlık görüntülerin etkinleştirilip etkinleştirilmeyeceğini belirtir. Geçerli değerler:
-
false (varsayılan): Artımlı anlık görüntüler devre dışı bırakılır.
-
true: Artımlı anlık görüntüler etkinleştirilir.
scan.startup.mode
Hayır
STRING
Veri tüketimi için başlangıç modu. Geçerli değerler:
-
initial (varsayılan): İş ilk kez başladığında tüm geçmiş verileri tarar ve ardından en son write-ahead logging (WAL) verilerini okur. Bu sayede tam ve artımlı veriler arasında kesintisiz bir geçiş sağlanır.
-
latest-offset: İş ilk kez başladığında geçmiş verileri taramaz. WAL'ın sonundan, yani en son günlük konumundan okumaya başlar. Yalnızca bağlayıcı başladıktan sonra oluşan veri değişikliklerini yakalar.
-
snapshot: Tüm geçmiş verileri tarar ve tam tarama sırasında oluşturulan yeni WAL girdilerini okur. Tam tarama tamamlandığında iş durur.
changelog-mode
Hayır
STRING
Akış değişikliklerini kodlamak için değişiklik günlüğü modu. Geçerli değerler:
-
ALL (varsayılan):
INSERT,DELETE,UPDATE_BEFOREveUPDATE_AFTERdahil olmak üzere tüm işlem türlerini destekler. -
UPSERT: Yalnızca
UPSERTişlemlerini destekler. BunlarINSERT,DELETEveUPDATE_AFTERişlemlerini içerir.
heartbeat.interval.ms
Hayır
DURATION
Heartbeat paketlerinin gönderilme aralığı. Varsayılan değer 30 saniyedir. Birim milisaniyedir.
AnalyticDB for PostgreSQL CDC bağlayıcısı, yuva ofsetinin sürekli ilerlemesini sağlamak için veritabanına heartbeat paketleri gönderir. Tablo verileri sık değişmiyorsa WAL günlüklerini zamanında temizlemek ve disk alanı israfını önlemek için bu parametreyi makul bir değere ayarlayın.
scan.incremental.snapshot.chunk.key-column
Hayır
STRING
Anlık görüntü aşamasında parçalama için kullanılacak bir sütun belirtir. Varsayılan olarak birincil anahtarın ilk sütunu seçilir.
url
Evet
STRING
Format
jdbc:postgresql://<Address>:<PortId>/<DatabaseName>şeklindedir. -
İş geliştirme sayfasının üst kısmında sözdizimi denetimi gerçekleştirmek için Deep Check seçeneğine tıklayın.
Deploy seçeneğine tıklayın ve ardından Confirm seçeneğine tıklayın.
Sağ üst köşede Operations seçeneğine tıklayın. Deployments sayfasında Start seçeneğine tıklayın.
Adım 4: Flink tarafından yazılan verileri görüntüleme
-
Flink tarafından yazılan verileri görüntülemek için test veritabanında aşağıdaki deyimleri yürütün.
SELECT * FROM testschema.adbpg_sink_table; SELECT COUNT(*) FROM testschema.adbpg_sink_table; -
Kaynak tabloya 50 satır daha veri ekleyin. Ardından Flink'in havuz tablosuna yazdığı artımlı veri satırlarının toplam sayısını kontrol edin.
-- Insert 50 rows of incremental data into the source table. INSERT INTO testschema.adbpg_source_table(id, username) SELECT i, 'username'||i::text FROM generate_series(51, 100) AS t(i); -- Check the new data in the destination table. SELECT COUNT(*) FROM testschema.adbpg_sink_table where id > 50;Sonuç aşağıda gösterilmektedir.
count ------- 50 (1 row)
Kullanım notları
-
Disk alanı israfını önlemek için Çoğaltma Yuvalarını zamanında yönetin.
Bir Flink işi yeniden başlatıldığında kontrol noktasına karşılık gelen WAL günlüklerinin temizlenmesinden kaynaklanan veri kaybını önlemek amacıyla Flink Çoğaltma Yuvalarını otomatik olarak silmez. Bu nedenle bir Flink işinin artık yeniden başlatılmasına gerek olmadığından eminseniz kapladığı kaynakları serbest bırakmak için ilgili Çoğaltma Yuvasını manuel olarak silmelisiniz. Ayrıca bir Çoğaltma Yuvasının onaylanan konumu uzun süre ilerletilmezse AnalyticDB for PostgreSQL bu konumdan sonraki WAL girdilerini temizleyemez. Bu durum kullanılmayan WAL verilerinin birikmesine ve büyük miktarda disk alanı tüketmesine neden olabilir.
Bir AnalyticDB for PostgreSQL örneğinin normal çalışması sırasında exactly-once veri işleme semantiği garanti edilir. Ancak bir hata senaryosunda yalnızca at-least-once semantiği desteklenir.
-
CDC bağlayıcısı veri senkronizasyonu tutarlılığını sağlamak için abone olunan tablonun REPLICA IDENTITY parametresini
FULLolarak değiştirir. Bu değişikliğin aşağıdaki etkileri vardır:Artan disk alanı kullanımı. Sık güncelleme veya silme işlemlerinin olduğu senaryolarda bu ayar WAL günlüklerinin boyutunu artırır ve dolayısıyla disk alanı kullanımını yükseltir.
Azalan yazma performansı. Yüksek eşzamanlı yazma içeren senaryolarda performans önemli ölçüde etkilenebilir.
Artan kontrol noktası baskısı. Daha büyük WAL günlükleri kontrol noktalarının daha fazla veri işlemesi gerektiği anlamına gelir ve bu durum kontrol noktaları için gereken süreyi uzatabilir.
En iyi uygulamalar
Flink CDC Flink SQL API veya DataStream API kullanılarak iş geliştirmeyi destekler. Flink CDC kullanarak tek bir kaynak veritabanındaki tek veya birden çok tablo için entegre tam ve artımlı veri senkronizasyonu uygulayabilirsiniz. Ayrıca farklı veri kaynaklarında tablo birleştirme gibi hesaplamalar gerçekleştirebilirsiniz. Flink çerçevesi veri işleme prosedürü boyunca exactly-once olay işleme semantiğini garanti eder. Ancak Flink CDC PostgreSQL uyumlu bir veritabanının tamamını senkronize etmek için uygun değildir. Bunun nedeni DDL senkronizasyonunu desteklememesi ve her tablonun yapısının Flink SQL'de tanımlanmasının bakım karmaşıklığını artırmasıdır.
Bu bölümde AnalyticDB for PostgreSQL verilerinin Kafka'ya senkronize edilmesi örneği üzerinden Flink CDC SQL işi geliştirmeye ilişkin en iyi uygulamalar açıklanmaktadır. Flink CDC işini geliştirmeden önce Ön Koşullar bölümünde açıklandığı gibi kaynakları hazırladığınızdan ve yapılandırdığınızdan emin olun.
Adım 1: Test tablolarını hazırlama
AnalyticDB for PostgreSQL örneğinde iki kaynak tablo oluşturun.
CREATE TABLE products (
product_id SERIAL PRIMARY KEY,
product_name VARCHAR(200) NOT NULL,
sku CHAR(12) NOT NULL,
description TEXT,
price NUMERIC(10,2) NOT NULL,
discount_price DECIMAL(10,2),
stock_quantity INTEGER DEFAULT 0,
weight REAL,
volume DOUBLE PRECISION,
dimensions BOX,
release_date DATE,
is_featured BOOLEAN DEFAULT FALSE,
rating FLOAT,
warranty_period INTERVAL,
metadata JSON,
tags TEXT[]
);
CREATE TABLE documents (
document_id UUID PRIMARY KEY,
title VARCHAR(200) NOT NULL,
content TEXT,
summary TEXT,
publication_date TIMESTAMP WITHOUT TIME ZONE,
last_updated TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
author_id BIGINT,
file_data BYTEA,
xml_content XML,
json_metadata JSON,
reading_time INTERVAL,
is_public BOOLEAN DEFAULT TRUE,
views_count INTEGER DEFAULT 0,
category VARCHAR(50),
tags TEXT[]
);
Adım 2: Kafka kaynaklarını hazırlama
Bir Kafka örneği satın alın ve dağıtın.
Flink çalışma alanının CIDR bloğunu Kafka örneğinin izin listesine ekleyin.
Kafka örneğinde kaynaklar oluşturun.
Adım 3: Flink işi oluşturma
Realtime Compute konsoluna giriş yapın. Fully Managed Flink sekmesinde hedef çalışma alanını bulun ve Actions sütunundaki Console seçeneğine tıklayın.
Sol gezinme bölmesinde yolunu izleyin.
Üst menü çubuğunda
simgesine tıklayın. New Blank Stream Draft seçeneğini belirleyin ve iş parametrelerini ayarlayın.Create seçeneğine tıklayın.
Adım 4: İş kodunu yazma ve işi dağıtma
-
Flink çalışma alanında bir SQL işi yazın. Aşağıdaki iş kodunu düzenleyiciye kopyalayın ve yapılandırmaları gerçek değerlerinizle değiştirin.
-- Use one source to capture data from multiple tables CREATE TEMPORARY TABLE ADBPGSource( table_name STRING METADATA FROM 'table_name' VIRTUAL, row_kind STRING METADATA FROM 'row_kind' VIRTUAL, product_id BIGINT, product_name STRING, sku STRING, description STRING, price STRING, discount_price STRING, stock_quantity INT, weight STRING, volume STRING, dimensions STRING, release_date STRING, is_featured BOOLEAN, rating FLOAT, warranty_period STRING, metadata STRING, tags STRING, document_id STRING, title STRING, content STRING, summary STRING, publication_date STRING, last_updated STRING, author_id BIGINT, file_data STRING, xml_content STRING, json_metadata STRING, reading_time STRING, is_public BOOLEAN, views_count INT, category STRING ) WITH ( 'connector' = 'adbpg-cdc', 'hostname' = 'gp-2zev887z58390***-master.gpdb.rds.aliyuncs.com', 'port' = '5432', 'username' = 'account****', 'password' = 'password****', 'database-name' = 'testdb', 'schema-name' = 'public', 'table-name' = '(products|documents)', 'slot.name' = 'flink', 'decoding.plugin.name' = 'pgoutput', 'debezium.snapshot.mode' = 'never' ); CREATE TEMPORARY TABLE KafkaProducts ( product_id BIGINT, product_name STRING, sku STRING, description STRING, price STRING, discount_price STRING, stock_quantity INT, weight STRING, volume STRING, dimensions STRING, release_date STRING, is_featured BOOLEAN, rating FLOAT, warranty_period STRING, metadata STRING, tags STRING, PRIMARY KEY(product_id) NOT ENFORCED ) WITH ( 'connector' = 'upsert-kafka', 'topic' = '****', 'properties.bootstrap.servers' = 'alikafka-post-cn-****-1-vpc.alikafka.aliyuncs.com:9092', 'key.format'='avro', 'value.format'='avro' ); CREATE TEMPORARY TABLE KafkaDocuments ( document_id STRING, title STRING, content STRING, summary STRING, publication_date STRING, last_updated STRING, author_id BIGINT, file_data STRING, xml_content STRING, json_metadata STRING, reading_time STRING, is_public BOOLEAN, views_count INT, category STRING, tags STRING, PRIMARY KEY(document_id) NOT ENFORCED ) WITH ( 'connector' = 'upsert-kafka', 'topic' = '****', 'properties.bootstrap.servers' = 'alikafka-post-cn-****-1-vpc.alikafka.aliyuncs.com:9092', 'key.format'='avro', 'value.format'='avro' ); -- Use a STATEMENT SET to wrap multiple statements BEGIN STATEMENT SET; -- Use the table_name METADATA to route data to the destination table INSERT INTO KafkaProducts SELECT product_id,product_name,sku,description,price,discount_price,stock_quantity,weight,volume,dimensions,release_date,is_featured,rating,warranty_period,metadata,tags FROM ADBPGSource WHERE table_name = 'products'; INSERT INTO KafkaDocuments SELECT document_id,title,content,summary,publication_date,last_updated,author_id,file_data,xml_content,json_metadata,reading_time,is_public,views_count,category,tags FROM ADBPGSource WHERE table_name = 'documents'; END;Bu SQL işiyle ilgili aşağıdaki hususlara dikkat edin:
Çoklu tablo senkronizasyon görevleri için bu SQL örneğinde gösterildiği gibi birden çok tablodan veri yakalamak üzere tek bir kaynak tablo kullanmanızı öneririz. Bu kaynak tabloda tüm kaynak tabloların tüm sütunlarını tanımlamanız gerekir. Sütun adları yineleniyorsa yalnızca birini tutun. Hedef tabloya yazarken verileri belirtilen tabloya yönlendirmek için
METADATAtable_name kullanın. Bu yaklaşım AnalyticDB for PostgreSQL üzerinde yalnızca bir Çoğaltma Yuvası oluşturmayı gerektirir. Bu yöntem kaynak veritabanının kaynak kullanımını azaltır, senkronizasyon performansını iyileştirir ve gelecekteki bakımı kolaylaştırır.Birden çok kaynak tablo belirtmek için
table-nameparametresini kullanın. Tablo adlarını parantez içine alın ve dikey çizgilerle (|) ayırın; örneğin(table1|table2|table3).debezium.snapshot.modeayarınıneverolarak yapmak kaynak tablodan yalnızca artımlı verilerin senkronize edilmesini sağlar. Hem tam hem de artımlı verileri senkronize etmek için ayarıinitialolarak değiştirin.
İş geliştirme sayfasının üst kısmında sözdizimi denetimi gerçekleştirmek için Deep Check seçeneğine tıklayın.
Deploy seçeneğine tıklayın ve ardından OK seçeneğine tıklayın.
Sağ üst köşede Operations seçeneğine tıklayın. Deployments sayfasında Start seçeneğine tıklayın.
Adım 5: Test verisi ekleme
AnalyticDB for PostgreSQL örneğinde iki kaynak tablodaki verileri güncelleyin ve Kafka konusunda mesaj değişikliklerini gözlemleyin.
Test verisi eklemek için aşağıdaki SQL deyimini kullanabilirsiniz:
INSERT INTO products (
product_name, sku, description, price, discount_price, stock_quantity, weight, volume, dimensions, release_date, is_featured, rating, warranty_period, metadata, tags
) VALUES (
'Test Product', 'Test-2025', 'A piece of test product data', 299.99, 279.99, 150, 50.5, 120.75, '(10,20),(30,40)', '2023-05-01', TRUE, 4.8, INTERVAL '1 year', '{"brand": "TechCo", "model": "X1"}', '{"Test1", "Test2"}'
);
İlgili Konular
AnalyticDB for PostgreSQL tam verilerine abone olma hakkında daha fazla bilgi için bkz. Flink kullanarak tam verileri gerçek zamanlı okuma ve yazma.