使用canal同步mysql数据至es的特点如下:
- 使用mysql的binlog(中性)
- 支持增量更新(优点)
- 配置可用(优点)
- 实时性高(优点)
- 需要预先在es中创建mapping关系(缺点)
- 每个索引都需要定义一个配置(中性)
下载
下载&&编译
git clone git@github.com:alibaba/canal.git
cd canal;
切换至最新版本1.1.3,开始编译安装
mvn clean install -Dmaven.test.skip -Denv=release
编译完成后,会在根目录下的target文件夹产生三个压缩包:
- canal.adapter-1.1.3.tar.gz (客户端)
- canal.deployer-1.1.3.tar.gz (服务端)
- canal.example-1.1.3.tar.gz (路人甲)
部署服务端
mysql配置binlog
首先配置mysqld中的binlog
[mysqld]
log-bin=mysql-bin #添加这一行就ok
binlog-format=ROW #选择row模式
server_id=1 #配置mysql replaction需要定义,不能和canal的slaveId重复
授予响应账号的权限
CREATE USER canal IDENTIFIED BY 'canal';
GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'canal'@'%';
-- GRANT ALL PRIVILEGES ON *.* TO 'canal'@'%' ;
FLUSH PRIVILEGES;
服务端
解压
tar zxvf canal.deployer-$version.tar.gz -C /tmp/canal
修改配置vi conf/example/instance.properties
配置
#################################################
## mysql serverId
canal.instance.mysql.slaveId = 1234
#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.standby.address =
#canal.instance.standby.journal.name =
#canal.instance.standby.position =
#canal.instance.standby.timestamp =
#username/password,需要改成自己的数据库信息
canal.instance.dbUsername = canal
canal.instance.dbPassword = canal
canal.instance.defaultDatabaseName =
canal.instance.connectionCharset = UTF-8
#table regex
canal.instance.filter.regex = .*\\..*
#################################################
准备启动
sh bin/startup.sh
查看日志
vi logs/canal/canal.log
关闭
sh bin/stop.sh
客户端
解压adapter压缩包,配置application.yml
canal.conf:
canalServerHost: 127.0.0.1:11111
batchSize: 500
syncBatchSize: 1000
retries: 0
timeout:
mode: tcp
srcDataSources:
defaultDS:
url: jdbc:mysql://127.0.0.1:3306/mytest?useUnicode=true
username: root
password: 121212
canalAdapters:
- instance: example
groups:
- groupId: g1
outerAdapters:
- name: es
hosts: 127.0.0.1:9300 # es 集群地址, 逗号分隔
properties:
cluster.name: elasticsearch # es cluster name
adapter将会自动加载 conf/es 下的所有.yml结尾的配置文件
适配器表映射文件
修改 conf/es/mytest_user.yml文件:
dataSourceKey: defaultDS # 源数据源的key, 对应上面配置的srcDataSources中的值
destination: example # cannal的instance或者MQ的topic
groupId: # 对应MQ模式下的groupId, 只会同步对应groupId的数据
esMapping:
_index: canal_test # es 的索引名称
_type: _doc # es 的doc名称
_id: _id # es 的_id, 如果不配置该项必须配置下面的pk项_id则会由es自动分配
upsert: true
# pk: id # 如果不需要_id, 则需要指定一个属性为主键属性
# sql映射
sql: "select a.id as _id, a.name from canal_test a"
# objFields:
# _labels: array:; # 数组或者对象属性, array:; 代表以;字段里面是以;分隔的
# _obj: object # json对象
etlCondition: "" # etl 的条件参数
commitBatch: 3000 # 提交批大小
启动
./start.sh
创建es相关mapping关系
修改mysql数据项,触发变化,数据则会同步至响应索引中