https://github.com/alibaba/canal
canal 工作原理
前提是mysql、rabbitmq已经安装完成
[mysqld]
log-bin=mysql-bin #开启binlog
binlog-format=ROW #选择ROW模式
server_id=1 # 配置MySQL replaction需要定义,不和Canal的slaveId重复即可
查看是否生效:
show variables like 'log_bin';
https://github.com/alibaba/canal/releases/download/canal-1.1.6/canal.deployer-1.1.6.tar.gz
下载完之后解压压缩文件,进入canal.deployer-1.1.6之后可以看到:
配置 Canal 服务方式为 RabbitMQ 和连接配置( 只列出需要修改的地方)
# tcp, kafka, rocketMQ, rabbitMQ, pulsarMQ
canal.serverMode = rabbitMQ
##################################################
######### RabbitMQ #############
##################################################
rabbitmq.host = 192.168.0.181
rabbitmq.virtual.host = /test
rabbitmq.exchange = canal.exchange
rabbitmq.username = user123
rabbitmq.password = pass123
rabbitmq.deliveryMode =
填写自己RabbitMQ的地址以及用户名密码和虚拟机即可.
(1)配置mysql的连接地址和正在使用的bin-log文件以及偏移量
# position info
canal.instance.master.address=192.168.0.80:3306
canal.instance.master.journal.name=mysql-bin.000988
canal.instance.master.position=446897591
canal.instance.master.timestamp=
canal.instance.master.gtid=
查看bin-log文件可使用以下命令查看
# 查看正在使用的二进制日志文件和对应的偏移量
SHOW MASTER STATUS;
# 查看所有的二进制日志文件和对应文件的大小
SHOW BINARY LOGS;
Canal的订阅规则是通过正则表达式来进行匹配的。具体来说,订阅规则由三个部分组成:数据库名、表名和操作类型,使用“.”分隔。
例如,订阅规则“testdb.test_table.*”表示订阅testdb数据库中名为test_table的表的所有操作类型。
test\\…*表示监听test.开头数据库下所有的表的所有操作
ps:test\\.(student|stu)表示匹配test库下的student和stu表
# table regex
# 监听的
canal.instance.filter.regex=test\\..*
# table black regex
# 不监听的
canal.instance.filter.black.regex=xxl_job\\..*
当然这里配置完毕之后可能会不生效,所以我们要进入\canal.deployer-1.1.6\config目录:编辑canal.properties文件
# binlog filter config
canal.instance.filter.query.dml = true
在启动之前将canal.deployer-1.1.6\plugin中的jar包拷贝到 canal.deployer-1.1.6\lib目录下;否则启动会报错,因为我们使用了mq,但是在lib目录下没有相关mq的jar。
进入\canal.deployer-1.1.6\bin目录双击startup.bat即可,
或者在此目录下cmd命令:startup.bat pause
不加pause也可,加上只是防止窗口闪退
<dependencies>
<dependency>
<groupId>com.alibaba.ottergroupId>
<artifactId>canal.clientartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-amqpartifactId>
dependency>
dependencies>
canal版本使用Canal服务相同版本,即1.1.6
spring:
rabbitmq:
addresses: 192.168.0.181:5672
username: user123
password: pass123
virtual-host: /test
listener:
simple:
acknowledge-mode: auto
direct:
acknowledge-mode: auto
@Component
public class CanalListener {
private final static Logger logger = LoggerFactory.getLogger(CanalListener.class);
@RabbitListener(bindings = @QueueBinding(
exchange = @Exchange(value = "canal.exchange"),
value = @Queue(value = "canal_queue"), key = "canal_routing_key"))
public void receiveMessage(Message message) {
logger.debug("receive canal message:{}", message);
MessageProperties messageProperties = message.getMessageProperties();
String body = new String(message.getBody());
logger.info("messageProperties:{}", messageProperties);
logger.info("body:{}", body);
}
}
其中的交换机、队列、路由key都是上面配置文件配置中一样的。
执行如下sql之后:
UPDATE `student` SET `del_flag` = 0;