本文介紹如何使用canal增量同步mysql數據庫信息到ElasticSearch。(注意:是增量!!!)mysql
Canal是一個基於MySQL二進制日誌的高性能數據同步系統。Canal普遍用於阿里巴巴集團(包括www.taobao.com),以提供可靠的低延遲增量數據管道,github地址:github.com/alibaba/can…git
Canal Server可以解析MySQL binlog並訂閱數據更改,而Canal Client能夠實現將更改廣播到任何地方,例如數據庫和Apache Kafka。github
它具備如下功能:spring
缺點:sql
不支持全量更新,只支持增量更新。數據庫
完整wiki地址:github.com/alibaba/can…bash
原理很簡單:服務器
如圖所示:app
在同步數據到es的時候須要使用適配器:canal adapter。目前最新版本1.1.3,下載地址:github.com/alibaba/can…。elasticsearch
目前es貌似支持6.x版本,不支持7.x版本!!!
安裝es能夠參考:www.dalaoyang.cn/article/78
安裝jdk能夠參考:www.dalaoyang.cn/article/16
下載canal.deployer-1.1.3.tar.gz
wget https://github.com/alibaba/canal/releases/download/canal-1.1.3/canal.deployer-1.1.3.tar.gz
複製代碼
解壓文件
tar -zxvf canal.deployer-1.1.3.tar.gz
複製代碼
進入解壓後的文件夾
cd canal.deployer-1.1.3
複製代碼
修改conf/example/instance.properties文件,主要注意如下幾處:
完整內容以下:
#################################################
## mysql serverId , v1.0.26+ will autoGen
# canal.instance.mysql.slaveId=0
# enable gtid use true/false
canal.instance.gtidon=false
# position info
canal.instance.master.address=127.0.0.1:3306
canal.instance.master.journal.name=
canal.instance.master.position=
canal.instance.master.timestamp=
canal.instance.master.gtid=
# rds oss binlog
canal.instance.rds.accesskey=
canal.instance.rds.secretkey=
canal.instance.rds.instanceId=
# table meta tsdb info
canal.instance.tsdb.enable=true
#canal.instance.tsdb.url=
#canal.instance.tsdb.dbUsername=
#canal.instance.tsdb.dbPassword=
#canal.instance.standby.address =
#canal.instance.standby.journal.name =
#canal.instance.standby.position =
#canal.instance.standby.timestamp =
#canal.instance.standby.gtid=
# username/password
canal.instance.dbUsername=root
canal.instance.dbPassword=12345678
canal.instance.connectionCharset = UTF-8
# enable druid Decrypt database password
canal.instance.enableDruid=false
#canal.instance.pwdPublicKey=MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBALK4BUxdDltRRE5/zXpVEVPUgunvscYFtEip3pmLlhrWpacX7y7GCMo2/JM6LeHmiiNdH1FWgGCpUfircSwlWKUCAwEAAQ==
# table regex
canal.instance.filter.regex=.*\\..*
# table black regex
canal.instance.filter.black.regex=
# mq config
#canal.mq.topic=example
# dynamic topic route by schema or table regex
#canal.mq.dynamicTopic=mytest1.user,mytest2\\..*,.*\\..*
#canal.mq.partition=0
# hash partition config
#canal.mq.partitionsNum=3
#canal.mq.partitionHash=test.table:id^name,.*\\..*
#################################################
複製代碼
回到canal.deployer-1.1.3目錄下,啓動canal:
sh bin/startup.sh
複製代碼
查看日誌:
vi logs/canal/canal.log
複製代碼
查看具體instance日誌:
vi logs/example/example.log
複製代碼
關閉命令
sh bin/stop.sh
複製代碼
下載canal.adapter-1.1.3.tar.gz
wget https://github.com/alibaba/canal/releases/download/canal-1.1.3/canal.adapter-1.1.3.tar.gz
複製代碼
解壓
tar -zxvf canal.adapter-1.1.3.tar.gz
複製代碼
進入解壓後的文件夾
cd canal.adapter-1.1.3
複製代碼
修改conf/application.yml文件,主要注意以下內容,因爲是yml文件,注意我這裏說明的屬性名稱:
完整內容以下:
server:
port: 8081
spring:
jackson:
date-format: yyyy-MM-dd HH:mm:ss
time-zone: GMT+8
default-property-inclusion: non_null
canal.conf:
mode: tcp
canalServerHost: 127.0.0.1:11111
batchSize: 500
syncBatchSize: 1000
retries: 0
timeout:
accessKey:
secretKey:
srcDataSources:
defaultDS:
url: jdbc:mysql://127.0.0.1:3306/test?useUnicode=true
username: root
password: 12345678
canalAdapters:
- instance: example
groups:
- groupId: g1
outerAdapters:
- name: es
hosts: 127.0.0.1:9300
properties:
cluster.name: elasticsearch
複製代碼
另外須要配置conf/es/*.yml文件,adapter將會自動加載conf / es下的全部.yml結尾的配置文件。在介紹配置前,須要先介紹一下本案例使用的表結構,以下:
CREATE TABLE `test` (
`id` int(11) NOT NULL,
`name` varchar(200) NOT NULL,
`address` varchar(1000) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
複製代碼
須要手動去es中建立索引,好比這裏使用es-head建立,以下圖:
test索引結構以下:
{
"mappings":{
"_doc":{
"properties":{
"name":{
"type":"text"
},
"address":{
"type":"text"
}
}
}
}
}
複製代碼
接下來建立test.yml(文件名隨意),內容很好理解_index爲索引名稱,sql爲對應語句,內容以下:
dataSourceKey: defaultDS
destination: example
groupId:
esMapping:
_index: test
_type: _doc
_id: _id
upsert: true
sql: "select a.id as _id,a.name,a.address from test a"
commitBatch: 3000
複製代碼
配置完成後,回到canal-adapter根目錄,執行命令啓動
bin/startup.sh
複製代碼
查看日誌
vi logs/adapter/adapter.log
複製代碼
關閉canal-adapter命令
bin/stop.sh
複製代碼
都啓動成功後,先查看一下es-head,如圖,如今是沒有任何數據的。
接下來,咱們在數據庫中插入一條數據進行測試,語句以下:
INSERT INTO `test`.`test`(`id`, `name`, `address`) VALUES (7, '北京', '北京市朝陽區');
複製代碼
而後在看一下es-head,以下
接下來看一下日誌,以下:
2019-06-22 17:54:15.385 [pool-2-thread-1] DEBUG c.a.otter.canal.client.adapter.es.service.ESSyncService - DML: {"data":[{"id":7,"name":"北京","address":"北京市朝陽區"}],"database":"test","destination":"example","es":1561197255000,"groupId":null,"isDdl":false,"old":null,"pkNames":["id"],"sql":"","table":"test","ts":1561197255384,"type":"INSERT"}
Affected indexes: test
複製代碼
小知識點:上面介紹的查看日誌的方法可能不是很好用,推薦使用以下語法,好比查看日誌最後200行:
tail -200f logs/adapter/adapter.log
複製代碼
1.全量更新不能實現,可是增刪改都是能夠的。 2.必定要提早建立好索引。 3.es配置的是tcp端口,好比默認的9300