All Products
Search
Document Center

Realtime Compute for Apache Flink:MySQL SQL connector

Last Updated:Aug 28, 2026

Topik ini menjelaskan cara menggunakan konektor MySQL dalam pekerjaan SQL.

Informasi latar belakang

Konektor MySQL mendukung semua database yang kompatibel dengan protokol MySQL, seperti ApsaraDB RDS for MySQL, PolarDB for MySQL, OceanBase (mode MySQL), dan self-managed MySQL.

Penting

Saat menggunakan konektor MySQL untuk membaca data dari OceanBase, pastikan binary logging (binlog) diaktifkan dan dikonfigurasi dengan benar. Untuk informasi selengkapnya, lihat Operasi terkait Binlog. Fitur ini berada dalam pratinjau publik. Gunakan fitur ini dengan hati-hati.

Konektor MySQL mendukung hal-hal berikut.

Kategori

Detail

Jenis yang didukung

Tabel sumber, tabel dimensi, tabel sink, dan sumber data ingestion data

Mode runtime

Hanya mode streaming yang didukung.

Format data

Tidak berlaku

Metrik pemantauan spesifik

Metrik pemantauan

  • Tabel sumber

    • currentFetchEventTimeLag: Interval dari saat data dihasilkan hingga ditarik oleh operator Source.

      Metrik ini hanya berlaku pada fase binary logging. Pada fase snapshot, nilainya selalu 0.

    • currentEmitEventTimeLag: Interval dari saat data dihasilkan hingga meninggalkan operator Source.

      Metrik ini hanya berlaku pada fase binary logging. Pada fase snapshot, nilainya selalu 0.

    • sourceIdleTime: Durasi selama tabel sumber tidak menghasilkan data baru.

  • Tabel dimensi dan tabel sink: Tidak ada.

Catatan

Untuk informasi lebih lanjut tentang metrik tersebut, lihat Deskripsi metrik.

Jenis API

DataStream, SQL, dan YAML data ingestion

Mendukung pembaruan atau penghapusan data di tabel sink

Ya

Fitur

Tabel sumber change data capture (CDC) MySQL, juga dikenal sebagai tabel sumber streaming MySQL, pertama-tama membaca seluruh data historis dari database, lalu secara mulus beralih ke pembacaan log biner. Proses ini memastikan tidak ada data yang terlewat atau diduplikasi. Bahkan jika terjadi kegagalan, data diproses dengan semantik tepat-sekali. Tabel sumber CDC MySQL mendukung pembacaan konkuren data penuh dan menggunakan algoritma snapshot inkremental untuk menerapkan pembacaan tanpa lock serta transfer data yang dapat dilanjutkan. Untuk informasi selengkapnya, lihat Tentang tabel sumber CDC MySQL.

  • Pemrosesan batch dan stream terpadu yang mendukung pembacaan data penuh maupun inkremental, sehingga menghilangkan kebutuhan untuk memelihara dua proses terpisah.

  • Pembacaan konkuren data penuh untuk penskalaan kinerja horizontal.

  • Peralihan mulus dari pembacaan data penuh ke pembacaan data inkremental dan skala-masuk otomatis untuk menghemat sumber daya komputasi.

  • Transfer data yang dapat dilanjutkan selama fase pembacaan data penuh untuk meningkatkan stabilitas.

  • Pembacaan data penuh tanpa lock, yang tidak memengaruhi layanan online.

  • Dukungan untuk membaca log cadangan ApsaraDB RDS for MySQL.

  • Parsing paralel file log biner untuk latensi baca yang lebih rendah.

Prasyarat

Sebelum menggunakan tabel sumber CDC MySQL, Anda harus menyelesaikan operasi prasyarat yang dijelaskan dalam Konfigurasi MySQL.

ApsaraDB RDS for MySQL

  • Lakukan network probe untuk memastikan konektivitas jaringan ke Realtime Compute for Apache Flink.

  • Versi MySQL: 5.6, 5.7, 8.0.x, atau 8.4.

  • Binary logging harus diaktifkan. Fitur ini diaktifkan secara default.

  • Format log biner harus ROW. Ini adalah format default.

  • Parameter `binlog_row_image` harus diatur ke FULL. Ini adalah pengaturan default.

  • Binary Log Transaction Compression harus dinonaktifkan. Fitur ini diperkenalkan di MySQL 8.0.20 dan dinonaktifkan secara default.

  • Pengguna MySQL telah dibuat dengan izin SELECT, SHOW DATABASES, REPLICATION SLAVE, dan REPLICATION CLIENT.

  • Buat database dan tabel MySQL. Untuk informasi selengkapnya, lihat Buat database dan akun untuk instans ApsaraDB RDS for MySQL. Gunakan akun istimewa untuk membuat database MySQL guna mencegah kegagalan operasi akibat izin yang tidak mencukupi.

  • Konfigurasikan daftar putih alamat IP. Untuk informasi selengkapnya, lihat Konfigurasi daftar putih alamat IP untuk instans ApsaraDB RDS for MySQL.

PolarDB for MySQL

  • Lakukan network probe untuk memastikan konektivitas jaringan ke Realtime Compute for Apache Flink.

  • Versi MySQL: 5.6, 5.7, 8.0.x, atau 8.4.

  • Binary logging harus diaktifkan. Fitur ini dinonaktifkan secara default.

  • Format log biner harus ROW. Ini adalah format default.

  • Parameter `binlog_row_image` harus diatur ke FULL. Ini adalah pengaturan default.

  • Binary Log Transaction Compression harus dinonaktifkan. Fitur ini diperkenalkan di MySQL 8.0.20 dan dinonaktifkan secara default.

  • Anda telah membuat pengguna MySQL dengan izin SELECT, SHOW DATABASES, REPLICATION SLAVE, dan REPLICATION CLIENT.

  • Buat database dan tabel MySQL. Untuk informasi selengkapnya, lihat Buat database dan akun untuk kluster PolarDB for MySQL. Gunakan akun istimewa untuk membuat database MySQL guna mencegah kegagalan operasi akibat izin yang tidak mencukupi.

  • Konfigurasikan daftar putih alamat IP. Untuk informasi selengkapnya, lihat Konfigurasi daftar putih alamat IP untuk kluster PolarDB for MySQL.

Self-managed MySQL

  • Lakukan network probe untuk memastikan konektivitas jaringan ke Realtime Compute for Apache Flink.

  • Versi MySQL: 5.6, 5.7, 8.0.x, atau 8.4.

  • Binary logging harus diaktifkan. Fitur ini dinonaktifkan secara default.

  • Format log biner harus ROW. Format default adalah STATEMENT.

  • Parameter `binlog_row_image` harus diatur ke FULL. Ini adalah pengaturan default.

  • Binary Log Transaction Compression harus dinonaktifkan. Fitur ini diperkenalkan di MySQL 8.0.20 dan dinonaktifkan secara default.

  • Buat pengguna MySQL dan berikan izin SELECT, SHOW DATABASES, REPLICATION SLAVE, dan REPLICATION CLIENT.

  • Buat database dan tabel MySQL. Untuk informasi selengkapnya, lihat Buat database dan akun untuk instans self-managed MySQL. Gunakan akun istimewa untuk membuat database MySQL guna mencegah kegagalan operasi akibat izin yang tidak mencukupi.

  • Konfigurasikan daftar putih alamat IP. Untuk informasi selengkapnya, lihat Konfigurasi daftar putih alamat IP untuk instans self-managed MySQL.

Batasan

Batasan umum

  • Tabel sumber CDC MySQL tidak mendukung definisi watermark.

  • Dalam pekerjaan Create Table As Select (CTAS) dan Create Database As Select (CDAS), tabel sumber CDC MySQL dapat menyinkronkan beberapa perubahan skema. Untuk informasi selengkapnya tentang jenis perubahan yang didukung, lihat Kebijakan sinkronisasi evolusi skema.

  • Konektor CDC MySQL tidak mendukung fitur Binary Log Transaction Compression. Oleh karena itu, saat menggunakan konektor CDC MySQL untuk mengonsumsi data inkremental, pastikan Binary Log Transaction Compression dinonaktifkan. Jika tidak, konektor mungkin gagal mengambil data inkremental.

ApsaraDB RDS for MySQL batasan

  • Untuk ApsaraDB RDS for MySQL, jangan membaca data dari database sekunder atau replika read-only. Hal ini karena periode retensi log biner default untuk database sekunder dan replika read-only sangat singkat. Jika log biner kedaluwarsa dan dihapus, pekerjaan mungkin gagal mengonsumsi data log biner dan melaporkan error.

  • ApsaraDB RDS for MySQL mengaktifkan sinkronisasi primer/sekunder paralel secara default tetapi tidak menjamin urutan transaksi yang konsisten antara instans primer dan sekunder. Hal ini dapat menyebabkan data terlewat selama alih bencana primer/sekunder dan pemulihan checkpoint. Untuk menghindari masalah ini, Anda dapat mengaktifkan opsi `slave_preserve_commit_order` secara manual untuk ApsaraDB RDS for MySQL.

PolarDB for MySQL batasan

Tabel sumber CDC MySQL tidak mendukung pembacaan data dari kluster arsitektur Multi-master Cluster PolarDB for MySQL V1.0.19 dan sebelumnya. Untuk informasi selengkapnya, lihat Apa itu Kluster Multi-master?. Log biner yang dihasilkan oleh kluster ini mungkin berisi ID tabel duplikat. Hal ini dapat menyebabkan error pemetaan skema pada tabel sumber CDC, yang mengakibatkan error saat parsing data log biner.

Open source MySQL batasan

