Cancal同步MySQL数据
参考博客:https://www.cnblogs.com/liuxuebagaomizhe/p/13809317.html
MySQL配置
-
查看MySQL是否开启binary log记录功能
show variables like 'log_bin';
-
如果是OFF,在my.cnf(mysql配置文件)追加
log-bin=mysql-bin #添加这一行就ok binlog-format=ROW #选择row模式 server_id=1 #配置mysql replaction需要定义,不能和canal的slaveId重复
-
重启mysql
docker restart mysql
-
再次查看MySQL是否开启binary log记录功能,确保是ON状态
show variables like 'log_bin';
-
进入MySQL容器
docker exec -it mysql bash
-
创建canal用户
mysql -uroot -proot # 创建账号 CREATE USER canal IDENTIFIED BY 'canal'; # 授予权限 GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'canal'@'%'; -- GRANT ALL PRIVILEGES ON *.* TO 'canal'@'%' ; # 刷新并应用 FLUSH PRIVILEGES;
docker安装cancal
-
拉取镜像
docker pull canal/canal-server
-
启动并复制配置文件
#启动镜像 docker run --name canal -d canal/canal-server #找到文件位置后 exit退出容器 将容器内部文件copy到外部 docker cp canal:/home/admin/canal-server/conf/canal.properties /mydata/canal docker cp canal:/home/admin/canal-server/conf/example/instance.properties /mydata/canal
-
修改刚刚复制的instance文件
vi /mydata/canal/instance.properties ## 找到数据库信息,按需更改 canal.instance.master.address=127.0.0.1:3306 canal.instance.dbUsername=canal canal.instance.dbPassword=canal ## 按照需要同步的表选择 canal.instance.filter.regex=db.table
-
重建一个容器
#关闭容器 docker stop canal #移除容器 docker rm canal #启动新的 这里-v是将外部的文件挂载到容器内部 这样就不用每次启动都要配置参数了 docker run --name canal -p 11111:11111 -d -v /mydata/canal/instance.properties:/home/admin/canal-server/conf/example/instance.properties -v /mydata/canal/canal.properties:/home/admin/canal-server/conf/canal.properties canal/canal-server
docker部署canal-adapter
-
拉取镜像
docker pull slpcat/canal-adapter:v1.1.5
-
创建配置文件
mkdir -p /mydata/canal-adapter/conf touch application.yml mkdir -p /mydata/canal-adapter/conf/es7 cd es7 touch ceshi.yml
-
application.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 flatMessage: true zookeeperHosts: syncBatchSize: 1000 retries: 0 timeout: accessKey: secretKey: consumerProperties: # canal tcp consumer canal.tcp.server.host: canal-server地址:11111 canal.tcp.batch.size: 500 canal.tcp.username: canal.tcp.password: srcDataSources: defaultDS: url: jdbc:mysql://数据库IP:数据库端口/数据库名?useUnicode=true username: db_username password: db_password canalAdapters: - instance: example # canal instance Name or mq topic name groups: - groupId: g1 outerAdapters: - name: logger - name: es7 # 该版本发现只能是es7/es6 hosts: esip地址:9300 # 127.0.0.1:9200 for rest mode properties: mode: transport # transport # or rest
-
ceshi.yml文件,文件内容要对应数据库和esindex
dataSourceKey: defaultDS destination: example groupId: g1 esMapping: _index: ceshi _id: _id _type: _doc upsert: true # pk: id sql: "SELECT a.id _id from t_ceshi a " # objFields: # _labels: array:; etlCondition: "where a.>={}" commitBatch: 3000
-
创建并启动容器,挂在刚刚创建的文件夹
docker run --name canal-adapter -p 8081:8081 -v /mydata/canal-adapter/conf:/opt/canal-adapter/conf -d slpcat/canal-adapter:v1.1.5
-
查看运行情况,不报错即可
image-20210617150629160.png