canal使用说明:MySQL、Redis实时数据同步
1. canal简介
canal是阿里开源的数据同步工具,基于bin log可以将数据库同步到其他各类数据库中,目标数据库支持mysql,postgresql,oracle,redis,MQ,ES等
canal分成服务端deployer和客户端adapter,我们可以部署多个,同时为了方便管理还提供了一个管理端admin
canal的数据同步流程如下图所示

因为目前canal还不能直接通过配置就实现对redis的数据同步,因此我们需要自定义一下canal客户端,通过服务端将数据同步到客户端后,由客户端自定义操作同步到redis

2、canal配置(MySQL数据库用的是204服务器上的,canal安装在208服务器上)
第一步:因为canal是监控MySQL中的binlog日志来完成同步工作,所以我们需要开启binlog日志功能,由于咱们项目用的MySQL8以上的版本,binlog默认开启,所以可以不管。
第二步:通过show variables like ‘%binlog_format%’; 查看当前binlog,值为ROW就可以了

第三步:源数据库创建一个canal账号,并且设置slave,dump权限
CREATE USER canal IDENTIFIED BY 'canal';
GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'canal'@'%';
-- GRANT ALL PRIVILEGES ON *.* TO 'canal'@'%' ;
FLUSH PRIVILEGES;
第四步:因为mysql8.0.3后身份检验方式为caching_sha2_password,但canal使用的是mysql_native_password,因此需要设置检验方式(如果该版本之前的可跳过),否则会报错IOException: caching_sha2_password Auth failed
ALTER USER 'canal'@'%' IDENTIFIED WITH mysql_native_password BY 'canal';
select host,user,plugin from mysql.user ;
第五步:在208服务器上拉取canal,输入以下命令并解压到/tmp/canal文件夹下
wget https://github.com/alibaba/canal/releases/download/canal-1.1.6/canal.deployer-1.1.6.tar.gz
进入到canal文件夹,然后进入conf文件夹找到example文件夹,复制example文件夹并重命名为redis
cd conf
# 复制example实例配置
cp -R example redis
然后修改redis文件夹中的instance.properties配置文件

在此之前需要查看一下数据库binlog日志状态信息:
show master status;

然后进行instance.properties配置文件开始配置(说明和需要改动的地方都在图里)

想了解配置中其他配置信息的,可以参考下面的