Secara default, MySQL mempertahankan urutan transaksi selama replikasi log biner primer/sekunder. Jika replika MySQL memiliki replikasi paralel diaktifkan (slave_parallel_workers > 1) tetapi tidak memiliki slave_preserve_commit_order=ON diaktifkan, urutan commit transaksinya mungkin tidak konsisten dengan database primer. Saat Flink CDC pulih dari checkpoint, data mungkin terlewat karena urutan yang tidak teratur. Anda dapat mengatur `slave_preserve_commit_order` = ON pada replika MySQL. Atau, Anda dapat mengatur `slave_parallel_workers` = 1, tetapi hal ini akan mengorbankan kinerja replikasi.

Catatan penggunaan

  • Tabel sumber

    • Selama fase pembacaan data penuh, Anda tidak dapat menyimpan titik simpan, menambahkan atau menghapus tabel dari tabel sumber, lalu me-restart pekerjaan dari titik simpan tersebut. Jika Anda melakukan operasi ini, pekerjaan akan gagal membaca data.

  • Tabel sink

    • Primary key auto-increment: Jangan deklarasikan primary key auto-increment dalam DDL. MySQL akan mengisinya secara otomatis saat menulis data.

    • Anda harus mendeklarasikan setidaknya satu bidang non-primary key. Jika tidak, error akan dilaporkan.

    • Kendala `NOT ENFORCED` dalam DDL menunjukkan bahwa Flink tidak menerapkan validasi primary key. Anda bertanggung jawab untuk memastikan kebenaran dan integritas primary key. Untuk informasi selengkapnya, lihat Pemeriksaan Validitas.

  • Tabel dimensi

    Jika Anda ingin menggunakan indeks untuk mempercepat kueri, urutan bidang dalam klausa JOIN harus sesuai dengan urutan yang ditentukan dalam indeks, berdasarkan aturan prefiks paling kiri. Misalnya, jika indeksnya adalah (a, b, c), kondisi JOIN-nya adalah ON t.a = x AND t.b = y.

    SQL yang dihasilkan oleh Flink mungkin ditulis ulang oleh pengoptimal. Hal ini dapat mencegah indeks terkena selama kueri database aktual. Untuk memastikan apakah indeks digunakan, periksa rencana eksekusi (EXPLAIN) atau log kueri lambat di MySQL untuk melihat pernyataan SELECT aktual yang dieksekusi.

SQL

Anda dapat menggunakan konektor MySQL dalam pekerjaan SQL sebagai tabel sumber, tabel dimensi, atau tabel sink.

Sintaksis

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>'
);

Catatan
  • Saat menulis ke tabel sink, konektor membuat dan mengeksekusi pernyataan SQL untuk setiap catatan data yang diterima. Pernyataan tersebut disusun sebagai berikut:

    • Untuk tabel sink tanpa primary key, pernyataan INSERT INTO table_name (column1, column2, ...) VALUES (value1, value2, ...); dieksekusi.

    • Untuk tabel sink dengan primary key, pernyataan INSERT INTO table_name (column1, column2, ...) VALUES (value1, value2, ...) ON DUPLICATE KEY UPDATE column1 = VALUES(column1), column2 = VALUES(column2), ...; dieksekusi. Catatan: Jika tabel fisik memiliki kendala indeks unik selain primary key, memasukkan dua catatan dengan primary key berbeda tetapi nilai indeks unik yang sama menyebabkan konflik indeks unik. Hal ini mengakibatkan data ditimpa dan hilang.

  • Jika primary key auto-increment didefinisikan dalam database MySQL, jangan deklarasikan kolom auto-increment dalam DDL Flink. Database akan mengisi bidang ini secara otomatis saat menulis data. Konektor mendukung penulisan dan penghapusan data dengan kolom auto-increment, tetapi tidak mendukung pembaruan data ini.

