之前公司存在mysql数据同步mongo的需求,可以有多种实现方式,比如硬编码,发送消息等。公司选择的是Canal中间件,最近有空来研究下他的使用方式,对于mysql数据变更监听有需求的应用场景都可以使用它。
参考:https://yq.aliyun.com/articles/14570
- Canal介绍
canal源码地址:https://github.com/alibaba/canal
- 下载安装server
先去https://github.com/alibaba/canal/releases下载最新版本的canal.deployer,解压后配置conf/example/instance.properties文件为自己的配置主要为数据库的ip端口和连接的用户和密码。这里创建一个repication权限的用户。
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
执行bin/startup.sh,查看日志logs/canal/canal.log是否成功。
- 启动canal client
这里使用上面源码里的SimpleCanalClientTest测试类(直连方式)。
CanalConnector connector = CanalConnectors.newSingleConnector(new InetSocketAddress(ip, 11111), destination, "", "");
设置canal server的ip和port,还有一个destination参数。
destination对应的是canal server的instance,默认是example,它代表一个完整的监听实例,这里如果有多个连接example实例的client,则只有一个client能获取mysql的数据变更通知。所以要想不同的应用都获取变更通知,则需要连接不同的instance,再此我们可以在canal server复制一个conf/example文件夹,并重命名为example1即可。 - 测试代码
我自己这边fork了代码,地址:https://github.com/yaojf/canal,并且新增了同步redis的测试类,参考自http://blog.csdn.net/stubborn_cow/article/details/50371405,运行ClientSample测试类即可。