CDC?YAML?在阿里云的最佳實踐

摘要:本文投稿自阿里云開源大數據平臺數據通道團隊,主要介紹了 Flink CDC YAML 在實時計算Flink版的最佳實踐。內容分為以下五個部分:

  1. CDC YAML 簡介
  1. CDC YAML 核心能力
  1. CDC YAML 應用場景
  1. 阿里云 Flink CDC 企業級功能
  1. 十分鐘在阿里云免費實現一個 CDC YAML 作業

CDC YAML 簡介

CDC YAML 是 Flink CDC [1] 提供的簡單易用的數據集成 API,用于幫助用戶快速構建功能強大的數據同步鏈路,實時地同步業務數據庫中的數據變更和表結構變更實時同步到數據倉庫,數據湖以及其他下游系統。CDC YAML 上手門檻較低,即使沒有研發背景和Flink基礎,用戶也可以較快地完成數據的同步和ETL加工,快速完成數據的實時入湖入倉,加速數據分析效率。

阿里云實時計算 Flink 版基于 Flink CDC 提供了數據攝入 CDC YAML 開發[2],通過開發 YAML 作業的方式有效地實現將數據從源端同步到目標端的數據攝入工作,幫助用戶在云上高效完成數據入湖入倉。

CDC YAML 核心能力

CDC YAML 主要用于同步數據庫變更到其他系統,同步前支持對數據進行簡單處理和清洗,幫助用戶完成秒級的數據同步工作,構建入湖入倉作業,主要的核心能力有以下幾個方面:

  1. 端到端 Data Pipeline:支持秒級同步數據變更和結構變更到其他系統,用戶可以快速構建自己的數據湖和數據倉庫,為數據分析提供基礎。

  2. 細粒度 Schema Evolution:出于數據安全的考慮,部分高危操作(如刪除表,清空數據等)用戶不希望同步到目標端。CDC YAML 提供細粒度 Schema 變更的能力,幫助用戶限制可同步的數據變更類型。

  3. 全增量一體化 CDC 讀取:CDC YAML提供了全量和增量的一體化讀取能力,全量數據讀取完成后自動切換增量讀取,無需用戶操作。

  4. 豐富的 Transform 支持 :支持對數據字段進行處理后同步到下游,如添加額外計算列,添加元數據、只同步某些列、重新指定主鍵或分區鍵等場景。CDC YAML 內置了豐富的函數,用戶也可以自行開發UDF,兼容 Flink 的 UDF。支持對數據源數據進行過濾,跳過不需要的數據,完成對無用數據和臟數據的清洗工作。

  5. 靈活的 Route 策略控制:支持自定義數據源的表同步到目標端表的映射關系,支持一對一、一對多和多對一的多種映射關系,幫助用戶靈活指定目標端表名,支持分庫分表合并的場景。

  6. 完善的 作業 Metric 支持:為了便于判斷作業運行的階段和狀態,CDC YAML 提供了豐富的指標。如全量階段未處理/已處理的表數量,全量階段未處理/已處理的分片數量、最新一條數據的時間戳等。

阿里云實時計算 Flink 結合用戶需求,YAML 作業支持了更多的上下游,支持同步到常見的數據湖和數據倉庫,已經支持的上下游如下。

連接器 支持類型
Source Sink
MySQL ×
消息隊列Kafka
實時數倉Hologres ×
Upsert Kafka ×
Print ×
StarRocks ×
流式數據湖倉Paimon ×

YAML 作業 與 SQL / DataStream 作業對比

Flink 提供了兩種級別的作業開發方式:SQL 和 DataStream,下面會比較一下相比于 SQL 和 DataStream來說 CDC YAML 開發有什么優勢。

CDC YAML 作業相比 SQL 主要有以下一些優勢:

數據攝入YAML SQL
自動識別 Schema,支持整庫同步 需要人工寫 Create Table 和 Insert 語句
支持細粒度 Schema 變更 不支持 Schema 變更
支持原始 Changelog 同步 破壞原始 Changelog 結構
支持讀寫多個表 讀寫單個表