Parameter WITH

  • Umum

    Parameter

    Deskripsi

    Wajib

    Tipe data

    Nilai default

    Catatan

    connector

    Jenis tabel.

    Ya

    STRING

    None

    Saat digunakan sebagai tabel sumber, Anda dapat mengatur parameter ini ke mysql-cdc atau mysql. Keduanya setara. Saat digunakan sebagai tabel dimensi atau tabel sink, nilainya harus mysql.

    hostname

    Alamat IP atau hostname database MySQL.

    Ya

    STRING

    None

    Kami menyarankan agar Anda menentukan alamat virtual private cloud (VPC).

    Catatan

    Jika database MySQL dan Realtime Compute for Apache Flink tidak berada dalam VPC yang sama, Anda harus membuat koneksi jaringan cross-VPC atau menggunakan titik akhir publik untuk mengakses database. Untuk informasi selengkapnya, lihat Kelola dan operasikan ruang kerja dan Bagaimana kluster Flink yang sepenuhnya dikelola mengakses Internet?.

    username

    Username untuk layanan database MySQL.

    Ya

    STRING

    None

    None.

    password

    Password untuk layanan database MySQL.

    Ya

    STRING

    None

    None.

    database-name

    Nama database MySQL.

    Ya

    STRING

    None

    • Saat database digunakan sebagai tabel sumber, Anda dapat menggunakan ekspresi reguler untuk nama database guna membaca data dari beberapa database.

    • Saat menggunakan ekspresi reguler, jangan gunakan simbol ^ dan $ untuk mencocokkan awal dan akhir string. Untuk informasi selengkapnya, lihat catatan untuk parameter table-name.

    table-name

    Nama tabel MySQL.

    Ya

    STRING

    None

    • Anda dapat menggunakan ekspresi reguler untuk nama tabel sumber guna membaca data dari beberapa tabel.

      Saat membaca data dari beberapa tabel MySQL, kirimkan beberapa pernyataan CTAS sebagai satu pekerjaan. Hal ini menghindari pengaktifan beberapa pendengar log biner dan meningkatkan kinerja serta efisiensi. Untuk informasi selengkapnya, lihat Beberapa pernyataan CTAS: Kirim sebagai satu pekerjaan.

    • Saat menggunakan ekspresi reguler, jangan gunakan simbol ^ dan $ untuk mencocokkan awal dan akhir string. Untuk informasi selengkapnya, lihat catatan berikut.

    Catatan

    Saat tabel sumber CDC MySQL mencocokkan nama tabel menggunakan ekspresi reguler, konektor menggabungkan database-name dan table-name yang Anda tentukan dengan string \\. untuk membentuk ekspresi reguler path lengkap. Sebelum VVR 8.0.1, karakter . digunakan. Konektor kemudian menggunakan ekspresi reguler ini untuk mencocokkan nama tabel yang memenuhi syarat sepenuhnya di database MySQL.

    Misalnya, jika Anda mengatur 'database-name'='db_.*' dan 'table-name'='tb_.+', konektor menggunakan ekspresi reguler db_.*\\.tb_.+ untuk mencocokkan nama tabel yang memenuhi syarat sepenuhnya guna menentukan tabel mana yang akan dibaca. Sebelum VVR 8.0.1, ekspresi regulernya adalah db_.*.tb_.+.

    port

    Nomor port layanan database MySQL.

    Tidak

    INTEGER

    3306

    None.

  • Hanya untuk tabel sumber

    Parameter

    Deskripsi

    Wajib

    Tipe data

    Nilai default

    Catatan

    server-id

    ID numerik untuk klien database.

    Tidak

    STRING

    Nilai acak antara 5400 dan 6400 dihasilkan.

    ID ini harus unik secara global dalam kluster MySQL. Tetapkan ID berbeda untuk setiap pekerjaan yang terhubung ke database yang sama.

    Parameter ini juga mendukung format rentang ID, seperti 5400-5408. Saat pembacaan inkremental diaktifkan, pembacaan konkuren didukung. Dalam kasus ini, atur rentang ID sehingga setiap pembaca konkuren menggunakan ID berbeda. Untuk informasi selengkapnya, lihat Gunakan Server ID.

    scan.incremental.snapshot.enabled

    Menentukan apakah akan mengaktifkan snapshot inkremental.

    Tidak

    BOOLEAN

    true

    Snapshot inkremental diaktifkan secara default. Snapshot inkremental adalah mekanisme baru untuk membaca snapshot data penuh. Dibandingkan dengan metode pembacaan snapshot lama, snapshot inkremental memiliki banyak keunggulan, termasuk:

    • Sumber dapat membaca data penuh secara paralel.

    • Sumber mendukung checkpoint tingkat chunk saat membaca data penuh.

    • Sumber tidak perlu mengambil lock baca global (FLUSH TABLES WITH read lock) saat membaca data penuh.

    Jika Anda ingin sumber mendukung pembacaan konkuren, setiap pembaca konkuren memerlukan server ID unik. Oleh karena itu, server-id harus berupa rentang, seperti 5400-6400, dan ukuran rentang harus lebih besar dari atau sama dengan konkurensi.

    Catatan

    Item konfigurasi ini dihapus di Ververica Runtime (VVR) 11.1 dan versi yang lebih baru.

    scan.incremental.snapshot.chunk.size

    Ukuran setiap chunk dalam jumlah baris.

    Tidak

    INTEGER

    8096

    Saat pembacaan snapshot inkremental diaktifkan, tabel dibagi menjadi beberapa chunk untuk dibaca. Data chunk di-cache dalam memori sebelum sepenuhnya dibaca.

    Semakin sedikit baris yang dikandung setiap chunk, semakin besar jumlah total chunk dalam tabel. Meskipun hal ini mengurangi granularitas pemulihan kesalahan, hal ini dapat menyebabkan error kehabisan memori (OOM) dan throughput keseluruhan yang lebih rendah. Oleh karena itu, Anda perlu membuat pertimbangan dan mengatur ukuran chunk yang wajar.

    scan.snapshot.fetch.size

    Jumlah maksimum catatan yang ditarik sekaligus saat membaca data penuh tabel.

    Tidak

    INTEGER

    1024

    None.

    scan.startup.mode

    Mode startup untuk konsumsi data.

    Tidak

    STRING

    initial

    Nilai yang valid:

    • initial (default): Saat startup pertama atau startup tanpa status, konektor memindai data historis penuh lalu membaca data log biner terbaru.

    • latest-offset: Saat startup pertama atau startup tanpa status, konektor tidak memindai data historis. Konektor mulai membaca dari akhir log biner, artinya hanya membaca perubahan terbaru setelah konektor dimulai.

    • earliest-offset: Konektor tidak memindai data historis. Konektor mulai membaca dari log biner yang tersedia paling awal.

    • specific-offset: Konektor tidak memindai data historis. Konektor mulai dari offset log biner tertentu. Anda dapat menentukan offset dengan mengonfigurasi scan.startup.specific-offset.file dan scan.startup.specific-offset.pos, atau hanya mengonfigurasi scan.startup.specific-offset.gtid-set untuk memulai dari set GTID tertentu.

    • timestamp: Konektor tidak memindai data historis. Konektor mulai membaca log biner dari timestamp tertentu. Timestamp ditentukan oleh scan.startup.timestamp-millis dalam milidetik.

    Penting

    Saat menggunakan mode startup earliest-offset, specific-offset, atau timestamp, pastikan skema tabel yang sesuai tidak berubah antara posisi konsumsi log biner yang ditentukan dan waktu startup pekerjaan. Hal ini mencegah error akibat ketidakcocokan skema.

    scan.startup.specific-offset.file

    Nama file log biner untuk offset awal saat menggunakan mode startup specific-offset.

    Tidak

    STRING

    None

    Saat menggunakan parameter ini, Anda harus mengatur scan.startup.mode ke specific-offset. Contoh format nama file: mysql-bin.000003.

    scan.startup.specific-offset.pos

    Offset dalam file log biner yang ditentukan untuk offset awal saat menggunakan mode startup specific-offset.

    Tidak

    INTEGER

    None

    Saat menggunakan parameter ini, Anda harus mengatur scan.startup.mode ke specific-offset.

    scan.startup.specific-offset.gtid-set

    Set GTID untuk offset awal saat menggunakan mode startup specific-offset.

    Tidak

    STRING

    None

    Saat menggunakan parameter ini, Anda harus mengatur scan.startup.mode ke specific-offset. Contoh format set GTID: 24DA167-0C0C-11E8-8442-00059A3C7B00:1-19.

    scan.startup.timestamp-millis

    Timestamp dalam milidetik untuk offset awal saat menggunakan mode startup timestamp.

    Tidak

    LONG

    None

    Saat menggunakan parameter ini, Anda harus mengatur scan.startup.mode ke timestamp. Satuan timestamp adalah milidetik.

    Penting

    Saat Anda menentukan waktu, CDC MySQL mencoba membaca event awal setiap file log biner untuk menentukan timestamp-nya. Kemudian, CDC MySQL menemukan file log biner yang sesuai dengan waktu yang ditentukan. Pastikan file log biner yang sesuai dengan timestamp yang ditentukan belum dihapus dari database dan dapat dibaca.

    server-time-zone

    Zona waktu sesi yang digunakan oleh database.

    Tidak

    STRING

    Jika Anda tidak menentukan parameter ini, sistem menggunakan zona waktu lingkungan runtime pekerjaan Flink sebagai zona waktu server database. Ini adalah zona waktu zona yang Anda pilih.

    Contoh: Asia/Shanghai. Parameter ini mengontrol bagaimana tipe TIMESTAMP di MySQL dikonversi ke tipe STRING. Untuk informasi selengkapnya, lihat Debezium temporal values.

    debezium.min.row.count.to.stream.results

    Saat jumlah baris dalam tabel lebih besar dari nilai ini, mode pembacaan batch digunakan.

    Tidak

    INTEGER

    1000

    Flink membaca data dari tabel sumber MySQL dengan salah satu cara berikut:

    • Baca penuh: Membaca seluruh data tabel langsung ke memori. Metode ini cepat tetapi mengonsumsi memori yang sesuai. Jika tabel sumber sangat besar, ada risiko error OOM.

    • Baca batch: Membaca data dalam beberapa batch, dengan jumlah baris tertentu per batch, hingga semua data dibaca. Metode ini menghindari risiko OOM saat membaca tabel besar tetapi relatif lambat.

    connect.timeout

    Waktu maksimum menunggu koneksi ke server database MySQL hingga timeout sebelum mencoba lagi.

    Tidak

    DURATION

    30s

    None.

    connect.max-retries

    Jumlah maksimum percobaan ulang setelah koneksi ke layanan database MySQL gagal.

    Tidak

    INTEGER

    3

    None.

    connection.pool.size

    Ukuran kolam koneksi database.

    Tidak

    INTEGER

    20

    Kolam koneksi database digunakan untuk menggunakan kembali koneksi, yang dapat mengurangi jumlah koneksi database.

    jdbc.properties.*

    Parameter koneksi kustom dalam URL JDBC.

    Tidak

    STRING

    None

    Anda dapat meneruskan parameter koneksi kustom. Misalnya, untuk tidak menggunakan protokol SSL, Anda dapat mengonfigurasi 'jdbc.properties.useSSL' = 'false'.

    Untuk informasi selengkapnya tentang parameter koneksi yang didukung, lihat MySQL Configuration Properties.

    debezium.*

    Parameter kustom untuk Debezium guna membaca log biner.

    Tidak

    STRING

    None

    Anda dapat meneruskan parameter Debezium kustom. Misalnya, gunakan 'debezium.event.deserialization.failure.handling.mode'='ignore' untuk menentukan logika penanganan error parsing.

    Peringatan

    Jangan mengubah parameter Debezium secara sembarangan. Hal ini dapat menyebabkan konektor membaca data secara salah. Misalnya, parameter debezium.binlog.buffer.size tidak boleh dikonfigurasi.

    heartbeat.interval

    Interval di mana sumber memajukan offset log biner menggunakan event heartbeat.

    Tidak

    DURATION

    30s

    Event heartbeat digunakan untuk memajukan offset log biner di sumber. Hal ini sangat berguna untuk tabel di MySQL yang jarang diperbarui. Untuk tabel tersebut, offset log biner tidak dapat maju secara otomatis. Event heartbeat dapat mendorong offset log biner maju, yang mencegah masalah akibat offset log biner yang kedaluwarsa. Offset log biner yang kedaluwarsa dapat menyebabkan pekerjaan gagal dan tidak dapat dipulihkan, sehingga memerlukan restart tanpa status.

    scan.incremental.snapshot.chunk.key-column

    Menentukan kolom yang akan digunakan sebagai kolom pemisah untuk sharding selama fase snapshot.

    Lihat kolom Catatan.

    STRING

    None

    • Wajib untuk tabel tanpa primary key. Kolom yang dipilih harus bertipe non-null (NOT NULL).

    • Opsional untuk tabel dengan primary key. Hanya satu kolom yang dapat dipilih dari primary key.

    rds.region-id

    ID wilayah instans Alibaba Cloud ApsaraDB RDS for MySQL.

    Wajib saat menggunakan fitur membaca log arsip dari OSS.

    STRING

    None

    Untuk informasi selengkapnya tentang ID wilayah, lihat Wilayah dan zona.

    Penting

    Karena string GTID untuk CDC MySQL dihasilkan secara acak dan tidak meningkat secara monoton seperti offset file log biner, menemukan GTID dalam file memerlukan pengunduhan dan parsing semua log arsip dari OSS. Proses ini sangat intensif sumber daya dan memakan waktu, sehingga fitur yang bergantung pada offset GTID tidak layak. Oleh karena itu, fitur log arsip OSS hanya mendukung pemulaian dari timestamp tertentu atau offset file log biner tertentu. Fitur ini tidak mendukung pemulaian dari GTID tertentu, maupun skenario dengan alih bencana primer/sekunder dalam log arsip, karena alih bencana primer/sekunder MySQL bergantung pada GTID. Evaluasi fitur ini dengan hati-hati sebelum digunakan.

    rds.access-key-id

    ID AccessKey akun Alibaba Cloud ApsaraDB RDS for MySQL.

    Wajib saat menggunakan fitur membaca log arsip dari OSS.

    STRING

    None

    Untuk informasi selengkapnya, lihat Bagaimana cara melihat ID AccessKey dan Rahasia AccessKey?.

    Penting

    Untuk mencegah Informasi AccessKey Anda bocor, gunakan fitur manajemen rahasia untuk menentukan ID AccessKey. Untuk informasi selengkapnya, lihat Kelola variabel.

    rds.access-key-secret

    Rahasia AccessKey akun Alibaba Cloud ApsaraDB RDS for MySQL.

    Wajib saat menggunakan fitur membaca log arsip dari OSS.

    STRING

    None

    Untuk informasi selengkapnya, lihat Bagaimana cara melihat ID AccessKey dan Rahasia AccessKey?

    Penting

    Untuk mencegah Informasi AccessKey Anda bocor, gunakan fitur manajemen rahasia untuk menentukan Rahasia AccessKey. Untuk informasi selengkapnya, lihat Kelola variabel.

    rds.db-instance-id

    ID instans Alibaba Cloud ApsaraDB RDS for MySQL.

    Wajib saat menggunakan fitur membaca log arsip dari OSS.

    STRING

    None

    None.

    rds.main-db-id

    Nomor database utama instans Alibaba Cloud ApsaraDB RDS for MySQL.

    Tidak

    STRING

    None

    • Untuk informasi selengkapnya tentang cara mendapatkan nomor database utama, lihat Cadangan log ApsaraDB RDS for MySQL.

    • Hanya didukung di VVR 8.0.7 dan versi yang lebih baru.

    Catatan

    Jika parameter ini tidak ditentukan, VVR 11.7 dan versi yang lebih baru secara otomatis mengkueri nomor database utama berdasarkan informasi koneksi ApsaraDB RDS for MySQL.

    rds.download.timeout

    Periode timeout untuk mengunduh satu log arsip dari OSS.

    Tidak

    DURATION

    60s

    None.

    rds.endpoint

    Titik akhir layanan untuk mendapatkan informasi log biner OSS.

    Tidak

    STRING

    None

    • Untuk informasi selengkapnya tentang nilai yang valid, lihat Titik akhir.

    • Hanya didukung di VVR 8.0.8 dan versi yang lebih baru.

    scan.incremental.close-idle-reader.enabled

    Menentukan apakah akan menutup pembaca idle setelah snapshot selesai.

    Tidak

    BOOLEAN

    false

    • Hanya didukung di VVR 8.0.1 dan versi yang lebih baru.

    • Agar konfigurasi ini berlaku, Anda harus mengatur execution.checkpointing.checkpoints-after-tasks-finish.enabled ke true.

    scan.read-changelog-as-append-only.enabled

    Menentukan apakah akan mengonversi aliran data changelog menjadi aliran data append-only.

    Tidak

    BOOLEAN

    false

    Nilai yang valid:

    • true: Semua jenis pesan, termasuk INSERT, DELETE, UPDATE_BEFORE, dan UPDATE_AFTER, dikonversi menjadi pesan INSERT. Aktifkan opsi ini hanya dalam skenario khusus, seperti saat Anda perlu menyimpan pesan delete dari tabel upstream.

    • false (default): Semua jenis pesan dikirim downstream apa adanya.

    Catatan

    Hanya didukung di VVR 8.0.8 dan versi yang lebih baru.

    scan.only.deserialize.captured.tables.changelog.enabled

    Dalam fase inkremental, menentukan apakah hanya akan mendeserialisasi event perubahan dari tabel yang ditentukan.

    Tidak

    BOOLEAN

    • Nilai default adalah false di versi VVR 8.x.

    • Nilai default adalah true di VVR 11.1 dan versi yang lebih baru.

    Nilai yang valid:

    • true: Hanya mendeserialisasi data perubahan dari tabel target untuk mempercepat pembacaan log biner.

    • false (default): Mendeserialisasi data perubahan dari semua tabel.

    Catatan
    • Hanya didukung di VVR 8.0.7 dan versi yang lebih baru.

    • Saat menggunakan VVR 8.0.8 atau versi sebelumnya, Anda harus mengubah nama parameter menjadi debezium.scan.only.deserialize.captured.tables.changelog.enable.

    scan.parse.online.schema.changes.enabled

    Dalam fase inkremental, menentukan apakah akan mencoba mengurai event DDL perubahan tanpa lock RDS.

    Tidak

    BOOLEAN

    false

    Nilai yang valid:

    • true: Mengurai event DDL perubahan tanpa lock RDS.

    • false (default): Tidak mengurai event DDL perubahan tanpa lock RDS.

    Ini adalah fitur eksperimental. Sebelum melakukan perubahan tanpa lock online, ambil snapshot pekerjaan Flink untuk pemulihan.

    Catatan

    Hanya didukung di VVR 11.1 dan versi yang lebih baru.

    scan.incremental.snapshot.backfill.skip

    Menentukan apakah akan melewati backfill selama fase pembacaan snapshot.

    Tidak

    BOOLEAN

    false

    Nilai yang valid:

    • true: Melewati backfill selama fase pembacaan snapshot.

    • false (default): Tidak melewati backfill selama fase pembacaan snapshot.

    Backfill hanya berlaku selama kueri snapshot chunk tunggal dan tidak mencakup seluruh fase baca penuh. Saat backfill dilewati, kueri snapshot setiap chunk membaca data tabel terbaru pada saat itu; pembaruan yang terjadi pada chunk setelah dibaca tidak digabung selama fase baca penuh dan dibaca dari Binlog setelah memasuki fase inkremental. Misalnya, pembaruan pada chunk5 yang terjadi saat chunk5 sedang di-snapshot tercermin langsung dalam snapshot chunk5; jika chunk5 diperbarui setelah pembaca maju ke chunk80, pembaruan tersebut diterapkan kemudian dari Binlog selama fase inkremental.

    Penting

    Saat diaktifkan, perubahan yang terjadi selama atau setelah pemindaian chunk tetap dikirim dari Binlog dalam fase inkremental dan mungkin diduplikasi. Hanya semantik setidaknya-sekali yang dijamin. Aktifkan ini hanya saat sink downstream mendukung penulisan idempoten berdasarkan primary key.

    Catatan

    Hanya didukung di VVR 11.1 dan versi yang lebih baru.

    scan.incremental.snapshot.unbounded-chunk-first.enabled

    Menentukan apakah akan mengirimkan chunk tak terbatas terlebih dahulu selama fase pembacaan snapshot.

    Tidak

    BOOELEAN

    false

    Nilai yang valid:

    • true: Mengirimkan chunk tak terbatas terlebih dahulu selama fase pembacaan snapshot.

    • false (default): Tidak mengirimkan chunk tak terbatas terlebih dahulu selama fase pembacaan snapshot.

    Ini adalah fitur eksperimental. Mengaktifkannya dapat mengurangi risiko error OOM pada Pengelola Tugas saat menyinkronkan chunk terakhir selama fase snapshot. Tambahkan parameter ini sebelum startup pertama pekerjaan.

    Catatan

    Hanya didukung di VVR 11.1 dan versi yang lebih baru.

    binlog.session.network.timeout

    Timeout baca/tulis jaringan untuk koneksi log biner.

    Tidak

    DURATION

    10m

    Jika diatur ke 0s, timeout default server MySQL digunakan.

    Catatan

    Hanya didukung di VVR 11.5 dan versi yang lebih baru.

    scan.rate-limit.records-per-second

    Membatasi jumlah maksimum catatan yang dikirim oleh sumber per detik.

    Tidak

    LONG

    None

    Ini berlaku untuk skenario di mana pembacaan data perlu dibatasi. Batasan ini berlaku baik dalam fase penuh maupun inkremental.

    Metrik numRecordsOutPerSecond dari sumber mencerminkan jumlah catatan yang dikeluarkan oleh seluruh aliran data per detik. Anda dapat menyesuaikan parameter ini berdasarkan metrik tersebut.

    Dalam fase pembacaan data penuh, Anda biasanya perlu mengurangi jumlah baris yang dibaca dalam setiap batch. Anda dapat mengurangi nilai parameter scan.incremental.snapshot.chunk.size.

    Catatan

    Hanya didukung di VVR 11.5 dan versi yang lebih baru.

    scan.binlog.tolerate.gtid-holes

    Mengaktifkan parameter ini mengabaikan celah dalam urutan GTID, memungkinkan pekerjaan melewati event yang tidak kontinu dan terus berjalan.

    Tidak

    BOOLEAN

    false

    Sebelum mengaktifkan parameter ini, Anda harus memastikan bahwa offset awal pekerjaan belum kedaluwarsa. Jika pekerjaan dimulai dari offset GTID yang dihapus atau kedaluwarsa, mesin akan diam-diam melewatkan log yang hilang, yang akan menyebabkan kehilangan data.

    Catatan

    Parameter ini hanya didukung di VVR 11.6 dan versi yang lebih baru.

  • Parameter khusus tabel dimensi

    Parameter

    Deskripsi

    Wajib

    Tipe data

    Nilai default

    Catatan

    url

    URL JDBC MySQL.

    Tidak

    STRING

    None

    Format URL adalah: jdbc:mysql://<endpoint>:<port>/<database_name>.

    lookup.max-retries

    Jumlah maksimum percobaan ulang setelah pembacaan data gagal.

    Tidak

    INTEGER

    3

    Hanya didukung di VVR 6.0.7 dan versi yang lebih baru.

    lookup.cache.strategy

    Kebijakan cache.

    Tidak

    STRING

    None

    Kebijakan cache yang didukung adalah None, LRU, dan ALL. Untuk informasi selengkapnya tentang nilai-nilai tersebut, lihat Pernyataan JOIN tabel dimensi.

    Catatan

    Saat Anda menggunakan kebijakan cache LRU, Anda juga harus mengonfigurasi parameter lookup.cache.max-rows.

    lookup.cache.max-rows

    Jumlah maksimum baris yang di-cache.

    Tidak

    INTEGER

    100000

    • Jika Anda memilih kebijakan cache LRU, Anda harus mengatur ukuran cache.

    • Jika Anda memilih kebijakan cache ALL, Anda tidak perlu mengatur ukuran cache.

    lookup.cache.ttl

    Waktu hidup (TTL) cache.

    Tidak

    DURATION

    10 s

    Konfigurasi lookup.cache.ttl bergantung pada lookup.cache.strategy:

    • Jika lookup.cache.strategy diatur ke None, Anda tidak perlu mengonfigurasi lookup.cache.ttl. Artinya cache tidak kedaluwarsa.

    • Jika lookup.cache.strategy diatur ke LRU, lookup.cache.ttl adalah TTL cache. Secara default, cache tidak kedaluwarsa.

    • Jika lookup.cache.strategy diatur ke ALL, lookup.cache.ttl adalah waktu pemuatan cache. Secara default, cache tidak dimuat ulang.

    Gunakan format waktu, seperti 1min atau 10s.

    lookup.max-join-rows

    Jumlah maksimum hasil yang dikembalikan saat catatan dari tabel utama cocok dengan catatan di tabel dimensi.

    Tidak

    INTEGER

    1024

    None.

    lookup.filter-push-down.enabled

    Menentukan apakah akan mengaktifkan filter pushdown untuk tabel dimensi.

    Tidak

    BOOLEAN

    false

    Nilai yang valid:

    • true: Mengaktifkan filter pushdown untuk tabel dimensi. Saat memuat data dari tabel database MySQL, tabel dimensi memfilter data terlebih dahulu berdasarkan kondisi yang ditetapkan dalam pekerjaan SQL.

    • false (default): Menonaktifkan filter pushdown untuk tabel dimensi. Saat memuat data dari tabel database MySQL, tabel dimensi memuat semua data.

    Catatan

    Hanya didukung di VVR 8.0.7 dan versi yang lebih baru.

    Penting

    Pushdown tabel dimensi hanya boleh diaktifkan saat tabel Flink digunakan sebagai tabel dimensi. Tabel sumber MySQL tidak mendukung pengaktifan filter pushdown. Jika tabel Flink digunakan sebagai tabel sumber dan tabel dimensi, dan filter pushdown diaktifkan untuk tabel dimensi, Anda harus secara eksplisit mengatur item konfigurasi ini ke false untuk tabel sumber menggunakan Petunjuk SQL. Jika tidak, pekerjaan mungkin berjalan tidak normal.

  • Hanya untuk tabel sink

    Parameter

    Deskripsi

    Wajib

    Tipe data

    Nilai default

    Catatan

    url

    URL JDBC MySQL.

    Tidak

    STRING

    None

    Format URL adalah: jdbc:mysql://<endpoint>:<port>/<database_name>.

    sink.max-retries

    Jumlah maksimum percobaan ulang setelah penulisan data gagal.

    Tidak

    INTEGER

    3

    None.

    sink.buffer-flush.batch-size

    Jumlah baris dalam satu penulisan batch.

    Tidak

    INTEGER

    4096

    None.

    sink.buffer-flush.max-rows

    Jumlah baris data yang di-cache dalam memori.

    Tidak

    INTEGER

    10000

    Parameter ini hanya berlaku setelah primary key ditentukan.

    sink.buffer-flush.interval

    Interval untuk membersihkan cache. Jika data dalam cache tidak memenuhi kondisi output setelah waktu tunggu yang ditentukan, sistem secara otomatis mengeluarkan semua data dalam cache.

    Tidak

    DURATION

    1s

    None.

    sink.ignore-delete

    Menentukan apakah akan mengabaikan operasi DELETE data.

    Tidak

    BOOLEAN

    false

    Saat aliran yang dihasilkan oleh Flink SQL menyertakan catatan delete atau update-before, jika beberapa tugas output memperbarui bidang berbeda dari tabel yang sama secara bersamaan, ketidaksesuaian data dapat terjadi.

    Misalnya, setelah catatan dihapus, tugas lain hanya memperbarui beberapa bidang. Bidang yang tidak diperbarui akan menjadi null atau nilai default, menyebabkan error data.

    Dengan mengatur sink.ignore-delete ke true, Anda dapat mengabaikan operasi DELETE dan UPDATE_BEFORE upstream untuk menghindari masalah tersebut.

    Catatan
    • UPDATE_BEFORE adalah bagian dari mekanisme retraksi Flink, digunakan untuk "menarik kembali" nilai lama dalam operasi pembaruan.

    • Saat ignoreDelete = true, semua catatan tipe DELETE dan UPDATE_BEFORE dilewati. Hanya catatan INSERT dan UPDATE_AFTER yang diproses.

    sink.ignore-delete-mode

    Strategi untuk menangani catatan tipe delete setelah operasi DELETE diabaikan.

    Tidak

    STRING

    ALL

    Nilai yang valid:

    • ALL: Mengabaikan catatan -D dan -U.

    • REAL_DELETE: Hanya mengabaikan catatan -D.

    • UPDATE_BEFORE: Hanya mengabaikan catatan -U.

    Catatan
    • Opsi ini hanya didukung di mesin Realtime Compute VVR 11.8 dan versi yang lebih baru.

    • Hanya berlaku saat sink.ignore-delete=true. Mengonfigurasinya sendiri menghasilkan error.

    sink.ignore-null-when-update

    Saat memperbarui data, menentukan apakah akan memperbarui bidang yang sesuai menjadi null atau melewatkan pembaruan untuk bidang tersebut jika nilai bidang data yang masuk adalah null.

    Tidak

    BOOLEAN

    false

    Nilai yang valid:

    • true: Tidak memperbarui bidang. Parameter ini dapat diatur ke true hanya saat primary key ditetapkan untuk tabel Flink. Saat diatur ke true:

      • Untuk VVR 8.0.6 dan versi sebelumnya, tabel sink tidak mendukung penulisan batch.

      • Untuk VVR 8.0.7 dan versi yang lebih baru, tabel sink mendukung penulisan batch.

        Penulisan batch dapat secara signifikan meningkatkan efisiensi penulisan dan throughput keseluruhan, tetapi memperkenalkan latensi data dan risiko error OOM. Oleh karena itu, Anda harus membuat pertimbangan berdasarkan skenario bisnis Anda.

    • false: Memperbarui bidang menjadi null.

    Catatan

    Parameter ini hanya didukung di VVR 8.0.5 dan versi yang lebih baru.

