基于binlog+Canal+Redis保姆级教程,帮助您实现数据一致性落地的全过程!

原创 不码不疯魔 不码不疯魔 2023-08-07 22:25 发表于四川

收录于合集

#binlog1个

#本地缓存4个

#canal1个

#数据一致性4个

#基于binlog+canal实现数据一致性1个

20

23

不疯魔不成活,大家好呀,我是科哥,江湖ID 不码不疯魔

真实场景:

基于binlog+Canal+Redis方案是一种解决分布式缓存和数据库之间数据一致性问题的方法,它通过MySQL的binlog和Canal机制,实现数据同步到Redis缓存,以保证数据一致性。

图片

重点掌握:4点

1. MySQL主备复制原理

2. MySQL中binlog配置

3. Canal工作原理、安装、配置、使用

4. SpringBoot整合Canal实现数据同步

    注意:此篇文章,具体的商用级代码已更新,记得关注,免费领取,标记星号每日更多干货分享哟!!!

 

01

MySQL主备复制原理

图片

uMySQL master 将数据变更写入二进制日志( binary log, 其中记录叫做二进制日志事件binary log events,可以通过 show binlog events 进行查看)

uMySQL slave 将 master 的 binary log events 拷贝到它的中继日志(relay log)

uMySQL slave 重放 relay log 中事件,将数据变更反映它自己的数据

02

MySQL binlog配置

  • 安装mysql(参考安装文档,略过)

  • 查看mysql是否开启binlog,ON:开启,OFF:关闭,如果默认已经开启,忽略这一步,查看是否开启命令如下:

mysql> show variables like 'log_bin';

+---------------+-------+

| Variable_name | Value |

+---------------+-------+

| log_bin       | OFF   |

+---------------+-------+

1 row in set (0.00 sec)

  • 如果log_bin关闭,修改MySQL配置开启log_bin,步骤如下:

  • 修改 mysql 的配置文件 my.cnf

vi /etc/my.cnf

  • 追加内容:

server_id=1 #mysql实例id,不能canal的slaveId重复

log-bin=/var/lib/mysql/mysql-bin #binlog文件名

binlog_format=ROW #选择row模式

binlog-do-db=timo #监控的数据库

  • 重启mysql


    service mysql restart

  • 登录 mysql 客户端,查看 log_bin 变量

mysql> show variables like 'log_bin';

+---------------+-------+

| Variable_name | Value |

+---------------+-------+

| log_bin       |  ON

+---------------+-------+

1 row in set (0.00 sec)

  • mysql数据库发生变化时,在cd /var/lib/mysql 下可以查看mysql-bin.000001文件

cd /var/lib/mysql

图片

  • 添加一个用户数据同步的账户,提供操作权限

CREATE USER canal IDENTIFIED BY 'BmBfM123456@';

GRANT SELECT,INSERT,UPDATE,DELETE REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'canal'@'%';

FLUSH PRIVILEGES;

ALTER USER 'canal'@'%' IDENTIFIED WITH mysql_native_password BY 'BmBfM123456@';

图片

03

什么是Canal

canal 是阿里巴巴的一个开源项目,基于java实现,整体已经在很多大型的互联网项目生产环境中使用,包括阿里、美团等都有广泛的应用, 是一个非常成熟的数据库同步方案,基础的使用只需要进行简单的配置即可。canal是通过模拟成为mysql 的slave的方式, 监听mysql 的binlog日志来获取数据,binlog设置为row模式以后,不仅能获取到执行的每一个增删改的脚本,同时还能获取到修改前和修改后的数据,基于这个特性,canal就能高性能的获取到mysql数据数据的变更。

04

Canal工作原理

uCanal 模拟 MySQL slave 的交互协议,伪装自己为 MySQL slave ,向 MySQL master 发送dump 协议

uMySQL master 收到 dump 请求,开始推送 binary log 给 slave (即 canal )

uCanal 解析 binary log 对象(原始为 byte 流)

05

安装和使用Canal

Canal Server下载

官方文档:https://github.com/alibaba/canal/wiki

项目地址:https://github.com/alibaba/canal

下载地址:https://github.com/alibaba/canal/releases

进入下载地址,选择canal.deployer-1.1.5.tar.gz

