深入淺出 MySQL CDC

MySQL CDC (Change Data Capture),中文名為MySQL變化數據捕獲,是一種截取MySQL主從複製流中binlog的技術,從而實時捕獲數據庫中的增、刪、改操作。在大數據、實時計算、數據集成等領域都有廣泛應用。本文將從多個方面對MySQL CDC做詳細闡述,讓你全面了解其背後的原理和應用場景。

一、基本原理

MySQL CDC的基本原理是使用MySQL提供的binlog,通過解析binlog中的事件來得到數據庫中的增、刪、改操作。具體實現步驟如下:

1、首先在MySQL中通過配置參數啟用binlog,使得MySQL開始記錄MySQL實例的所有數據更改操作;


[mysqld]
log-bin=mysql-bin
binlog-format=ROW
binlog-row-image=full

2、使用支持MySQL協議的binlog消費者(如Debezium、Maxwell等)連接到MySQL實例的binlog,並開始實時從binlog中截取數據;

3、解析binlog內容,獲取其中的事務和事務中對數據進行的操作;


{
    "database": "testdb",
    "table": "user",
    "type": "insert",
    "ts": 1633093513,
    "xid": 1,
    "commit": 1,
    "data": {
        "id": "1",
        "name": "張三",
        "age": 24
    }
}

4、將解析後的數據推送到下游處理過程(如實時計算引擎、數據倉庫、緩存等)。

二、應用場景

MySQL CDC的應用場景廣泛,下面介紹其中幾個典型應用場景。

1、實時數據同步

當企業應用系統需要將MySQL的數據同步到其他數據源(如緩存、數據倉庫、搜索引擎等)時,可以使用MySQL CDC實現實時數據同步。通過截取MySQL主從複製流中的binlog,將數據實時同步到其他目標數據源,實現數據的最新狀態。

2、實時計算

MySQL CDC可以將數據變更事件實時推送到流式計算引擎(如Apache Flink、Apache Spark等)進行實時計算和分析。通過將實時計算的結果寫回MySQL中,可以實現實時的數據統計、分析和決策。

3、數據集成

MySQL CDC可作為數據集成的中間層,通過解析binlog實現異構數據的讀取和寫入。例如可以將MySQL中的數據同步到MongoDB中,或將Kafka中的數據寫入MySQL中。這樣,在各個數據系統之間就可以實現快速、實時、可靠的數據集成。

三、實戰案例

下面通過一個簡單的實戰案例來介紹如何使用MySQL CDC實現實時數據同步。

1、安裝Debezium Connector

Debezium Connector是一種流行的開源的CDC實現,支持從MySQL、PostgreSQL等關係型數據庫中提取數據變更並將其廣播到Kafka。如下是使用Docker安裝Debezium Connector:


docker run -it --rm --name debezium -p 8083:8083 debezium/connect

2、創建MySQL實例和新表


create database demo;
use demo;
create table user (
  id int primary key auto_increment,
  name varchar(50) not null,
  age int not null
);

3、啟用binlog

在MySQL的配置文件中,設置啟用binlog:


[mysqld]
log-bin=mysql-bin
binlog-format=ROW
binlog-row-image=full

然後重啟MySQL實例,使binlog參數生效。

4、創建Debezium連接

執行以下curl命令,創建與MySQL實例的連接。


curl -i -X POST -H "Accept:application/json" -H "Content-Type:application/json" localhost:8083/connectors/ -d '
{
  "name": "demo-connector",
  "config": {
    "connector.class": "io.debezium.connector.mysql.MySqlConnector",
    "database.hostname": "mysql",
    "database.port": "3306",
    "database.user": "root",
    "database.password": "root",
    "database.server.id": "1",
    "database.server.name": "test",
    "database.include.list": "demo",
    "table.include.list": "demo.user",
    "database.history.kafka.bootstrap.servers": "kafka:9092",
    "database.history.kafka.topic": "schema-changes.demo"
  }
}'

5、查看數據變更

現在我們可以通過監控Kafka中的實時數據變更事件來捕獲MySQL的數據變更信息了。執行以下命令,查看demo.user表的變更事件:


docker run -it --rm --name debezium-toolkit --link debezium:kafka --network mysql-cdc_default debezium/tooling debezium-connector-mysql/bin/mysqlbinlog --raw --verbose -d demo -t user --schema=test --host=kafka --port=9092