Pemetaan tipe

  • Tabel sumber CDC

    Tipe bidang MySQL CDC

    Tipe bidang Flink

    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

    Penting

    Jangan gunakan tipe TINYINT(1) di MySQL untuk menyimpan nilai selain 0 dan 1. Saat property-version=0, tabel sumber CDC MySQL memetakan TINYINT(1) ke tipe BOOLEAN di Flink secara default. Hal ini dapat menyebabkan ketidakakuratan data. Untuk menggunakan tipe TINYINT(1) guna menyimpan nilai selain 0 dan 1, lihat parameter konfigurasi catalog.table.treat-tinyint1-as-boolean.

  • Tabel dimensi dan tabel sink

    Tipe bidang MySQL

    Tipe bidang Flink

    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)

    Catatan

    dengan p <= 38.

    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

    Penting

    Flink hanya mendukung catatan tipe BLOB MySQL yang kurang dari atau sama dengan 2.147.483.647 (2^31 - 1) byte.

    BLOB

    MEDIUMBLOB

    LONGBLOB

Contoh penggunaan

  • Tabel sumber CDC

    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;
  • Tabel dimensi

    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;
  • Tabel sink

    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;
  • Sumber data ingestion data

    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

Tentang tabel sumber CDC MySQL

  • Cara kerja

    Saat tabel sumber CDC MySQL dimulai, tabel tersebut memindai seluruh tabel, membagi tabel menjadi beberapa chunk berdasarkan primary key, dan mencatat offset log biner saat ini. Tabel sumber kemudian menggunakan algoritma snapshot inkremental untuk membaca data dari setiap chunk menggunakan pernyataan SELECT. Pekerjaan secara berkala melakukan checkpoint untuk mencatat chunk yang telah selesai. Jika terjadi failover, pekerjaan melanjutkan membaca data dari chunk yang belum selesai. Setelah semua chunk dibaca, pekerjaan mulai membaca catatan perubahan inkremental dari offset log biner yang sebelumnya dicatat. Pekerjaan Flink terus melakukan checkpoint berkala untuk mencatat offset log biner. Jika pekerjaan gagal, pekerjaan melanjutkan pemrosesan dari offset log biner terakhir yang dicatat, sehingga mencapai semantik tepat-sekali.

    Untuk penjelasan lebih rinci tentang algoritma snapshot inkremental, lihat Konektor CDC MySQL.

  • Metadata

    Metadata berguna dalam skenario di mana data dari database dan tabel yang di-shard digabung dan disinkronkan. Hal ini karena setelah penggabungan, bisnis sering ingin membedakan database dan tabel sumber untuk setiap catatan data. Kolom metadata dapat mengakses informasi nama database dan tabel dari tabel sumber. Oleh karena itu, Anda dapat dengan mudah menggabungkan beberapa tabel yang di-shard menjadi satu tabel tujuan menggunakan kolom metadata.

    Sumber CDC MySQL mendukung sintaksis kolom metadata. Anda dapat mengakses metadata berikut melalui kolom metadata.

    Kunci metadata

    Tipe metadata

    Deskripsi

    database_name

    STRING NOT NULL

    Nama database yang berisi baris tersebut.

    table_name

    STRING NOT NULL

    Nama tabel yang berisi baris tersebut.

    op_ts

    TIMESTAMP_LTZ(3) NOT NULL

    Waktu baris tersebut diubah di database. Jika catatan berasal dari data historis tabel alih-alih log biner, nilai ini selalu 0.

    Catatan

    Bidang ini akurat hanya sampai detik.

    op_type

    STRING NOT NULL

    Jenis perubahan baris tersebut.

    • +I: Pesan INSERT

    • -D: Pesan DELETE

    • -U: Pesan UPDATE_BEFORE

    • +U: Pesan UPDATE_AFTER

    Catatan

    Hanya didukung di VVR 8.0.7 dan versi yang lebih baru.

    query_log

    STRING NOT NULL

    Anda dapat membaca catatan log kueri MySQL untuk baris ini.

    Catatan

    MySQL perlu mengaktifkan parameter binlog_rows_query_log_events untuk mencatat log kueri.

    Contoh kode berikut menunjukkan cara menggabungkan dan menyinkronkan beberapa tabel orders dari beberapa database yang di-shard dalam instans MySQL ke tabel holo_orders di Hologres.

    CREATE TEMPORARY TABLE mysql_orders (
      db_name STRING METADATA FROM 'database_name' VIRTUAL,  -- Baca nama database.
      table_name STRING METADATA  FROM 'table_name' VIRTUAL, -- Baca nama tabel.
      operation_ts TIMESTAMP_LTZ(3) METADATA FROM 'op_ts' VIRTUAL, -- Baca waktu perubahan.
      op_type STRING METADATA FROM 'op_type' VIRTUAL, -- Baca jenis perubahan.
      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_.*', -- Ekspresi reguler untuk mencocokkan beberapa database yang di-shard.
      'table-name' = 'orders_.*'   -- Ekspresi reguler untuk mencocokkan beberapa tabel yang di-shard.
    );
    
    INSERT INTO holo_orders SELECT * FROM mysql_orders;

    Berdasarkan kode di atas, jika parameter `scan.read-changelog-as-append-only.enabled` diatur ke true dalam klausa WITH, hasil output bervariasi tergantung pada pengaturan primary key tabel downstream:

    • Jika primary key tabel downstream adalah `order_id`, hasil output hanya berisi perubahan terakhir untuk setiap primary key di tabel upstream. Untuk data yang perubahan terakhirnya untuk primary key adalah operasi delete, Anda dapat melihat catatan di tabel downstream dengan primary key yang sama dan `op_type` -D.

    • Jika primary key tabel downstream adalah `order_id`, `operation_ts`, dan `op_type`, hasil output berisi perubahan lengkap untuk setiap primary key di tabel upstream.

  • Dukungan ekspresi reguler

    Tabel sumber CDC MySQL mendukung penggunaan ekspresi reguler dalam nama tabel atau nama database untuk mencocokkan beberapa tabel atau database. Contoh kode berikut menunjukkan cara menentukan beberapa tabel menggunakan ekspresi reguler.

    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})', -- Ekspresi reguler untuk mencocokkan beberapa database.
      'table-name' = '(t[5-8]|tt)' -- Ekspresi reguler untuk mencocokkan beberapa tabel.
    );

    Ekspresi reguler dalam contoh dijelaskan sebagai berikut:

    • `^(test).*` adalah contoh pencocokan prefiks. Ekspresi ini dapat mencocokkan nama database yang dimulai dengan "test", seperti "test1" atau "test2".

    • `.*[p$]` adalah contoh pencocokan sufiks. Ekspresi ini dapat mencocokkan nama database yang diakhiri dengan "p", seperti "cdcp" atau "edcp".

    • `txc` adalah pencocokan spesifik. Ekspresi ini dapat mencocokkan nama database yang persis "txc".

    Saat CDC MySQL mencocokkan nama tabel yang memenuhi syarat sepenuhnya, CDC MySQL menggunakan pola `database-name.table-name` untuk mengidentifikasi tabel secara unik. Misalnya, pola `(^(test).*|^(tpc).*|txc|.*[p$]|t{2}).(t[ 5-8]|tt)` dapat mencocokkan tabel seperti `txc.tt` dan `test2.test5` dalam database.

    Penting

    Dalam konfigurasi pekerjaan SQL, parameter `table-name` dan `database-name` tidak mendukung penggunaan koma (,) untuk menentukan beberapa tabel atau database.

    • Untuk mencocokkan beberapa tabel atau menggunakan beberapa ekspresi reguler, hubungkan dengan tanda vertikal (|) dan sertakan dalam tanda kurung. Misalnya, untuk membaca tabel `user` dan `product`, Anda dapat mengatur `table-name` ke (user|product).

    • Jika ekspresi reguler berisi koma, Anda harus menulis ulang menggunakan operator tanda vertikal (|). Misalnya, ekspresi reguler mytable_\d{1, 2} harus ditulis ulang menjadi setara (mytable_\d{1}|mytable_\d{2}) untuk menghindari penggunaan koma.

  • Kontrol konkurensi

    Konektor MySQL mendukung pembacaan data penuh multithread, yang dapat meningkatkan efisiensi pemuatan data. Bersamaan dengan fitur tuning otomatis Autopilot di konsol Realtime Compute for Apache Flink, konektor dapat secara otomatis melakukan skala-masuk selama fase inkremental setelah pembacaan multithread selesai untuk menghemat sumber daya komputasi.

    Di konsol pengembangan Realtime Compute for Apache Flink, Anda dapat mengatur konkurensi pekerjaan dalam mode dasar atau mode ahli di halaman Konfigurasi Sumber Daya.

    • Konkurensi yang diatur dalam mode dasar adalah konkurensi global untuk seluruh pekerjaan.

      Misalnya, saat parallelism diatur ke 8 dalam mode dasar, server-id dalam klausa WITH SQL harus dikonfigurasi sebagai rentang kontinu (seperti '404-412').

    • Mode ahli mendukung pengaturan konkurensi untuk VERTEX tertentu sesuai kebutuhan.

    Untuk informasi selengkapnya tentang konfigurasi sumber daya, lihat Konfigurasi informasi penerapan untuk pekerjaan.

    Penting

    Baik dalam mode dasar maupun mode ahli, saat Anda mengatur konkurensi, rentang server ID yang dideklarasikan dalam tabel harus lebih besar dari atau sama dengan konkurensi pekerjaan. Misalnya, jika rentang server ID adalah `5404-5412`, terdapat sembilan server ID unik. Oleh karena itu, konkurensi pekerjaan dapat diatur hingga maksimum 9. Pekerjaan berbeda untuk instans MySQL yang sama tidak boleh memiliki rentang server ID yang tumpang tindih. Artinya, setiap pekerjaan harus secara eksplisit dikonfigurasi dengan server ID atau rentang server ID yang berbeda.

  • Autopilot skala-masuk otomatis

    Fase data penuh mengumpulkan sejumlah besar data historis. Untuk meningkatkan efisiensi pembacaan, data historis biasanya dibaca secara paralel. Dalam fase log biner inkremental, karena jumlah data log biner kecil dan untuk memastikan urutan global, pembacaan single-threaded biasanya sudah cukup. Persyaratan sumber daya yang berbeda dari fase penuh dan inkremental dapat diseimbangkan untuk kinerja dan sumber daya menggunakan fitur tuning otomatis.

    Tuning otomatis memantau trafik setiap tugas Sumber CDC MySQL. Saat memasuki fase log biner, jika hanya satu tugas yang bertanggung jawab atas pembacaan log biner dan tugas lainnya idle, tuning otomatis secara otomatis mengurangi jumlah CU dan konkurensi sumber. Untuk mengaktifkan tuning otomatis, atur mode tuning otomatis ke Active di halaman O&M pekerjaan.

    Catatan

    Interval pemicu minimum default untuk mengurangi konkurensi adalah 24 jam. Untuk informasi selengkapnya tentang parameter dan detail tuning otomatis, lihat Konfigurasi tuning otomatis.

  • Mode startup

    Gunakan item konfigurasi `scan.startup.mode` untuk menentukan mode startup tabel sumber CDC MySQL. Opsi-opsinya meliputi:

    • initial (default): Saat startup pertama atau startup tanpa status, melakukan pembacaan penuh tabel database lalu beralih ke mode inkremental untuk membaca log biner.

    • earliest-offset: Melewati fase snapshot dan mulai membaca dari offset log biner paling awal yang tersedia.

    • latest-offset: Melewati fase snapshot dan mulai membaca dari akhir log biner. Dalam mode ini, tabel sumber hanya dapat membaca perubahan data yang terjadi setelah pekerjaan dimulai.

    • specific-offset: Melewati fase snapshot dan mulai membaca dari offset log biner tertentu. Offset dapat ditentukan oleh nama file log biner dan posisi, atau oleh set GTID.

    • timestamp: Melewati fase snapshot dan mulai membaca event log biner dari timestamp tertentu.

    Startup tanpa status tidak menggunakan status apa pun. Konektor sumber memperlakukannya sebagai startup pertama, sehingga scan.startup.mode berlaku kembali. Untuk informasi selengkapnya tentang mode startup penerapan, lihat Mulai penerapan.

    Contoh penggunaan:

    CREATE TABLE mysql_source (...) WITH (
        'connector' = 'mysql-cdc',
        'scan.startup.mode' = 'earliest-offset', -- Mulai dari offset paling awal.
        'scan.startup.mode' = 'latest-offset', -- Mulai dari offset terbaru.
        'scan.startup.mode' = 'specific-offset', -- Mulai dari offset tertentu.
        'scan.startup.mode' = 'timestamp', -- Mulai dari timestamp tertentu.
        'scan.startup.specific-offset.file' = 'mysql-bin.000003', -- Tentukan nama file log biner dalam mode specific-offset.
        'scan.startup.specific-offset.pos' = '4', -- Tentukan posisi log biner dalam mode specific-offset.
        'scan.startup.specific-offset.gtid-set' = '24DA167-0C0C-11E8-8442-00059A3C7B00:1-19', -- Tentukan set GTID dalam mode specific-offset.
        'scan.startup.timestamp-millis' = '1667232000000' -- Tentukan timestamp startup dalam mode timestamp.
        ...
    )
    Penting
    • Sumber MySQL mencetak offset saat ini ke log pada level INFO selama checkpoint. Awalan log adalah Binlog offset on checkpoint {checkpoint-id}. Log ini dapat membantu Anda memulai pekerjaan dari offset checkpoint tertentu.

    • Jika tabel yang dibaca telah mengalami perubahan skema, memulai dari `earliest-offset`, `specific-offset`, atau `timestamp` dapat menyebabkan error. Hal ini karena pembaca Debezium secara internal menyimpan skema tabel terbaru, dan data awal dengan skema yang tidak cocok tidak dapat diurai dengan benar.

  • Tentang tabel sumber CDC tanpa primary key

    • Menggunakan tabel tanpa primary key memerlukan pengaturan `scan.incremental.snapshot.chunk.key-column`, dan hanya kolom non-null yang dapat dipilih.

    • Semantik pemrosesan untuk tabel sumber CDC tanpa primary key ditentukan oleh perilaku kolom yang ditentukan oleh `scan.incremental.snapshot.chunk.key-column`:

      • Jika kolom yang ditentukan tidak diperbarui, semantik tepat-sekali dapat dijamin.

      • Jika kolom yang ditentukan diperbarui, hanya semantik setidaknya-sekali yang dapat dijamin. Namun, Anda dapat memastikan kebenaran data dengan menggabungkannya dengan downstream, menentukan primary key downstream, dan menggunakan operasi idempoten.

  • Baca log cadangan Alibaba Cloud ApsaraDB RDS for MySQL

    Tabel sumber CDC MySQL mendukung pembacaan log cadangan Alibaba Cloud ApsaraDB RDS for MySQL. Hal ini berguna dalam skenario di mana fase data penuh memakan waktu lama dan file log biner lokal telah dihapus secara otomatis, tetapi file cadangan yang diunggah secara otomatis atau manual masih ada.

    Contoh penggunaan:

    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'
        ...
    )
  • Aktifkan penggunaan ulang Sumber CDC

    Dalam pekerjaan yang sama, beberapa tabel sumber CDC MySQL menjalankan beberapa klien log biner. Jika semua tabel sumber berada dalam instans yang sama, hal ini akan meningkatkan beban pada database. Untuk informasi selengkapnya, lihat FAQ CDC MySQL.

    Solusi

    Versi VVR 8.0.7 dan yang lebih baru mendukung penggunaan ulang sumber CDC MySQL. Fitur ini menggabungkan tabel sumber CDC MySQL yang dapat digabungkan. Penggabungan terjadi saat konfigurasi tabel sumber identik, kecuali untuk nama database, nama tabel, dan server-id. Mesin secara otomatis menggabungkan sumber CDC MySQL dalam pekerjaan yang sama.

    Prosedur

    1. Gunakan perintah SET dalam pekerjaan SQL Anda:

      SET 'table.optimizer.source-merge.enabled' = 'true';
      
      # (Untuk VVR 8.0.8 dan 8.0.9) Atur juga item ini:
      SET 'sql-gateway.exec-plan.enabled' = 'false';
      VVR 11.1 dan versi yang lebih baru memiliki penggunaan ulang diaktifkan secara default.
    2. Mulai pekerjaan tanpa status. Karena memodifikasi konfigurasi penggunaan ulang mengubah topologi pekerjaan, Anda harus memulai pekerjaan tanpa status. Jika tidak, pekerjaan mungkin gagal dimulai atau Anda mungkin kehilangan data. Jika sumber digabung, Anda dapat melihat node MergetableSourceScan dalam topologi.

    Penting
    • Setelah Anda mengaktifkan penggunaan ulang, jangan nonaktifkan operator chaining. Jika Anda mengatur pipeline.operator-chaining ke false, hal ini meningkatkan overhead serialisasi dan deserialisasi data. Semakin banyak sumber yang digabung, semakin besar overhead-nya.

    • Di VVR 8.0.7, menonaktifkan operator chaining menyebabkan masalah serialisasi.