图片

mkdir /data/canal

cd /data/canal

tar -zxvf /opt/canal.deployer-1.1.5.tar.gz -C ./

解压后的目录如下:

- bin   # 运维脚本
- conf  # 配置文件
  canal_local.properties  # canal本地配置,一般不需要动
  canal.properties        # canal服务配置
  logback.xml             # logback日志配置
  metrics                 # 度量统计配置
  spring                  # spring-实例配置,主要和binlog位置计算、一些策略配置相关,可以在canal.properties选用其中的任意一个配置文件
  example                 # 实例配置文件夹,一般认为单个数据库对应一个独立的实例配置文件夹
    instance.properties   # 实例配置,一般指单个数据库的配置
- lib   # 服务依赖包
- logs  # 日志文件输出目录

修改内容如下:

在开发和测试环境建议把logback.xml的日志级别修改为DEBUG方便定位问题。

这里需要关注canal.properties和instance.properties两个配置文件。canal.properties文件中,

需要修改:去掉canal.instance.parser.parallelThreadSize = 16这个配置项的「注释」,也就是启用此配置项,和实例解析器的线程数相关,不配置会表现为阻塞或者不进行解析。

canal.serverMode配置项指定为kafka,可选值有tcp、kafka和rocketmq(master分支或者最新的的v1.1.5-alpha-1版本,可以选用rabbitmq),默认是kafka。canal.mq.servers配置需要指定为Kafka服务或者集群Broker的地址,这里配置为127.0.0.1:9092。

canal.mq.servers在不同的canal.serverMode有不同的意义。

kafka模式下,指Kafka服务或者集群Broker的地址,也就是bootstrap.servers

rocketmq模式下,指NameServer列表

rabbitmq模式下,指RabbitMQ服务的Host和Port

instance.properties一般指一个数据库实例的配置,Canal架构支持一个Canal服务实例,处理多个数据库实例的binlog异步解析。

instance.properties需要修改的配置项主要包括:

canal.instance.mysql.slaveId需要配置一个和Master节点的服务ID完全不同的值,这里笔者配置为123456。

配置数据源实例,包括地址、用户、密码和目标数据库:

canal.instance.master.address,这里指定为127.0.0.1:3306。canal.instance.dbUsername,这里指定为canal。canal.instance.dbPassword,这里指定为BmBfM123456@。

新增canal.instance.defaultDatabaseName,这里指定为test(需要在MySQL中建立一个test数据库,见前面的流程)。

Kafka相关配置,这里暂时使用静态topic和单个partition:

canal.mq.topic,这里指定为test,「也就是解析完的binlog结构化数据会发送到Kafka的命名为test的topic中」。canal.mq.partition,这里指定为0。

配置工作做好之后,可以启动Canal服务:
sh /data/canal/bin/startup.sh 
# 查看服务日志
tail -100f /data/canal/logs/canal/canal.log
# 查看实例日志  -- 一般情况下,关注实例日志即可
tail -100f /data/canal/logs/example/example.log

06

Spring Boot整合canal实现数据同步

6.1 依赖

<!-- canal-spring-boot-starter依赖包 -->
<dependency>
    <groupId>top.javatool</groupId>
    <artifactId>canal-spring-boot-starter</artifactId>
    <version>1.2.1-RELEASE</version>
</dependency>

6.2 修改配置

此方式需将canal.properties配置文件中的canal.serverMode属性值修改为tcp

图片

6.3 application.yml配置

canal:
  # canal实例名称,要跟canal-server运行时设置destination一致
  destination: example
  # canal地址
  server: 172.16.123.12:11111

6.4 监听binlog的数据 – 订阅数据库增删改操作

/**
 * 获取canal监听mysql的binlog的数据
 */
// 指定要监听的表
@CanalTable("order")
@Component
@Slf4j
public class MyItemHandler implements EntryHandler<Order> {
    @Autowired
    private RedisTemplate redisTemplate;

    // 监听新增数据,插入redis
    @Override
    public void insert(Order order) {
        log.info("监听新增数据{},插入redis",order);
        redisTemplate.opsForValue().set("order:"+order.getOrder_id(), String.valueOf(order));
    }

