基于 Canal 和 Kafka 實(shí)現(xiàn) MySQL 的 Binlog 近實(shí)時(shí)同步

作者:Throwable
掘金:https://juejin.im/post/5e6a6746f265da575c16d678

前提

近段時(shí)間旭贬,業(yè)務(wù)系統(tǒng)架構(gòu)基本完備跨算,數(shù)據(jù)層面的建設(shè)比較薄弱憔涉,因?yàn)楣P者目前工作重心在于搭建一個(gè)小型的數(shù)據(jù)平臺(tái)。優(yōu)先級(jí)比較高的一個(gè)任務(wù)就是需要近實(shí)時(shí)同步業(yè)務(wù)系統(tǒng)的數(shù)據(jù)(包括保存、更新或者軟刪除)到一個(gè)另一個(gè)數(shù)據(jù)源掏父,持久化之前需要清洗數(shù)據(jù)并且構(gòu)建一個(gè)相對(duì)合理的便于后續(xù)業(yè)務(wù)數(shù)據(jù)統(tǒng)計(jì)、標(biāo)簽系統(tǒng)構(gòu)建等擴(kuò)展功能的數(shù)據(jù)模型秆剪∩奘纾基于當(dāng)前團(tuán)隊(duì)的資源和能力,優(yōu)先調(diào)研了Alibaba開源中間件Canal的使用仅讽。

image

這篇文章簡(jiǎn)單介紹一下如何快速地搭建一套Canal相關(guān)的組件陶缺。

關(guān)于Canal

簡(jiǎn)介

下面的簡(jiǎn)介和下一節(jié)的原理均來自于Canal項(xiàng)目的README:

image