Mempercepat pembacaan log biner

Saat Anda menggunakan konektor MySQL sebagai tabel sumber atau sumber data ingestion data, konektor tersebut mengurai file log biner untuk menghasilkan berbagai pesan perubahan selama fase inkremental. File log biner mencatat semua perubahan tabel dalam format biner. Anda dapat mempercepat penguraian file log biner dengan cara-cara berikut.

  • Aktifkan penguraian paralel dan filter penguraian (Fitur ini memerlukan Realtime Compute for Apache Flink dengan Ververica Runtime (VVR) 8.0.7 atau versi yang lebih baru. Fitur ini tidak tersedia di edisi komunitas konektor CDC MySQL.)

    • Aktifkan opsi scan.only.deserialize.captured.tables.changelog.enabled untuk mengurai event perubahan hanya untuk tabel yang ditentukan.

    • Aktifkan opsi scan.parallel-deserialize-changelog.enabled untuk menggunakan beberapa thread guna mengurai file log biner dan mengirimkan event ke antrian konsumen secara berurutan. Saat Anda mengaktifkan opsi ini, Anda biasanya perlu meningkatkan TaskManager CPU juga.

  • Optimalkan parameter Debezium

    debezium.max.queue.size: 162580
    debezium.max.batch.size: 40960
    debezium.poll.interval.ms: 50
    • debezium.max.queue.size: Jumlah maksimum catatan yang dapat ditampung oleh antrian pemblokiran. Saat Debezium membaca aliran event dari database, Debezium menempatkan event dalam antrian pemblokiran sebelum menuliskannya ke downstream. Nilai default adalah 8192.

    • debezium.max.batch.size: Jumlah maksimum event yang diproses konektor dalam setiap iterasi. Nilai default adalah 2048.

    • debezium.poll.interval.ms: Jumlah milidetik yang harus ditunggu konektor sebelum meminta event perubahan baru. Nilai default adalah 1000 milidetik, atau 1 detik.

