Kafka Connect 實現MySQL增量同步

前言

本文將使用Kafka Connect 實現MySQL增量同步,設計三種模式,分別為incrementing timestamp timestamp+incrementing
理論續自上文
當然你也可以使用除了MySQL其他DB,參考官網放置對應的驅動文件即可。

以下實驗請在能正常Kafka生產消費的基礎之上進行。

1、incrementing 自增模式

準備工作

創建 A數據庫源表person

CREATE TABLE `person` (
  `pid` int(11) NOT NULL AUTO_INCREMENT,
  `firstname` varchar(255) CHARACTER SET utf8 DEFAULT NULL,
  `age` int(11) DEFAULT NULL,
  PRIMARY KEY (`pid`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

創建 B數據庫目標表kafkaperson

CREATE TABLE `kafkaperson` (
  `pid` int(11) NOT NULL AUTO_INCREMENT,
  `firstname` varchar(255) CHARACTER SET utf8 DEFAULT NULL,
  `age` int(11) DEFAULT NULL,
  PRIMARY KEY (`pid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

切換目錄 D:\com\kafka_2.11-2.0.1\config
quickstart-mysql.properties(source)

name=mysql-a-source-person
connector.class=io.confluent.connect.jdbc.JdbcSourceConnector
tasks.max=1
connection.url=jdbc:mysql://localhost:3306/A?user=***&password=***
# incrementing  自增
mode=incrementing
# 自增字段  pid
incrementing.column.name=pid
# 白名單表  person
table.whitelist=person
# topic前綴   mysql-kafka-
topic.prefix=mysql-kafka-

quickstart-mysql-sink.properties(sink)

name=mysql-a-sink-person
connector.class=io.confluent.connect.jdbc.JdbcSinkConnector
tasks.max=1
#kafka的topic名稱
topics=mysql-kafka-person
# 配置JDBC鏈接
connection.url=jdbc:mysql://localhost:3306/B?user=***&password=***
# 不自動創建表,如果為true,會自動創建表,表名為topic名稱
auto.create=false
# upsert model更新和插入
insert.mode=upsert
# 下面兩個參數配置了以pid為主鍵更新
pk.mode = record_value
pk.fields = pid
#表名為kafkatable
table.name.format=kafkaperson

實驗一

創建 Kafka Topic: mysql-kafka-person

D:\com\kafka_2.11-2.0.1\bin\windows>kafka-run-class.bat kafka.admin.TopicCommand --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic mysql-kafka-person

啟動 Kafka Connect

D:\com\kafka_2.11-2.0.1\bin\windows>connect-standalone.bat D:/com/kafka_2.11-2.0.1/config/connect-standalone.properties D:/com/kafka_2.11-2.0.1/config/quickstart-mysql.properties D:/com/kafka_2.11-2.0.1/config/quickstart-mysql-sink.properties

A庫person表插入三條數據


創建測試數據

稍后發現B庫kafkaperson表中進入了這三條數據


image.png

consumer控制臺 觀察到三條數據
Topic console

此時插入1條新數據

INSERT INTO person(pid, firstname, age) VALUES(4, 'zl', 20);

發現B庫表中也多了一條pid為4的數據


添加新的數據

實驗一結論

JDBC Sink Connector 官網中指出insert.mode有且僅有兩個值
insert.mode=insert只接收標準的INSERT SQL新增語句
insert.mode=upsert接收新增和更新,當對主鍵修改時也可以洞察并且輸出。而insert是無法滿足此要求的,因此根據實際業務使用的場景選擇insert.mode

INSERT INTO person (pid, firstname, age) VALUES (2, 'ls', 15) ON DUPLICATE KEY UPDATE firstname="world"; 

然而我在實驗過程中并沒有成功,因此沒看出來insert和upsert的區別,希望成功的人可以在留言中指正下!

2、timestamp 時間戳模式

準備工作

創建 A數據庫源表comments

CREATE TABLE `comments` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `content` varchar(255) DEFAULT NULL,
  `commenttime` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=latin1;

注意timestamp必須指定not null,否則會報錯!(無法使用時間戳列進行增量查詢因為時間戳字段是可為空的...)
創建 B數據庫源表kafkacomments

CREATE TABLE `kafkacomments` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `content` varchar(255) DEFAULT NULL,
  `commenttime` timestamp NULL DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=latin1;

切換目錄 D:\com\kafka_2.11-2.0.1\config
timestamp-mysql-source.properties(source)

name=mysql-b-source-comments
connector.class=io.confluent.connect.jdbc.JdbcSourceConnector
tasks.max=1
connection.url=jdbc:mysql://localhost:3306/A?user=***&password=***
table.whitelist=comments
mode=timestamp
timestamp.column.name=commenttime
topic.prefix=mysql-kafka-

timestamp-mysql-sink.properties(sink)

name=mysql-b-sink-comments
connector.class=io.confluent.connect.jdbc.JdbcSinkConnector
tasks.max=1
#kafka的topic名稱
topics=mysql-kafka-comments
# 配置JDBC鏈接
connection.url=jdbc:mysql://localhost:3306/B?user=***&password=***
# 不自動創建表,如果為true,會自動創建表,表名為topic名稱
auto.create=false
# upsert model更新和插入
insert.mode=upsert
# 下面兩個參數配置了以id為主鍵更新
pk.mode = record_value
pk.fields = id
#表名為kafkatable
table.name.format=kafkacomments

實驗二

創建 Kafka Topic: mysql-kafka-comments

D:\com\kafka_2.11-2.0.1\bin\windows>kafka-run-class.bat kafka.admin.TopicCommand --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic mysql-kafka-comments

啟動 Kafka Connect

D:\com\kafka_2.11-2.0.1\bin\windows>connect-standalone.bat D:/com/kafka_2.11-2.0.1/config/connect-standalone.properties D:/com/kafka_2.11-2.0.1/config/timestamp-mysql-source.properties D:/com/kafka_2.11-2.0.1/config/timestamp-mysql-sink.properties

A庫comments表插入四條數據


A.comments表

此時發現控制臺和目標表中有了四條數據


image.png

B.kafkacomments表

此時修改id為2和4的內容content,并修改評論時間commenttime

update comments set content = "show test data" ,commenttime="2018-12-20 15:55:10" where id in(2,4)

發現源表和目標表中的內容都發生了變化!


image.png

image.png

image.png

注意:

1、如果修改的時間戳早于latest time ,則不會洞察到更新。例如MySQL中的now()獲取當前時間就是很好的能被獲取到的例子。
2、源表向目標表傳輸數據,假設有兩條(或以上)的數據行擁有同樣的時間戳,如果在傳輸第二條的過程中崩潰,恢復過后第二條將會被丟失,因為latest time已經被記錄過了,他只會去找更新的下一次時間。這種方式雖然能獲取到update更新,但是不夠穩健。而如果使用自增字段加時間戳字段混合的方式,即使崩潰也能記錄到更新的最大ID,恢復之后可以被找到不會丟失。因此我們更推薦第三種方式!timestamp+incrementing

3、timestamp+incrementing 時間戳自增混合模式

實驗過程同方法2不做贅述,唯一變動的是source的config文件

name=mysql-b-source-comments
connector.class=io.confluent.connect.jdbc.JdbcSourceConnector
tasks.max=1
connection.url=jdbc:mysql://localhost:3306/A?user=***&password=***
table.whitelist=comments
mode=timestamp+incrementing
timestamp.column.name=commenttime
incrementing.column.name=id
topic.prefix=mysql-kafka-

至此完成使用Kafka Connect 三種模式實現MySQL增量同步!

謝謝閱讀,有幫助的點個?!

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

推薦閱讀更多精彩內容

  • 前言: 最近需要調研Kafka Connect可連接哪些數據源,特此學習官網并翻譯了下文檔。Confluent J...
    CNSTT閱讀 13,960評論 4 6
  • MYSQL 基礎知識 1 MySQL數據庫概要 2 簡單MySQL環境 3 數據的存儲和獲取 4 MySQL基本操...
    Kingtester閱讀 7,830評論 5 116
  • 關于Mongodb的全面總結 MongoDB的內部構造《MongoDB The Definitive Guide》...
    中v中閱讀 31,985評論 2 89
  • 有一種落差是,你配不上自己的野心,也辜負了自己的期望。 現在的我成了當時最討厭的那類人,卻身處迷惘,我們都希望來生...
    麒實在等你閱讀 607評論 0 1
  • 不管昨夜你經歷了怎樣的泣不成聲,早晨醒來 這個城市依舊車水馬龍,人 總要學著自己長大。
    小翼a閱讀 123評論 0 0