在另一個終端窗口中,進行如下的MySQL插入操作,向demo.user表中插入一條數據:


use demo;
insert into user(name, age) values('john', 18);

插入完成後,Debezium即會輸出以下信息表示成功推送該數據變更:


#...chunk of binlog...
{
    "database": "demo",
    "table": "user",
    "type": "insert",
    "ts": 1633093513,
    "xid": 1,
    "commit": 1,
    "data": {
        "id": "1",
        "name": "john",
        "age": 18
    }
}

四、總結

MySQL CDC通過解析MySQL主從複製流中的binlog,捕獲並推送數據庫中的數據變更事件,為實時數據同步、實時計算和數據集成提供了有效手段。但在使用MySQL CDC時,需要注意以下幾個方面:

1、binlog性能開銷。當binlog文件過大時,可能會對MySQL實例造成性能開銷;

2、並發訪問和數據同步。使用MySQL CDC實現數據同步時,需要考慮多個數據源、並發訪問、重複數據等問題;

3、CDC數據的精確度。使用MySQL CDC捕獲變化數據時,需要考慮數據變更的精確度,例如在UPDATE語句中SET字段的順序可能對捕獲的結果產生影響。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/183075.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-11-24 16:26
下一篇 2024-11-24 16:26

相關推薦

  • 如何修改mysql的端口號

    本文將介紹如何修改mysql的端口號,方便開發者根據實際需求配置對應端口號。 一、為什麼需要修改mysql端口號 默認情況下,mysql使用的端口號是3306。在某些情況下,我們需…

    編程 2025-04-29
  • Python操作MySQL

    本文將從以下幾個方面對Python操作MySQL進行詳細闡述: 一、連接MySQL數據庫 在使用Python操作MySQL之前,我們需要先連接MySQL數據庫。在Python中,我…

    編程 2025-04-29
  • MySQL遞歸函數的用法

    本文將從多個方面對MySQL遞歸函數的用法做詳細的闡述,包括函數的定義、使用方法、示例及注意事項。 一、遞歸函數的定義 遞歸函數是指在函數內部調用自身的函數。MySQL提供了CRE…

    編程 2025-04-29
  • MySQL bigint與long的區別

    本文將從數據類型定義、存儲空間、數據範圍、計算效率、應用場景五個方面詳細闡述MySQL bigint與long的區別。 一、數據類型定義 bigint在MySQL中是一種有符號的整…

    編程 2025-04-28
  • MySQL左連接索引不生效問題解決

    在MySQL數據庫中,經常會使用左連接查詢操作,但是左連接查詢中索引不生效的情況也比較常見。本文將從多個方面探討MySQL左連接索引不生效問題,並給出相應的解決方法。 一、索引的作…

    編程 2025-04-28
  • CentOS 7在線安裝MySQL 8

    在本文中,我們將介紹如何在CentOS 7操作系統中在線安裝MySQL 8。我們會從安裝環境的準備開始,到安裝MySQL 8的過程進行詳細的闡述。 一、環境準備 在進行MySQL …

    編程 2025-04-27
  • 如何使用MySQL字段去重

    本文將從多個方面為您詳細介紹如何使用MySQL字段去重並給出相應的代碼示例。 一、SELECT DISTINCT語句去重 MySQL提供了SELECT DISTINCT語句,通過在…

    編程 2025-04-27
  • MySQL正則表達式替換

    MySQL正則表達式替換是指通過正則表達式對MySQL中的字符串進行替換。在文本處理方面,正則表達式是一種強大的工具,可以方便快捷地進行字符串處理和匹配。在MySQL中,可以使用正…

    編程 2025-04-27
  • Apache2.4和MySQL的全能編程開發工程師指南

    本文將從多個方面對Apache2.4和MySQL進行詳細的闡述,為全能編程開發工程師提供有用的參考和指導。首先,我們來解答這個標題所涵蓋的主題: 本文將提供Apache2.4和My…

    編程 2025-04-27
  • MySQL JDBC驅動包下載詳解

    一、JDBC驅動介紹 JDBC是Java Database Connectivity的縮寫,它是Java應用程序與各種數據庫連接的標準API,允許Java程序員使用JDBC API…

    編程 2025-04-25

發表回復

登錄後才能評論