Contoh penggunaan:

CREATE TABLE mysql_source (...) WITH (
    'connector' = 'mysql-cdc',
    -- Konfigurasi Debezium
    'debezium.max.queue.size' = '162580',
    'debezium.max.batch.size' = '40960',
    'debezium.poll.interval.ms' = '50',
    -- Aktifkan filter penguraian
    'scan.only.deserialize.captured.tables.changelog.enabled' = 'true',  -- Hanya uraikan event perubahan tabel yang ditentukan.
    ...
)
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
  # Konfigurasi Debezium
  debezium.max.queue.size: 162580
  debezium.max.batch.size: 40960
  debezium.poll.interval.ms: 50
  # Aktifkan filter penguraian
  scan.only.deserialize.captured.tables.changelog.enabled: true

Kapasitas konsumsi log biner Edisi Perusahaan CDC MySQL adalah 85 MB/detik, sekitar dua kali lipat dari versi komunitas open source. Saat kecepatan pembuatan file log biner melebihi 85 MB/detik (yaitu, satu file 512 MB setiap 6 detik), latensi pekerjaan Flink terus meningkat. Latensi pemrosesan secara bertahap berkurang setelah kecepatan pembuatan file log biner melambat. Jika file log biner berisi transaksi besar, latensi pemrosesan mungkin meningkat sementara. Latensi berkurang setelah log untuk transaksi tersebut dibaca.

