canal同步mysql数据到elasticsearch
一、环境准备
- CentOS7
- Canal 1.1.6
- MySQL 5.7
- ElasticSearch 7.4.2
- Kibana 7.4.2
二、docker安装
参考地址: https://docs.docker.com/engine/install/centos/
1.卸载老的dockr
[root@node1 docker]# yum remove docker \
> docker-client \
> docker-client-latest \
> docker-common \
> docker-latest \
> docker-latest-logrotate \
> docker-logrotate \
> docker-engine
2.安装docker
[root@node1 docker]# sudo yum install -y yum-utils
[root@node1 docker]# sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
[root@node1 docker]# sudo yum install docker-ce docker-ce-cli containerd.io docker-compose-plugin
3.启动docker
[root@node1 docker]# sudo systemctl start docker
4.查看版本
[root@node1 docker]# docker -v
5.设置开机自启
[root@node1 docker]# sudo systemctl enable docker
6.配置镜像加速
1. sudo mkdir -p /etc/docker
2.
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://gyxyir3g.mirror.aliyuncs.com"]
}
EOF
3.sudo systemctl daemon-reload
4.sudo systemctl restart docker
三、安装mysql
1.下载mysql镜像
[root@node1 ~]# docker pull mysql:5.7
2.运行容器
[root@node1 ~]# docker run -p 3306:3306 --name mysql \
-v /mydata/mysql/log:/var/log/mysql \
-v /mydata/mysql/data:/var/lib/mysql \
-v /mydata/mysql/conf:/etc/mysql \
-e MYSQL_ROOT_PASSWORD=root \
-d mysql:5.7
3.修改配置文件开启binlog
[root@node1 conf]# vi /mydata/mysql/conf/my.cnf
4.将下面内容配置到my.cnf
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
[mysqld]
init_connect='SET collation_connection = utf8_unicode_ci'
init_connect='SET NAMES utf8'
character-set-server=utf8
collation-server=utf8_unicode_ci
skip-character-set-client-handshake
skip-name-resolve
log-bin=mysql-bin
binlog-format=ROW
server-id=1
5.重启mysql容器
[root@node1 ~]# docker restart mysql
6.查看binlog开启
show variables like '%log_bin%';
7.查看binlog日志格式
show variables like '%binlog_format%';
8.创建student表,后面测试用
CREATE TABLE `student` (
`id` bigint(20) NOT NULL,
`name` varchar(128) DEFAULT '',
`age` tinyint(1) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
四、ElasticSearch安装
1.下载elasticSearch镜像
[root@node1 ~]# docker pull elasticsearch:7.4.2
2.下载kibana镜像
[root@node1 ~]# docker pull kibana:7.4.2
3.设置允许外部任意IP访问
[root@node1 ~]# echo "http.host: 0.0.0.0">>/docker/elasticsearch/config/elasticsearch.yml
4.创建挂载目录
[root@node1 ~]# mkdir -p /mydata/elasticsearch/config
[root@node1 ~]# mkdir -p /mydata/elasticsearch/data
5.设置文件夹权限可读可写可执行
[root@node1 ~]# chmod -R 777 /mydata/elasticsearch
6.启动
[root@node1 ~]# docker run --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms64m -Xmx128m" -v /mydata/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml -v /mydata/elasticsearch/data:/usr/share/elasticsearch/data -v /mydata/elasticsearch/plugins:/usr/share/elasticsearch/plugins -d elasticsearch:7.4.2
访问:192.168.1.101:9200 (主机地址:9200)
7.启动kibana
注意:http://192.168.1.101:9200为elasticsearch的地址,根据自己的主机地址做修改。
[root@node1 data]# docker run --name kibana -e ELASTICSEARCH_HOSTS=http://192.168.1.101:9200 -p 5601:5601 -d kibana:7.4.2
访问:192.168.1.101:5601(主机地址:5601)
8.创建索引后面测试同步数据用
PUT student
{
"mappings":{
"properties":{
"age":{
"type":"integer"
},
"name":{
"type":"text"
},
"id":{
"type":"long"
}
}
}
}
五、安装 canal-server
1.下载镜像文件
[root@node1 data]# docker pull canal/canal-server:v1.1.6
2.启动docker
[root@node1 data]# docker run --name canal-server -p 11111:11111 -d canal/canal-server:v1.1.6
3.挂载文件
[root@node1 data]# docker cp canal-server:/home/admin/canal-server/. /mydata/canal-server/
[root@node1 data]# docker stop canal-server
[root@node1 data]# docker rm canal-server
4.再次启动
[root@node1 data]# docker run --name canal-server -p 11111:11111 /
-v /mydata/canal-server:/home/admin/canal-server -d canal/canal-server:v1.1.6
5.修改配置文件
[root@node1 data]# vim /mydata/canal-server/conf/example/instance.properties
6.重新启动canal-server
[root@node1 example]# docker restart canal-server
看到successful启动成功
六、安装canal-adapter
说明:截至到写这边博客之前docker hub官网没有提供canal-adapter 1.1.6的镜像文件,所以这里从canal所在git下载canal-adapter1.1.6安装包安装。
下载地址: https://github.com/alibaba/canal/releases
1.上传服务器后进行解压
[root@node1 canal.adapter]# tar -zxvf canal.adapter-1.1.6.tar.gz
2.修改application.yml配置文件
[root@node1 canal.adapter]# cd /usr/local/canal.adapter/conf/
[root@node1 conf]# vim application.yml
4.注掉bootstrap.yml配置文件
说明:bootstrap.yml连接的数据库起到配置中心的作用,如果不注释掉日志会一直报错,但不影响使用,如果你需要该配置中心可以打开该配置连接自己的数据源进行配置。
[root@node1 conf]# vim bootstrap.yml
5.配置elasticSearch同步数据文件
[root@node1 es7]# vim /usr/local/canal.adapter/conf/es7/student.yml
dataSourceKey: defaultDS # 源数据源的key, 对应配置的 /conf/application.yml 中srcDataSources中的值
destination: example # 对应配置的 /conf/application.yml中instance或者MQ的topic
groupId: g1 # 对应MQ模式下的groupId, 只会同步对应groupId的数据
esMapping:
_index: student # es 的索引名称
_id: _id # es 的_id, 如果不配置该项必须配置下面的pk项_id则会由es自动分配
sql: "SELECT id AS _id ,id AS id ,name AS name,age AS age FROM student" # sql映射
etlCondition: "where id>={} and id<={}" #etl的条件参数
commitBatch: 3000 # 提交批大小
6.启动
[root@node1 conf]# cd /usr/local/canal.adapter/bin/
[root@node1 bin]# sh startup.sh
看到succeed启动成功
七、测试同步数据
1.增量同步数据
1)执行sql语句
INSERT INTO student(id,age,name) VALUES(1,18,"张三");
看到Affected indexes: student 表示同步成功
2)查看ES数据
GET student/_search
2.批量同步数据
[root@node1 adapter]# curl http://192.168.1.101:8081/etl/es7/student.yml -X POST -d "params=1;10"
看到数据全量导入完成表示同步成功。
八、总结
- canal.adapter配置文件application.yml中es的访问地址填http://192.168.1.101:9200,要加上http://,否则会连接不上。有些版本不要加,如果出现连接报错,可以参考一下这个解决方案。
- es7下同步数据的配置文件xxx.yml,在确认配置没有问题的情况下启动adapter查看日志报错的情况,建议删除掉这个配置文件,重新建一个新的配置文件,再进行配置。另外配置文件要有被访问的权限。