第四篇-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

浙公网安备 33010602011771号