Diagnosis latensi data untuk mengoptimalkan throughput pekerjaan

Jika Anda mengalami latensi data selama fase inkremental, analisis masalah dengan mengikuti langkah-langkah berikut:

  1. Periksa metrik currentFetchEventTimeLag dan currentEmitEventTimeLag di halaman Ikhtisar. Metrik currentFetchEventTimeLag merepresentasikan latensi dalam membaca data dari log biner. Metrik currentEmitEventTimeLag merepresentasikan latensi dalam membaca data untuk tabel yang relevan dengan pekerjaan dari log biner.

    Skenario

    Deskripsi

    currentFetchEventTimeLag rendah, sedangkan currentEmitEventTimeLag tinggi dan jarang diperbarui.

    currentFetchEventTimeLag yang rendah menunjukkan bahwa menarik log biner dari database efisien. Namun, log biner berisi sedikit data untuk tabel yang perlu dibaca pekerjaan. Oleh karena itu, currentEmitEventTimeLag jarang diperbarui. Ini adalah perilaku yang diharapkan.

    Kedua currentFetchEventTimeLag dan currentEmitEventTimeLag tinggi.

    Hal ini menunjukkan bahwa tabel sumber memiliki kinerja baca yang buruk. Anda dapat melanjutkan ke langkah-langkah berikutnya dalam bagian ini untuk optimasi.

  2. Backpressure dapat mengurangi laju pengiriman data sumber ke operator downstream. Anda mungkin mengamati bahwa sourceIdleTime meningkat secara berkala, dan kedua currentFetchEventTimeLag serta currentEmitEventTimeLag terus bertambah. Untuk mengatasi hal ini, tingkatkan parallelisme node tempat backpressure berasal.

  3. Periksa metrik TM CPU Usage di halaman CPU dan metrik TM GC Time di halaman JVM untuk menentukan apakah sumber daya CPU atau memori tidak mencukupi. Anda dapat meningkatkan sumber daya pekerjaan untuk mengoptimalkan kinerja baca. Anda juga dapat mengaktifkan parameter mini-batch untuk meningkatkan throughput. Untuk informasi selengkapnya, lihat Teknik Optimasi SQL Flink Berkinerja Tinggi.

  4. Jika operator SinkUpsertMaterializer dengan state besar ada dalam pekerjaan, hal ini dapat memengaruhi kinerja baca. Pertimbangkan untuk meningkatkan parallelisme pekerjaan atau menghindari operator SinkUpsertMaterializer. Untuk informasi selengkapnya, lihat Hindari penggunaan SinkUpsertMaterializer. Menghapus operator SinkUpsertMaterializer dari pekerjaan yang sudah ada memerlukan restart tanpa status. Hal ini karena topologi pekerjaan berubah, dan memulai dari status yang ada dapat menyebabkan pekerjaan gagal atau mengakibatkan kehilangan data.

Tetapkan server ID untuk menghindari konflik binlog

