使用canal和canal_mysql_nosql_sync同步mysql数据

来源:互联网 发布:js替换图片路径 编辑:程序博客网 时间:2024/06/01 08:11

场景:

有两个独立的项目A和B,都使用mysql做数据库,
其中项目A中有一个表存储新闻资讯,字段有新闻id,标题title,类型type,内容data。
后来项目B也需要这个表的数据,但项目B用了两个表:一个表存新闻id,标题title,类型type,另一个表存储新闻id和新闻内容data。
这时如果要把项目A中实时变化的数据同步项目B中,显然传统的同步方式就不满足了

实现思路

利用canal获取变化数据
利用canal_mysql_nosql_sync存入redis队列
(https://github.com/liukelin/canal_mysql_nosql_sync)
起一个守护脚本一直读取该redis,将产生的数据写入到新库

实施步骤

一.在项目A中配置canal
1.确定服务器上有java环境,如果没有需安装下java

# java -versionjava version "1.8.0_121"

2.获取canal包

访问https://github.com/alibaba/canal/releases,下载相应的版本本次以1.0.24为例wget https://github.com/alibaba/canal/releases/download/canal-1.0.24/canal.deployer-1.0.24.tar.gz

3.解压并配置
详细的配置参数可参考https://github.com/alibaba/canal/wiki/AdminGuide
这里不多赘述
将安装包解压后,默认有如下文件夹

# lsbin  conf  lib  logs

编辑instance.properties文件

vim ./conf/example/instance.properties配置好数据库的相关信息canal.instance.master.address = 127.0.0.1:3306# username/passwordcanal.instance.dbUsername = rootcanal.instance.dbPassword = root123456canal.instance.defaultDatabaseName = newscanal.instance.connectionCharset = UTF-8配置下正则表达式# table regexcanal.instance.filter.regex = .* # table black regexcanal.instance.filter.black.regex = platform_news\\..*这里注意两点:1)数据库的用户需要有slave权限;2)正则表达式中,如果只配置白名单,在通过redis读取时,发现没生效,需同时配置黑名单才生效

配置完成后,启动服务

sh bin/startup.sh启动完成后,会看到有个端口号为11111的进程

二.在项目B中部署canal_mysql_nosql_sync
1.获取canal_mysql_nosql_sync

git clone https://github.com/liukelin/canal_mysql_nosql_sync

2配置

cd canal_mysql_nosql_sync/canal-client/confvim canal.properties配置好对应参数即可

3启动

sh ./canal_mysql_nosql_sync/canal-client/start_canal_client.sh正常启动后,去项目A的表中改个数据,可立即看到变化

三.在项目B中通过脚本获取redis数据,并写入到项目B的数据库中
脚本就不多赘述了,任意一个语言都可以(只要能操作redis和mysql即可XD):
1.连接redis,获取redis中变化的数据,redis的数据结构如下

eventType :操作类型(UPDATE/INSERT/DELETE)db:   涉及库table: 涉及表before:变更前数据after: 变更后数据time:  操作时间

2.提取出变化的数据,根据eventType,将数据修改到项目B的数据库中

0 0