第四篇-mysql-canal

1.mysql-master配置

#在mysql-master 创建canal,并授权
set global validate_password_length=4;
set global validate_password_policy=0;
GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'canal'@'%' IDENTIFIED BY 'canal' ;
 #重启服务 systemctl restart mysqld
#在/etc/my.cnf  加入 
log-bin=mysql-bin
binlog_format=row
server-id=107
#binlog-do-db 根据自己的情况进行修改,指定具体要同步的数据库,如果不配置则表示所有数据库均开启 Binlog
binlog-do-db=ai_center

2.canal配置

2.1canal.properties

# tcp, kafka, RocketMQ  这里改为kafka
canal.serverMode = kafka
#下面这语句,注释打开
canal.instance.parser.parallelThreadSize = 16
#设置在master库授权的账户
canal.instance.tsdb.dbUsername = canal
canal.instance.tsdb.dbPassword = canal


#修改成kafka地址
canal.mq.servers = 192.168.56.103:9092
#topic主题在实例里面设置,在conf目录下的example目录下的
canal.destinations = example

2.2instance.properties

#/conf/example/instance.properties
canal.instance.mysql.slaveId=103   #不能和mysql-master 和其他的slave 重复
canal.instance.master.address=192.168.56.107:3306  #mysql-master服务器
canal.instance.dbUsername=canal
canal.instance.dbPassword=canal
canal.mq.topic=testtopic #kafka主题

3.kafka监听canal

./kafka-console-consumer.sh --bootstrap-server 192.168.56.103:9092 --topic canal_msg

4.java代码监听canal

注意:若要用java连接,请将canal配置文件中的 canal.serverMode 改成 tcp

 引入启动器 
<dependency>
    <groupId>top.javatool</groupId>
    <artifactId>canal-spring-boot-starter</artifactId>
    <version>1.2.1-RELEASE</version>
</dependency>
//实现EntryHandler接口
@CanalTable("tb_item")
@Component
public class ItemHandler implements EntryHandler<Item> {

    @Autowired
    private RedisHandler redisHandler;
    @Autowired
    private Cache<Long, Item> itemCache;

    @Override
    public void insert(Item item) {
        System.out.println("--------------------canal监听到插入--------------------");
        // 写数据到JVM进程缓存
        itemCache.put(item.getId(), item);
        // 写数据到redis
        redisHandler.saveItem(item);
    }

    @Override
    public void update(Item before, Item after) {
        System.out.println("--------------------canal监听到更新--------------------");
        // 写数据到JVM进程缓存
        itemCache.put(after.getId(), after);
        // 写数据到redis
        redisHandler.saveItem(after);
    }

    @Override
    public void delete(Item item) {
        System.out.println("--------------------canal监听到删除--------------------");
        // 删除数据到JVM进程缓存
        itemCache.invalidate(item.getId());
        // 删除数据到redis
        redisHandler.deleteItemById(item.getId());
    }
}

canal:
  server: 192.168.56.103:11111
  destination: example
posted @ 2022-09-22 13:37  贝奇韭菜  阅读(256)  评论(0)    收藏  举报