场景:
有两个独立的项目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的数据库中