CDC YAML 作業相比 DataStream 作業的優勢如下:

數據攝入YAML DataStream
為各級別用戶設計,不只是專家 需要熟悉Java和分布式系統
隱藏底層細節,便于開發 需要熟悉Flink框架
YAML格式容易理解和學習 需要了解Maven等工具管理相關依賴
已有作業方便復用 難以復用已有代碼

CDC YAML 應用場景

CDC YAML 能夠支持用戶數據同步多種應用場景,下面簡單介紹一些常見的使用場景,以及應該如何使用 CDC YAML 解決這些問題。

整庫同步,構建數據湖倉

整庫同步是數據同步最常見的一種使用場景,將存在數據庫的數據同步到數據湖或數據倉庫中,為后續的數據分析提供基礎。

如下的數據攝入YAML作業可以完成同步整個app_db數據庫到Paimon的工作,快速完成數據入湖的同步工作。

<pre class="md-fences md-end-block ty-contain-cm modeLoaded" spellcheck="false" lang="yaml" cid="n124" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: var(--monospace); font-size: 0.9em; display: block; break-inside: avoid; text-align: left; white-space: normal; background-image: inherit; background-position: inherit; background-size: inherit; background-repeat: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: rgb(248, 248, 248); position: relative !important; border: 1px solid rgb(231, 234, 237); border-radius: 3px; padding: 8px 4px 6px; margin-bottom: 15px; margin-top: 15px; width: inherit; caret-color: rgb(51, 51, 51); color: rgb(51, 51, 51); font-style: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: auto; text-indent: 0px; text-transform: none; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;">source:
type: mysql
name: MySQL Source
hostname: {secret_values.mysql-hostname} port: 3306 username: flink password:{secret_values.mysql-password}
tables: app_db..*
server-id: 18601-18604

sink:
type: paimon
name: Paimon Sink
catalog.properties.metastore: filesystem
catalog.properties.warehouse: oss://test-bucket/warehouse
catalog.properties.fs.oss.endpoint: oss-cn-beijing-internal.aliyuncs.com
catalog.properties.fs.oss.accessKeyId: {secret_values.test_ak} catalog.properties.fs.oss.accessKeySecret:{secret_values.test_sk}</pre>

在整庫同步中,有時需要重新定義同步到目標端的表名,防止發生沖突。或者需要做一些簡單的數據處理和數據過濾工作,這時需要結合 transform 模塊和 route 模塊完成,transform 模塊負責數據處理工作,route 模塊負責數據分發工作。

例如在如下的整庫同步作業中,為 app_db.customers 表添加額外的計算列 upper 和數據庫名這個元數據列db,同時在目標端為三張表名添加版本后綴。

<pre class="md-fences md-end-block ty-contain-cm modeLoaded" spellcheck="false" lang="yaml" cid="n127" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: var(--monospace); font-size: 0.9em; display: block; break-inside: avoid; text-align: left; white-space: normal; background-image: inherit; background-position: inherit; background-size: inherit; background-repeat: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: rgb(248, 248, 248); position: relative !important; border: 1px solid rgb(231, 234, 237); border-radius: 3px; padding: 8px 4px 6px; margin-bottom: 15px; margin-top: 15px; width: inherit; caret-color: rgb(51, 51, 51); color: rgb(51, 51, 51); font-style: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: auto; text-indent: 0px; text-transform: none; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;">source:
type: mysql
name: MySQL Source
hostname: {secret_values.mysql-hostname} port: 3306 username: flink password:{secret_values.mysql-password}
tables: app_db..*
server-id: 18601-18604

transform:

  • source-table: app_db.customers
    projection: *, UPPER(name) AS upper, schema_name AS db

route:

  • source-table: app_db.customers
    sink-table: app_db.customers_v1
  • source-table: app_db.products
    sink-table: app_db.products_v0
  • source-table: app_db.orders
    sink-table: app_db.orders_v0