    // 监听修改数据,更新redis,更新本地缓存
    @Override
    public void update(Order before, Order after) {
        log.info("监听修改数据{},更新redis,更新本地缓存",after);
        redisTemplate.delete("order:"+before.getOrder_id());
        redisTemplate.opsForValue().set("order:"+after.getOrder_id(),String.valueOf(after));
    }

    // 监听删除数据,删除本地缓存,删除redis数据
    @Override
    public void delete(Order order) {
        log.info("监听删除数据,删除本地缓存,删除redis数据",order);
        redisTemplate.delete("order:"+order.getOrder_id());
    }
}

6.5 测试结果

图片

收获

源码+文档资料

图片

图片

源码+笔记文档,怎么获取?

点击下方公众号进入关注,后台回复【canal】即可获取所有资料,具体的商用级代码已经更新,记得关注,免费领取,标记星号哟!!!

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 可以回答这个问题。canal中间件可以实现redis和mysql的数据同步,它可以监控mysql数据库binlog日志,将数据变更同步到redis中。同时,canal也支持将mysql数据同步到其他数据库,如elasticsearch等。 ### 回答2: Canal中间件是一种用于实现数据库数据同步的工具。它可以实现Redis和MySQL之间的数据同步。 首先,我们需要设置Canal中间件与Redis和MySQL的连接。通过配置Canal中间件的连接参数,使其能够连接到Redis和MySQL数据库。可以设置监控的表和字段,以确定需要同步的数据范围。 当MySQL数据库中的数据发生变化时,Canal中间件会自动捕获这些变化并生成相应的Binlog日志。通过监听MySQL数据库Binlog日志,Canal中间件能够实时获取更新的数据。 接下来,Canal中间件将获取到的数据进行处理,将变化的数据转换成Redis可以接受的数据格式,并将其写入到Redis数据库中。这样就实现了MySQL中数据变化的同步到Redis数据库的功能。 通过Canal中间件,我们可以实现MySQL和Redis之间的双向数据同步。当MySQL中的数据发生改变时,Canal中间件会将变化的数据同步到Redis数据库中。同样地,当Redis中的数据发生改变时,Canal中间件也能够捕获这些变化并同步到MySQL数据库中。 这种数据同步的方式可以提高应用程序的性能和可靠性。通过将热点数据存储到Redis中,可以提高读取性能。同时,由于Canal中间件的实时同步机制,可以保证数据一致性。 总结起来,Canal中间件可以实现Redis和MySQL之间的数据同步。它通过捕获MySQL数据库Binlog日志,并将变化的数据转换成Redis可以接受的格式,实现数据的同步。这种方式可以提高应用程序的性能和可靠性。 ### 回答3: Canal中间件是一个开源的数据同步工具,用于将数据库中的数据同步到其他数据源。在实现Redis和MySQL数据同步的场景下,可以通过以下步骤实现数据的同步: 第一步,安装配置Canal中间件。首先需要在服务器上安装Canal中间件,并配置Canal的相关参数,如数据源的地址、端口号、用户名和密码等。 第二步,配置Canal中间件连接MySQL数据库。需要在Canal配置文件中添加MySQL数据源的相关信息,包括MySQL服务器的地址、端口号、用户名和密码等。 第三步,配置Canal中间件连接Redis数据库。同样需要在Canal配置文件中添加Redis数据源的相关信息,包括Redis服务器的地址、端口号、密码等。 第四步,创建数据库数据的监听和同步。通过创建Canal的实例,并指定需要监听的数据库和表,可以实现对特定表数据的监听和同步。 第五步,通过Canal中间件将MySQL数据同步到Redis。当MySQL数据库中的数据发生变化时,Canal中间件会将变更的数据解析并转发给Redis数据库实现数据的同步。 通过以上步骤,即可实现Redis和MySQL数据的同步。Canal中间件作为数据同步的桥梁,能够实时监听MySQL数据库的变化,并将变更的数据同步到Redis,确保数据一致性和及时性。 需要注意的是,在配置Canal中间件时,需要确保Canal和MySQL、Redis之间的网络连接正常,并且对应的用户有足够的权限来进行数据操作。同时,还需要进行相关的性能测试和优化,以确保数据同步的效率和稳定性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值