canal配置使用
项目中遇到mysql与redis同步问题,之前使用gearman,需要编写mysql触发器与同步的逻辑代码,复杂并且不易于维护。
尝试使用阿里的canal组件实现mysql redis同步。
canal项目地址 https://github.com/alibaba/canal
mysql配置
目前canal test已支持mysql 5.7.13 / 5.6.10及以下版本,mariadb 5.5.35和10.0.7(理论上可支持以下版本)
开启mysql的binlog写入功能
[mysqld]
log-bin=mysql-bin #添加这一行就ok
binlog-format=ROW #选择row模式
server_id=1 #配置mysql replaction需要定义,不能和canal的slaveId重复
配置mysql user
canal的原理是模拟自己为mysql slave,所以这里一定需要做为mysql slave的相关权限
CREATE USER canal IDENTIFIED BY 'canal';
GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'canal'@'%';
-- GRANT ALL PRIVILEGES ON *.* TO 'canal'@'%' ;
FLUSH PRIVILEGES;
部署canal server
获取发布包(写博客时的canal版本为1.0.25)
wget https://github.com/alibaba/canal/releases/download/v1.0.25/canal.deployer-1.0.25.tar.gz
tar -zxvf canal canal
修改canal server配置
参考canal wiki https://github.com/alibaba/canal/wiki/AdminGuide
启动canal
到bin目录下启动canal server
./startup.sh
异常 ERROR testWhileIdle is true, validationQuery not set
查看运行日志 logs/example/example.log
,发现如下错误:
ERROR com.alibaba.druid.pool.DruidDataSource - testWhileIdle is true, validationQuery not set
查看canal github仓库issues发现https://github.com/alibaba/canal/issues/494
打开conf/canal.properties,注释掉:
#canal.instance.tsdb.spring.xml=classpath:spring/tsdb/h2-tsdb.xml
client端例子
https://github.com/alibaba/canal/tree/master/example/src/main/java/com/alibaba/otter/canal/example
写在最后的彩蛋
druid暂时不支持enum类型
https://github.com/alibaba/canal/issues/549
面对数据库蒙X中。。。。。。