sink:
type: paimon
name: Paimon Sink
catalog.properties.metastore: filesystem
catalog.properties.warehouse: oss://test-bucket/warehouse
catalog.properties.fs.oss.endpoint: oss-cn-beijing-internal.aliyuncs.com
catalog.properties.fs.oss.accessKeyId: {secret_values.test_ak} catalog.properties.fs.oss.accessKeySecret:{secret_values.test_sk}</pre>

CDC YAML提供了豐富的內置函數,還支持用戶自定義函數來完成復雜的數據處理。CDC YAML 對Flink SQL 的自定義函數進行了兼容,大部分的 Flink 自定義函數可以在數據攝入YAML中直接使用。

分庫分表合并

在高并發和大數據量場景下,用戶可能選擇將一個表拆分為多個庫的多張表存儲數據,對于分庫分表在分析數據前,希望將數據合并為數據湖倉中的一張表。

假設app_db數據庫中只有customers_v0,customers_v1和customers_v2三張表,如下 CDC YAML 作業可以將這三張分表合并為一張表customers,完成分庫分表的數據同步。

<pre class="md-fences md-end-block ty-contain-cm modeLoaded" spellcheck="false" lang="yaml" cid="n132" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: var(--monospace); font-size: 0.9em; display: block; break-inside: avoid; text-align: left; white-space: normal; background-image: inherit; background-position: inherit; background-size: inherit; background-repeat: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: rgb(248, 248, 248); position: relative !important; border: 1px solid rgb(231, 234, 237); border-radius: 3px; padding: 8px 4px 6px; margin-bottom: 15px; margin-top: 15px; width: inherit; caret-color: rgb(51, 51, 51); color: rgb(51, 51, 51); font-style: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: auto; text-indent: 0px; text-transform: none; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;">source:
type: mysql
name: MySQL Source
hostname: {secret_values.mysql-hostname} port: 3306 username: flink password:{secret_values.mysql-password}
tables: app_db.customers.*
server-id: 18601-18604

route:

  • source-table: app_db.customers.*
    sink-table: app_db.customers

sink:
type: paimon
name: Paimon Sink
catalog.properties.metastore: filesystem
catalog.properties.warehouse: oss://test-bucket/warehouse
catalog.properties.fs.oss.endpoint: oss-cn-beijing-internal.aliyuncs.com
catalog.properties.fs.oss.accessKeyId: {secret_values.test_ak} catalog.properties.fs.oss.accessKeySecret:{secret_values.test_sk}</pre>

原始 Binlog 數據同步 Kafka,對接已有系統

用戶除了整庫整表同步,有些場景下需要獲取到詳細的 Changelog 變更歷史,而不是變更后的數據。將 Binlog 同步到 Kafka,結合分布式消息隊列 Kafka 可以提高數據消費速度,解決消費同一個 Binlog 導致的數據瓶頸。后續能夠使用 Kafka 里的 Binlog 歷史, 進行數據回放和數據審計工作,或者消費 Kafka 實時監控數據變更歷史,從而觸發通知和報警。

由于 Flink SQL 作業里傳遞的數據結構是 RowData,會將一條 Update 操作拆分為 Update before 和 Update after 兩條消息發送,破壞了 Changelog 原有的結構,無法完成原始 Binlog 數據同步。CDC YAML 使用了 SchemaChangeEvent 和 DataChangeEvent 傳遞數據,可以完整保留 Changelog,幫助用戶完成同步原始 Binlog 數據到 Kafka 的工作。

如下作業可以將數據庫 app_db 的變更歷史同步到 Kafka,app_db 數據庫下的表 customers、products 和 shipments 的變更會各自寫入對應的 topic 中。

<pre class="md-fences md-end-block ty-contain-cm modeLoaded" spellcheck="false" lang="yaml" cid="n137" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: var(--monospace); font-size: 0.9em; display: block; break-inside: avoid; text-align: left; white-space: normal; background-image: inherit; background-position: inherit; background-size: inherit; background-repeat: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: rgb(248, 248, 248); position: relative !important; border: 1px solid rgb(231, 234, 237); border-radius: 3px; padding: 8px 4px 6px; margin-bottom: 15px; margin-top: 15px; width: inherit; caret-color: rgb(51, 51, 51); color: rgb(51, 51, 51); font-style: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: auto; text-indent: 0px; text-transform: none; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;">source:
type: mysql
name: MySQL Source
hostname: {secret_values.mysql-hostname} port: 3306 username: flink password:{secret_values.mysql-password}
tables: app_db..*
server-id: 18601-18604
metadata-column.include-list: op_ts