配置完成后,启动canal客户端并查看日志,没报错就说明成功了
./bin/start.sh
cat logs/redis/redis.log
我在过程中也遇到了错误,如遇到,可以看看下面的解决办法:
Received error packet: errno = 1236, sqlstate = HY000 errmsg = Could
not find first log file name in binary log index file
第六步:创建canal应用端,配置需要同步到redis的地址(展示本地应用,具体的应用这几天会上传到云效上)
依赖引用:
<dependency><groupId>top.javatool</groupId><artifactId>canal-spring-boot-starter</artifactId><version>1.2.1-RELEASE</version>
</dependency>
配置文件(application.yml):
# 应用名称
spring:application:name: ns-service-support-canal# 数据同步到当前redis中redis:host: 127.0.0.1password: 123456database: 6# 应用服务 WEB 访问端口
server:port: 8080# canal服务端地址
canal:# 部署到208上,port默认为11111server: 192.168.xxx.xxx:11111# 实例名,与之前复制example之后那个文件夹名称一致destination: redis# 设置canal消息日志打印级别
logging:level:top.javatool.canal.client: warn
RedisConfig.java(json转换与其他微服务同步)
@Configuration
@AllArgsConstructor
public class RedisConfig {private RedisConnectionFactory factory;/*** jsonObject转换* @param connectionFactory* @return*/@Bean@SuppressWarnings(value = { "unchecked", "rawtypes" })public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory connectionFactory){RedisTemplate<Object, Object> template = new RedisTemplate<>();template.setConnectionFactory(connectionFactory);FastJsonRedisSerializer serializer = new FastJsonRedisSerializer(Object.class);// 使用StringRedisSerializer来序列化和反序列化redis的key值template.setKeySerializer(new StringRedisSerializer());template.setValueSerializer(serializer);// Hash的key也采用StringRedisSerializer的序列化方式template.setHashKeySerializer(new StringRedisSerializer());template.setHashValueSerializer(serializer);template.afterPropertiesSet();return template;}}
3、关键(如果选择直接使用当前项目,你需要在项目中增加实体类和handler两个)
关键的来了,需要同步哪张表,就需要创建对应的实体类(与其他微服务基本一致,需要添加的东西是,实体类头部增加@Table注解,标明对应的数据库表名,每个实体类参数添加@Column注解,名称对应数据库表参数),以user表为例
@Data
@Table(name = "user")
public class User implements Serializable {private static final long serialVersionUID = 1L;@ApiModelProperty("id")@NsGridField(title = "id")@Column(name="id")private Long userId;@ApiModelProperty("姓名")@NsGridField(title = "姓名")@Column(name="name")private String name;@ApiModelProperty("账号")@NsGridField(title = "账号")@Column(name="username")private String username;@ApiModelProperty("密码")@NsGridField(title = "密码")@Column(name="password")private String password;@ApiModelProperty("昵称")@NsGridField(title = "昵称")@Column(name="nickname")private String nickname;@ApiModelProperty("授权顾问昵称")@NsGridField(title = "授权顾问昵称")@Column(name="g_a_a_c_nickname")private String gAACNickname;@ApiModelProperty("头像地址")@NsGridField(title = "头像地址")@Column(name="avatar_url")private String avatarUrl;@ApiModelProperty("手机")@NsGridField(title = "手机")@Column(name="phone")private String phone;@ApiModelProperty("身份证号")@NsGridField(title = "身份证号")@Column(name="id_card")private String idCard;@ApiModelProperty("邮箱")@NsGridField(title = "邮箱")@Column(name="email")private String email;@ApiModelProperty("性别: 0男;1女;2未知")@NsGridField(title = "性别: 0男;1女;2未知")@Column(name="gender")private Integer gender;@ApiModelProperty("账号状态:0正常;1禁用")@NsGridField(title = "账号状态:0正常;1禁用")@Column(name="account_status")private Integer accountStatus;@ApiModelProperty("账号类型:0普通用户 1平台用户 ")@NsGridField(title = "账号类型:0普通用户 1平台用户 ")@Column(name="account_type")private Integer accountType;@ApiModelProperty("是否实名认证:0否 1是")@NsGridField(title = "是否实名认证:0否 1是")@Column(name="is_approve")private Integer isApprove;@ApiModelProperty("平台组织id")@NsGridField(title = "平台组织id")@Column(name="org_id")private Long orgId;@ApiModelProperty("备注")@NsGridField(title = "备注")@Column(name="remark")private String remark;@ApiModelProperty("乐观锁")@NsGridField(title = "乐观锁")@Column(name="revision")private Integer revision;@ApiModelProperty("排序")@NsGridField(title = "排序")@Column(name="sort_value")private Integer sortValue;@ApiModelProperty("状态")@NsGridField(title = "状态")@Column(name="status")private Boolean status;@ApiModelProperty("组织描述")@NsGridField(title = "组织描述")@Column(name="org_describe")private String orgDescribe;@Overridepublic String toString() {return "User{" +"name='" + name + '\'' +", username='" + username + '\'' +", password='" + password + '\'' +", nickname='" + nickname + '\'' +", gAACNickname='" + gAACNickname + '\'' +", avatarUrl='" + avatarUrl + '\'' +", phone='" + phone + '\'' +", idCard='" + idCard + '\'' +", email='" + email + '\'' +", gender=" + gender +", accountStatus=" + accountStatus +", accountType=" + accountType +", isApprove=" + isApprove +", orgId=" + orgId +", remark='" + remark + '\'' +", revision=" + revision +", sortValue=" + sortValue +", status=" + status +", orgDescribe='" + orgDescribe + '\'' +'}';}
}
canal-spring-boot-starter包提供了EntryHandler类用于监控表数据更新,于是我们创建一个EntryHandler实现类,用于实现redis的增删改
/*** @author csf* @Description* @date 2023/1/30*/
@CanalTable("user")
@Component
@AllArgsConstructor
@Slf4j
public class NmsUserHandler implements EntryHandler<User> {private final RedisTemplate<Object,Object> redisTemplate;@Overridepublic void insert(User nmsUser) {log.info("[新增]"+nmsUser.toString());redisTemplate.opsForValue().set("user:"+nmsUser.getUsername(),nmsUser);Object o = redisTemplate.opsForValue().get("user:ns0");System.out.println(o);}@Overridepublic void update(User before, User after) {log.info("[更新]"+after.toString());redisTemplate.opsForValue().set("user:"+after.getUsername(),after);Object o = redisTemplate.opsForValue().get("user:snn7");System.out.println(o);}@Overridepublic void delete(User nmsUser) {log.info("[删除]"+nmsUser.getUsername());redisTemplate.delete("user:"+nmsUser.getUsername());}
}
至此,配置完成,启动项目
测试:不管对数据进行增或删改,日志都能实时反馈,并且数据都能实时同步到redis中



日志

redis


相关文章:
canal使用说明:MySQL、Redis实时数据同步
1. canal简介 canal是阿里开源的数据同步工具,基于bin log可以将数据库同步到其他各类数据库中,目标数据库支持mysql,postgresql,oracle,redis,MQ,ES等 canal分成服务端deployer和客户端adapter,我们可以部署多个,同时为了方便管…...
计算机视觉框架OpenMMLab开源学习(三):图像分类实战
前言:本篇主要偏向图像分类实战部分,使用MMclassification工具进行代码应用,最后对水果分类进行实战演示,本次环境和代码配置部分省略,具体内容建议参考前一篇文章:计算机视觉框架OpenMMLab开源学习&#x…...
awk命令
一.介绍 awk是专门为文本处理设计的编程语言,是一门数据驱动的编程语言。与sed类似,都是以数据驱动的行处理软件,主要用于数据扫描,过滤和汇总。数据可以来自于标准输入,管道或者文件。 二.语法 awk是一种处理文本文件…...
LocalDateTime获取时间的年、月、日、时、分、秒、纳秒
如何把String/Date转成LocalDateTime参考String、Date与LocalDate、LocalTime、LocalDateTime之间互转 String、Date、LocalDateTime、Calendar与时间戳之间互相转化参考String、Date、LocalDateTime、Calendar与时间戳之间互相转化 方法介绍 getYear() 获取日期的年 getMon…...
MoveIT Rviz和Gazebo联合仿真
文章目录环境安装概述ros_control框架ros_control数据流文件配置附加工具故障问题解决参考接前两篇:ROS MoveIT1(Noetic)安装总结 Solidworks导出为URDF用于MoveIT总结(带prismatic) MoveIT1 Assistant 总结 环境 Ubu…...
ESP32S2(12K)-DS18B20数码管显示温度
一、物料清单: NODEMCU-32-S2 (ESP32-12K)四段数码管(共阴)DS18B20(VCC/DQ/GND)Arduino-IDE 2.0.3二、实现方法及效果图: 2.1 引用库 // #include <OneWire.h> //可以不引入,因为DallasTemperature.h中已经引入了OneWire.h #include <DallasTemperature.h>#…...
linux栈溢出定位
一、编译选项定位堆栈溢出 来源:堆栈溢出检测机制 - SkrSky - 博客园 1、栈溢出可能打印 unhandled level 1 translation fault (11) at 0x7f8d0347, esr 0x92000005 2、栈溢出保护机制 gcc提供了栈保护机制stack-protector(编译选项-fstack-protec…...
CSS基础:选择器和声明样式
CSS概念 CSS(Cascading Style Sheets)层叠样式表,又叫级联样式表,简称样式表 CSS用于HTML文档中元素样式的定义 使用css让网页具有美观一致的页面 语法 CSS 规则由两个主要的部分构成:选择器和声明样式 选择器通常…...
VS中安装gismo库
文章目录前言一、下载安装paraview直接下载压缩包安装就可以了解压后按步骤安装即可二、gismo库的安装gismo库网址第一种方法:第二种方法第三种方法:用Cmake软件直接安装首先下载cmake软件[网址](https://cmake.org/download/)安装gismo库三、gismo库的使…...
元学习方法解决CDFSL以及两篇SOTA论文讲解
来源:投稿 作者:橡皮 编辑:学姐 带你学习跨域小样本系列1-简介篇 跨域小样本系列2-常用数据集与任务设定详解 跨域小样本系列3:元学习方法解决CDFSL以及两篇SOTA论文讲解(本篇) 跨域小样本系列4…...
大数据之------------数据中台
一、什么是数据中台 **数据中台是指通过数据技术,对海量数据进行采集、计算、存储、加工,同时统一标准和口径。**数据中台的目标是让数据持续用起来,通过数据中台提供的工具、方法和运行机制,把数据变为一种服务能力,…...
Python 中 字符串是什么?
字符串是 Python 中最常用的数据类型。我们可以使用引号 ( ’ 或 " ) 来创建字符串。 创建字符串很简单,只要为变量分配一个值即可。例如: var1 ‘Hello World!’ var2 “Python Runoob” Python 访问字符串中的值 Python 不支持单字符类型&…...
OJ刷题Day1 · 一维数组的动态和 · 将数字变成 0 的操作次数 · 最富有的客户资产总量 · Fizz Buzz · 链表的中间结点 · 赎金信
一、一维数组的动态和二、将数字变成 0 的操作次数三、最富有的客户资产总量四、Fizz Buzz五、链表的中间结点六、赎金信一、一维数组的动态和 给你一个数组 nums 。数组「动态和」的计算公式为:runningSum[i] sum(nums[0]…nums[i]) 。 请返回 nums 的动态和。 示…...
【数据结构】栈——必做题
逆波兰表达式后缀表达式的出现是为了方便计算机处理,它的运算符是按照一定的顺序出现,所以求值过程中并不需要使用括号来指定运算顺序,也不需要考虑运算符号(比如加减乘除)的优先级。先介绍中简单的人工转化方法&#…...
LearnOpenGL 笔记 - 入门 04 你好,三角形
系列文章目录 LearnOpenGL 笔记 - 入门 01 OpenGLLearnOpenGL 笔记 - 入门 02 创建窗口LearnOpenGL 笔记 - 入门 03 你好,窗口 文章目录系列文章目录前言你好,三角形顶点输入顶点着色器(Vertex Shader)编译着色器片段着色器&…...
keepalived+mysql高可用
一.设置mysql同步信息两节点安装msyql略#配置节点11.配置权限允许远程访问mysql -u root -p grant all on *.* to root% identified by Root1212# with grant option; flush privileges;2.修改my.cnf#作为主节点配置(节点1)#作为主节点配置 server-id 1 …...
JAVA工具篇--1 Idea中 Gradle的使用
前言: 既然我们已经使用Maven 来完成对项目的构建,为什么还要使用Gradle 进行项目的构建;gradle和maven都可以作为java程序的构建工具,但两者还是有很大的不同之处的:1.可扩展性,gradle比较灵活,…...
弄懂自定义 Hooks 不难,改变开发认知有点不习惯
前言 我之前总结逻辑重用的时候,就一直在思考一个问题。 对于逻辑复用,render props 和 高阶组件都可以实现,同样官方说 Hooks 也可以实现,且还是在不增加额外的组件的情况下。 但是我在项目代码中,没有找到自定义 …...
Java面向对象基础
文章目录面向对象类注意事项内存机制构造器this关键字封装javabean格式成员变量和局部变量区别static静态关键字使用成员方法使用场景内存机制注意事项static应用:工具类static应用:代码块静态代码块实例代码块(用的比较少)static…...
基于python下selenium库实现交互式图片保存操作(批量保存浏览器中的图片)
Selenium是最广泛使用的开源Web UI(用户界面)自动化测试套件之一,可以通过编程与浏览量的交互式操作对网页进行自动化控制。基于这种操作进行数据保存操作,尤其是在图像数据的批量保存上占据优势。本博文基于selenium 与jupyterla…...
告别重复劳动:用快马生成自动化脚本,实现dify多环境一键部署与高效管理
在团队协作中,dify的部署工作常常成为效率瓶颈。每次新版本发布或环境迁移时,手动配置docker-compose文件、处理版本差异、备份数据等重复操作不仅耗时,还容易出错。最近尝试用InsCode(快马)平台生成自动化脚本集,意外发现部署效率…...
FanControl完全掌控:5大核心优势实现电脑风扇智能调节
FanControl完全掌控:5大核心优势实现电脑风扇智能调节 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitHub_Trending/fa…...
Halcon仿射变换实战:手把手教你用vector_to_aniso和solve_matrix搞定图像配准(附完整代码)
Halcon仿射变换实战:从原理到工程落地的图像配准指南 在工业视觉检测领域,图像配准的精度直接影响着后续缺陷检测的准确性。去年参与的一个半导体封装项目让我深刻体会到这一点——当芯片位置存在0.5像素以上的偏移时,细微的焊球缺陷就会被漏…...
清单来了:2026最新AI论文网站测评与推荐
2026年真正好用的AI论文网站,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 一、…...
Meshery 1.0正式发布,为云原生基础设施提供新的管控层
跨多云环境管理Kubernetes基础设施长期以来产生了YAML文件泛滥、配置漂移以及依赖个人而非系统的知识问题。生成基础设施配置的AI工具速度超过了团队审查能力,使这个问题更加难以控制。开源Meshery技术正是为了解决这一问题而构建的。Meshery v1.0现已发布ÿ…...
MySQL技巧(八) :死锁解决与实战案例
在数据库高并发场景下,死锁是一个绕不开的经典难题。两个或多个事务相互持有对方需要的锁,导致都无法继续执行,就像两辆车在狭窄路口互不相让。本文将带你从原理到实战,掌握死锁的排查、解决和预防全流程。一、死锁快速定位当应用…...
为什么你的USB设备总接触不良?A/B型接口物理结构对比与耐久性测试
为什么你的USB设备总接触不良?A/B型接口物理结构对比与耐久性测试 每次给手机充电都要反复调整角度,打印机线稍微碰一下就断开连接——这些恼人的USB接口问题,本质上都是物理结构设计的差异在作祟。作为消费电子领域最基础的连接标准…...
【深度解析】DeepSeek API 悄然分叉:开发者该如何正确评估与接入最新大模型?
摘要 本文基于近期 DeepSeek API 更新及官方文档变更,从「API 版本 ≠ Web/App 版本」这一关键细节出发,梳理大模型多版本部署策略背后的技术与成本逻辑,并给出基于兼容 OpenAI 协议的实战接入示例(使用 claude‑sonnet‑4‑6&…...
JAVA重点基础、进阶知识及易错点总结(1)---数据类型、运算符、流程控制
🚀 Java 巩固进阶 第1天 主题:数据类型、运算符与流程控制 —— 避开那些“隐形”的坑📅 进度概览:重启Java基础。 💡 核心价值:很多生产环境的Bug(如金额精度丢失、空指针崩溃、逻辑穿透&…...
个人记账自动化:OpenClaw+nanobot解析消费短信
个人记账自动化:OpenClawnanobot解析消费短信 1. 为什么需要自动化记账 每个月末看着银行卡余额叹气时,我总在想:钱到底花哪儿了?手动记账App试过七八个,最终都败给"忘记记录"这个人类通病。直到发现消费短…...