Setiap klien yang menyinkronkan data dari database memiliki ID unik yang disebut server ID. Jika pekerjaan berbeda menggunakan server ID yang sama, konflik dapat terjadi dan menyebabkan kegagalan pekerjaan. Kami menyarankan agar Anda memberikan server ID berbeda untuk setiap sumber data CDC MySQL.

  • Cara mengonfigurasi server ID

    Anda dapat menentukan server ID dalam pernyataan DDL tabel Flink atau dengan menggunakan Petunjuk SQL.

    Kami menyarankan menggunakan Petunjuk SQL untuk mengonfigurasi server ID alih-alih menentukannya dalam klausa WITH DDL tabel. Untuk informasi selengkapnya, lihat Petunjuk SQL.

  • Konfigurasi server ID untuk skenario berbeda

    • Snapshot inkremental dinonaktifkan atau parallelisme adalah 1

      Jika snapshot inkremental dinonaktifkan atau parallelisme adalah 1, Anda dapat menentukan satu server ID.

      SELECT * FROM source_table /*+ OPTIONS('server-id'='123456') */ ;
    • Snapshot inkremental diaktifkan dan parallelisme lebih dari 1

      Saat snapshot inkremental diaktifkan dan parallelisme lebih dari 1, Anda harus menentukan rentang server ID. Jumlah server ID yang tersedia dalam rentang harus minimal sama dengan parallelisme. Misalnya, jika parallelisme adalah 3, Anda dapat menggunakan konfigurasi berikut:

      SELECT * FROM source_table /*+ OPTIONS('server-id'='123456-123458') */ ;
    • Sinkronisasi data dengan CTAS

      Saat Anda menyinkronkan data dengan menggunakan CREATE TABLE AS (CTAS), sumber data CDC dengan konfigurasi identik secara otomatis digabung dan digunakan kembali. Dalam kasus ini, Anda dapat memberikan server ID yang sama ke beberapa sumber data CDC. Untuk informasi selengkapnya, lihat Contoh 4: Beberapa Pernyataan CTAS.

    • Pekerjaan dengan beberapa tabel sumber CDC MySQL (non-CTAS)

      Jika pekerjaan berisi beberapa tabel sumber CDC MySQL, tidak menggunakan pernyataan CTAS, dan penggunaan ulang sumber dinonaktifkan, Anda harus memberikan server ID berbeda untuk setiap tabel sumber CDC. Untuk informasi selengkapnya, lihat Aktifkan penggunaan ulang sumber untuk mengurangi koneksi log biner. Demikian pula, jika snapshot inkremental diaktifkan dan parallelisme lebih dari 1, Anda harus menentukan rentang server ID.

      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;

Tetapkan parameter chunk untuk mengoptimalkan penggunaan memori

Saat tabel sumber CDC MySQL dimulai, tabel tersebut melakukan pemindaian tabel penuh, membagi tabel menjadi beberapa chunk berdasarkan primary key, dan mencatat posisi log biner saat ini. Pekerjaan kemudian menggunakan algoritma snapshot inkremental untuk membaca data dari setiap chunk secara berurutan dengan menggunakan pernyataan SELECT. Pekerjaan secara berkala melakukan checkpoint untuk mencatat chunk yang telah selesai. Jika terjadi failover, pekerjaan melanjutkan membaca dari chunk pertama yang belum selesai. Setelah semua chunk dibaca, pekerjaan beralih ke membaca perubahan inkremental dari posisi log biner yang sebelumnya dicatat. Pekerjaan Flink melakukan checkpoint berkala untuk menyimpan posisi log biner. Jika terjadi failover, pekerjaan melanjutkan pemrosesan dari posisi terakhir yang disimpan, sehingga mencapai semantik tepat-sekali.

Untuk detail lebih lanjut tentang algoritma snapshot inkremental, lihat Konektor CDC MySQL.

Untuk tabel dengan primary key kolom tunggal, chunk dibagi berdasarkan kunci tersebut secara default. Untuk tabel dengan primary key komposit, kolom pertama dari primary key digunakan untuk pemisahan secara default. Ververica Runtime (VVR) 6.0.7 dan versi yang lebih baru mendukung pembacaan tabel sumber tanpa primary key. Anda harus mengatur parameter scan.incremental.snapshot.chunk.key-column untuk menentukan kolom non-null untuk pemisahan.

Optimasi parameter chunk

Data dan metadata chunk disimpan dalam memori, yang kadang-kadang dapat menyebabkan error kehabisan memori (OOM). Anda dapat menyesuaikan parameter berdasarkan komponen mana yang mengalami error OOM:

  • JobManager

    JobManager menyimpan metadata untuk semua chunk. Jumlah chunk yang berlebihan dapat menyebabkan error OOM. Untuk mengatasi hal ini, tingkatkan nilai scan.incremental.snapshot.chunk.size untuk mengurangi jumlah chunk. Atau, Anda dapat meningkatkan memori heap JobManager dengan mengatur jobmanager.memory.heap.size dalam konfigurasi runtime Anda. Untuk informasi selengkapnya, lihat Konfigurasi Parameter Flink.

  • TaskManager

    • TaskManager membaca data untuk setiap chunk. Jika chunk berisi terlalu banyak baris, error OOM dapat terjadi. Untuk mengatasi hal ini, kurangi nilai scan.incremental.snapshot.chunk.size untuk mengurangi jumlah baris per chunk. Anda juga dapat meningkatkan memori heap TaskManager dengan meningkatkan nilai TaskManager Memory dalam konfigurasi runtime Anda.

    • Di VVR 8.0.8 dan versi sebelumnya, chunk terakhir mungkin berisi sejumlah besar data, yang dapat menyebabkan TaskManager mengalami error OOM. Kami menyarankan untuk meningkatkan ke VVR 8.0.9 atau versi yang lebih baru untuk menghindari masalah ini.

    • Untuk tabel sumber CDC MySQL dengan primary key komposit, chunk dibagi berdasarkan kolom pertama kunci secara default. Jika data sangat miring, dengan banyak baris yang memiliki nilai yang sama dalam kolom tersebut, chunk untuk nilai tersebut dapat menjadi sangat besar dan menyebabkan error OOM di TaskManager. Anda dapat mengatur scan.incremental.snapshot.chunk.key-column untuk menentukan kolom berbeda dari primary key untuk pemisahan.

Mempercepat pembacaan dalam fase snapshot

Selama fase snapshot, tabel sumber MySQL membaca data snapshot melalui koneksi JDBC. Gunakan metode berikut untuk mempercepat pembacaan selama fase ini.

  1. Tingkatkan parallelisme sumber untuk mempercepat pembacaan selama fase snapshot.

  2. Tingkatkan nilai scan.incremental.snapshot.chunk.size untuk mengambil lebih banyak data dalam satu chunk.

  3. Jika tabel hasil downstream memiliki primary key dan mendukung penulisan idempoten, Anda dapat mengaktifkan scan.incremental.snapshot.backfill.skip untuk melewati pembacaan log biner untuk bagian backfill. Hal ini mempercepat pemrosesan selama fase snapshot.

Aktifkan penggunaan ulang sumber untuk mengurangi koneksi binlog

Saat pekerjaan mencakup beberapa tabel sumber MySQL, Anda dapat mengaktifkan penggunaan ulang sumber untuk mengurangi beban database dengan berbagi satu koneksi log biner. Fitur ini hanya tersedia di Realtime Compute for Apache Flink dan tidak didukung di edisi komunitas konektor CDC MySQL.

Aktifkan fitur penggunaan ulang sumber dalam pekerjaan SQL dengan menggunakan perintah SET:

SET 'table.optimizer.source-merge.enabled' = 'true';

Kami menyarankan mengaktifkan penggunaan ulang sumber hanya untuk pekerjaan baru. Jika Anda mengaktifkan penggunaan ulang sumber untuk pekerjaan yang sudah ada, Anda harus melakukan restart tanpa status. Hal ini karena penggunaan ulang sumber mengubah topologi pekerjaan, dan memulai dari status yang ada dapat menyebabkan pekerjaan gagal atau mengakibatkan kehilangan data.

Setelah Anda mengaktifkan penggunaan ulang sumber, tabel sumber MySQL dengan parameter konfigurasi yang sama digabung. Jika semua tabel sumber dalam pekerjaan Anda memiliki konfigurasi yang sama, jumlah koneksi log biner dihitung sebagai berikut:

  • Selama fase snapshot, jumlah koneksi log biner sama dengan parallelisme sumber.

  • Selama fase inkremental, jumlah koneksi log biner adalah 1.

Penting
  • Di VVR 8.0.8 dan 8.0.9, Anda juga harus mengatur SET 'sql-gateway.exec-plan.enabled' = 'false'; saat mengaktifkan penggunaan ulang sumber CDC.

  • Setelah mengaktifkan penggunaan ulang sumber CDC, jangan mengatur opsi pekerjaan pipeline.operator-chaining ke false. Memutus rantai operator menambahkan overhead serialisasi dan deserialisasi untuk data yang dikirim dari sumber ke operator downstream. Semakin banyak sumber yang digabung, semakin besar overhead-nya.

  • Di Ververica Runtime (VVR) 8.0.7, mengatur pipeline.operator-chaining ke false menyebabkan masalah serialisasi.

Baca binlog arsip dari OSS

Saat Anda menggunakan instans ApsaraDB RDS for MySQL sebagai sumber data, Anda dapat membaca cadangan log yang disimpan di OSS. Jika file yang sesuai dengan timestamp atau posisi log biner yang ditentukan disimpan di OSS, Flink secara otomatis menarik file log dari OSS ke kluster. Jika file disimpan secara lokal di database, Flink secara otomatis beralih ke pembacaan melalui koneksi database. Fitur ini hanya tersedia di Realtime Compute for Apache Flink dan tidak didukung di edisi komunitas konektor CDC MySQL.

Untuk mengaktifkan pembacaan dari cadangan log OSS, Anda harus mengonfigurasi parameter koneksi ApsaraDB RDS for MySQL. Contoh:

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',  // ID instans database.
    'rds.main-db-id' = '12345678', // ID database utama.
    'rds.endpoint' = 'rds.aliyuncs.com'
    ...
)

FAQ

Untuk informasi selengkapnya tentang masalah yang mungkin Anda temui saat menggunakan tabel sumber CDC, lihat FAQ CDC.