sink:
type: Kafka
name: Kafka Sink
properties.bootstrap.servers: ${secret_values.bootstraps-server}
properties.enable.idempotence: false</pre>

存儲時支持使用 debezium-json(默認) 或 canal-json 格式,使用 debezium 或 canal 的歷史同步作業可以平滑切換為使用 Flink CDC YAML 進行同步,下游的消費者無需修改邏輯。以一條Update消息為例,debezium-json 和 canal-json 數據格式分別如下。

<pre class="md-fences md-end-block ty-contain-cm modeLoaded" spellcheck="false" lang="json" cid="n139" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: var(--monospace); font-size: 0.9em; display: block; break-inside: avoid; text-align: left; white-space: normal; background-image: inherit; background-position: inherit; background-size: inherit; background-repeat: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: rgb(248, 248, 248); position: relative !important; border: 1px solid rgb(231, 234, 237); border-radius: 3px; padding: 8px 4px 6px; margin-bottom: 15px; margin-top: 15px; width: inherit; caret-color: rgb(51, 51, 51); color: rgb(51, 51, 51); font-style: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: auto; text-indent: 0px; text-transform: none; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;">{
"before": {
"id": 4,
"name": "John",
"address": "New York",
"phone_number": "2222",
"age": 12
},
"after": {
"id": 4,
"name": "John",
"address": "New York",
"phone_number": "1234",
"age": 12
},
"op": "u",
"source": {
"db": null,
"table": "customers",
"ts_ms": 1728528674000
}
}</pre>

<pre class="md-fences md-end-block ty-contain-cm modeLoaded" spellcheck="false" lang="json" cid="n140" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: var(--monospace); font-size: 0.9em; display: block; break-inside: avoid; text-align: left; white-space: normal; background-image: inherit; background-position: inherit; background-size: inherit; background-repeat: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: rgb(248, 248, 248); position: relative !important; border: 1px solid rgb(231, 234, 237); border-radius: 3px; padding: 8px 4px 6px; margin-bottom: 15px; margin-top: 15px; width: inherit; caret-color: rgb(51, 51, 51); color: rgb(51, 51, 51); font-style: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: auto; text-indent: 0px; text-transform: none; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;">{
"old": [
{
"id": 4,
"name": "John",
"address": "New York",
"phone_number": "2222",
"age": 12
}
],
"data": [
{
"id": 4,
"name": "John",
"address": "New York",
"phone_number": "1234",
"age": 12
}
],
"type": "UPDATE",
"database": null,
"table": "customers",
"pkNames": [
"id"
],
"ts": 1728528674000
}</pre>

細粒度 Schema 變更

CDC YAML 作業支持同步數據源的 Schema 變更到目標端,例如創建表、添加列、重命名列、更改列類型、刪除列和刪除表等。但是下游目標端可能無法支持全部類型的變更,或者出于數據安全和權限的考慮,不希望將全部的變更同步到下游。比如希望保留全部歷史數據,不希望執行刪除和清空等操作。

為了滿足更多的用戶場景,數據攝入YAML提供了多種變更策略:

  • LENIENT(默認):按照固定的模式,將部分類型的變更轉換后同步或跳過同步,確保 Schema Evolution 的向后兼容性。

  • EXCEPTION:不允許變更行為,發生變更時作業拋出異常。

  • IGNORE:跳過全部變更。

  • EVOLVE:同步所有變更,同步失敗作業拋出異常。

  • TRY_EVOLVE:嘗試同步變更,目標端不支持變更時不報錯。

