摘要:本文投稿自阿里云開源大數據平臺數據通道團隊,主要介紹了 Flink CDC YAML 在實時計算Flink版的最佳實踐。內容分為以下五個部分:
- CDC YAML 簡介
- CDC YAML 核心能力
- CDC YAML 應用場景
- 阿里云 Flink CDC 企業級功能
- 十分鐘在阿里云免費實現一個 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 主要用于同步數據庫變更到其他系統,同步前支持對數據進行簡單處理和清洗,幫助用戶完成秒級的數據同步工作,構建入湖入倉作業,主要的核心能力有以下幾個方面:
端到端 Data Pipeline:支持秒級同步數據變更和結構變更到其他系統,用戶可以快速構建自己的數據湖和數據倉庫,為數據分析提供基礎。
細粒度 Schema Evolution:出于數據安全的考慮,部分高危操作(如刪除表,清空數據等)用戶不希望同步到目標端。CDC YAML 提供細粒度 Schema 變更的能力,幫助用戶限制可同步的數據變更類型。
全增量一體化 CDC 讀取:CDC YAML提供了全量和增量的一體化讀取能力,全量數據讀取完成后自動切換增量讀取,無需用戶操作。
豐富的 Transform 支持 :支持對數據字段進行處理后同步到下游,如添加額外計算列,添加元數據、只同步某些列、重新指定主鍵或分區鍵等場景。CDC YAML 內置了豐富的函數,用戶也可以自行開發UDF,兼容 Flink 的 UDF。支持對數據源數據進行過濾,跳過不需要的數據,完成對無用數據和臟數據的清洗工作。
靈活的 Route 策略控制:支持自定義數據源的表同步到目標端表的映射關系,支持一對一、一對多和多對一的多種映射關系,幫助用戶靈活指定目標端表名,支持分庫分表合并的場景。
完善的 作業 Metric 支持:為了便于判斷作業運行的階段和狀態,CDC YAML 提供了豐富的指標。如全量階段未處理/已處理的表數量,全量階段未處理/已處理的分片數量、最新一條數據的時間戳等。
阿里云實時計算 Flink 結合用戶需求,YAML 作業支持了更多的上下游,支持同步到常見的數據湖和數據倉庫,已經支持的上下游如下。
連接器 | 支持類型 | |
---|---|---|
Source | Sink | |
MySQL | √ | × |
消息隊列Kafka | √ | √ |
實時數倉Hologres | × | √ |
Upsert Kafka | × | √ |
× | √ | |
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-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_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-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_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-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_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-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-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-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 消費性能進行了大幅優化:
Debezium Bump參數優化:Debezium 讀取數據時,一些參數可以適當調整以獲取更好的性能。該方式對比開源 Flink CDC 可以提高11%的性能。
過濾無關表數據:MySQL CDC 消費整個實例的 Binlog,跳過不匹配的表的數據可以加速解析。該方式提升的性能取決于無關表數據的占比。
并行解析 Binlog:Binlog 解析字節流時,可以從單并發優化為多并發加速解析速度。該方式對比開源 Flink CDC 可以提高14%的性能。
并行序列化:通過火焰圖發現 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/