Bu konu, SQL işlerinde MySQL bağlayıcısının nasıl kullanılacağını açıklar.
Genel bilgiler
MySQL bağlayıcısı; ApsaraDB RDS for MySQL, PolarDB for MySQL, OceanBase (MySQL modu) ve kendi kendine yönetilen MySQL gibi MySQL protokolüyle uyumlu tüm veritabanlarını destekler.
MySQL bağlayıcısını kullanarak OceanBase'den veri okurken ikili günlük kaydının (binlog) etkinleştirildiğinden ve doğru yapılandırıldığından emin olun. Daha fazla bilgi için bkz. Binlog ile ilgili işlemler. Bu özellik genel önizleme aşamasındadır. Bu özelliği kullanırken dikkatli olun.
MySQL bağlayıcısı aşağıdakileri destekler.
|
Kategori |
Ayrıntılar |
|
Desteklenen türler |
Kaynak tablolar, boyut tabloları, hedef tablolar ve veri alımı veri kaynakları |
|
Çalışma zamanı modu |
Yalnızca akış modu desteklenir. |
|
Veri biçimi |
Uygulanamaz |
|
Özel izleme ölçümleri |
|
|
API türleri |
DataStream, SQL ve veri alımı YAML |
|
Hedef tablolardaki verilerin güncellenmesini veya silinmesini destekler |
Evet |
Özellikler
MySQL değişen veri yakalama (CDC) kaynak tablosu, diğer adıyla MySQL akış kaynak tablosu, önce veritabanından tam geçmiş verileri okur. Ardından, ikili günlükleri okumaya sorunsuz bir şekilde geçer. Bu işlem, hiçbir verinin kaçırılmamasını veya yinelenmemesini sağlar. Bir hata oluşsa bile veriler tam olarak bir kez işleme semantiği ile işlenir. MySQL CDC kaynak tablosu, tam verilerin eşzamanlı okunmasını destekler. Kilit gerektirmeyen okuma ve kaldığı yerden devam edebilen veri aktarımı uygulamak için artımlı anlık görüntü algoritması kullanır. Daha fazla bilgi için bkz. MySQL CDC kaynak tabloları hakkında.
Hem tam hem de artımlı verileri okumayı destekleyen ve iki ayrı işlemi sürdürme ihtiyacını ortadan kaldıran birleşik toplu ve akış işleme.
Yatay performans ölçeklendirmesi için tam verilerin eşzamanlı okunması.
Tam veri okumadan artımlı veri okumaya sorunsuz geçiş ve hesaplama kaynaklarını tasarruf etmek için otomatik ölçek küçültme.
Geliştirilmiş kararlılık için tam veri okuma aşaması sırasında kaldığı yerden devam edebilen veri aktarımı.
Çevrimiçi hizmetleri etkilemeyen, kilit gerektirmeyen tam veri okuma.
ApsaraDB RDS for MySQL yedekleme günlüklerinin okunmasını destekleme.
Daha düşük okuma gecikme süresi için ikili günlük dosyalarının paralel ayrıştırılması.
Önkoşullar
Bir MySQL CDC kaynak tablosu kullanmadan önce MySQL'i Yapılandırma bölümünde açıklanan önkoşul işlemlerini tamamlamanız gerekir.
ApsaraDB RDS for MySQL
Realtime Compute for Apache Flink ile ağ bağlantısını sağlamak için bir ağ probu gerçekleştirin.
MySQL sürümü: 5.6, 5.7, 8.0.x veya 8.4.
İkili günlük kaydı etkinleştirilmelidir. Varsayılan olarak etkindir.
İkili günlük biçimi ROW olmalıdır. Bu, varsayılan biçimdir.
binlog_row_imageparametresi FULL olarak ayarlanmalıdır. Bu, varsayılan ayardır.Binary Log Transaction Compression devre dışı bırakılmalıdır. Bu özellik MySQL 8.0.20'de tanıtılmıştır ve varsayılan olarak devre dışıdır.
SELECT, SHOW DATABASES, REPLICATION SLAVE ve REPLICATION CLIENT izinlerine sahip bir MySQL kullanıcısı oluşturulmuştur.
Bir MySQL veritabanı ve tablosu oluşturun. Daha fazla bilgi için bkz. ApsaraDB RDS for MySQL örneği için veritabanı ve hesap oluşturma. Yetersiz izinlerden kaynaklanan işlem hatalarını önlemek için MySQL veritabanını yetkili bir hesapla oluşturun.
Bir IP adresi izin listesi yapılandırın. Daha fazla bilgi için bkz. ApsaraDB RDS for MySQL örneği için IP adresi izin listesi yapılandırma.
PolarDB for MySQL
Realtime Compute for Apache Flink ile ağ bağlantısını sağlamak için bir ağ probu gerçekleştirin.
MySQL sürümü: 5.6, 5.7, 8.0.x veya 8.4.
İkili günlük kaydı etkinleştirilmelidir. Varsayılan olarak devre dışıdır.
İkili günlük biçimi ROW olmalıdır. Bu, varsayılan biçimdir.
binlog_row_imageparametresi FULL olarak ayarlanmalıdır. Bu, varsayılan ayardır.Binary Log Transaction Compression devre dışı bırakılmalıdır. Bu özellik MySQL 8.0.20'de tanıtılmıştır ve varsayılan olarak devre dışıdır.
SELECT, SHOW DATABASES, REPLICATION SLAVE ve REPLICATION CLIENT izinlerine sahip bir MySQL kullanıcısı oluşturulmuştur.
Bir MySQL veritabanı ve tablosu oluşturun. Daha fazla bilgi için bkz. PolarDB for MySQL kümesi için veritabanı ve hesap oluşturma. Yetersiz izinlerden kaynaklanan işlem hatalarını önlemek için MySQL veritabanını yetkili bir hesapla oluşturun.
Bir IP adresi izin listesi yapılandırın. Daha fazla bilgi için bkz. PolarDB for MySQL kümesi için IP adresi izin listesi yapılandırma.
Kendi kendine yönetilen MySQL
Realtime Compute for Apache Flink ile ağ bağlantısını sağlamak için bir ağ probu gerçekleştirin.
MySQL sürümü: 5.6, 5.7, 8.0.x veya 8.4.
İkili günlük kaydı etkinleştirilmelidir. Varsayılan olarak devre dışıdır.
İkili günlük biçimi ROW olmalıdır. Varsayılan biçim STATEMENT'tir.
binlog_row_imageparametresi FULL olarak ayarlanmalıdır. Bu, varsayılan ayardır.Binary Log Transaction Compression devre dışı bırakılmalıdır. Bu özellik MySQL 8.0.20'de tanıtılmıştır ve varsayılan olarak devre dışıdır.
Bir MySQL kullanıcısı oluşturun ve SELECT, SHOW DATABASES, REPLICATION SLAVE ve REPLICATION CLIENT izinlerini verin.
Bir MySQL veritabanı ve tablosu oluşturun. Daha fazla bilgi için bkz. Kendi kendine yönetilen MySQL örneği için veritabanı ve hesap oluşturma. Yetersiz izinlerden kaynaklanan işlem hatalarını önlemek için MySQL veritabanını yetkili bir hesapla oluşturun.
Bir IP adresi izin listesi yapılandırın. Daha fazla bilgi için bkz. Kendi kendine yönetilen MySQL örneği için IP adresi izin listesi yapılandırma.
Sınırlamalar
Genel sınırlamalar
MySQL CDC kaynak tabloları watermark tanımlamalarını desteklemez.
MySQL CDC bağlayıcısı Binary Log Transaction Compression özelliğini desteklemez. Bu nedenle, MySQL CDC bağlayıcısını kullanarak artımlı verileri tüketirken Binary Log Transaction Compression özelliğinin devre dışı bırakıldığından emin olun. Aksi takdirde bağlayıcı artımlı verileri alamayabilir.
ApsaraDB RDS for MySQL sınırlamaları
ApsaraDB RDS for MySQL için ikincil bir veritabanından veya salt okunur çoğaltmadan veri okumayın. Bunun nedeni, ikincil veritabanları ve salt okunur çoğaltmalar için varsayılan ikili günlük saklama süresinin kısa olmasıdır. İkili günlüklerin süresi dolup temizlenirse iş ikili günlük verilerini tüketemeyebilir ve hata verebilir.
ApsaraDB RDS for MySQL varsayılan olarak paralel birincil/ikincil senkronizasyonunu etkinleştirir ancak birincil ve ikincil örnekler arasında tutarlı bir işlem sırası garantisi vermez. Bu durum, birincil/ikincil geçişi ve kontrol noktası kurtarma sırasında verilerin kaçırılmasına neden olabilir. Bu sorunu önlemek için ApsaraDB RDS for MySQL'de
slave_preserve_commit_orderseçeneğini manuel olarak etkinleştirebilirsiniz.
PolarDB for MySQL sınırlamaları
MySQL CDC kaynak tabloları, PolarDB for MySQL V1.0.19 ve önceki sürümlerinin Çoklu Ana Küme Mimarisi kümelerinden veri okumayı desteklemez. Daha fazla bilgi için bkz. Çoklu Ana Küme nedir?. Bu kümeler tarafından oluşturulan ikili günlükler yinelenen tablo kimlikleri içerebilir. Bu durum, CDC kaynak tablosunda şema eşleme hatalarına neden olabilir ve ikili günlük verilerinin ayrıştırılması sırasında hatalara yol açabilir.
Açık kaynak MySQL sınırlamaları
MySQL varsayılan olarak birincil/ikincil ikili günlük çoğaltması sırasında işlem sırasını korur. Bir MySQL çoğaltmasında paralel çoğaltma etkinleştirilmişse (slave_parallel_workers > 1) ancak slave_preserve_commit_order=ON etkinleştirilmemişse işlem taahhüt sırası birincil veritabanıyla tutarsız olabilir. Flink CDC bir kontrol noktasından kurtulduğunda sıralı diziden dolayı veri kaybı yaşanabilir. MySQL çoğaltmasında slave_preserve_commit_order = ON ayarlayabilirsiniz. Alternatif olarak slave_parallel_workers = 1 ayarlayabilirsiniz ancak bu, çoğaltma performansından ödün verilmesine neden olur.
Kullanım notları
-
Kaynak tablo
Tam veri okuma aşaması sırasında bir kaydetme noktası kaydedemez, kaynak tabloya tablo ekleyemez veya tablo silemez ve ardından işi kaydetme noktasından yeniden başlatamazsınız. Bu işlemleri gerçekleştirirseniz iş veri okuyamaz.
-
Hedef tablo
Otomatik artan birincil anahtarlar: DDL'de otomatik artan birincil anahtarları bildirmeyin. MySQL, veri yazarken bunları otomatik olarak doldurur.
En az bir birincil anahtar olmayan alan bildirmelisiniz. Aksi takdirde hata raporlanır.
DDL'deki
NOT ENFORCEDkısıtlaması, Flink'in birincil anahtar doğrulamasını zorlamadığını gösterir. Birincil anahtarın doğruluğunu ve bütünlüğünü sağlamak sizin sorumluluğunuzdadır. Daha fazla bilgi için bkz. Geçerlilik Kontrolü.
-
Boyut tablosu
Sorguları hızlandırmak için bir dizin kullanmak istiyorsanız JOIN yan tümcesindeki alanların sırası dizinde tanımlanan sırayla eşleşmelidir. Bu, en soldaki önek kuralına dayanır. Örneğin, dizin (a, b, c) ise JOIN koşulu
ON t.a = x AND t.b = yşeklindedir.Flink tarafından oluşturulan SQL, optimize edici tarafından yeniden yazılabilir. Bu durum, gerçek veritabanı sorgusu sırasında dizinin isabet etmesini engelleyebilir. Dizinin kullanılıp kullanılmadığını doğrulamak için yürütme planını (EXPLAIN) veya MySQL'deki yavaş sorgu günlüğünü kontrol ederek yürütülen gerçek SELECT ifadesini görüntüleyin.
SQL
MySQL bağlayıcısını SQL işlerinde kaynak tablo, boyut tablosu veya hedef tablo olarak kullanabilirsiniz.
Sözdizimi
CREATE TEMPORARY TABLE mysqlcdc_source (
order_id INT,
order_date TIMESTAMP(0),
customer_name STRING,
price DECIMAL(10, 5),
product_id INT,
order_status BOOLEAN,
PRIMARY KEY(order_id) NOT ENFORCED
) WITH (
'connector' = 'mysql',
'hostname' = '<yourHostname>',
'port' = '3306',
'username' = '<yourUsername>',
'password' = '<yourPassword>',
'database-name' = '<yourDatabaseName>',
'table-name' = '<yourTableName>'
);
-
Bir hedef tabloya yazarken bağlayıcı, alınan her veri kaydı için bir SQL ifadesi oluşturur ve yürütür. İfade şu şekilde yapılandırılır:
Birincil anahtarı olmayan bir hedef tablo için
INSERT INTO table_name (column1, column2, ...) VALUES (value1, value2, ...);ifadesi yürütülür.Birincil anahtarı olan bir hedef tablo için
INSERT INTO table_name (column1, column2, ...) VALUES (value1, value2, ...) ON DUPLICATE KEY UPDATE column1 = VALUES(column1), column2 = VALUES(column2), ...;ifadesi yürütülür. Not: Fiziksel tabloda birincil anahtar dışında benzersiz bir dizin kısıtlaması varsa farklı birincil anahtarlara ancak aynı benzersiz dizin değerine sahip iki kayıt eklemek benzersiz dizin çakışmasına neden olur. Bu durum, verilerin üzerine yazılmasına ve kaybolmasına neden olur.
MySQL veritabanında otomatik artan bir birincil anahtar tanımlanmışsa Flink DDL'sinde otomatik artan alanı bildirmeyin. Veritabanı, veri yazarken bu alanı otomatik olarak doldurur. Bağlayıcı, otomatik artan alanlara sahip verilerin yazılmasını ve silinmesini destekler ancak bu verilerin güncellenmesini desteklemez.
Parametrelerle
-
Genel
Parameter
Description
Required
Data type
Default value
Notes
connector
Tablo türü.
Yes
STRING
None
Kaynak tablo olarak kullanıldığında bu parametreyi
mysql-cdcveyamysqlolarak ayarlayabilirsiniz; ikisi eşdeğerdir. Boyut tablosu veya havuz (sink) tablosu olarak kullanıldığında değer mutlakamysqlolmalıdır.hostname
MySQL veritabanının IP adresi veya ana bilgisayar adı.
Yes
STRING
None
Bir sanal özel cloud (VPC) adresi belirtmenizi öneririz.
NotMySQL veritabanı ile Realtime Compute for Apache Flink aynı VPC içinde değilse, veritabanına erişmek için VPC'ler arası bir ağ bağlantısı kurmanız veya genel bir uç nokta kullanmanız gerekir. Daha fazla bilgi için bkz. Manage and operate workspaces ve How can a fully managed Flink cluster access the Internet?.
username
MySQL veritabanı hizmetinin kullanıcı adı.
Yes
STRING
None
Yok.
password
MySQL veritabanı hizmetinin parolası.
Yes
STRING
None
Yok.
database-name
MySQL veritabanının adı.
Yes
STRING
None
-
Bir veritabanı kaynak tablo olarak kullanıldığında, birden çok veritabanından veri okumak için veritabanı adında düzenli ifade kullanabilirsiniz.
-
Düzenli ifadeler kullanırken dizenin başını ve sonunu eşleştirmek üzere ^ ve $ simgelerini kullanmayın. Daha fazla bilgi için table-name parametresine ilişkin notlara bakın.
table-name
MySQL tablosunun adı.
Yes
STRING
None
-
Birden çok tablodan veri okumak için kaynak tablo adında düzenli ifade kullanabilirsiniz.
-
Düzenli ifadeler kullanırken dizenin başını ve sonunu eşleştirmek üzere ^ ve $ simgelerini kullanmayın. Daha fazla bilgi için aşağıdaki nota bakın.
NotBir MySQL CDC kaynak tablosu tablo adlarını düzenli ifadeyle eşleştirirken, belirttiğiniz database-name ve table-name değerlerini \\. dizesiyle birleştirerek tam yollu bir düzenli ifade oluşturur. VVR 8.0.1 öncesinde . karakteri kullanılırdı. Bağlayıcı daha sonra bu düzenli ifadeyi kullanarak MySQL veritabanındaki tabloların tam nitelikli adlarını eşleştirir.
Örneğin, 'database-name'='db_.' ve 'table-name'='tb_.+' şeklinde ayarlarsanız bağlayıcı, hangi tabloların okunacağını belirlemek için tam nitelikli tablo adlarını eşleştirmek üzere db_.\\.tb_.+ düzenli ifadesini kullanır. VVR 8.0.1 öncesinde düzenli ifade db_.*.tb_.+ idi.
port
MySQL veritabanı hizmetinin bağlantı noktası numarası.
No
INTEGER
3306
Yok.
-
-
Yalnızca kaynak tablo
Parametre
Açıklama
Gerekli
Veri türü
Varsayılan değer
Notlar
server-id
Veritabanı istemcisi için sayısal bir kimlik.
Hayır
STRING
5400 ile 6400 arasında rastgele bir değer oluşturulur.
Bu kimliğin MySQL kümesinde genel olarak benzersiz olması gerekir. Aynı veritabanına bağlanan her iş için farklı bir kimlik ayarlayın.
Bu parametre ayrıca 5400-5408 gibi bir kimlik aralığı biçimini de destekler. Artımlı okuma etkinleştirildiğinde eşzamanlı okuma desteklenir. Bu durumda, her eşzamanlı okuyucunun farklı bir kimlik kullanması için bir kimlik aralığı ayarlayın. Daha fazla bilgi için bkz. Sunucu Kimliğini Kullanma.
scan.incremental.snapshot.enabled
Artımlı anlık görüntülerin etkinleştirilip etkinleştirilmeyeceğini belirtir.
Hayır
BOOLEAN
true
Artımlı anlık görüntüler varsayılan olarak etkindir. Artımlı anlık görüntü, tam veri anlık görüntülerini okumak için yeni bir mekanizmadır. Eski anlık görüntü okuma yöntemine kıyasla artımlı anlık görüntülerin aşağıdakiler dahil olmak üzere birçok avantajı vardır:
-
Kaynak, tam verileri paralel olarak okuyabilir.
-
Kaynak, tam verileri okurken parça düzeyinde kontrol noktalarını destekler.
-
Kaynak, tam verileri okurken genel okuma kilidi (FLUSH TABLES WITH read lock) almayı gerektirmez.
Kaynağın eşzamanlı okumayı desteklemesini istiyorsanız her eşzamanlı okuyucunun benzersiz bir sunucu kimliğine ihtiyacı vardır. Bu nedenle server-id bir aralık olmalıdır (örneğin 5400-6400) ve aralığın boyutu eşzamanlılık düzeyinden büyük veya ona eşit olmalıdır.
NotBu yapılandırma öğesi Ververica Runtime (VVR) 11.1 ve sonraki sürümlerde kaldırılmıştır.
scan.incremental.snapshot.chunk.size
Her bir parçanın satır cinsinden boyutu.
Hayır
INTEGER
8096
Artımlı anlık görüntü okuma etkinleştirildiğinde tablo okuma için birden çok parçaya bölünür. Bir parçanın verileri tamamen okunana kadar bellekte önbelleğe alınır.
Her parçada bulunan satır sayısı azaldıkça tabloda toplam parça sayısı artar. Bu durum hata kurtarma granülerliğini azaltsa da bellek yetersizliği (OOM) hatalarına ve daha düşük genel aktarım hızına yol açabilir. Bu nedenle makul bir parça boyutu belirlemek için dengeli bir yaklaşım sergilemeniz gerekir.
scan.snapshot.fetch.size
Bir tablonun tam verilerini okurken tek seferde çekilecek maksimum kayıt sayısı.
Hayır
INTEGER
1024
Yok.
scan.startup.mode
Veri tüketimi için başlangıç modu.
Hayır
STRING
initial
Geçerli değerler:
-
initial (varsayılan): İlk başlatmada veya durumsuz bir başlatmada konektör tüm geçmiş verileri tarar ve ardından en son ikili günlük verilerini okur.
-
latest-offset: İlk başlatmada veya durumsuz bir başlatmada konektör geçmiş verileri taramaz. İkili günlüğün sonundan itibaren okumaya başlar; bu, konektör başladıktan sonra yapılan yalnızca en son değişiklikleri okuduğu anlamına gelir.
-
earliest-offset: Konektör geçmiş verileri taramaz. En eski kullanılabilir ikili günlükten başlayarak okumaya başlar.
-
specific-offset: Konektör geçmiş verileri taramaz. Belirli bir ikili günlük ofsetinden başlar. Ofseti hem scan.startup.specific-offset.file hem de scan.startup.specific-offset.pos parametrelerini yapılandırarak veya belirli bir GTID kümesinden başlamak için yalnızca scan.startup.specific-offset.gtid-set parametresini yapılandırarak belirtebilirsiniz.
-
timestamp: Konektör geçmiş verileri taramaz. Belirtilen bir zaman damgasından itibaren ikili günlüğü okumaya başlar. Zaman damgası milisaniye cinsinden scan.startup.timestamp-millis parametresiyle belirtilir.
Önemliearliest-offset, specific-offset veya timestamp başlangıç modlarını kullanırken belirtilen ikili günlük tüketim konumu ile işin başlatılma zamanı arasında ilgili tablonun şemasının değişmediğinden emin olun. Bu, şema uyuşmazlıklarından kaynaklanan hataları önler.
scan.startup.specific-offset.file
specific-offset başlangıç modu kullanılırken başlangıç ofseti için ikili günlük dosya adı.
Hayır
STRING
Yok
Bu parametreyi kullanırken scan.startup.mode parametresini specific-offset olarak ayarlamanız gerekir. Örnek dosya adı biçimi:
mysql-bin.000003.scan.startup.specific-offset.pos
specific-offset başlangıç modu kullanılırken belirtilen ikili günlük dosyasındaki başlangıç ofseti.
Hayır
INTEGER
Yok
Bu parametreyi kullanırken scan.startup.mode parametresini specific-offset olarak ayarlamanız gerekir.
scan.startup.specific-offset.gtid-set
specific-offset başlangıç modu kullanılırken başlangıç ofseti için GTID kümesi.
Hayır
STRING
Yok
Bu parametreyi kullanırken scan.startup.mode parametresini specific-offset olarak ayarlamanız gerekir. Örnek GTID kümesi biçimi:
24DA167-0C0C-11E8-8442-00059A3C7B00:1-19.scan.startup.timestamp-millis
timestamp başlangıç modu kullanılırken başlangıç ofseti için milisaniye cinsinden zaman damgası.
Hayır
LONG
Yok
Bu parametreyi kullanırken scan.startup.mode parametresini timestamp olarak ayarlamanız gerekir. Zaman damgası birimi milisaniyedir.
ÖnemliBir zaman belirttiğinizde MySQL CDC, her ikili günlük dosyasının ilk olayını okuyarak zaman damgasını belirlemeye çalışır. Ardından belirtilen zamana karşılık gelen ikili günlük dosyasını bulur. Belirtilen zaman damgasına karşılık gelen ikili günlük dosyasının veritabanından temizlenmediğinden ve okunabilir olduğundan emin olun.
server-time-zone
Veritabanı tarafından kullanılan oturum saat dilimi.
Hayır
STRING
Bu parametreyi belirtmezseniz sistem, Flink iş çalışma zamanının ortam saat dilimini veritabanı sunucusu saat dilimi olarak kullanır. Bu, seçtiğiniz alanın saat dilimidir.
Örnek: Asia/Shanghai. Bu parametre, MySQL'deki TIMESTAMP türünün STRING türüne nasıl dönüştürüleceğini kontrol eder. Daha fazla bilgi için bkz. Debezium temporal values.
debezium.min.row.count.to.stream.results
Bir tablodaki satır sayısı bu değerden büyük olduğunda toplu okuma modu kullanılır.
Hayır
INTEGER
1000
Flink, bir MySQL kaynak tablosundan verileri aşağıdaki yollardan biriyle okur:
-
Tam okuma: Tablonun tüm verilerini doğrudan belleğe okur. Bu yöntem hızlıdır ancak karşılık gelen miktarda bellek tüketir. Kaynak tablo çok büyükse OOM hatası riski vardır.
-
Toplu okuma: Tüm veriler okunana kadar her topluda belirli sayıda satır olacak şekilde verileri birden çok toplu halinde okur. Bu yöntem büyük tabloları okurken OOM riskini önler ancak nispeten yavaştır.
connect.timeout
MySQL veritabanı sunucusuna bağlantı kurulurken yeniden denemeden önce beklenen maksimum zaman aşımı süresi.
Hayır
DURATION
30s
Yok.
connect.max-retries
MySQL veritabanı hizmetine başarısız bir bağlantıdan sonra yapılacak maksimum yeniden deneme sayısı.
Hayır
INTEGER
3
Yok.
connection.pool.size
Veritabanı bağlantı havuzunun boyutu.
Hayır
INTEGER
20
Veritabanı bağlantı havuzu, bağlantıları yeniden kullanarak veritabanı bağlantısı sayısını azaltır.
jdbc.properties.*
JDBC URL'sindeki özel bağlantı parametreleri.
Hayır
STRING
Yok
Özel bağlantı parametreleri iletebilirsiniz. Örneğin SSL protokolünü kullanmamak için 'jdbc.properties.useSSL' = 'false' şeklinde yapılandırma yapabilirsiniz.
Desteklenen bağlantı parametreleri hakkında daha fazla bilgi için bkz. MySQL Configuration Properties.
debezium.*
Debezium'un ikili günlükleri okuması için özel parametreler.
Hayır
STRING
Yok
Özel Debezium parametreleri iletebilirsiniz. Örneğin ayrıştırma hataları için işleme mantığını belirtmek amacıyla 'debezium.event.deserialization.failure.handling.mode'='ignore' kullanabilirsiniz.
UyarıDebezium parametrelerini keyfi olarak değiştirmeyin. Bu, konektörün verileri yanlış okumasına neden olabilir. Örneğin debezium.binlog.buffer.size parametresinin yapılandırılmasına izin verilmez.
heartbeat.interval
Kaynağın kalp atışı olaylarını kullanarak ikili günlük ofsetini ilerletme aralığı.
Hayır
DURATION
30s
Kalp atışı olayları, kaynaktaki ikili günlük ofsetini ilerletmek için kullanılır. Bu durum, MySQL'de nadiren güncellenen tablolar için oldukça faydalıdır. Bu tür tablolar için ikili günlük ofseti otomatik olarak ilerleyemez. Kalp atışı olayları ikili günlük ofsetini ileriye taşıyarak süresi dolmuş bir ikili günlük ofsetinden kaynaklanan sorunları önler. Süresi dolmuş bir ikili günlük ofseti işin başarısız olmasına ve kurtarılamamasına neden olabilir; bu da durumsuz bir yeniden başlatma gerektirir.
scan.incremental.snapshot.chunk.key-column
Anlık görüntü aşamasında parçalama için bölme sütunu olarak kullanılacak bir sütun belirtir.
Notlar sütununa bakın.
STRING
Yok
-
Birincil anahtarı olmayan tablolar için gereklidir. Seçilen sütun null olmayan bir türde (NOT NULL) olmalıdır.
-
Birincil anahtarı olan tablolar için isteğe bağlıdır. Birincil anahtardan yalnızca bir sütun seçilebilir.
rds.region-id
Alibaba Cloud ApsaraDB RDS for MySQL örneğinin bölge kimliği.
OSS'ten arşivlenmiş günlükleri okuma özelliği kullanılırken gereklidir.
STRING
Yok
Bölge kimlikleri hakkında daha fazla bilgi için bkz. Bölgeler ve alanlar.
ÖnemliMySQL CDC için GTID dizesi rastgele oluşturulduğundan ve ikili günlük dosya ofsetleri gibi monoton artmadığından bir dosyada GTID bulmak OSS'ten tüm arşivlenmiş günlüklerin indirilip ayrıştırılmasını gerektirir. Bu işlem çok yoğun kaynak tüketir ve zaman alır; bu da GTID ofsetlerine dayalı özelliklerin uygulanmasını imkansız kılar. Bu nedenle OSS arşivlenmiş günlük özelliği yalnızca belirtilen bir zaman damgasından veya belirtilen bir ikili günlük dosya ofsetinden başlamayı destekler. Belirtilen bir GTID'den başlamayı veya arşivlenmiş günlüklerde birincil/ikincil geçişleri içeren senaryoları desteklemez çünkü MySQL birincil/ikincil geçişleri GTID'lere dayanır. Bu özelliği kullanmadan önce dikkatlice değerlendirin.
rds.access-key-id
Alibaba Cloud ApsaraDB RDS for MySQL hesabının AccessKey kimliği.
OSS'ten arşivlenmiş günlükleri okuma özelliği kullanılırken gereklidir.
STRING
Yok
Daha fazla bilgi için bkz. AccessKey ID ve AccessKey gizli anahtarını nasıl görüntülerim?.
ÖnemliAccessKey bilgilerinizin sızmasını önlemek için AccessKey kimliğini belirtmek üzere gizli anahtar yönetimi özelliğini kullanın. Daha fazla bilgi için bkz. Değişkenleri yönetme.
rds.access-key-secret
Alibaba Cloud ApsaraDB RDS for MySQL hesabının AccessKey gizli anahtarı.
OSS'ten arşivlenmiş günlükleri okuma özelliği kullanılırken gereklidir.
STRING
Yok
Daha fazla bilgi için bkz. AccessKey ID ve AccessKey gizli anahtarını nasıl görüntülerim?
ÖnemliAccessKey bilgilerinizin sızmasını önlemek için AccessKey gizli anahtarını belirtmek üzere gizli anahtar yönetimi özelliğini kullanın. Daha fazla bilgi için bkz. Değişkenleri yönetme.
rds.db-instance-id
Alibaba Cloud ApsaraDB RDS for MySQL örneğinin kimliği.
OSS'ten arşivlenmiş günlükleri okuma özelliği kullanılırken gereklidir.
STRING
Yok
Yok.
rds.main-db-id
Alibaba Cloud ApsaraDB RDS for MySQL örneğinin birincil veritabanı numarası.
Hayır
STRING
Yok
-
Birincil veritabanı numarasının nasıl elde edileceği hakkında daha fazla bilgi için bkz. ApsaraDB RDS for MySQL günlük yedekleme.
-
Yalnızca VVR 8.0.7 ve sonraki sürümlerde desteklenir.
NotBu parametre belirtilmezse VVR 11.7 ve sonraki sürümler, ApsaraDB RDS for MySQL bağlantı bilgilerine göre birincil veritabanı numarasını otomatik olarak sorgular.
rds.download.timeout
OSS'ten tek bir arşivlenmiş günlüğü indirmek için zaman aşımı süresi.
Hayır
DURATION
60s
Yok.
rds.endpoint
OSS ikili günlük bilgilerini almak için hizmet uç noktası.
Hayır
STRING
Yok
-
Geçerli değerler hakkında daha fazla bilgi için bkz. Uç noktalar.
-
Yalnızca VVR 8.0.8 ve sonraki sürümlerde desteklenir.
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
-
Yalnızca VVR 8.0.1 ve sonraki sürümlerde desteklenir.
-
Bu yapılandırmanın etkili olması için execution.checkpointing.checkpoints-after-tasks-finish.enabled parametresini true olarak ayarlamanız gerekir.
scan.read-changelog-as-append-only.enabled
Değişiklik günlüğü veri akışının yalnızca ekleme yapılabilen bir veri akışına dönüştürülüp dönüştürülmeyeceğini belirtir.
Hayır
BOOLEAN
false
Geçerli değerler:
-
true: INSERT, DELETE, UPDATE_BEFORE ve UPDATE_AFTER dahil tüm mesaj türleri INSERT mesajlarına dönüştürülür. Bu seçeneği yalnızca yukarı akış tablosundaki silme mesajlarını kaydetmeniz gerektiğinde gibi özel senaryolarda etkinleştirin.
-
false (varsayılan): Tüm mesaj türleri olduğu gibi aşağı akışa gönderilir.
NotYalnızca VVR 8.0.8 ve sonraki sürümlerde desteklenir.
scan.only.deserialize.captured.tables.changelog.enabled
Artımlı aşamada yalnızca belirtilen tabloların değişiklik olaylarının ayrıştırılıp ayrıştırılmayacağını belirtir.
Hayır
BOOLEAN
-
Varsayılan değer VVR 8.x sürümlerinde false'tur.
-
Varsayılan değer VVR 11.1 ve sonraki sürümlerde true'dur.
Geçerli değerler:
-
true: İkili günlük okumayı hızlandırmak için yalnızca hedef tabloların değişiklik verilerini ayrıştırır.
-
false (varsayılan): Tüm tabloların değişiklik verilerini ayrıştırır.
Not-
Yalnızca VVR 8.0.7 ve sonraki sürümlerde desteklenir.
-
VVR 8.0.8 veya önceki sürümleri kullanırken parametre adını debezium.scan.only.deserialize.captured.tables.changelog.enable olarak değiştirmeniz gerekir.
scan.parse.online.schema.changes.enabled
Artımlı aşamada RDS kilitsiz değişiklik DDL olaylarını ayrıştırmayı denemenin gerekip gerekmediğini belirtir.
Hayır
BOOLEAN
false
Geçerli değerler:
-
true: RDS kilitsiz değişiklik DDL olaylarını ayrıştırır.
-
false (varsayılan): RDS kilitsiz değişiklik DDL olaylarını ayrıştırmaz.
Bu deneysel bir özelliktir. Çevrimiçi kilitsiz bir değişiklik gerçekleştirmeden önce kurtarma amacıyla Flink işinin anlık görüntüsünü alın.
NotYalnızca VVR 11.1 ve sonraki sürümlerde desteklenir.
scan.incremental.snapshot.backfill.skip
Anlık görüntü okuma aşamasında geri doldurmanın atlanıp atlanmayacağını belirtir.
Hayır
BOOLEAN
false
Geçerli değerler:
-
true: Anlık görüntü okuma aşamasında geri doldurmayı atlar.
-
false (varsayılan): Anlık görüntü okuma aşamasında geri doldurmayı atlamaz.
Geri doldurma yalnızca tek bir parçanın anlık görüntü sorgusu sırasında uygulanır ve tüm tam okuma aşamasını kapsamaz. Geri doldurma atlandığında her parçanın anlık görüntü sorgusu o andaki en güncel tablo verilerini okur; bir parça okunduktan sonra o parçada gerçekleşen güncellemeler tam okuma aşamasında birleştirilmez ve artımlı aşamaya girildikten sonra Binlog'dan okunur. Örneğin chunk5 anlık görüntülenirken chunk5 üzerinde yapılan bir güncelleme doğrudan chunk5'in anlık görüntüsünde yansıtılır; okuyucu chunk80'e ilerledikten sonra chunk5 güncellenirse güncelleme artımlı aşamada Binlog'dan daha sonra uygulanır.
ÖnemliEtkinleştirildiğinde bir parçanın taraması sırasında veya sonrasında meydana gelen değişiklikler artımlı aşamada Binlog'dan teslim edilir ve yinelenen kayıtlara neden olabilir. Yalnızca en az bir kez semantiği garanti edilir. Bunu yalnızca aşağı akış havuzu birincil anahtara göre yedimsiz yazmaları desteklediğinde etkinleştirin.
NotYalnızca VVR 11.1 ve sonraki sürümlerde desteklenir.
scan.incremental.snapshot.unbounded-chunk-first.enabled
Anlık görüntü okuma aşamasında sınırsız parçaların öncelikli olarak dağıtılıp dağıtılmayacağını belirtir.
Hayır
BOOELEAN
false
Geçerli değerler:
-
true: Anlık görüntü okuma aşamasında sınırsız parçaları öncelikli olarak dağıtır.
-
false (varsayılan): Anlık görüntü okuma aşamasında sınırsız parçaları öncelikli olarak dağıtmaz.
Bu deneysel bir özelliktir. Etkinleştirilmesi, anlık görüntü aşamasında son parçayı senkronize ederken TaskManager'da OOM hatası riskini azaltabilir. Bu parametreyi işin ilk başlatmasından önce ekleyin.
NotYalnızca VVR 11.1 ve sonraki sürümlerde desteklenir.
binlog.session.network.timeout
İkili günlük bağlantısı için ağ okuma/yazma zaman aşımı.
Hayır
DURATION
10m
0s olarak ayarlanırsa MySQL sunucusunun varsayılan zaman aşımı kullanılır.
NotYalnızca VVR 11.5 ve sonraki sürümlerde desteklenir.
scan.rate-limit.records-per-second
Kaynağın saniyede gönderdiği maksimum kayıt sayısını sınırlar.
Hayır
LONG
Yok
Bu parametre veri okumanın sınırlandırılması gereken senaryolar için uygundur. Bu sınır hem tam hem de artımlı aşamalarda etkilidir.
Kaynağın
numRecordsOutPerSecondölçümü, tüm veri akışı tarafından saniyede çıktılanan kayıt sayısını yansıtır. Bu ölçüme göre parametreyi ayarlayabilirsiniz.Tam veri okuma aşamasında genellikle her topluda okunan satır sayısını azaltmanız gerekir.
scan.incremental.snapshot.chunk.sizeparametresinin değerini düşürebilirsiniz.NotYalnızca VVR 11.5 ve sonraki sürümlerde desteklenir.
scan.binlog.tolerate.gtid-holes
Bu parametrenin etkinleştirilmesi GTID dizisindeki boşlukları yok sayarak işin kesintili olayları atlayıp çalışmaya devam etmesini sağlar.
Hayır
BOOLEAN
false
Bu parametreyi etkinleştirmeden önce işin başlangıç ofsetinin süresinin dolmadığından emin olmalısınız. İş temizlenmiş veya süresi dolmuş bir GTID ofsetinden başlarsa motor eksik günlükleri sessizce atlayarak veri kaybına yol açar.
NotBu parametre yalnızca VVR 11.6 ve sonraki sürümlerde desteklenir.
scan.filter-unchanged-row.enabled
SQL'de kullanılmayan alanların değişiklik olaylarının filtrelenip filtrelenmeyeceğini belirtir.
Hayır
BOOLEAN
false
Bu parametreyi true olarak ayarlarsanız bir CDC kaynak tablosu bir UPDATE olayı aldığında yalnızca SQL ifadesinde başvurulan sütunları karşılaştırır. Başvurulan sütunların değerleri değişmezse olay aşağı akışa gönderilmez. Bu parametre çoklu akış JOIN senaryolarında etkili olur. Yukarı akış tablosu SQL ifadesinde başvurulan bir alanı güncellerse gereksiz DELETE ve INSERT olayları oluşmaz. Bu durum aşağı akış operatörlerinde veri çoğalmasını ve sonuç titremesini azaltır.
NotBu parametre yalnızca VVR 11.8 ve sonraki sürümlerde desteklenir.
scan.projection-pushdown.enabled
Projeksiyon itelemenin etkinleştirilip etkinleştirilmeyeceğini belirtir.
Hayır
BOOLEAN
false
Bu parametreyi true olarak ayarlarsanız bir CDC kaynak tablosu yalnızca SQL ifadesinde başvurulan sütunları ayrıştırır ve iletir. Başvurulmayan sütunlar serileştirilmez veya ağ üzerinden iletilmez. Bu durum G/Ç ve hesaplama yükünü azaltır. Bu parametre
scan.filter-unchanged-row.enabledile birlikte kullanıldığında daha iyi çalışır. Projeksiyon iteleme önce veri hacmini azaltır ardından değişmeyen satırlar filtrelenerek aşağı akış operatörlerindeki işleme yükü daha da hafifletilir.NotBu parametre yalnızca VVR 11.8 ve sonraki sürümlerde desteklenir.
-
-
Boyut tablosuna özel parametreler
Parametre
Açıklama
Gerekli
Veri türü
Varsayılan değer
Notlar
url
MySQL JDBC URL'si.
Hayır
STRING
Yok
URL biçimi şöyledir:
jdbc:mysql://<endpoint>:<port>/<database_name>.lookup.max-retries
Başarısız bir veri okuma işleminden sonra gerçekleştirilecek maksimum yeniden deneme sayısı.
Hayır
INTEGER
3
Yalnızca VVR 6.0.7 ve sonraki sürümlerde desteklenir.
lookup.cache.strategy
Önbellek ilkesi.
Hayır
STRING
Yok
Desteklenen önbellek ilkeleri None, LRU ve ALL'dir. Değerler hakkında daha fazla bilgi için bkz. Boyut tablosu JOIN deyimleri.
NotLRU önbellek ilkesini kullandığınızda lookup.cache.max-rows parametresini de yapılandırmanız gerekir.
lookup.cache.max-rows
Maksimum önbelleğe alınmış satır sayısı.
Hayır
INTEGER
100000
-
LRU önbellek ilkesini seçtiyseniz önbellek boyutunu ayarlamanız gerekir.
-
ALL önbellek ilkesini seçtiyseniz önbellek boyutunu ayarlamanıza gerek yoktur.
lookup.cache.ttl
Önbellek yaşam süresi (TTL).
Hayır
DURATION
10 s
lookup.cache.ttl yapılandırması lookup.cache.strategy değerine bağlıdır:
-
lookup.cache.strategy değeri None olarak ayarlanmışsa lookup.cache.ttl öğesini yapılandırmanıza gerek yoktur. Bu durumda önbelleğin zaman aşımı olmaz.
-
lookup.cache.strategy değeri LRU olarak ayarlanmışsa lookup.cache.ttl önbellek TTL değeridir. Varsayılan olarak önbelleğin süresi dolmaz.
-
lookup.cache.strategy değeri ALL olarak ayarlanmışsa lookup.cache.ttl önbellek yükleme süresidir. Varsayılan olarak önbellek yeniden yüklenmez.
1min veya 10s gibi bir zaman biçimi kullanın.
lookup.max-join-rows
Birincil tablodan bir kaydın boyut tablosundaki kayıtlarla eşleşmesi durumunda döndürülen maksimum sonuç sayısı.
Hayır
INTEGER
1024
Yok.
lookup.filter-push-down.enabled
Boyut tablosu için filtre aşağı itmenin etkinleştirilip etkinleştirilmeyeceğini belirtir.
Hayır
BOOLEAN
false
Geçerli değerler:
-
true: Boyut tablosu için filtre aşağı itmeyi etkinleştirir. MySQL veritabanı tablosundan veri yüklerken boyut tablosu, SQL işinde belirtilen koşullara göre verileri önceden filtreler.
-
false (varsayılan): Boyut tablosu için filtre aşağı itmeyi devre dışı bırakır. MySQL veritabanı tablosundan veri yüklerken boyut tablosu tüm verileri yükler.
NotYalnızca VVR 8.0.7 ve sonraki sürümlerde desteklenir.
ÖnemliBoyut tablosu aşağı itme özelliği yalnızca bir Flink tablosu boyut tablosu olarak kullanıldığında etkinleştirilmelidir. MySQL source tabloları filtre aşağı itmenin etkinleştirilmesini desteklemez. Bir Flink tablosu hem source tablosu hem de boyut tablosu olarak kullanılıyorsa ve boyut tablosu için filtre aşağı itme etkinleştirilmişse source tablosu için bu yapılandırma öğesini SQL İpuçları kullanarak açıkça false olarak ayarlamanız gerekir. Aksi takdirde iş anormal şekilde çalışabilir.
lookup.cache.cache-empty
Boş sorgu sonuçlarının önbelleğe alınıp alınmayacağını belirtir.
Hayır
BOOLEAN
true
Yalnızca önbellek ilkesi
LRUolduğunda etkili olur. Geçerli değerler:-
true (varsayılan): Bir sorgu veri döndürmezse boş bir sonuç önbelleğe alınır ve sonraki sorgular için doğrudan döndürülür.
-
false: Bir sorgu veri döndürmezse hiçbir sonuç önbelleğe alınmaz ve sonraki sorgu verileri tekrar arar.
NotBu parametre yalnızca VVR 11.9.0 ve sonraki sürümlerde desteklenir.
-
-
Yalnızca sink tabloları için
Parametre
Açıklama
Gerekli
Veri türü
Varsayılan değer
Notlar
url
MySQL JDBC URL'si.
Hayır
STRING
Yok
URL biçimi şöyledir:
jdbc:mysql://<endpoint>:<port>/<database_name>.sink.max-retries
Başarısız bir veri yazma işleminden sonra gerçekleştirilecek maksimum yeniden deneme sayısı.
Hayır
INTEGER
3
Yok.
sink.buffer-flush.batch-size
Tek bir toplu iş yazmasındaki satır sayısı.
Hayır
INTEGER
4096
Yok.
sink.buffer-flush.max-rows
Bellekte önbelleğe alınan veri satırı sayısı.
Hayır
INTEGER
10000
Bu parametre yalnızca bir birincil anahtar belirtildikten sonra etkili olur.
sink.buffer-flush.interval
Önbelleği temizleme aralığı. Belirtilen bekleme süresi sonunda önbellekteki veriler çıkış koşullarını karşılamazsa sistem önbellekteki tüm verileri otomatik olarak çıkarır.
Hayır
DURATION
1s
Yok.
sink.ignore-delete
Veri SİLME işlemlerinin yoksayılıp yoksayılmayacağını belirtir.
Hayır
BOOLEAN
false
Flink SQL tarafından oluşturulan akış delete veya update-before kayıtları içeriyorsa birden fazla çıkış görevi aynı tablonun farklı alanlarını aynı anda güncellediğinde veri tutarsızlığı oluşabilir.
Örneğin bir kayıt silindikten sonra başka bir görev yalnızca bazı alanları günceller. Güncellenmemiş alanlar null veya varsayılan değerlere dönüşerek veri hatalarına neden olur.
sink.ignore-delete değerini true olarak ayarlayarak yukarı akıştaki DELETE ve UPDATE_BEFORE işlemlerini yoksayabilir ve bu tür sorunlardan kaçınabilirsiniz.
Not-
UPDATE_BEFORE, bir güncelleme işlemindeki eski değeri "geri çekmek" için kullanılan Flink'in geri çekme mekanizmasının bir parçasıdır.
-
ignoreDelete = true olduğunda tüm DELETE ve UPDATE_BEFORE türündeki kayıtlar atlanır. Yalnızca INSERT ve UPDATE_AFTER kayıtları işlenir.
sink.ignore-delete-mode
DELETE işlemleri yoksayıldıktan sonra silme türündeki kayıtları işleme stratejisi.
Hayır
STRING
ALL
Geçerli değerler:
-
ALL: Hem -D hem de -U kayıtlarını yoksayar.
-
REAL_DELETE: Yalnızca -D kayıtlarını yoksayar.
-
UPDATE_BEFORE: Yalnızca -U kayıtlarını yoksayar.
Not-
Bu seçenek yalnızca Realtime Compute motoru VVR 11.8 ve sonraki sürümlerde desteklenir.
-
Yalnızca sink.ignore-delete=true olduğunda etkilidir. Tek başına yapılandırılması hataya neden olur.
sink.ignore-null-when-update
Verileri güncellerken gelen veri alanı değeri null ise ilgili alanın null olarak güncellenip güncellenmeyeceğini veya o alan için güncellemenin atlanıp atlanmayacağını belirtir.
Hayır
BOOLEAN
false
Geçerli değerler:
-
true: Alanı güncellemez. Bu parametre yalnızca Flink tablosu için bir birincil anahtar ayarlandığında true olarak ayarlanabilir. true olarak ayarlandığında:
-
VVR 8.0.6 ve önceki sürümler için sink tablosu toplu iş yazmayı desteklemez.
-
VVR 8.0.7 ve sonraki sürümler için sink tablosu toplu iş yazmayı destekler.
Toplu iş yazma, yazma verimliliğini ve genel aktarım hızını önemli ölçüde artırabilir ancak veri gecikmesine ve OOM hataları riskine neden olur. Bu nedenle iş senaryonza göre bir denge kurmanız gerekir.
-
-
false: Alanı null olarak günceller.
NotBu parametre yalnızca VVR 8.0.5 ve sonraki sürümlerde desteklenir.
sink.force-batch-on-non-primary-table
Birincil anahtarı olmayan bir MySQL sink tablosuna veri yazılırken kayıtların zorla arabelleğe alınıp JDBC Batch kullanılarak toplu iş olarak eklenip eklenmeyeceğini belirtir.
Hayır
BOOLEAN
false
Bu parametre yalnızca birincil anahtarı olmayan tablolarda etkili olur. Bu parametreyi true olarak ayarlarsanız DELETE ve UPDATE_BEFORE olayları sessizce atılır ve INSERT ile UPDATE_AFTER olayları INSERT deyimleri olarak toplu iş halinde yazılır. Verilerin yalnızca ekleme amaçlı olması veya önceki semantiğin sizin için kabul edilebilir olması durumunda bu parametreyi etkinleştirmenizi öneririz.
Not-
Bu parametre yalnızca VVR 11.8 ve sonraki sürümlerde desteklenir.
-
Verilerin yalnızca ekleme amaçlı olması veya önceki semantiğin sizin için kabul edilebilir olması durumunda bu parametreyi etkinleştirin. Aksi takdirde veriler tutarsız hale gelebilir.
-
Tür eşleme
-
CDC kaynak tabloları
MySQL CDC alan türü
Flink alan türü
TINYINT
TINYINT
SMALLINT
SMALLINT
TINYINT UNSIGNED
TINYINT UNSIGNED ZEROFILL
INT
INT
MEDIUMINT
SMALLINT UNSIGNED
SMALLINT UNSIGNED ZEROFILL
BIGINT
BIGINT
INT UNSIGNED
INT UNSIGNED ZEROFILL
MEDIUMINT UNSIGNED
MEDIUMINT UNSIGNED ZEROFILL
BIGINT UNSIGNED
DECIMAL(20, 0)
BIGINT UNSIGNED ZEROFILL
SERIAL
FLOAT [UNSIGNED] [ZEROFILL]
FLOAT
DOUBLE [UNSIGNED] [ZEROFILL]
DOUBLE
DOUBLE PRECISION [UNSIGNED] [ZEROFILL]
REAL [UNSIGNED] [ZEROFILL]
NUMERIC(p, s) [UNSIGNED] [ZEROFILL]
DECIMAL(p, s)
DECIMAL(p, s) [UNSIGNED] [ZEROFILL]
BOOLEAN
BOOLEAN
TINYINT(1)
DATE
DATE
TIME [(p)]
TIME [(p)] [WITHOUT TIME ZONE]
DATETIME [(p)]
TIMESTAMP [(p)] [WITHOUT TIME ZONE]
TIMESTAMP [(p)]
TIMESTAMP [(p)]
TIMESTAMP [(p)] WITH LOCAL TIME ZONE
CHAR(n)
STRING
VARCHAR(n)
TEXT
BINARY
BYTES
VARBINARY
BLOB
ÖnemliMySQL'de 0 ve 1 dışındaki değerleri saklamak için TINYINT(1) türünü kullanmayın. property-version=0 olduğunda, MySQL CDC kaynak tablosu TINYINT(1) türünü varsayılan olarak Flink'teki BOOLEAN türüne eşler. Bu durum veri tutarsızlıklarına yol açabilir. TINYINT(1) türünü 0 ve 1 dışındaki değerleri saklamak amacıyla kullanmak istiyorsanız catalog.table.treat-tinyint1-as-boolean yapılandırma parametresine bakın.
-
Boyut tabloları ve havuz tabloları
MySQL alan türü
Flink alan türü
TINYINT
TINYINT
SMALLINT
SMALLINT
TINYINT UNSIGNED
INT
INT
MEDIUMINT
SMALLINT UNSIGNED
BIGINT
BIGINT
INT UNSIGNED
BIGINT UNSIGNED
DECIMAL(20, 0)
FLOAT
FLOAT
DOUBLE
DOUBLE
DOUBLE PRECISION
NUMERIC(p, s)
DECIMAL(p, s)
Notp <= 38 olmalıdır.
DECIMAL(p, s)
BOOLEAN
BOOLEAN
TINYINT(1)
DATE
DATE
TIME [(p)]
TIME [(p)] [WITHOUT TIME ZONE]
DATETIME [(p)]
TIMESTAMP [(p)] [WITHOUT TIME ZONE]
TIMESTAMP [(p)]
CHAR(n)
CHAR(n)
VARCHAR(n)
VARCHAR(n)
BIT(n)
BINARY(⌈n/8⌉)
BINARY(n)
BINARY(n)
VARBINARY(N)
VARBINARY(N)
TINYTEXT
STRING
TEXT
MEDIUMTEXT
LONGTEXT
TINYBLOB
BYTES
ÖnemliFlink yalnızca boyutu 2.147.483.647 (2^31 - 1) bayt veya daha küçük olan MySQL BLOB türündeki kayıtları destekler.
BLOB
MEDIUMBLOB
LONGBLOB
Kullanım örnekleri
-
CDC kaynak tablosu
CREATE TEMPORARY TABLE mysqlcdc_source ( order_id INT, order_date TIMESTAMP(0), customer_name STRING, price DECIMAL(10, 5), product_id INT, order_status BOOLEAN, PRIMARY KEY(order_id) NOT ENFORCED ) WITH ( 'connector' = 'mysql', 'hostname' = '<yourHostname>', 'port' = '3306', 'username' = '<yourUsername>', 'password' = '<yourPassword>', 'database-name' = '<yourDatabaseName>', 'table-name' = '<yourTableName>' ); CREATE TEMPORARY TABLE blackhole_sink( order_id INT, customer_name STRING ) WITH ( 'connector' = 'blackhole' ); INSERT INTO blackhole_sink SELECT order_id, customer_name FROM mysqlcdc_source; -
Boyut tablosu
CREATE TEMPORARY TABLE datagen_source( a INT, b BIGINT, c STRING, `proctime` AS PROCTIME() ) WITH ( 'connector' = 'datagen' ); CREATE TEMPORARY TABLE mysql_dim ( a INT, b VARCHAR, c VARCHAR ) WITH ( 'connector' = 'mysql', 'hostname' = '<yourHostname>', 'port' = '3306', 'username' = '<yourUsername>', 'password' = '<yourPassword>', 'database-name' = '<yourDatabaseName>', 'table-name' = '<yourTableName>' ); CREATE TEMPORARY TABLE blackhole_sink( a INT, b STRING ) WITH ( 'connector' = 'blackhole' ); INSERT INTO blackhole_sink SELECT T.a, H.b FROM datagen_source AS T JOIN mysql_dim FOR SYSTEM_TIME AS OF T.`proctime` AS H ON T.a = H.a; -
Havuz tablosu
CREATE TEMPORARY TABLE datagen_source ( `name` VARCHAR, `age` INT ) WITH ( 'connector' = 'datagen' ); CREATE TEMPORARY TABLE mysql_sink ( `name` VARCHAR, `age` INT ) WITH ( 'connector' = 'mysql', 'hostname' = '<yourHostname>', 'port' = '3306', 'username' = '<yourUsername>', 'password' = '<yourPassword>', 'database-name' = '<yourDatabaseName>', 'table-name' = '<yourTableName>' ); INSERT INTO mysql_sink SELECT * FROM datagen_source; -
Veri alımı veri kaynağı
source: type: mysql name: MySQL Source hostname: ${mysql.hostname} port: ${mysql.port} username: ${mysql.username} password: ${mysql.password} tables: ${mysql.source.table} server-id: 7601-7604 sink: type: values name: Values Sink print.enabled: true sink.print.logger: true
MySQL CDC kaynak tabloları hakkında
-
Nasıl çalışır
Bir MySQL CDC kaynak tablosu başlatıldığında tüm tabloyu tarar, birincil anahtara göre tabloyu birden çok parçaya böler ve mevcut ikili günlük ofsetini kaydeder. Kaynak tablo daha sonra artımlı anlık görüntü algoritmasını kullanarak her parçadan SELECT deyimleriyle verileri okur. İş düzenli olarak kontrol noktaları gerçekleştirerek tamamlanan parçaları kaydeder. Bir yük devretme gerçekleşirse iş tamamlanmamış parçalardan veri okumaya devam eder. Tüm parçalar okunduktan sonra iş daha önce kaydedilen ikili günlük ofsetinden artımlı değişiklik kayıtlarını okumaya başlar. Flink işi ikili günlük ofsetini kaydetmek için düzenli aralıklarla kontrol noktaları gerçekleştirmeye devam eder. İş yük devretme yaparsa son kaydedilen ikili günlük ofsetinden işlemeye devam eder; bu sayede exactly-once semantiği sağlanır.
Artımlı anlık görüntü algoritması hakkında daha ayrıntılı açıklama için bkz. MySQL CDC Connector.
-
Meta veriler
Meta veriler, bölümlenmiş veritabanlarından ve tablolardan gelen verilerin birleştirilip senkronize edildiği senaryolarda faydalıdır. Birleştirme işleminden sonra işletmeler genellikle her veri kaydı için kaynak veritabanını ve tabloyu ayırt etmek ister. Meta veri sütunları aracılığıyla kaynak tablonun veritabanı ve tablo adı bilgilerine erişebilirsiniz. Bu sayede meta veri sütunlarını kullanarak birden çok bölümlenmiş tabloyu tek bir hedef tabloda kolayca birleştirebilirsiniz.
MySQL CDC Kaynağı meta veri sütunu sözdizimini destekler. Aşağıdaki meta verilere meta veri sütunları aracılığıyla erişebilirsiniz.
Meta veri anahtarı
Meta veri türü
Açıklama
database_name
STRING NOT NULL
Satırı içeren veritabanının adı.
table_name
STRING NOT NULL
Satırı içeren tablonun adı.
op_ts
TIMESTAMP_LTZ(3) NOT NULL
Satırın veritabanında değiştirildiği zaman. Kayıt tablonun geçmiş verilerinden geliyorsa ve ikili günlükten gelmiyorsa bu değer her zaman 0'dır.
NotBu alan yalnızca saniye hassasiyetindedir.
op_type
STRING NOT NULL
Satırın değişiklik türü.
-
+I: INSERT mesajı
-
-D: DELETE mesajı
-
-U: UPDATE_BEFORE mesajı
-
+U: UPDATE_AFTER mesajı
NotYalnızca VVR 8.0.7 ve sonraki sürümlerde desteklenir.
query_log
STRING NOT NULL
Bu satır için MySQL sorgu günlüğü kaydını okuyabilirsiniz.
NotSorgu günlüklerinin kaydedilmesi için MySQL'de binlog_rows_query_log_events parametresi etkinleştirilmelidir.
Aşağıdaki kod örneği bir MySQL örneğindeki birden çok bölümlenmiş veritabanından gelen birden çok sipariş tablosunun Hologres'teki holo_orders tablosuna nasıl birleştirilip senkronize edileceğini gösterir.
CREATE TEMPORARY TABLE mysql_orders ( db_name STRING METADATA FROM 'database_name' VIRTUAL, -- Read the database name. table_name STRING METADATA FROM 'table_name' VIRTUAL, -- Read the table name. operation_ts TIMESTAMP_LTZ(3) METADATA FROM 'op_ts' VIRTUAL, -- Read the change time. op_type STRING METADATA FROM 'op_type' VIRTUAL, -- Read the change type. order_id INT, order_date TIMESTAMP(0), customer_name STRING, price DECIMAL(10, 5), product_id INT, order_status BOOLEAN, PRIMARY KEY(order_id) NOT ENFORCED ) WITH ( 'connector' = 'mysql-cdc', 'hostname' = 'localhost', 'port' = '3306', 'username' = 'flinkuser', 'password' = 'flinkpw', 'database-name' = 'mydb_.*', -- Regular expression to match multiple sharded databases. 'table-name' = 'orders_.*' -- Regular expression to match multiple sharded tables. ); INSERT INTO holo_orders SELECT * FROM mysql_orders;Yukarıdaki koda dayanarak WITH yan tümcesinde
scan.read-changelog-as-append-only.enabledparametresi true olarak ayarlanırsa çıkış sonucu aşağı akış tablosunun birincil anahtar ayarına bağlı olarak değişir:Aşağı akış tablosunun birincil anahtarı
order_idise çıkış sonucu yalnızca yukarı akış tablosundaki her birincil anahtar için yapılan son değişikliği içerir. Bir birincil anahtar için yapılan son değişiklik bir silme işlemiyse aşağı akış tablosunda aynı birincil anahtara sahip veop_typedeğeri -D olan bir kayıt görürsünüz.Aşağı akış tablosunun birincil anahtarı
order_id,operation_tsveop_typeise çıkış sonucu yukarı akış tablosundaki her birincil anahtar için yapılan tüm değişiklikleri içerir.
-
-
Normal ifade desteği
MySQL CDC kaynak tablosu birden çok tablo veya veritabanıyla eşleşmek için tablo adı veya veritabanı adında normal ifadelerin kullanılmasını destekler. Aşağıdaki kod örneği normal ifade kullanarak birden çok tablonun nasıl belirtileceğini gösterir.
CREATE TABLE products ( db_name STRING METADATA FROM 'database_name' VIRTUAL, table_name STRING METADATA FROM 'table_name' VIRTUAL, operation_ts TIMESTAMP_LTZ(3) METADATA FROM 'op_ts' VIRTUAL, order_id INT, order_date TIMESTAMP(0), customer_name STRING, price DECIMAL(10, 5), product_id INT, order_status BOOLEAN, PRIMARY KEY(order_id) NOT ENFORCED ) WITH ( 'connector' = 'mysql-cdc', 'hostname' = 'localhost', 'port' = '3306', 'username' = 'root', 'password' = '123456', 'database-name' = '(^(test).*|^(tpc).*|txc|.*[p$]|t{2})', -- Regular expression to match multiple databases. 'table-name' = '(t[5-8]|tt)' -- Regular expression to match multiple tables. );Örnekteki normal ifadeler şu şekilde açıklanır:
^(test).*bir ön ek eşleme örneğidir. Bu ifade "test" ile başlayan veritabanı adlarıyla ("test1" veya "test2" gibi) eşleşebilir..*[p$]bir son ek eşleme örneğidir. Bu ifade "p" ile biten veritabanı adlarıyla ("cdcp" veya "edcp" gibi) eşleşebilir.txcbelirli bir eşlemedir. Tam olarak "txc" olan bir veritabanı adı ile eşleşebilir.
MySQL CDC tam nitelikli bir tablo adıyla eşleşirken bir tabloyu benzersiz şekilde tanımlamak için
database-name.table-namekalıbını kullanır. Örneğin(^(test).|^(tpc).|txc|.*[p$]|t{2}).(t[ 5-8]|tt)kalıbı veritabanındakitxc.ttvetest2.test5gibi tablolarla eşleşebilir.ÖnemliBir SQL işinin yapılandırmasında
table-namevedatabase-nameparametreleri birden çok tablo veya veritabanı belirtmek için virgül (,) kullanımını desteklemez.Birden çok tabloyla eşleşmek veya birden çok normal ifade kullanmak için bunları dikey çubuk (|) ile bağlayın ve parantez içine alın. Örneğin
userveproducttablolarını okumak içintable-namedeğerini(user|product)olarak ayarlayabilirsiniz.Bir normal ifade virgül içeriyorsa dikey çubuk (|) operatörünü kullanarak yeniden yazmanız gerekir. Örneğin
mytable_\d{1, 2}normal ifadesi virgül kullanımından kaçınmak için eşdeğer(mytable_\d{1}|mytable_\d{2})biçimine dönüştürülmelidir.
-
Eşzamanlılık denetimi
MySQL konektörü tam verilerin çok iş parçacıklı okunmasını destekler; bu sayede veri yükleme verimliliği artırılabilir. Realtime Compute for Apache Flink konsolundaki Autopilot otomatik ayarlama özelliği ile birlikte kullanıldığında konektör çok iş parçacıklı okuma tamamlandıktan sonra artımlı aşamada ölçeği otomatik olarak küçülterek hesaplama kaynaklarından tasarruf sağlar.
Realtime Compute for Apache Flink'in geliştirme konsolunda Kaynak Yapılandırması sayfasında bir işin eşzamanlılığını temel modda veya uzman modunda ayarlayabilirsiniz.
-
Temel modda ayarlanan eşzamanlılık tüm iş için genel eşzamanlılıktır.
Örneğin temel modda parallelism değeri
8olarak ayarlandığında SQL WITH yan tümcesindekiserver-iddeğeri sürekli bir aralık (örneğin'404-412') olarak yapılandırılmalıdır. Uzman mod belirli bir VERTEX için ihtiyaç duyulan eşzamanlılığın ayarlanmasını destekler.
Kaynak yapılandırması hakkında daha fazla bilgi için bkz. Bir iş için dağıtım bilgilerini yapılandırma.
ÖnemliTemel modda veya uzman modda olun fark etmeksizin eşzamanlılığı ayarlarken tabloda bildirilen sunucu kimliği aralığı işin eşzamanlılığından büyük veya ona eşit olmalıdır. Örneğin sunucu kimliği aralığı
5404-5412ise dokuz benzersiz sunucu kimliği vardır. Bu nedenle işin eşzamanlılığı en fazla 9 olarak ayarlanabilir. Aynı MySQL örneği için farklı işlerin sunucu kimliği aralıkları örtüşmemelidir. Yani her iş açıkça farklı bir sunucu kimliği veya sunucu kimliği aralığı ile yapılandırılmalıdır. -
-
Autopilot otomatik ölçek küçültme
Tam veri aşaması büyük miktarda geçmiş veri biriktirir. Okuma verimliliğini artırmak için geçmiş veriler genellikle paralel olarak okunur. Artımlı ikili günlük aşamasında ikili günlük veri miktarı az olduğu ve genel sıralamanın korunması gerektiği için genellikle tek iş parçacıklı okuma yeterlidir. Tam ve artımlı aşamaların farklı kaynak gereksinimleri otomatik ayarlama özelliği kullanılarak performans ve kaynak açısından dengelenebilir.
Otomatik ayarlama MySQL CDC Kaynağının her görevinin trafiğini izler. İkili günlük aşamasına girildiğinde yalnızca bir görev ikili günlük okumadan sorumluyken diğer görevler boşta kalıyorsa otomatik ayarlama kaynağın CU sayısını ve eşzamanlılığını otomatik olarak azaltır. Otomatik ayarlamayı etkinleştirmek için iş İzleme ve Yönetim sayfasında otomatik ayarlama modunu Aktif olarak ayarlayın.
NotEşzamanlılığı azaltmak için varsayılan minimum tetikleme aralığı 24 saattir. Otomatik ayarlama parametreleri ve ayrıntıları hakkında daha fazla bilgi için bkz. Otomatik ayarlamayı yapılandırma.
-
Başlatma modları
MySQL CDC kaynak tablosunun başlatma modunu belirtmek için
scan.startup.modeyapılandırma öğesini kullanın. Seçenekler şunlardır:initial (varsayılan): İlk başlatmada veya durumsuz başlatmada veritabanı tablosunun tam okumasını gerçekleştirir ve ardından ikili günlüğü okumak için artımlı moda geçer.
earliest-offset: Anlık görüntü aşamasını atlar ve en eski kullanılabilir ikili günlük ofsetinden okumaya başlar.
latest-offset: Anlık görüntü aşamasını atlar ve ikili günlüğün sonundan okumaya başlar. Bu modda kaynak tablo yalnızca iş başladıktan sonra oluşan veri değişikliklerini okuyabilir.
specific-offset: Anlık görüntü aşamasını atlar ve belirtilen bir ikili günlük ofsetinden okumaya başlar. Ofset ikili günlük dosya adı ve konumu veya bir GTID kümesi tarafından belirtilebilir.
timestamp: Anlık görüntü aşamasını atlar ve belirtilen bir zaman damgasından ikili günlük olaylarını okumaya başlar.
Durumsuz bir başlatma hiçbir durumu yeniden kullanmaz. Kaynak konektörü bunu ilk başlatma olarak değerlendirir; bu nedenle scan.startup.mode tekrar etkili olur. Dağıtım başlatma modları hakkında daha fazla bilgi için bkz. Dağıtımı başlatma.
Kullanım örneği:
CREATE TABLE mysql_source (...) WITH ( 'connector' = 'mysql-cdc', 'scan.startup.mode' = 'earliest-offset', -- Start from the earliest offset. 'scan.startup.mode' = 'latest-offset', -- Start from the latest offset. 'scan.startup.mode' = 'specific-offset', -- Start from a specific offset. 'scan.startup.mode' = 'timestamp', -- Start from a specific timestamp. 'scan.startup.specific-offset.file' = 'mysql-bin.000003', -- Specify the binary log filename in specific-offset mode. 'scan.startup.specific-offset.pos' = '4', -- Specify the binary log position in specific-offset mode. 'scan.startup.specific-offset.gtid-set' = '24DA167-0C0C-11E8-8442-00059A3C7B00:1-19', -- Specify the GTID set in specific-offset mode. 'scan.startup.timestamp-millis' = '1667232000000' -- Specify the startup timestamp in timestamp mode. ... )ÖnemliMySQL kaynağı bir kontrol noktası sırasında INFO düzeyinde mevcut ofseti günlüğe yazdırır. Günlük ön eki
Binlog offset on checkpoint {checkpoint-id}şeklindedir. Bu günlük bir işi belirli bir kontrol noktası ofsetinden başlatmanıza yardımcı olabilir.Okunan tabloda şema değişiklikleri gerçekleştiyse
earliest-offset,specific-offsetveyatimestampüzerinden başlatma hataya neden olabilir. Bunun nedeni Debezium okuyucusunun dahili olarak en son tablo şemasını kaydetmesi ve şeması uyuşmayan erken verilerin doğru şekilde ayrıştırılamamasıdır.
-
Birincil anahtarı olmayan CDC kaynak tabloları hakkında
Birincil anahtarı olmayan bir tablo kullanmak için
scan.incremental.snapshot.chunk.key-columnayarlanması gerekir ve yalnızca null olmayan bir sütun seçilebilir.-
Birincil anahtarı olmayan bir CDC kaynak tablosu için işleme semantiği
scan.incremental.snapshot.chunk.key-columntarafından belirtilen sütunun davranışına göre belirlenir:Belirtilen sütun güncellenmezse exactly-once semantiği garanti edilebilir.
Belirtilen sütun güncellenirse yalnızca at-least-once semantiği garanti edilebilir. Ancak aşağı akışla birleştirerek aşağı akış birincil anahtarı belirleyip idempotent işlemler kullanarak veri doğruluğunu sağlayabilirsiniz.
-
Alibaba Cloud ApsaraDB RDS for MySQL yedekleme günlüklerini okuma
MySQL CDC kaynak tablosu Alibaba Cloud ApsaraDB RDS for MySQL yedekleme günlüklerini okumayı destekler. Bu özellik tam veri aşamasının uzun sürdüğü ve yerel ikili günlük dosyaları otomatik olarak temizlendiği ancak otomatik veya manuel olarak yüklenen yedekleme dosyalarının hala mevcut olduğu senaryolarda yararlıdır.
Kullanım örneği:
CREATE TABLE mysql_source (...) WITH ( 'connector' = 'mysql-cdc', 'rds.region-id' = 'cn-beijing', 'rds.access-key-id' = 'xxxxxxxxx', 'rds.access-key-secret' = 'xxxxxxxxx', 'rds.db-instance-id' = 'rm-xxxxxxxxxxxxxxxxx', 'rds.main-db-id' = '12345678', 'rds.download.timeout' = '60s' ... ) -
CDC Kaynağı yeniden kullanmayı etkinleştirme
Aynı işte birden çok MySQL CDC kaynak tablosu birden çok ikili günlük istemcisi başlatır. Tüm kaynak tablolar aynı örnekte bulunuyorsa bu durum veritabanındaki yükü artırır. Daha fazla bilgi için bkz. MySQL CDC SSS.
Çözüm
VVR 8.0.7 ve sonraki sürümler MySQL CDC kaynak yeniden kullanmayı destekler. Bu özellik birleştirilebilecek MySQL CDC kaynak tablolarını birleştirir. Birleştirme işlemi kaynak tablo yapılandırmaları veritabanı adı, tablo adı ve
server-iddışında aynı olduğunda gerçekleşir. Motor aynı iş içindeki MySQL CDC kaynaklarını otomatik olarak birleştirir.Yordam
-
SQL işinizde
SETkomutunu kullanın:SET 'table.optimizer.source-merge.enabled' = 'true'; # (For VVR 8.0.8 and 8.0.9) Also set this item: SET 'sql-gateway.exec-plan.enabled' = 'false';VVR 11.1 ve sonraki sürümlerde yeniden kullanma varsayılan olarak etkindir.
İşi durumsuz başlatın. Kaynak yeniden kullanma yapılandırmasını değiştirmek iş topolojisini değiştirdiğinden işi durumsuz başlatmanız gerekir. Aksi takdirde iş başlatılamayabilir veya veri kaybı yaşanabilir. Bir kaynak birleştirildiğinde topolojide bir
MergetableSourceScandüğümü görebilirsiniz.
ÖnemliYeniden kullanmayı etkinleştirdikten sonra operatör zincirlemeyi devre dışı bırakmayın.
pipeline.operator-chainingdeğerinifalseolarak ayarlamak veri serileştirme ve seri durumdan çıkarma ek yükünü artırır. Birleştirilen kaynak sayısı arttıkça ek yük de artar.VVR 8.0.7'de operatör zincirlemenin devre dışı bırakılması serileştirme sorunlarına neden olur.
-
İkili günlük okumayı hızlandırma
MySQL bağlayıcısını bir kaynak tablo veya veri alımı kaynağı olarak kullandığınızda, artımlı aşama sırasında çeşitli değişiklik iletileri oluşturmak için ikili günlük dosyalarını ayrıştırır. İkili günlük dosyaları tüm tablo değişikliklerini ikili biçimde kaydeder. Aşağıdaki yöntemlerle ikili günlük dosyalarının ayrıştırılmasını hızlandırabilirsiniz.
-
Paralel ayrıştırma ve ayrıştırma filtrelerini etkinleştirin (Bu özellik, Ververica Runtime (VVR) 8.0.7 veya sonraki sürümlere sahip Realtime Compute for Apache Flink gerektirir. MySQL CDC bağlayıcısının topluluk sürümünde kullanılamaz.)
Yalnızca belirtilen tablolar için değişiklik olaylarını ayrıştırmak üzere
scan.only.deserialize.captured.tables.changelog.enabledseçeneğini etkinleştirin.İkili günlük dosyasını ayrıştırmak için birden çok iş parçacığı kullanmak ve olayları tüketici kuyruğuna sırayla iletmek amacıyla
scan.parallel-deserialize-changelog.enabledseçeneğini etkinleştirin. Bu seçeneği etkinleştirdiğinizde genellikleTaskManager CPUdeğerini de artırmanız gerekir.
-
Debezium parametrelerini optimize edin
debezium.max.queue.size: 162580 debezium.max.batch.size: 40960 debezium.poll.interval.ms: 50debezium.max.queue.size: Engelleme kuyruğunun tutabileceği maksimum kayıt sayısı. Debezium veritabanından bir olay akışı okuduğunda, bu olayları aşağı akışa yazmadan önce bir engelleme kuyruğuna yerleştirir. Varsayılan değer 8192'dir.debezium.max.batch.size: Bağlayıcının her yinelemede işlediği maksimum olay sayısı. Varsayılan değer 2048'dir.debezium.poll.interval.ms: Bağlayıcının yeni değişiklik olaylarını istemeden önce beklemesi gereken milisaniye cinsinden süre. Varsayılan değer 1000 milisaniye, yani 1 saniyedir.
Kullanım örneği:
CREATE TABLE mysql_source (...) WITH (
'connector' = 'mysql-cdc',
-- Debezium configuration
'debezium.max.queue.size' = '162580',
'debezium.max.batch.size' = '40960',
'debezium.poll.interval.ms' = '50',
-- Enable parsing filter
'scan.only.deserialize.captured.tables.changelog.enabled' = 'true', -- Parse only the change events of specified tables.
...
)
source:
type: mysql
name: MySQL Source
hostname: ${mysql.hostname}
port: ${mysql.port}
username: ${mysql.username}
password: ${mysql.password}
tables: ${mysql.source.table}
server-id: 7601-7604
# Debezium configuration
debezium.max.queue.size: 162580
debezium.max.batch.size: 40960
debezium.poll.interval.ms: 50
# Enable parsing filter
scan.only.deserialize.captured.tables.changelog.enabled: true
MySQL CDC Enterprise Edition'ın ikili günlük tüketim kapasitesi 85 MB/sn olup bu değer, açık kaynak topluluk sürümünün yaklaşık iki katıdır. İkili günlük dosyalarının oluşturma hızı 85 MB/sn'yi aştığında (yani her 6 saniyede bir 512 MB'lık dosya), Flink işinin gecikme süresi sürekli artar. İkili günlük dosyası oluşturma hızı yavaşladığında işleme gecikmesi kademeli olarak azalır. Bir ikili günlük dosyası büyük bir işlem içeriyorsa işleme gecikmesi geçici olarak artabilir. Bu işlemin günlüğü okunduktan sonra gecikme azalır.
İş aktarım hızını optimize etmek için veri gecikmesini teşhis etme
Artımlı aşamada veri gecikmesi yaşıyorsanız sorunu aşağıdaki adımları izleyerek analiz edin:
-
Genel Bakış sayfasındaki
currentFetchEventTimeLagvecurrentEmitEventTimeLagölçümlerini kontrol edin.currentFetchEventTimeLagölçümü, ikili günlükten veri okuma gecikmesini temsil eder.currentEmitEventTimeLagölçümü ise işle ilgili tablolar için ikili günlükten veri okuma gecikmesini temsil eder.
Senaryo
AçıklamacurrentFetchEventTimeLagdüşük, ancakcurrentEmitEventTimeLagyüksek ve nadiren güncelleniyor.
DüşükcurrentFetchEventTimeLagdeğeri, veritabanından ikili günlüğün çekilmesinin verimli olduğunu gösterir. Ancak ikili günlük, işin okuması gereken tablolar için çok az veri içerir. Bu nedenlecurrentEmitEventTimeLagnadiren güncellenir. Bu beklenen bir davranıştır.currentFetchEventTimeLagvecurrentEmitEventTimeLagdeğerlerinin her ikisi de yüksektir.
Bu durum, kaynak tablonun okuma performansının düşük olduğunu gösterir. Optimizasyon için bu bölümdeki sonraki adımlara devam edebilirsiniz. Arka basınç, kaynağın aşağı akış operatörlerine veri gönderme hızını düşürebilir. sourceIdleTime değerinin periyodik olarak arttığını ve hem currentFetchEventTimeLag hem de currentEmitEventTimeLag değerlerinin sürekli büyüdüğünü gözlemleyebilirsiniz. Bu sorunu çözmek için arka basıncın kaynağı olan düğümün paralellliğini artırın.
Yetersiz CPU veya bellek kaynağı olup olmadığını belirlemek için CPU sayfasındaki TM CPU Kullanımı ölçümünü ve JVM sayfasındaki TM GC Süresi ölçümünü kontrol edin. Okuma performansını optimize etmek için iş kaynaklarını artırabilirsiniz. Aktarım hızını artırmak için mini-toplu iş parametrelerini de etkinleştirebilirsiniz. Daha fazla bilgi için bkz. Yüksek Performanslı Flink SQL Optimizasyon Teknikleri.
İşte büyük bir duruma sahip bir SinkUpsertMaterializer operatörü varsa bu durum okuma performansını etkileyebilir. İş paralelliğini artırmayı veya SinkUpsertMaterializer operatöründen kaçınmayı düşünün. Daha fazla bilgi için bkz. SinkUpsertMaterializer kullanımından kaçının. Mevcut bir işten SinkUpsertMaterializer operatörünü kaldırmak durumsuz yeniden başlatma gerektirir. Bunun nedeni iş topolojisinin değişmesidir; mevcut durumdan başlamak işin başarısız olmasına veya veri kaybına neden olabilir.
Binlog çakışmalarını önlemek için sunucu kimliğini ayarlama
Bir veritabanından veri senkronize eden her istemcinin sunucu kimliği adlı benzersiz bir kimliği vardır. Farklı işler aynı sunucu kimliğini kullanırsa çakışmalar oluşabilir ve bu durum işlerin başarısız olmasına neden olabilir. Her MySQL CDC veri kaynağı için farklı bir sunucu kimliği atamanızı öneririz.
-
Sunucu kimliğinin nasıl yapılandırılacağı
Sunucu kimliğini bir Flink tablosu DDL ifadesinde veya SQL İpuçları kullanarak belirtebilirsiniz.
Sunucu kimliğini tablo DDL'sinin WITH yan tümcesinde belirtmek yerine SQL İpuçları ile yapılandırmayı öneririz. Daha fazla bilgi için bkz. SQL Hints.
-
Farklı senaryolar için sunucu kimliği yapılandırması
-
Artımlı anlık görüntü devre dışı bırakıldıysa veya paralellik 1 ise
Artımlı anlık görüntü devre dışı bırakılmışsa veya paralellik 1 ise tek bir sunucu kimliği belirtebilirsiniz.
SELECT * FROM source_table /*+ OPTIONS('server-id'='123456') */ ; -
Artımlı anlık görüntü etkinleştirildiyse ve paralellik 1'den büyükse
Artımlı anlık görüntü etkinleştirildiğinde ve paralellik 1'den büyük olduğunda bir sunucu kimliği aralığı belirtmeniz gerekir. Aralıktaki kullanılabilir sunucu kimliklerinin sayısı en az paralellik kadar olmalıdır. Örneğin, paralellik 3 ise aşağıdaki yapılandırmayı kullanabilirsiniz:
SELECT * FROM source_table /*+ OPTIONS('server-id'='123456-123458') */ ; -
Birden çok MySQL CDC kaynak tablosu içeren bir Flink SQL işi
Bir Flink SQL işi birden çok MySQL CDC kaynak tablosu içeriyorsa ve kaynak yeniden kullanımı devre dışı bırakılmışsa her CDC kaynak tablosu için farklı bir sunucu kimliği sağlamalısınız. Benzer şekilde, artımlı anlık görüntü etkinleştirilmişse ve paralellik 1'den büyükse bir sunucu kimliği aralığı belirtmeniz gerekir.
select * from source_table1 /*+ OPTIONS('server-id'='123456-123457') */ left join source_table2 /*+ OPTIONS('server-id'='123458-123459') */ on source_table1.id=source_table2.id;
-
Bellek kullanımını optimize etmek için parça parametrelerini ayarlama
Bir MySQL CDC kaynak tablosu başladığında tam tablo taraması gerçekleştirir, tabloyu birincil anahtara göre birden çok parçaya böler ve geçerli ikili günlük konumunu kaydeder. İş daha sonra SELECT ifadelerini kullanarak her parçadan sırayla veri okumak için artımlı anlık görüntü algoritmasını kullanır. İş, tamamlanan parçaları kaydetmek için periyodik olarak kontrol noktası oluşturur. Yük devretme durumunda ilk tamamlanmamış parçadan okumaya devam eder. Tüm parçalar okunduktan sonra iş, önceden kaydedilen ikili günlük konumundan artımlı değişiklikleri okumaya geçer. Flink işi, ikili günlük konumunu kaydetmek için periyodik kontrol noktaları oluşturur. Yük devretme gerçekleşirse iş son kaydedilen konumdan işlemeye devam ederek tam olarak bir kez semantiği elde eder.
Artımlı anlık görüntü algoritması hakkında daha fazla ayrıntı için bkz. MySQL CDC Connector.
Tek sütunlu birincil anahtara sahip tablolar için parçalar varsayılan olarak bu anahtara göre bölünür. Bileşik birincil anahtara sahip tablolar için varsayılan olarak birincil anahtarın ilk sütunu bölme için kullanılır. Ververica Runtime (VVR) 6.0.7 ve sonraki sürümler birincil anahtarı olmayan kaynak tabloların okunmasını destekler. Bölme için null olamaz bir sütun belirtmek üzere scan.incremental.snapshot.chunk.key-column parametresini ayarlamanız gerekir.
Parça parametre optimizasyonu
Parça verileri ve meta verileri bellekte saklanır ve bu durum bazen bellek yetersizliği (OOM) hatalarına yol açabilir. OOM hatasının hangi bileşende oluştuğuna bağlı olarak parametreleri ayarlayabilirsiniz:
-
JobManager
JobManager tüm parçaların meta verilerini saklar. Aşırı sayıda parça OOM hatasına neden olabilir. Bu sorunu çözmek için parça sayısını azaltmak amacıyla
scan.incremental.snapshot.chunk.sizedeğerini artırın. Alternatif olarak, çalışma zamanı yapılandırmanızdajobmanager.memory.heap.sizeayarını yaparak JobManager yığın belleğini artırabilirsiniz. Daha fazla bilgi için bkz. Flink Parameter Configuration. -
TaskManager
TaskManager her parçanın verilerini okur. Bir parça çok fazla satır içeriyorsa OOM hatası oluşabilir. Bu sorunu çözmek için parça başına satır sayısını azaltmak amacıyla
scan.incremental.snapshot.chunk.sizedeğerini azaltın. Çalışma zamanı yapılandırmanızdaTaskManager Memorydeğerini artırarak TaskManager yığın belleğini de büyütebilirsiniz.VVR 8.0.8 ve önceki sürümlerde son parça büyük miktarda veri içerebilir ve bu durum TaskManager'da OOM hatasına neden olabilir. Bu sorundan kaçınmak için VVR 8.0.9 veya sonraki bir sürüme yükseltmenizi öneririz.
Bileşik birincil anahtara sahip bir MySQL CDC kaynak tablosu için parçalar varsayılan olarak anahtarın ilk sütununa göre bölünür. Veriler önemli ölçüde eğimliyse ve o sütunda aynı değere sahip birçok satır varsa bu değere ait parça çok büyük hale gelebilir ve TaskManager'da OOM hatasına neden olabilir. Bölme için birincil anahtardan farklı bir sütun belirtmek üzere
scan.incremental.snapshot.chunk.key-columnayarını yapabilirsiniz.
Anlık görüntü aşamasında okumaları hızlandırma
Anlık görüntü aşamasında MySQL kaynak tablosu bir JDBC bağlantısı üzerinden anlık görüntü verilerini okur. Bu aşamadaki okumaları hızlandırmak için aşağıdaki yöntemleri kullanın.
Anlık görüntü aşamasındaki okumaları hızlandırmak için kaynak paralelliğini artırın.
Tek bir parçada daha fazla veri getirmek için
scan.incremental.snapshot.chunk.sizedeğerini artırın.Aşağı akış sonuç tablosunun bir birincil anahtarı varsa ve idempotent yazmaları destekliyorsa geri doldurma kısmı için ikili günlüğü okumayı atlamak üzere
scan.incremental.snapshot.backfill.skipseçeneğini etkinleştirebilirsiniz. Bu seçenek anlık görüntü aşamasındaki işlemeyi hızlandırır.
Binlog bağlantılarını azaltmak için kaynak yeniden kullanımını etkinleştirme
Bir iş birden çok MySQL kaynak tablosu içeriyorsa tek bir ikili günlük bağlantısını paylaşarak veritabanı yükünü azaltmak için kaynak yeniden kullanımını etkinleştirebilirsiniz. Bu özellik yalnızca Realtime Compute for Apache Flink'te mevcuttur ve MySQL CDC bağlayıcısının topluluk sürümünde desteklenmez.
Bir SQL işinde SET komutunu kullanarak kaynak yeniden kullanım özelliğini etkinleştirin:
SET 'table.optimizer.source-merge.enabled' = 'true';
Kaynak yeniden kullanımını yalnızca yeni işler için etkinleştirmenizi öneririz. Mevcut bir iş için kaynak yeniden kullanımını etkinleştirirseniz durumsuz yeniden başlatma yapmanız gerekir. Bunun nedeni kaynak yeniden kullanımının iş topolojisini değiştirmesidir; mevcut bir durumdan başlamak işin başarısız olmasına veya veri kaybına neden olabilir.
Kaynak yeniden kullanımını etkinleştirdikten sonra aynı yapılandırma parametrelerine sahip MySQL kaynak tabloları birleştirilir. İşinizdeki tüm kaynak tablolar aynı yapılandırmayı paylaşıyorsa ikili günlük bağlantılarının sayısı şu şekilde hesaplanır:
Anlık görüntü aşamasında ikili günlük bağlantılarının sayısı kaynak paralelliğine eşittir.
Artımlı aşamada ikili günlük bağlantılarının sayısı 1'dir.
VVR 8.0.8 ve 8.0.9 sürümlerinde CDC kaynak yeniden kullanımını etkinleştirdiğinizde ayrıca
SET 'sql-gateway.exec-plan.enabled' = 'false';ayarını yapmanız gerekir.CDC kaynak yeniden kullanımını etkinleştirdikten sonra
pipeline.operator-chainingiş seçeneğini false olarak ayarlamayın. Operatör zincirini kırmak, kaynaktan aşağı akış operatörlerine gönderilen veriler için serileştirme ve serileştirmeyi kaldırma ek yükü ekler. Birleştirilen kaynak sayısı arttıkça ek yük de artar.Ververica Runtime (VVR) 8.0.7 sürümünde
pipeline.operator-chainingdeğerini false olarak ayarlamak bir serileştirme sorununa neden olur.
OSS'ten arşivlenmiş binlogları okuma
Veri kaynağı olarak bir ApsaraDB RDS for MySQL örneği kullandığınızda OSS'te depolanan günlük yedeklemelerini okuyabilirsiniz. Belirtilen zaman damgasına veya ikili günlük konumuna karşılık gelen dosya OSS'te depolanıyorsa Flink günlük dosyasını otomatik olarak OSS'ten kümeye çeker. Dosya veritabanında yerel olarak depolanıyorsa Flink otomatik olarak veritabanı bağlantısı üzerinden okumaya geçer. Bu özellik yalnızca Realtime Compute for Apache Flink'te mevcuttur ve MySQL CDC bağlayıcısının topluluk sürümünde desteklenmez.
OSS günlük yedeklemelerinden okumayı etkinleştirmek için ApsaraDB RDS for MySQL bağlantı parametrelerini yapılandırmanız gerekir. Örnek:
CREATE TABLE mysql_source (...) WITH (
'connector' = 'mysql-cdc',
'rds.region-id' = 'cn-beijing',
'rds.access-key-id' = 'your_access_key_id',
'rds.access-key-secret' = 'your_access_key_secret',
'rds.db-instance-id' = 'rm-xxxxxxxx', // The ID of the database instance.
'rds.main-db-id' = '12345678', // The ID of the primary database.
'rds.endpoint' = 'rds.aliyuncs.com'
...
)
SSS
CDC kaynak tablolarını kullanırken karşılaşabileceğiniz sorunlar hakkında daha fazla bilgi için bkz. CDC SSS.