如果不同的變更策略無法滿足需求,數據攝入YAML還提供了更細粒度的調控配置,在 Sink 模塊中設置 include.schema.changes 和 exclude.schema.changes 選項可以控制需要同步的和需要過濾的變更類型。

如下作業使用 EVOLVE 模式,可以正常同步全部變更,但是會跳過同步刪除表,刪除列和清空表的操作。

<pre class="md-fences md-end-block ty-contain-cm modeLoaded" spellcheck="false" lang="yaml" cid="n157" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: var(--monospace); font-size: 0.9em; display: block; break-inside: avoid; text-align: left; white-space: normal; background-image: inherit; background-position: inherit; background-size: inherit; background-repeat: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: rgb(248, 248, 248); position: relative !important; border: 1px solid rgb(231, 234, 237); border-radius: 3px; padding: 8px 4px 6px; margin-bottom: 15px; margin-top: 15px; width: inherit; caret-color: rgb(51, 51, 51); color: rgb(51, 51, 51); font-style: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: auto; text-indent: 0px; text-transform: none; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;">source:
type: mysql
name: MySQL Source
hostname: localhost
port: 3306
username: username
password: password
tables: holo_test..*
server-id: 8601-8604

sink:
type: hologres
name: Hologres Sink
endpoint: ****.hologres.aliyuncs.com:80
dbname: cdcyaml_test
username: {secret_values.holo-username} password:{secret_values.holo-password}
sink.type-normalize-strategy: BROADEN
exclude.schema.changes: [drop, truncate.table]

pipeline:
name: MySQL to Hologres yaml job
schema.change.behavior: EVOLVE</pre>

寬容模式同步

Schema 變更同步相比于數據同步可能耗時更多,因為在多并發情況下需要等全部數據都寫出后,才可以安全地進行 Schema 變更,而且下游的目標端可能無法支持重現全部的 Schema 變更。

為了作業能夠更寬容地處理這些變更,在 Hologres 目標端支持了寬容模式同步。Hologres 不支持變更列的類型,在寬容模式下,CDC YAML 將多個 MySQL 數據類型映射到更寬的 Hologres 類型,跳過不必要的類型變更事件,從而讓作業正常運行,可以通過配置項sink.type-normalize-strategy進行更改。

例如,如下作業使用 ONLY_BIGINT_OR_TEXT 讓 MySQL 類型只對應到 Hologres 的 int8 和 text 兩種類型。如果 MySQL 某個列類型從 INT 改為 BIGINT ,Hologres 將這兩種 MySQL 類型都對應到 int8 類型,作業不會因為無法處理類型轉換而報錯。

<pre class="md-fences md-end-block ty-contain-cm modeLoaded" spellcheck="false" lang="yaml" cid="n162" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: var(--monospace); font-size: 0.9em; display: block; break-inside: avoid; text-align: left; white-space: normal; background-image: inherit; background-position: inherit; background-size: inherit; background-repeat: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: rgb(248, 248, 248); position: relative !important; border: 1px solid rgb(231, 234, 237); border-radius: 3px; padding: 8px 4px 6px; margin-bottom: 15px; margin-top: 15px; width: inherit; caret-color: rgb(51, 51, 51); color: rgb(51, 51, 51); font-style: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: auto; text-indent: 0px; text-transform: none; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;">source:
type: mysql
name: MySQL Source
hostname: localhost
port: 3306
username: username
password: password
tables: holo_test..*
server-id: 8601-8604

sink:
type: hologres
name: Hologres Sink
endpoint: ****.hologres.aliyuncs.com:80
dbname: cdcyaml_test
username: {secret_values.holo-username} password:{secret_values.holo-password}
sink.type-normalize-strategy: ONLY_BIGINT_OR_TEXT</pre>

新增同步表

在一些業務場景企業開發了新業務模塊(如會員系統、積分系統),需要新增數據庫表,并將其數據同步到現有的數據倉庫、數據湖或實時計算平臺中?;蛘哂捎跇I務調整變化,作業啟動時未同步的表需要同步到數據湖倉。

