如何從MySQL中將變化的事件資料釋出到Kafka?
如何使用Debezium向Kafka提交MySQL的更改資料事件? CDC(變更資料捕獲)是將OLTP資料庫系統與其他系統(如資料倉儲,快取,Spark或Hadoop)互連的最佳方式之一。
Debezium是由Red Hat開發的一個開源專案,旨在透過允許您從各種資料庫系統(例如MySQL,PostgreSQL,MongoDB)中提取更改並將其推送到Apache Kafka來簡化此過程。
在本文中,我們將瞭解如何使用Debezium從MySQL二進位制日誌中提取事件。
首先,您需要一個特定於資料庫的Debezium聯結器才能提取重做日誌(例如Oracle,MySQL)或預寫日誌(例如PostgreSQL)。
您還需要執行Kafka,以便可以推送提取的日誌事件並使其可用於企業系統中的其他服務。Debezium不需要Apache ZooKeeper,但Kafka需要它,因為它依賴於ZK的分散式共識以及線性化保證。
必須執行以下Docker容器安裝Debezium:
> docker run -it --name zookeeper -p 2181:2181 -p 2888:2888 -p 3888:3888 debezium/zookeeper:0.5 > docker run -it --name kafka -p 9092:9092 --link zookeeper:zookeeper debezium/kafka:0.5 > docker run -it --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=debezium -e MYSQL_USER=mysqluser -e MYSQL_PASSWORD=mysqlpw debezium/example-mysql:0.5 > docker run -it --name kafka-connect -p 8083:8083 -e GROUP_ID=1 -e CONFIG_STORAGE_TOPIC=my_connect_configs -e OFFSET_STORAGE_TOPIC=my_connect_offsets --link zookeeper:zookeeper --link kafka:kafka --link mysql:mysql debezium/connect:0.5 > docker run -it --name kafka-watcher --link zookeeper:zookeeper debezium/kafka:0.5 watch-topic -a -k dbserver1.inventory.customers |
使用Docker列出容器:
docker ps -a
使用bash,您需要建立一個新聯結器:
curl -i -X POST -H "Accept:application/json" -H "Content-Type:application/json" localhost:8083/connectors/ -d '{ "name": "inventory-connector", "config": { "connector.class": "io.debezium.connector.mysql.MySqlConnector", "tasks.max": "1", "database.hostname": "mysql", "database.port": "3306", "database.user": "debezium", "database.password": "dbz", "database.server.id": "184054", "database.server.name": "dbserver1", "database.whitelist": "inventory", "database.history.kafka.bootstrap.servers": "kafka:9092", "database.history.kafka.topic": "dbhistory.inventory" } }' |
kafka-watcher是以互動模式啟動的,這樣我們就可以在控制檯中看到Debezium捕獲的CDC日誌事件。
測試
現在,如果我們使用root使用者和debezium密碼連線到MySQL Docker容器,我們可以發出各種SQL語句並檢查kafka-watcher容器控制檯輸出。
插入新customer行時:
INSERT INTO `inventory`.`customers` ( `first_name`, `last_name`, `email`) VALUES ( 'Vlad', 'Mihalcea', 'vlad@acme.org' ) |
在kafka-watcher,我們現在可以找到以下JSON條目:
{ "payload":{ "before":null, "after":{ "id":1005, "first_name":"Vlad", "last_name":"Mihalcea", "email":"vlad@acme.org" }, "source":{ "name":"dbserver1", "server_id":223344, "ts_sec":1500369632, "gtid":null, "file":"mysql-bin.000003", "pos":364, "row":0, "snapshot":null, "thread":13, "db":"inventory", "table":"customers" }, "op":"c", "ts_ms":1500369632095 } } |
當after物件顯示新插入的值時,before是null,op屬性值是c,這意味著它是一個CREATE事件。
更新customer行時:
UPDATE `inventory`.`customers` SET `email` = 'vlad.mihalcea@acme.org' WHERE `id` = 1005 |
我們現在可以找到以下日誌事件:
{ "payload":{ "before":{ "id":1005, "first_name":"Vlad", "last_name":"Mihalcea", "email":"vlad@acme.org" }, "after":{ "id":1005, "first_name":"Vlad", "last_name":"Mihalcea", "email":"vlad.mihalcea@acme.org" }, "source":{ "name":"dbserver1", "server_id":223344, "ts_sec":1500369929, "gtid":null, "file":"mysql-bin.000003", "pos":673, "row":0, "snapshot":null, "thread":13, "db":"inventory", "table":"customers" }, "op":"u", "ts_ms":1500369929464 } } |
發出DELETE語句時:
DELETE FROM `inventory`.`customers` WHERE id = 1005; |
kafka-connectDocker容器正在記錄以下事件:
{ "payload":{ "before":{ "id":1005, "first_name":"Vlad", "last_name":"Mihalcea", "email":"vlad.mihalcea@acme.org" }, "after":null, "source":{ "name":"dbserver1", "server_id":223344, "ts_sec":1500370394, "gtid":null, "file":"mysql-bin.000003", "pos":1025, "row":0, "snapshot":null, "thread":13, "db":"inventory", "table":"customers" }, "op":"d", "ts_ms":1500370394589 } } |
op屬性值d,這意味著我們有一個刪除日誌事件,after物件現在是null。before物件是在它被刪除之前捕獲的資料庫行狀態。
相關文章
- 從hive將資料匯出到mysql(轉)HiveMySql
- 如何將資料從Hadoop匯出到關係型和NoSQL資料庫?HadoopSQL資料庫
- 如何將kafka中的資料快速匯入Hadoop?KafkaHadoop
- 如何將資料熱匯出到檔案
- 將MYSQL中資料匯出到EXCEL表MySqlExcel
- 將資料匯出到ExcelExcel
- Flume將 kafka 中的資料轉存到 HDFS 中Kafka
- MSSQL資料匯出到MYSQLMySql
- 如何將WHQL驅動程式釋出到 Windows 更新Windows
- 如何將JAR包釋出到Maven中央倉庫?JARMaven
- Sqlstream:將MySQL複製事件流化到Apache KafkaMySql事件ApacheKafka
- vue中如何監聽vuex中的資料變化Vue
- Java將頁面中的資料存到MySQL資料庫中,漢字變成問號JavaMySql資料庫
- 轉載:利用SQL*Loader將 Excel 資料匯出到資料庫中SQLExcel資料庫
- 將MYSQL資料顯示在QT的tablewidget中/將QT中的資料儲存到MYSQL資料庫中MySqlQT資料庫
- Mysql增量寫入Hdfs(一) --將Mysql資料寫入Kafka TopicMySqlKafka
- EventBus原始碼解讀詳細註釋(6)從事件釋出到事件處理,究竟發生了什麼!原始碼事件
- 實戰教程:如何將自己的Python包釋出到PyPI上Python
- Golang:將日誌以Json格式輸出到KafkaGolangJSONKafka
- Clickhouse Engine kafka 將kafka資料同步clickhouseKafka
- MySQL 8.0.3 RC 版即將釋出,看看有哪些變化MySql
- 手把手教你如何將專案釋出到Maven中央倉庫Maven
- iPhone應用提交流程:如何將App程式釋出到App Store?iPhoneAPP
- Docker將映象檔案釋出到私服庫Docker
- SQL Server CDC配合Kafka Connect監聽資料變化SQLServerKafka
- 走過企業智慧化的界碑:FusionData如何讓資料從資源變資產?
- 將資料從文字匯入到mysql(轉)MySql
- C語言將資料表輸出到終端C語言
- 用SQL Loader將Excel資料匯出到OracleSQLExcelOracle
- 使用事件溯源、Kafka和OGG從Oracle內部複製資料事件KafkaOracle
- 將高版本mysql資料庫的資料匯入低版本mysql中MySql資料庫
- 如何從網頁中將JSP的後臺資料庫下載網頁JS資料庫
- 資料抽取中的CDC(變化資料捕獲)方式
- Docker入門系列之三:如何將dockerfile製作好的映象釋出到Dockerhub上Docker
- 將CSV的資料傳送到kafka(java版)KafkaJava
- 從SQL Server匯出到MYSQL的簡單方法(轉)ServerMySql
- 批處理中如何將百分號輸出到文字
- 如何克服 Apache Kafka中的資料順序問題 - DATAVERSITYApacheKafka