Canal[k?'n?l],譯意為水道/管道/溝渠洁灵,主要用途是基于MySQL數(shù)據(jù)庫增量日志解析饱岸,提供增量數(shù)據(jù)訂閱和消費(fèi)。早期阿里巴巴因?yàn)楹贾莺兔绹?guó)雙機(jī)房部署徽千,存在跨機(jī)房同步的業(yè)務(wù)需求苫费,實(shí)現(xiàn)方式主要是基于業(yè)務(wù)trigger獲取增量變更。從 2010 年開始罐栈,業(yè)務(wù)逐步嘗試數(shù)據(jù)庫日志解析獲取增量變更進(jìn)行同步黍衙,由此衍生出了大量的數(shù)據(jù)庫增量訂閱和消費(fèi)業(yè)務(wù)。

基于日志增量訂閱和消費(fèi)的業(yè)務(wù)包括:

  • 數(shù)據(jù)庫鏡像

  • 數(shù)據(jù)庫實(shí)時(shí)備份

  • 索引構(gòu)建和實(shí)時(shí)維護(hù)(拆分異構(gòu)索引荠诬、倒排索引等)

  • 業(yè)務(wù)Cache刷新

  • 帶業(yè)務(wù)邏輯的增量數(shù)據(jù)處理

Canal 的工作原理

MySQL主備復(fù)制原理:

image
  • MySQL的Master實(shí)例將數(shù)據(jù)變更寫入二進(jìn)制日志(binary log琅翻,其中記錄叫做二進(jìn)制日志事件binary log events,可以通過show binlog events進(jìn)行查看)

  • MySQL的Slave實(shí)例將master的binary log events拷貝到它的中繼日志(relay log)

  • MySQL的Slave實(shí)例重放relay log中的事件柑贞,將數(shù)據(jù)變更反映它到自身的數(shù)據(jù)

Canal的工作原理如下:

  • Canal模擬MySQL Slave的交互協(xié)議方椎,偽裝自己為MySQL Slave,向MySQL Master發(fā)送dump協(xié)議

  • MySQL Master收到dump請(qǐng)求钧嘶,開始推送binary log給Slave(即Canal)

  • Canal解析binary log對(duì)象(原始為byte流)棠众,并且可以通過連接器發(fā)送到對(duì)應(yīng)的消息隊(duì)列等中間件中

關(guān)于Canal的版本和部件

截止筆者開始編寫本文的時(shí)候(2020-03-05),Canal的最新發(fā)布版本是v1.1.5-alpha-1(2019-10-09發(fā)布的),最新的正式版是v1.1.4(2019-09-02發(fā)布的)闸拿。其中空盼,v1.1.4主要添加了鑒權(quán)、監(jiān)控的功能新荤,并且做了一些列的性能優(yōu)化揽趾,此版本集成的連接器是Tcp、Kafka和RockerMQ苛骨。而v1.1.5-alpha-1版本已經(jīng)新增了RabbitMQ連接器篱瞎,但是此版本的RabbitMQ連接器暫時(shí)不能定義連接RabbitMQ的端口號(hào),不過此問題已經(jīng)在master分支中修復(fù)(具體可以參看源碼中的CanalRabbitMQProducer類的提交記錄)痒芝。換言之俐筋,v1.1.4版本中目前能使用的內(nèi)置連接器只有Tcp、Kafka和RockerMQ三種严衬,如果想嘗鮮使用RabbitMQ連接器澄者,可以選用下面的兩種方式之一:

  • 選用v1.1.5-alpha-1版本,但是無法修改RabbitMQ的port屬性瞳步,默認(rèn)為5672闷哆。

  • 基于master分支自行構(gòu)建Canal。

目前单起,Canal項(xiàng)目的活躍度比較高,但是考慮到功能的穩(wěn)定性問題劣坊,筆者建議選用穩(wěn)定版本在生產(chǎn)環(huán)境中實(shí)施嘀倒,當(dāng)前可以選用v1.1.4版本,本文的例子用選用的就是v1.1.4版本局冰,配合Kafka連接器使用测蘑。Canal主要包括三個(gè)核心部件:

  • canal-admin:后臺(tái)管理模塊,提供面向WebUI的Canal管理能力康二。

  • canal-adapter:適配器碳胳,增加客戶端數(shù)據(jù)落地的適配及啟動(dòng)功能,包括REST沫勿、日志適配器挨约、關(guān)系型數(shù)據(jù)庫的數(shù)據(jù)同步(表對(duì)表同步)、HBase數(shù)據(jù)同步产雹、ES數(shù)據(jù)同步等等诫惭。

  • canal-deployer:發(fā)布器,核心功能所在蔓挖,包括binlog解析夕土、轉(zhuǎn)換和發(fā)送報(bào)文到連接器中等等功能都由此模塊提供。

一般情況下瘟判,canal-deployer部件是必須的怨绣,其他兩個(gè)部件按需選用即可角溃。

部署所需的中間件

搭建一套可以用的組件需要部署MySQL、Zookeeper篮撑、Kafka和Canal四個(gè)中間件的實(shí)例减细,下面簡(jiǎn)單分析一下部署過程。選用的虛擬機(jī)系統(tǒng)是CentOS7咽扇。

安裝MySQL

為了簡(jiǎn)單起見邪财,選用yum源安裝(官方鏈接是https://dev.mysql.com/downloads/repo/yum):

image

mysql80-community-release-el7-3雖然包名帶了mysql80關(guān)鍵字,其實(shí)已經(jīng)集成了MySQL主流版本5.6质欲、5.7和8.x等等的最新安裝包倉庫

選用的是最新版的MySQL8.x社區(qū)版树埠,下載CentOS7適用的rpm包:

cd /data/mysql
wget https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm
// 下載完畢之后
sudo rpm -Uvh mysql80-community-release-el7-3.noarch.rpm

此時(shí)列舉一下yum倉庫里面的MySQL相關(guān)的包:

[root@localhost mysql]# yum repolist all | grep mysql
mysql-cluster-7.5-community/x86_64 MySQL Cluster 7.5 Community   disabled
mysql-cluster-7.5-community-source MySQL Cluster 7.5 Community - disabled
mysql-cluster-7.6-community/x86_64 MySQL Cluster 7.6 Community   disabled
mysql-cluster-7.6-community-source MySQL Cluster 7.6 Community - disabled
mysql-cluster-8.0-community/x86_64 MySQL Cluster 8.0 Community   disabled
mysql-cluster-8.0-community-source MySQL Cluster 8.0 Community - disabled
mysql-connectors-community/x86_64  MySQL Connectors Community    enabled:    141
mysql-connectors-community-source  MySQL Connectors Community -  disabled
mysql-tools-community/x86_64       MySQL Tools Community         enabled:    105
mysql-tools-community-source       MySQL Tools Community - Sourc disabled
mysql-tools-preview/x86_64         MySQL Tools Preview           disabled
mysql-tools-preview-source         MySQL Tools Preview - Source  disabled
mysql55-community/x86_64           MySQL 5.5 Community Server    disabled
mysql55-community-source           MySQL 5.5 Community Server -  disabled
mysql56-community/x86_64           MySQL 5.6 Community Server    disabled
mysql56-community-source           MySQL 5.6 Community Server -  disabled
mysql57-community/x86_64           MySQL 5.7 Community Server    disabled
mysql57-community-source           MySQL 5.7 Community Server -  disabled
mysql80-community/x86_64           MySQL 8.0 Community Server    enabled:    161
mysql80-community-source           MySQL 8.0 Community Server -  disabled

編輯/etc/yum.repos.d/mysql-community.repo文件([mysql80-community]塊中enabled設(shè)置為1,其實(shí)默認(rèn)就是這樣子嘶伟,不用改怎憋,如果要選用5.x版本則需要修改對(duì)應(yīng)的塊):

[mysql80-community]
name=MySQL 8.0 Community Server
baseurl=http://repo.mysql.com/yum/mysql-8.0-community/el/7/$basearch/
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql

然后安裝MySQL服務(wù):

sudo yum install mysql-community-server

這個(gè)過程比較漫長(zhǎng),因?yàn)樾枰螺d和安裝5個(gè)rpm安裝包(或者是所有安裝包組合的壓縮包mysql-8.0.18-1.el7.x86_64.rpm-bundle.tar)九昧。如果網(wǎng)絡(luò)比較差绊袋,也可以直接從官網(wǎng)手動(dòng)下載后安裝:

image
// 下載下面5個(gè)rpm包 common --> libs --> libs-compat --> client --> server
mysql-community-common
mysql-community-libs
mysql-community-libs-compat
mysql-community-client
mysql-community-server

// 強(qiáng)制安裝
rpm -ivh mysql-community-common-8.0.18-1.el7.x86_64.rpm --force --nodeps
rpm -ivh mysql-community-libs-8.0.18-1.el7.x86_64.rpm --force --nodeps
rpm -ivh mysql-community-libs-compat-8.0.18-1.el7.x86_64.rpm --force --nodeps
rpm -ivh mysql-community-client-8.0.18-1.el7.x86_64.rpm --force --nodeps
rpm -ivh mysql-community-server-8.0.18-1.el7.x86_64.rpm --force --nodeps

安裝完畢之后,啟動(dòng)MySQL服務(wù)铸鹰,然后搜索MySQL服務(wù)的root賬號(hào)的臨時(shí)密碼用于首次登陸(mysql -u root -p):

// 啟動(dòng)服務(wù)癌别,關(guān)閉服務(wù)就是service mysqld stop
service mysqld start
// 查看臨時(shí)密碼 cat /var/log/mysqld.log
[root@localhost log]# cat /var/log/mysqld.log 
2020-03-02T06:03:53.996423Z 0 [System] [MY-013169] [Server] /usr/sbin/mysqld (mysqld 8.0.18) initializing of server in progress as process 22780
2020-03-02T06:03:57.321447Z 5 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: >kjYaXENK6li
2020-03-02T06:04:00.123845Z 0 [System] [MY-010116] [Server] /usr/sbin/mysqld (mysqld 8.0.18) starting as process 22834
// 登錄臨時(shí)root用戶,使用臨時(shí)密碼
[root@localhost log]# mysql -u root -p

接下來做下面的操作:

  • 修改root用戶的密碼:ALTER USER 'root'@'localhost' IDENTIFIED BY 'QWqw12!@';(注意密碼規(guī)則必須包含大小寫字母蹋笼、數(shù)字和特殊字符)

  • 更新root的host展姐,切換數(shù)據(jù)庫use mysql;,指定host為%以便可以讓其他服務(wù)器遠(yuǎn)程訪問UPDATE USER SET HOST = '%' WHERE USER = 'root';

  • 賦予'root'@'%'用戶剖毯,所有權(quán)限圾笨,執(zhí)行GRANT ALL PRIVILEGES ON . TO 'root'@'%';

  • 改變r(jià)oot'@'%用戶的密碼校驗(yàn)規(guī)則以便可以使用Navicat等工具訪問:ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'QWqw12!@';

image

操作完成之后,就可以使用root用戶遠(yuǎn)程訪問此虛擬機(jī)上的MySQL服務(wù)逊谋。最后確認(rèn)是否開啟了binlog(注意一點(diǎn)是MySQL8.x默認(rèn)開啟binlog)SHOW VARIABLES LIKE '%bin%';:

image

最后在MySQL的Shell執(zhí)行下面的命令擂达,新建一個(gè)用戶名canal密碼為QWqw12!@的新用戶,賦予REPLICATION SLAVE和 REPLICATION CLIENT權(quán)限:

CREATE USER canal IDENTIFIED BY 'QWqw12!@';
GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'canal'@'%';
FLUSH PRIVILEGES;
ALTER USER 'canal'@'%' IDENTIFIED WITH mysql_native_password BY 'QWqw12!@';

切換回去root用戶胶滋,創(chuàng)建一個(gè)數(shù)據(jù)庫test:

CREATE DATABASE `test` CHARSET `utf8mb4` COLLATE `utf8mb4_unicode_ci`;

安裝Zookeeper

Canal和Kafka集群都依賴于Zookeeper做服務(wù)協(xié)調(diào)板鬓,為了方便管理,一般會(huì)獨(dú)立部署Zookeeper服務(wù)或者Zookeeper集群镀钓。筆者這里選用2020-03-04發(fā)布的3.6.0版本:

midkr /data/zk
# 創(chuàng)建數(shù)據(jù)目錄
midkr /data/zk/data
cd /data/zk
wget http://mirror.bit.edu.cn/apache/zookeeper/zookeeper-3.6.0/apache-zookeeper-3.6.0-bin.tar.gz
tar -zxvf apache-zookeeper-3.6.0-bin.tar.gz
cd apache-zookeeper-3.6.0-bin/conf
cp zoo_sample.cfg zoo.cfg && vim zoo.cfg

把zoo.cfg文件中的dataDir設(shè)置為/data/zk/data穗熬,然后啟動(dòng)Zookeeper:

[root@localhost conf]# sh /data/zk/apache-zookeeper-3.6.0-bin/bin/zkServer.sh start
/usr/bin/java
ZooKeeper JMX enabled by default
Using config: /data/zk/apache-zookeeper-3.6.0-bin/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED

這里注意一點(diǎn),要啟動(dòng)此版本的Zookeeper服務(wù)必須本地安裝好JDK8+丁溅,這一點(diǎn)需要自行處理唤蔗。啟動(dòng)的默認(rèn)端口是2181,啟動(dòng)成功后的日志如下:

image

安裝Kafka

Kafka是一個(gè)高性能分布式消息隊(duì)列中間件,它的部署依賴于Zookeeper妓柜。筆者在此選用2.4.0并且Scala版本為2.13的安裝包:

mkdir /data/kafka
mkdir /data/kafka/data
wget http://mirrors.tuna.tsinghua.edu.cn/apache/kafka/2.4.0/kafka_2.13-2.4.0.tgz
tar -zxvf kafka_2.13-2.4.0.tgz

由于解壓后/data/kafka/kafka_2.13-2.4.0/config/server.properties配置中對(duì)應(yīng)的zookeeper.connect=localhost:2181已經(jīng)符合需要箱季,不必修改,需要修改日志文件的目錄log.dirs為/data/kafka/data棍掐。然后啟動(dòng)Kafka服務(wù):

sh /data/kafka/kafka_2.13-2.4.0/bin/kafka-server-start.sh /data/kafka/kafka_2.13-2.4.0/config/server.properties
image

這樣啟動(dòng)一旦退出控制臺(tái)就會(huì)結(jié)束Kafka進(jìn)程藏雏,可以添加-daemon參數(shù)用于控制Kafka進(jìn)程后臺(tái)不掛斷運(yùn)行。

sh /data/kafka/kafka_2.13-2.4.0/bin/kafka-server-start.sh -daemon /data/kafka/kafka_2.13-2.4.0/config/server.properties

安裝和使用Canal

終于到了主角登場(chǎng)作煌,這里選用Canal的v1.1.4穩(wěn)定發(fā)布版掘殴,只需要下載deployer模塊:

mkdir /data/canal
cd /data/canal
# 這里注意一點(diǎn),Github在國(guó)內(nèi)被墻粟誓,下載速度極慢奏寨,可以先用其他下載工具下載完再上傳到服務(wù)器中
wget https://github.com/alibaba/canal/releases/download/canal-1.1.4/canal.deployer-1.1.4.tar.gz
tar -zxvf canal.deployer-1.1.4.tar.gz

解壓后的目錄如下:

- bin   # 運(yùn)維腳本
- conf  # 配置文件
  canal_local.properties  # canal本地配置,一般不需要?jiǎng)?  canal.properties        # canal服務(wù)配置
  logback.xml             # logback日志配置
  metrics                 # 度量統(tǒng)計(jì)配置
  spring                  # spring-實(shí)例配置鹰服,主要和binlog位置計(jì)算病瞳、一些策略配置相關(guān),可以在canal.properties選用其中的任意一個(gè)配置文件
  example                 # 實(shí)例配置文件夾悲酷,一般認(rèn)為單個(gè)數(shù)據(jù)庫對(duì)應(yīng)一個(gè)獨(dú)立的實(shí)例配置文件夾
    instance.properties   # 實(shí)例配置套菜,一般指單個(gè)數(shù)據(jù)庫的配置
- lib   # 服務(wù)依賴包
- logs  # 日志文件輸出目錄

在開發(fā)和測(cè)試環(huán)境建議把logback.xml的日志級(jí)別修改為DEBUG方便定位問題。這里需要關(guān)注canal.properties和instance.properties兩個(gè)配置文件设易。canal.properties文件中逗柴,需要修改:

  • 去掉canal.instance.parser.parallelThreadSize = 16這個(gè)配置項(xiàng)的注釋,也就是啟用此配置項(xiàng)顿肺,和實(shí)例解析器的線程數(shù)相關(guān)嚎于,不配置會(huì)表現(xiàn)為阻塞或者不進(jìn)行解析。

  • canal.serverMode配置項(xiàng)指定為kafka挟冠,可選值有tcp、kafka和rocketmq(master分支或者最新的的v1.1.5-alpha-1版本袍睡,可以選用rabbitmq)知染,默認(rèn)是kafka。

  • canal.mq.servers配置需要指定為Kafka服務(wù)或者集群Broker的地址斑胜,這里配置為127.0.0.1:9092控淡。

canal.mq.servers在不同的canal.serverMode有不同的意義。
kafka模式下止潘,指Kafka服務(wù)或者集群Broker的地址掺炭,也就是bootstrap.servers
rocketmq模式下,指NameServer列表
rabbitmq模式下凭戴,指RabbitMQ服務(wù)的Host和Port

其他配置項(xiàng)可以參考下面兩個(gè)官方Wiki的鏈接:

  • Canal-Kafka-RocketMQ-QuickStart

  • AdminGuide

instance.properties一般指一個(gè)數(shù)據(jù)庫實(shí)例的配置涧狮,Canal架構(gòu)支持一個(gè)Canal服務(wù)實(shí)例,處理多個(gè)數(shù)據(jù)庫實(shí)例的binlog異步解析。instance.properties需要修改的配置項(xiàng)主要包括:

  • canal.instance.mysql.slaveId需要配置一個(gè)和Master節(jié)點(diǎn)的服務(wù)ID完全不同的值者冤,這里筆者配置為654321肤视。

  • 配置數(shù)據(jù)源實(shí)例,包括地址涉枫、用戶邢滑、密碼和目標(biāo)數(shù)據(jù)庫:

  • canal.instance.master.address,這里指定為127.0.0.1:3306愿汰。

  • canal.instance.dbUsername困后,這里指定為canal。

  • canal.instance.dbPassword衬廷,這里指定為QWqw12!@摇予。

  • 新增canal.instance.defaultDatabaseName,這里指定為test(需要在MySQL中建立一個(gè)test數(shù)據(jù)庫泵督,見前面的流程)趾盐。

  • Kafka相關(guān)配置,這里暫時(shí)使用靜態(tài)topic和單個(gè)partition:

  • canal.mq.topic小腊,這里指定為test救鲤,也就是解析完的binlog結(jié)構(gòu)化數(shù)據(jù)會(huì)發(fā)送到Kafka的命名為test的topic中。

  • canal.mq.partition秩冈,這里指定為0本缠。

配置工作做好之后,可以啟動(dòng)Canal服務(wù):

sh /data/canal/bin/startup.sh 
# 查看服務(wù)日志
tail -100f /data/canal/logs/canal/canal
# 查看實(shí)例日志  -- 一般情況下入问,關(guān)注實(shí)例日志即可
tail -100f /data/canal/logs/example/example.log

啟動(dòng)正常后丹锹,見實(shí)例日志如下:

image

在test數(shù)據(jù)庫創(chuàng)建一個(gè)訂單表,并且執(zhí)行幾個(gè)簡(jiǎn)單的DML:

use `test`;

CREATE TABLE `order`
(
    id          BIGINT UNIQUE PRIMARY KEY AUTO_INCREMENT COMMENT '主鍵',
    order_id    VARCHAR(64)    NOT NULL COMMENT '訂單ID',
    amount      DECIMAL(10, 2) NOT NULL DEFAULT 0 COMMENT '訂單金額',
    create_time DATETIME       NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '創(chuàng)建時(shí)間',
    UNIQUE uniq_order_id (`order_id`)
) COMMENT '訂單表';

INSERT INTO `order`(order_id, amount) VALUES ('10086', 999);
UPDATE `order` SET amount = 10087 WHERE order_id = '10086';
DELETE  FROM `order` WHERE order_id = '10086';

這個(gè)時(shí)候芬失,可以利用Kafka的kafka-console-consumer或者Kafka Tools查看test這個(gè)topic的數(shù)據(jù):

sh /data/kafka/kafka_2.13-2.4.0/bin/kafka-console-consumer.sh --bootstrap-server 127.0.0.1:9092 --from-beginning --topic test
image

具體的數(shù)據(jù)如下:

// test數(shù)據(jù)庫建庫腳本
{"data":null,"database":"`test`","es":1583143732000,"id":1,"isDdl":false,"mysqlType":null,"old":null,"pkNames":null,"sql":"CREATE DATABASE `test` CHARSET `utf8mb4` COLLATE `utf8mb4_unicode_ci`","sqlType":null,"table":"","ts":1583143930177,"type":"QUERY"}

// order表建表DDL
{"data":null,"database":"test","es":1583143957000,"id":2,"isDdl":true,"mysqlType":null,"old":null,"pkNames":null,"sql":"CREATE TABLE `order`\n(\n    id          BIGINT UNIQUE PRIMARY KEY AUTO_INCREMENT COMMENT '主鍵',\n    order_id    VARCHAR(64)    NOT NULL COMMENT '訂單ID',\n    amount      DECIMAL(10, 2) NOT NULL DEFAULT 0 COMMENT '訂單金額',\n    create_time DATETIME       NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '創(chuàng)建時(shí)間',\n    UNIQUE uniq_order_id (`order_id`)\n) COMMENT '訂單表'","sqlType":null,"table":"order","ts":1583143958045,"type":"CREATE"}

// INSERT
{"data":[{"id":"1","order_id":"10086","amount":"999.0","create_time":"2020-03-02 05:12:49"}],"database":"test","es":1583143969000,"id":3,"isDdl":false,"mysqlType":{"id":"BIGINT","order_id":"VARCHAR(64)","amount":"DECIMAL(10,2)","create_time":"DATETIME"},"old":null,"pkNames":["id"],"sql":"","sqlType":{"id":-5,"order_id":12,"amount":3,"create_time":93},"table":"order","ts":1583143969460,"type":"INSERT"}

// UPDATE
{"data":[{"id":"1","order_id":"10086","amount":"10087.0","create_time":"2020-03-02 05:12:49"}],"database":"test","es":1583143974000,"id":4,"isDdl":false,"mysqlType":{"id":"BIGINT","order_id":"VARCHAR(64)","amount":"DECIMAL(10,2)","create_time":"DATETIME"},"old":[{"amount":"999.0"}],"pkNames":["id"],"sql":"","sqlType":{"id":-5,"order_id":12,"amount":3,"create_time":93},"table":"order","ts":1583143974870,"type":"UPDATE"}

// DELETE
{"data":[{"id":"1","order_id":"10086","amount":"10087.0","create_time":"2020-03-02 05:12:49"}],"database":"test","es":1583143980000,"id":5,"isDdl":false,"mysqlType":{"id":"BIGINT","order_id":"VARCHAR(64)","amount":"DECIMAL(10,2)","create_time":"DATETIME"},"old":null,"pkNames":["id"],"sql":"","sqlType":{"id":-5,"order_id":12,"amount":3,"create_time":93},"table":"order","ts":1583143981091,"type":"DELETE"}

可見Kafka的名為test的topic已經(jīng)寫入了對(duì)應(yīng)的結(jié)構(gòu)化binlog事件數(shù)據(jù)楣黍,可以編寫消費(fèi)者監(jiān)聽Kafka對(duì)應(yīng)的topic然后對(duì)獲取到的數(shù)據(jù)進(jìn)行后續(xù)處理。

小結(jié)

這篇文章大部分篇幅用于介紹其他中間件是怎么部署的棱烂,這個(gè)問題側(cè)面說明了Canal本身部署并不復(fù)雜租漂,它的配置文件屬性項(xiàng)比較多,但是實(shí)際上需要自定義和改動(dòng)的配置項(xiàng)是比較少的颊糜,也就是說明了它的運(yùn)維成本和學(xué)習(xí)成本并不高哩治。后面會(huì)分析基于結(jié)構(gòu)化binlog事件做ELT和持久化相關(guān)工作以及Canal的生產(chǎn)環(huán)境可用級(jí)別HA集群的搭建。

參考資料:

  • A Quick Guide to Using the MySQL Yum Repository

  • Canal

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末衬鱼,一起剝皮案震驚了整個(gè)濱河市业筏,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌鸟赫,老刑警劉巖蒜胖,帶你破解...
    沈念sama閱讀 206,311評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件消别,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡翠勉,警方通過查閱死者的電腦和手機(jī)妖啥,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來对碌,“玉大人荆虱,你說我怎么就攤上這事⌒嗝牵” “怎么了怀读?”我有些...
    開封第一講書人閱讀 152,671評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)骑脱。 經(jīng)常有香客問我菜枷,道長(zhǎng),這世上最難降的妖魔是什么叁丧? 我笑而不...
    開封第一講書人閱讀 55,252評(píng)論 1 279
  • 正文 為了忘掉前任啤誊,我火速辦了婚禮,結(jié)果婚禮上拥娄,老公的妹妹穿的比我還像新娘蚊锹。我一直安慰自己,他們只是感情好稚瘾,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評(píng)論 5 371
  • 文/花漫 我一把揭開白布牡昆。 她就那樣靜靜地躺著,像睡著了一般摊欠。 火紅的嫁衣襯著肌膚如雪丢烘。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,031評(píng)論 1 285
  • 那天些椒,我揣著相機(jī)與錄音播瞳,去河邊找鬼。 笑死免糕,一個(gè)胖子當(dāng)著我的面吹牛狐史,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播说墨,決...
    沈念sama閱讀 38,340評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼苍柏!你這毒婦竟也來了尼斧?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,973評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤试吁,失蹤者是張志新(化名)和其女友劉穎棺棵,沒想到半個(gè)月后楼咳,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,466評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡烛恤,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評(píng)論 2 323
  • 正文 我和宋清朗相戀三年母怜,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片缚柏。...
    茶點(diǎn)故事閱讀 38,039評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡苹熏,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出币喧,到底是詐尸還是另有隱情轨域,我是刑警寧澤,帶...
    沈念sama閱讀 33,701評(píng)論 4 323
  • 正文 年R本政府宣布杀餐,位于F島的核電站干发,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏史翘。R本人自食惡果不足惜枉长,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望琼讽。 院中可真熱鬧必峰,春花似錦、人聲如沸跨琳。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽脉让。三九已至桂敛,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間溅潜,已是汗流浹背术唬。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留滚澜,地道東北人粗仓。 一個(gè)月前我還...
    沈念sama閱讀 45,497評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像设捐,于是被迫代替她去往敵國(guó)和親借浊。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容