對于在運行中的作業,這些新表就是新增表。新增表存在兩種不同的場景,CDC YAML 對不同新增表場景需要使用不同的處理方式,不需要新增作業。

  • 如果新增加的表是空表,由于數據都是新插入的數據,因此不需要同步歷史數據,可以在 mysql source 模塊上設置 scan.binlog.newly-added-table.enabled=true。在這種場景下,被 CDC YAML 作業匹配的新創建的表會自動同步到目標端。

  • 如果新增加的表是作業啟動前存在的表,客戶希望表里的歷史數據需要同步,可以在 mysql source 模塊上設置 scan.newly-added-table.enabled=true,然后從 savepoint 重啟作業。

指定同步位點重跑數據

運行中的 CDC YAML 作業可能因為一些預期外的錯誤而退出,比如 Binlog 過期清理,無法解析的 Binlog 內容,解析代碼的 Bug 等,這些錯誤會導致作業無法從原有位置恢復。CDC YAML 支持使用指定位點啟動作業,通過修正部分數據 + 指定位點的方式,可以幫助作業繼續運行。

阿里云 Flink CDC 企業級功能

阿里云實時計算 Flink 版在支持開源Flink CDC的所有功能外,還結合企業級客戶的需求和場景,提供了以下企業級特性,幫助云上企業更好地完成數據實時化改造。

MySQL CDC 企業級性能優化

MySQL CDC 消費 Binlog 是單并行度運行的,消費性能存在瓶頸,阿里云實時計算 Flink 版數據攝入 YAML 對MySQL CDC 消費性能進行了大幅優化:

  1. Debezium Bump參數優化:Debezium 讀取數據時,一些參數可以適當調整以獲取更好的性能。該方式對比開源 Flink CDC 可以提高11%的性能。

  2. 過濾無關表數據:MySQL CDC 消費整個實例的 Binlog,跳過不匹配的表的數據可以加速解析。該方式提升的性能取決于無關表數據的占比。

  3. 并行解析 Binlog:Binlog 解析字節流時,可以從單并發優化為多并發加速解析速度。該方式對比開源 Flink CDC 可以提高14%的性能。

  4. 并行序列化:通過火焰圖發現 CPU 在完成從 Event 到 SourceRecord 和從 SourceRecord 到 JSON 的序列化過程中耗時較多,優化為并行序列化并保序可以提高性能。該方式對比開源 Flink CDC 可以提高42%的性能。

結合以上 4 種優化方式,實時計算 Flink 版數據攝入 YAML 相比于社區 Flink CDC 來說,如果 Binlog 只有單個表的數據,普適的性能會提升 80%左右;如果 Binlog 包含多個表的數據且 YAML 作業只需要同步部分表,則可以獲得 10 倍左右的性能提升。

OSS 持久化 binlog 消費支持

MySQL 的數據庫實例只有一份 Binlog,如果數據更新太快很可能導致消費速度趕不上生產速度,從而 Binlog 日志被清理,無法從消費失敗的位置指定位點重啟作業。

阿里云 RDS MySQL 實例支持將 Binlog 同步到 OSS,MySQL CDC 可以使用這部分離線的日志啟動作業。用戶使用 RDS MySQL 作為上游時,可以指定對應 OSS 配置,當指定的時間戳或者 Binlog 位點對應的文件保存在 OSS 時,會自動拉取 OSS 日志文件到 Flink 集群本地進行讀取,當指定的時間戳或者 Binlog 位點對應的文件保存在數據庫本地時,會自動切換使用數據庫連接讀取,徹底解決 Binlog 日志過期導致的作業重跑或數據不一致問題。

更豐富的監控指標

為了便于判斷作業運行的階段和狀態,商業版提供更豐富的監控指標。

  • 當前作業處于全量或增量階段

  • 全量階段未處理/已處理的表數量

  • 全量階段未處理/已處理的分片數量

  • 最新一條數據的時間戳

  • 讀取數據的延遲

  • 全量階段的消息條數/全量階段每個表的消息條數

  • 消息總條數/每個表的消息條數

十分鐘在阿里云免費實現一個 CDC YAML 作業

