https://github.com/alibaba/canal/
阿里开源的数据同步工具,同步mysql的数据到es中,利用的是mysql的binlog日志。
canal就是把自己伪装成Slave,模拟slave的交互协议向master发送消息,master接收到消息,把bin log给canal,然后canal解析bin log再发送到具体的目的地。
数据同步,不同 不是全量的,是增量的。
一:mysql配置
1.新建一个mysql
2.创建一个canal用户并授权,也可以直接使用root账号
– 使用命令登录:mysql -u root -p
– 创建用户 用户名:canal 密码:lihairui
create user ‘canal’@‘%’ identified by ‘lihairui’;
– 授权 *.*表示所有库
grant SELECT, REPLICATION SLAVE, REPLICATION CLIENT on *.* to 'canal'@'%' identified by 'lihairui';
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'lihairui' WITH GRANT OPTION;
FLUSH PRIVILEGES;
3.修改mysql的配置文件(my.ini,my.cnf)
[mysqld]
log-bin=mysql-bin
binlog-format=ROW
server_id=1
4.重启mysql,查看是否开启了binlog模式
show variables like 'log_bin';
show variables like 'binlog_format';
5.查看日志状态和master和slave状态
show binary logs;
show master status;
show slave status;
默认端口是8089,
默认账号密码admin/123456
1.github下载canal.admin压缩包并解压到指定目录(目录不要有中文和空格)
2.配置admin的conf/application.yml
修改数据库信息
3.执行conf/canal_manager.sql文件,新建数据库和表
4.启动start.bat,输入localhost:8090,admin/123456账号密码
默认端口是11111
1.github下载cancal.deployer压缩包并解压到指定目录(目录不要有中文和空格)
2.如果使用canal.admin的话,要配置deployer的conf/canal.properties,把conf/canal_local.properties里面的配置覆盖到canal.properties的admin属性模块里面
3.配置deplyer的 conf/example/instance.properties
修改canal.instance.master.address
修改canal.instance.dbUsername
修改canal.instance.dbPassword
修改canal.instance.filter.regex,配置要监控哪些表,如果不配置,监控所有表
4.配置conf/canal.properties
修改canal.destinations,监听哪些canal实例名称(即conf下配置的文件夹名称,文件夹包含instance.properties),如果有多个,逗号分割
5.启动startup.bat,
如果报缺少jvm.dll,把jdk/jre/server文件夹拷贝到jre/bin下面
如果报下图
startup.bat打开删除红色里面的代码
6.如果么没报错,表明启动成功
三.canal.adaptor配置
默认端口是8081
在github下载canal.adaptor压缩包并解压到指定目录(目录不要有中文和空格)
修改conf/application.yml文件
修改canalServerHost,默认不修改,读取的是canalserver的配置信息
修改defaultDS
修改outerAdapter.es,要和es配置信息保持一致,选用高级的rest
修改conf/es/mytest_user.yml,不修改启动会报错
修改mytest_user.yml
创建mytest表
dataSourceKey: defaultDS
destination: example
groupId: g1
esMapping:
_index: mytest_user
_type: _doc
_id: id
upsert: true
# pk: id
sql: "select a.id id,a.name name,a.role_id role_id,a.c_time c_time from user a"
# objFields:
# _labels: array:;
etlCondition: "where a.c_time>={}"
commitBatch: 3000
create database mytest;
use mytest;
create table user (
`id` int(10) NOT NULL,
`name` varchar(100) DEFAULT NULL,
`role_id` int(10) NOT NULL,
`c_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
`c_utime` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
);
创建es的mytest_user索引
PUT /mytest_user
{
"mappings": {
"_doc": {
"properties": {
"name": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword"
}
}
},
"role_id": {
"type": "long"
},
"c_time": {
"type": "date"
}
}
}
}
}
9.启动canal.adapter,插入一条数据,看是否同步到es了。
【初始化数据,全量导入】
http://127.0.0.1:8081/etl/es/mytest_user.yml
【canal同步数据到es步骤】
在deployer的conf/ 下面新建文件夹,文件夹就是canal的实例名字,然后在新建的文件夹里面新建instance.properties,修改相关配置
修改canal.instance.master.address
修改canal.instance.dbUsername
修改canal.instance.dbPassword
修改canal.instance.filter.regex
在deployer的conf/canal.properties修改配置
在adapter里面配置conf/application.yml,配置要适配的实例名称
确定要处理的索引的结构,一旦建立无法修改
在adapter的conf/es文件夹下面建立 索引名称.yml文件,
在kibana里面执行插入索引,然后重启canal服务。
【sql映射】
【canal同步可能遇到的问题】
###【注意】
deployer的conf里面可以配置多个目录,每个目录(canal要配置的多个实例名字)里面的配置表明是一个索引,建立完毕之后,deployer就会监控这里面的instance.properties。
adapter同步es,adapter下的conf/application.yml,添加多个- instance:实例,实例名字就是deployer的conf配置的文件夹名字,然后通过es文件夹下面的实例名字.yml进行es相关的配置映射等。
总结:
deployer的conf文件夹就是配置要查询的表信息和数据库连接信息,配置的文件夹名字就是canal实例名字。。
adapter如果是同步es,下面conf/application.yml就要配置多个canal实例名字(即deployer配置的文件夹名字),然后再conf/es文件夹下面,配置实例名字.yml配置文件,进行sql查询之后的结果和es入库之间的映射关系。