基于canal实现mysql(mariadb)与redis的主从同步

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_40606441/article/details/79840205

    在数据需要频繁的使用场景之下,使用redis获取数据可以大大提高软件使用效率,如何实现mysql等关系型数据库和redis数据实时同步显得尤为关键,实现数据同步的方式有以下几种:

    1. 代码的方式控制,但是这种方式缺点是需要写入数据库的同时,也要向redis中写数,造成代码冗余和业务领域编程人员无法专注与业务逻辑。

    2. 配置mybatis拦截器,逻辑上是可行的,但是要考虑到只是实时数据可以插入或者删除,但是历史数据不能及时同步到redis中,尤其是代码异常,数据不能及时同步到redis中。

    3. 使用mysql的udf,通俗来说来说就是利用表的trigger,自动触发函数库,实现对redis进行操作,但是一般项目都是java居多,调c++代码显得很麻烦。

    4. 使redis作为mysql的二级缓存,实现org.apache.ibatis.cache.Cache接口写个MybatisRedisCache这样的类。修改mysql数据后,可以直接刷新redis缓存数据。比第二种稍好些。

    5. 将redis作为关系型数据库的从库,从可行性和逻辑作用来看,在这种使用场景之下,确实是一种主从的关系,redis负责取数,传统数据库负责对数据的增删改查。实现原理是模拟数据库的主从同步机制,读取数据库二进制日志文件,将数据同步到redis中。canal-阿里开源项目,实现了mysql和redis的逻辑上主从同步。


根据这篇博客指引:https://blog.csdn.net/tb3039450/article/details/53928351,利用ssm(spring spring-MVC myBatis)开源框架,maven管理包文件,开发工具sts(eclipse),数据库mysql(mariadb),redis4.0.7进行开发。

1. 搭建好数据库和redis环境(redis为本机docker镜像,数据库位于另一台机器上)

    下载好数据库mariadb ,mysql被oracle收购了,所以以后可能会收费,他的另一个版本mariadb开发者的另一个开源版本,他是从mysql衍生出来的,所以他在某种意义上说,就是mysql。配置好my.ini:

[client]
port = 7020
[mysqld]
character_set_server = utf8
server_id = 90
port = 7020
log_bin = mysql_bin
binlog-format = ROW
sql_mode = NO_ENGIN_SUBSTITUTION_TRANS_TABLES

    配置startup.bat文件:

cd bin
mysql --defaults-file=../my.ini --user=root

    点击startup.bat启动,创建canal用户,赋予服务器和sql权限:

        1. 创建数据库表:tb_person_file

        2. 服务器权限select,replication client,replication slave付给canal,并且赋予一定的增删改查权限。

    重启动服务器,startup.bat 

2. 开启redis,本机使用docker运行redis镜像


3. 创建一个springboot项目,将redis和数据调通

4. 下载canal:


    使用canal.deployer这个版本就可以,配置好canal,将数据信息配置到canal/conf/example/instance.properties

#################################################
## mysql serverId
canal.instance.mysql.slaveId=2020
# position info
canal.instance.master.address=192.168.1.109:7020
canal.instance.master.journal.name=
canal.instance.master.position=
canal.instance.master.timestamp=

    这里配置的是我的数据库所在的服务器,启动canal:


    canal.log文件出现:

2018-04-07 22:52:51.866 [main] INFO  com.alibaba.otter.canal.deployer.CanalLauncher - ## the canal server is running now ......
2018-04-07 22:52:51.877 [destination = example , address = /192.168.1.109:7020 , EventParser] WARN  c.a.otter.canal.parse.inbound.mysql.MysqlEventParser - prepare to find start position just show master status

    examples.log:

c.a.otter.canal.instance.spring.CanalInstanceWithSpring - start CannalInstance for 1-example 
2018-04-07 22:52:51.816 [main] INFO  c.a.otter.canal.instance.core.AbstractCanalInstance - start successful....
2018-04-07 22:52:51.877 [destination = example , address = /192.168.1.109:7020 
    标记这canal启动成功

5. 启动canal-client,与canal服务连接,将数据同步到redis中:


向数据库中插入一体数据。

通过加断点的方式,定位到:


调用redis工具类,将数据保存到redis中


数据已经保存到redis里边。 这样,我们实现的mysql数据实时同步到redis中,解决了数据需要重复使用并且访问关系型数据库耗时的问题。

使用canal的优势在于模拟了数据库的主从同步模式,通过mysql中数据日志对数据进行同步:

    1. 数据的实时同步,包括增删改查等操作。

    2. 服务重启以后,根据之前的日志文件,将历史数据同步到redis中。

演示项目代码地址:https://gitee.com/yuguangyuan13/files.git

展开阅读全文

没有更多推荐了,返回首页