接下來我們使用阿里云免費試用 [3] 來快速測試一下 CDC YAML 作業的功能,完成一個簡單的 MySQL 到 Paimon 的整庫同步作業。

資源準備

開始測試前需要準備好一個 RDS MySQL 實例,一個實時計算 Flink 版環境,一個 OSS 對象存儲。

OSS 對象存儲

OSS 對象存儲用作數據湖存儲,并且用在實時計算 Flink 版的 checkpoint 存儲。

在免費試用搜索oss,點擊立即試用對象存儲 OSS。

試用成功后,在 OSS 控制臺創建一個杭州地區的Bucket。創建成功后,在新建的 Bucket 的文件列表中新建目錄 warehouse,用于存儲數據湖數據。

RDS MySQL 實例

RDS MySQL 作為測試的 MySQL 數據源。

在免費試用搜索RDS MySQL,點擊立即試用云數據庫 RDS MySQL。

試用成功后,在 RDS 控制臺創建一個杭州地區的RDS MySQL集群。

在實例列表點擊進入剛創建的實例,在賬號管理創建一個高權限賬號。

賬號創建完成后,在數據庫管理創建一個數據庫用于測試。

點擊登錄數據庫,使用用戶名和密碼登錄,然后在數據庫下創建一些表并插入測試數據。此處創建了products 和 users 兩張表,每個表各生成 5 條測試數據。

在白名單與安全組點擊全部開放,打通網絡連接。此處因為測試目的使用了全部開放,在生產環境請合理配置白名單。

實時計算 Flink 版

在免費試用搜索 flink,點擊立即試用實時計算 Flink 版。

完成RAM授權并領取資源抵扣包后,在杭州地區與RDS相同的可用區創建實時計算 Flink 版實例。

創建 AccessKey

Paimon 訪問 OSS 時需要使用 AccessKey,參照創建AccessKey文檔[4]創建 AccessKey。

CDC YAML 整庫同步 Paimon

當所需資源和測試數據都準備好后,接下來讓我們在實時計算 Flink 版本上快速開發整庫同步作業。

為了數據安全,可以將需要使用的信息在變量管理用密文保存。

保存好變量后,在數據攝入中創建一個整庫同步作業并部署上線。

部署成功后,在作業運維點擊啟動按鈕啟動作業。

作業啟動后,可以在監控告警的數據攝入看到 CDC YAML 同步狀態。如下監控可以看出測試作業已經進入了增量階段,一共同步了2張表,2個分片,每個表全量分別同步了5條數據。

為了查看測試數據,可以使用數據開發 ETL 的調試功能。

首先在元數據管理創建對應的Paimon Catalog。

創建一個 Session 集群用于運行查看數據結果的 SQL,注意選擇數據攝入支持的引擎版本。

在數據開發 ETL 中,創建一個 select SQL 作業查看數據,點擊調試在 Session 集群運行,可以在控制臺查看數據結果。

至此一個完整的業務案例就已經實現了,接下來可以自由地在 RDS MySQL 數據庫側操作相應的數據修改,重新執行 select 命令查看數據時,變能夠觀察到通過YAML作業實時同步到Paimon中的數據了。

相關鏈接

[1] https://nightlies.apache.org/flink/flink-cdc-docs-stable/

[2] https://help.aliyun.com/zh/flink/user-guide/develop-a-yaml-draft?spm=a2c4g.11186623.help-menu-45029.d_2_2_3.a09a2a71KBQ8n5&scm=20140722.H_2846225._.OR_help-V_1

[3] https://free.aliyun.com/

[4] https://help.aliyun.com/zh/ram/user-guide/create-an-accesskey-pair?spm=a2c4g.11186623.0.0.4ed27ad1pdxcBb

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,030評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,310評論 3 415
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,951評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,796評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,566評論 6 407
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,055評論 1 322
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,142評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,303評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,799評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,683評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,899評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,409評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,135評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,520評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,757評論 1 282
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,528評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,844評論 2 372

推薦閱讀更多精彩內容