前言
canal是阿里開源的數(shù)據(jù)同步工具,基于binlog可以將數(shù)據(jù)庫同步到其他各類數(shù)據(jù)庫中,目標(biāo)數(shù)據(jù)庫支持mysql,postgresql,oracle,redis,MQ,ES等。
一、 基本原理
1、主從復(fù)制原理
MySQL的主從復(fù)制是依賴于binlog,也就是記錄MySQL上所有操作的邏輯日志保存在磁盤上。主從復(fù)制就是將binlog中的數(shù)據(jù)從主庫傳輸?shù)綇膸焐希话氵@個過程是異步的。
原理示意圖:
詳細(xì)流程:
- 主庫寫binlog:主庫的更新SQL(create、update、insert、delete等)被寫入到binlog;
- 主庫發(fā)送binlog:主庫創(chuàng)建一個log dump線程來發(fā)送binlog給從庫;
- 從庫寫relay log:(從庫在連接到主節(jié)點時會創(chuàng)建一個IO線程,以請求主庫更新的binlog),并且把binlog信息寫入一個叫做relay log的日志文件;
- 從庫回放:從庫還會創(chuàng)建一個SQL線程讀取relay log中的內(nèi)容,并且在從庫中回訪,最終實現(xiàn)主從一致性。
2、Canal介紹
主要流程:
- Canal 服務(wù)端向 MySQL 的 master 節(jié)點傳輸dump協(xié)議;
- MySQL 的 master 節(jié)點接收到 dump 請求后推送 binlog 日志給 Canal 服務(wù)端,解析 binlog 對象(原始為byte流)轉(zhuǎn)成 Json 格式;
- Canal 客戶端通過 TCP 協(xié)議或 MQ 形式監(jiān)聽 Canal 服務(wù)端,同步數(shù)據(jù)到ES。
二、實操
這篇文章我將以“將 MySQL 中 coding 數(shù)據(jù)庫的 article 表同步到 ES ”為需求舉例
看一下article表的結(jié)構(gòu)(這里展示主要是為了展示后文的 yml文件 和 ES索引 是怎么回事):
1、軟件下載
個人電腦:Windows 11
JDK版本:jdk 11.0.21
1.1 MySQL
(默認(rèn)MySQL都已經(jīng)安裝了,登錄 mysql 按如下執(zhí)行)
- 在 mysql 命令行輸入
show variables like 'log_bin;'
查看是否開啟binlog,如下圖顯式 NO 為開啟 - 創(chuàng)建一個 canal 用戶,專門用于 canal 同步數(shù)據(jù)庫使用
# 注意大小寫
CREATE USER canal IDENTIFIED BY 'canal';
GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'canal'@'%';
FLUSH PRIVILEGES;
1.2 ES
- 安裝地址:https://www.elastic.co/cn/downloads/past-releases#elasticsearch
- 版本:7.17.2
1、點擊下載
2、將下載后的壓縮包解壓到一文件夾(路徑最好不要含有中文或空格)
3、雙擊bin/elasticsearch.bat啟動
4、檢查是否成功,輸入http://localhost:9200/?pretty
1.3 Kibana
1、安裝地址:https://www.elastic.co/cn/downloads/past-releases#kibana
2、版本:7.14.0
3、解壓安裝到指定文件夾
4、雙擊 D:\ProgramFiles\kibana-7.14.0-windows-x86_64\bin\kibana.bat 啟動
5、輸入 http://localhost:5601 檢驗是否啟動成功
6、在 Kibana 中創(chuàng)建ES索引(可以通過PostMan創(chuàng)建,看下圖示意)
PUT article
{
"mappings" : {
"properties" :{
"id" :{
"type" : "integer"
},
"user_id" : {
"type" : "integer"
},
"article_type" : {
"type" : "integer"
},
"title" : {
"type" : "text",
"analyzer" : "ik_max_word"
},
"short_title" : {
"type" : "text",
"analyzer" : "ik_max_word"
},
"picture" : {
"type" : "text",
"analyzer" : "ik_max_word"
},
"summary" : {
"type" : "text",
"analyzer" : "ik_max_word"
},
"category_id" : {
"type" : "integer"
},
"source" : {
"type" : "integer"
},
"source_url" : {
"type" : "text",
"analyzer" : "ik_max_word"
},
"offical_stat" : {
"type" : "integer"
},
"topping_stat" : {
"type" : "integer"
},
"cream_stat" : {
"type" : "integer"
},
"status" : {
"type" : "integer"
},
"deleted" : {
"type" : "integer"
},
"create_time" : {
"type" : "date"
},
"update_time" : {
"type" : "date"
}
}
}
}
PostMan執(zhí)行成功后返回200。
1.4 ik
1、下載地址:https://gitcode.com/medcl/elasticsearch-analysis-ik/tags/v7.17.2?utm_source=csdn_github_accelerator&isLogin=1
2、版本:7.17.2 (ik的版本必須與ES版本一致)
3、在 ES 目錄下的 plugins 中創(chuàng)建一個文件夾ik(ES的安裝目錄最好不要有空格就是因為我安裝的時候如果有空格 ik 啟動的時候會報錯)
4、將 ik 壓縮包解壓到 plugins/ik 目錄下,解壓后的目錄結(jié)構(gòu)如下
5、重啟elasticsearch、kibana
6、訪問 http://localhost:5601/app/dev_tools#/console,輸入方框中的內(nèi)容,點擊運行,出現(xiàn)右側(cè)的結(jié)果,就是說明安裝成功了。
1.5 Canal
下載配置Canal的時候真的遇到了很多亂七八糟奇奇怪怪的問題,我的建議是面向百度編程搜索無解的時候不如靜下來分析一下日志。
1、下載地址:https://github.com/alibaba/canal/releases
2、版本:1.1.7
先把框中這三個壓縮包下載下來解壓到文件夾:比如
canal.deployer:相當(dāng)于canal的服務(wù)端,啟動它才可以在客戶端接收數(shù)據(jù)庫變更信息
canal.adapter:增加客戶端數(shù)據(jù)落地的適配以及啟動功能(當(dāng) deployer 收到消息后,會根據(jù)不同的目錄源做適配,比如 es 目標(biāo)源適配等。看需求,目標(biāo)源是Redis就不用這個。)
2、canal 配置
2.1 canal.deployer 配置
修改 canal.deployer-1.1.7\conf\example\instance.properties 文件
2.2 canal.deployer 啟動
1、雙擊 “D:\ProgramFiles\canal.deployer-1.1.7\bin\startup.bat” 啟動
2、在 “D:\ProgramFiles\canal.deployer-1.1.7\logs\canal\canal.log” 中查看啟動日志,存在類似于下圖的字樣說明啟動成功,也可能會在日志中看到binlog轉(zhuǎn)成Json后的sql邏輯
3、如果之前同步過,想要重新做全量同步,那么需要刪除 “D:\ProgramFiles\canal.deployer-1.1.7\conf\example\meta.dat” 文件,這個文件記錄上次同步的時間和 binlog 位置。
2.3 source源碼配置
我上邊的 canal-canal-1.1.7 文件夾就是 source 解壓之后
1、用 IDEA 打開 canal-canal-1.1.7 項目,等待依賴加載完畢,編譯成功
2、在 “canal-canal-1.1.7\client-adapter\es7x\pom.xml” 中增加依賴
<dependency>
<groupId>com.alibaba.otter</groupId>
<artifactId>client-adapter.common</artifactId>
<version>${project.version}</version>
<scope>provided</scope>
</dependency>
3、在 “canal-canal-1.1.7\pom.xml” 中增加如下片段,主要是打包跳過測試,避免報錯
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>${maven-surefire.version}</version>
<configuration>
<useSystemClassLoader>true</useSystemClassLoader>
<forkMode>once</forkMode>
<argLine>${argline} ${jacocoArgLine}</argLine>
<systemProperties>
<!-- common shared -->
</systemProperties>
<skipTests>true</skipTests> <!--默認(rèn)關(guān)掉單元測試 -->
</configuration>
</plugin>
4、在maven插件中重新打包
5、打包成功后將打包后的產(chǎn)物 "D:\ProgramFiles\canal-canal-1.1.7\client-adapter\es7x\target\client-adapter.es7x-1.1.7-jar-with-dependencies.jar"
替換 "D:\ProgramFiles\canal.adapter-1.1.7\plugin\client-adapter.es7x-1.1.7-jar-with-dependencies.jar"
(注意是把 source 中的產(chǎn)物替換到 adapter 文件夾下)
2.4 canal.adapter配置
1、先將 “D:\ProgramFiles\canal.adapter-1.1.7\conf\bootstrap.yml” 文件中的全部內(nèi)容注釋(這個文件應(yīng)該是給 canal.admin 用的,不注釋掉的話啟動時會提供XX表不存在)
2、修改 “D:\ProgramFiles\canal.adapter-1.1.7\conf\application.yml” 文件,重點看一下方框里的內(nèi)容就是,其他默認(rèn)的不用改
3、在 “D:\ProgramFiles\canal.adapter-1.1.7\conf\es7” 文件夾創(chuàng)建 article.yml 文件
文件內(nèi)容如下:
datasourceKey: defaultDS #源數(shù)據(jù)源的key,對應(yīng)上面配置的srcDatasources中的值
destination: example #canal的instance或者MO的topic
groupId: g1 #對應(yīng)MQ模式下的groupId,只會同步對應(yīng)groupId的數(shù)據(jù)
esMapping:
_index: article #es 的索引名稱
_id: _id #es 的 id,如果不配置該項必須配置下面的pk項 id則會由es自動分配
sql: "SELECT t.id As _id, t.id, t.user_id, t.article_type, t.title,t.short_title,
t.picture, t.summary, t.category_id, t.source, t.source_url, t.offical_stat,t.topping_stat,
t.cream_stat, t.status, t.deleted, t.create_time,
t.update_time FROM article t" # sq1映射
commitBatch: 1 # 提交批大小
“D:\ProgramFiles\canal.adapter-1.1.7\conf\es7” 解壓后這個文件夾下應(yīng)該會有3個默認(rèn)的 yml 文件,最好刪掉,不然啟動的時候會報錯
2.5 canal.adapter 啟動
1、雙擊 “D:\ProgramFiles\canal.adapter-1.1.7\bin\startup.bat” 啟動
2、到 “D:\ProgramFiles\canal.adapter-1.1.7\logs\adapter\adapter.log” 中查看 日志,有這樣的顯示說明啟動成功,并且執(zhí)行同步操作了
3、日志的最后能看到同步的條數(shù)和時間
4、也可以通過 curl 進行全量同步操作
curl http://127.0.0.1:8081/etl/es7/article.yml -X POST
5、在 Kibana 中查看,成功。
三、Q&A
1、好多教程里沒有 source 的部分,啟動adapter的就會出現(xiàn)問題,先把source 的部分配置好再試下;
2、source源碼在IDEA中編譯一直失敗
可能是這個地方?jīng)]有改成你自己的倉庫,也可能就是網(wǎng)絡(luò)不好。
3、啟動adapter時報錯:Failed to bind properties under ‘es-mapping’ to com.alibaba.otter.canal.client.adapter.es.core.config.ESSyncConfig$ESMapping
用記事本打開 startup.bat 文件,classPath 分號前后的內(nèi)容順序換一下,下面是改好后的樣子文章來源:http://www.zghlxwxcb.cn/news/detail-851141.html
4、忘記截圖了,看日志大概意思是說“找不到XXX索引”
找不到的索引是 canal.adapter 文件夾解壓的時候 canal.adapter-1.1.7\conf\es7 里自帶的,把自帶的yml文件刪除就好了文章來源地址http://www.zghlxwxcb.cn/news/detail-851141.html
5、如果想起來其他問題會再補充,啟動 adapter 時一些問題其實不太容易直接搜出來的,這個時候自己多看一下 adapter 的日志,嘗試?yán)斫鈫栴}現(xiàn)象思考原因。
到了這里,關(guān)于canal實現(xiàn)MySQL和ES同步實踐的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!