mysql nosql 同步_使用canal和canal_mysql_nosql_sync同步mysql数据

仲孙兴平
2023-12-01

场景:

有两个独立的项目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 -version

java 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

# ls

bin conf lib logs

编辑instance.properties文件

vim ./conf/example/instance.properties

配置好数据库的相关信息

canal.instance.master.address = 127.0.0.1:3306

# username/password

canal.instance.dbUsername = root

canal.instance.dbPassword = root123456

canal.instance.defaultDatabaseName = news

canal.instance.connectionCharset = UTF-8

配置下正则表达式

# table regex

canal.instance.filter.regex = .*

# table black regex

canal.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/conf

vim 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的数据库中

 类似资料: