自学内容网 自学内容网

基于canal实现MySQL作为主库的ES与MySQL数据同步

1.对mysql的配置

需要一个mysql作为主库,它需要开启binlog,开启binlog需要修改配置文件my.cnf

mysql安装就不多说了,我的mysql是5.7 ,装在docker中

我的mysql配置文件在容器中/etc/my.cnf

开启binlog需要修改my.cnf

即添加

log-bin=mysql-bin # 开启 binlog
binlog-format=ROW # 选择 ROW 模式
server_id=111 # 配置 MySQL replaction 需要定义,不要和 canal 的 slaveId 重复

查看binlog是否开启成功 

        show variables like '%log_bin%';

ON是成功,OFF是没成功

创建了个mysql的canal用户比用root安全点,也可直接用root

CREATE USER canal IDENTIFIED BY 'canal';  
GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'canal'@'%';
-- GRANT ALL PRIVILEGES ON *.* TO 'canal'@'%' ;
FLUSH PRIVILEGES;

2. canal的配置

        canal-server 是提供服务的

      // docker pull canal/canal-server:v1.1.5

# 下载脚本
wget https://raw.githubusercontent.com/alibaba/canal/master/docker/run.sh 

# 构建一个destination name为test的队列
sh run.sh -e canal.auto.scan=false \
          -e canal.destinations=test \
          -e canal.instance.master.address=127.0.0.1:3306  \
          -e canal.instance.dbUsername=canal  \
          -e canal.instance.dbPassword=canal  \
          -e canal.instance.connectionCharset=UTF-8 \
          -e canal.instance.tsdb.enable=true \
          -e canal.instance.gtidon=false  \

        canal-admin是为canal-server提供管理web界面的

        //docker pull canal/canal-admin:v1.1.5

# 下载脚本
wget https://raw.githubusercontent.com/alibaba/canal/master/docker/run_admin.sh 

# 以8089端口启动canal-admin
//sh  run_admin.sh -e server.port=8089 \
 //        -e canal.adminUser=admin \
  //       -e canal.adminPasswd=admin

# 指定外部的mysql作为admin的库 我是用这个命令启动的需要在将sql导入自己的数据库

sql位置:canal/admin/admin-web/src/main/resources/canal_manager.sql at master · alibaba/canal · GitHub
sh  run_admin.sh -e server.port=8089 \
         -e spring.datasource.address=xxx \
         -e spring.datasource.database=xx \
         -e spring.datasource.username=xx 
         -e spring.datasource.password=xx

3.sprintboot的配置

        pom.xml主要添加了

<dependency>
    <groupId>top.javatool</groupId>
    <artifactId>canal-spring-boot-starter</artifactId>
    <version>1.2.1-RELEASE</version>
</dependency>

之后就缺啥自动导入了

application.yml的配置

canal:
  server: 192.168.96.63:11111
  destination: test
  user-name: canal
  password: canal

创建一个 Handler 实现 EntryHandler  当然实体类得建,mysql中建表

import cn.powertime.ps.entity.Document;
import cn.powertime.ps.service.IDocumentService;
import org.springframework.stereotype.Component;
import top.javatool.canal.client.annotation.CanalTable;
import top.javatool.canal.client.handler.EntryHandler;

import javax.annotation.Resource;

@CanalTable("document")
@Component
public class DocumentHandler implements EntryHandler<Document> {

    @Resource
    private IDocumentService documentService;

    /**
     * mysql中数据有新增时自动执行
     * @param document 新增的数据
     */

    public void insert(Document document) {
        try {
            documentService.addData(document);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * mysql中数据有修改时自动执行
     * @param before 修改前的数据
     * @param after 修改后的数据
     */
    public void update(Document before, Document after) {
        documentService.updateData(after);
    }

    /**
     * mysql中数据有删除时自动执行
     * @param document 要删除的数据
     */
    public void delete(Document document) {
        documentService.deleteData(document);
    }
}

在以上方法中可以监听到mysql的增删改,同时操作一下ES,就玩事了。

做完了,简单记录下,写的有点糙。。。

可以参照

https://github.com/alibaba/canal/wiki


原文地址:https://blog.csdn.net/zhangxu1998lq/article/details/137478597

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!