canal:基于binlog的canal组件有哪些使用场景(三)?

 2021-07-13 20:01    77  

目录前言canal介绍canal工作原理mysql配置canal架构canal-ha架构canal应用场景总结前言前两篇文章老顾介绍了基于binlog日志,同步多机房的mysqlcanal;推荐使用canal组件;今天老顾就来介绍一下canal基本原理,以及一些常用的使用场景。

canal:基于binlog的canal组件有哪些使用场景(三)?

canal介绍Canal是阿里开源的一款基于Mysql数据库binlog的增量订阅和消费组件,通过它可以订阅数据库的binlog日志,然后进行一些数据消费,如数据镜像、数据异构、数据索引、缓存更新等canal。相对于消息队列,通过这种机制可以实现数据的有序化和一致性。

canal:基于binlog的canal组件有哪些使用场景(三)?

github地址canal:://github.com/alibaba/canal

canal:基于binlog的canal组件有哪些使用场景(三)?

完整wiki地址:://github.com/alibaba/canal/wiki

canal:基于binlog的canal组件有哪些使用场景(三)?

Canal工作原理原理很简单:

canal:基于binlog的canal组件有哪些使用场景(三)?

Canal模拟MySQL的slave的交互协议,伪装成mysql slave,并将转发协议发送到MySQL Master服务器。MySQL Master接收到存储请求并开始将二进制日志推送到slave(即canal)。Canal将二进制日志对象解析为自己的数据类型(原始字节流)如图所示:

canal:基于binlog的canal组件有哪些使用场景(三)?

canal:基于binlog的canal组件有哪些使用场景(三)?

mysql配置基于binlog则需要开启mysql的binlog日志

canal:基于binlog的canal组件有哪些使用场景(三)?

(1)查看当前mysql是否开启binlog模式。

canal:基于binlog的canal组件有哪些使用场景(三)?

SHOW VARIABLES LIKE '%log_bin%'

(2)修改/etc/my.cnf 需要开启binlog模式。

[mysqld]log-bin=mysql-binbinlog-format=ROWserver_id=1修改完成之后,重启mysqld的服务。

(3) 进入mysql

mysql -h localhost -u root -p(4) 创建账号 用于测试使用

使用root账号创建用户并授予权限

create user canal@'%' IDENTIFIED by 'canal';GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT,SUPER ON *.* TO 'canal'@'%';FLUSH PRIVILEGES;Canal架构

server代表一个canal运行实例,对应于一个jvm

instance对应于一个数据队列

instance模块:

eventParser (数据源接入,模拟slave协议和master进行交互,协议解析)eventSink (Parser和Store链接器,进行数据过滤,加工,分发的工作)eventStore (数据存储)metaManager (增量订阅&消费信息管理器)Canal-HA机制canal是支持HA的,其实现机制是依赖zookeeper来实现的,用到的特性有watcher和EPHEMERAL节点(和session生命周期绑定),与HDFS的HA类似。

canal的ha分为两部分,canal server和canal client分别有对应的ha实现

canal server: 为了减少对mysql dump的请求,不同server上的instance(不同server上的相同instance)要求同一时间只能有一个处于running,其他的处于standby状态(standby是instance的状态)。canal client: 为了保证有序性,一份instance同一时间只能由一个canal client进行get/ack/rollback操作,否则客户端接收无法保证有序。server ha的架构图如下:

大致步骤:

canal server要启动某个canal instance时都先向zookeeper_进行一次尝试启动判断_(实现:创建EPHEMERAL节点,谁创建成功就允许谁启动)创建zookeeper节点成功后,对应的canal server就启动对应的canal instance,没有创建成功的canal instance就会处于standby状态。一旦zookeeper发现canal server A创建的instance节点消失后,立即通知其他的canal server再次进行步骤1的操作,重新选出一个canal server启动instance。canal client每次进行connect时,会首先向zookeeper询问当前是谁启动了canal instance,然后和其建立链接,一旦链接不可用,会重新尝试connect。Canal Client的方式和canal server方式类似,也是利用zookeeper的抢占EPHEMERAL节点的方式进行控制.

Canal应用场景1、同步缓存redis/全文搜索EScanal一个常见应用场景是同步缓存/全文搜索,当数据库变更后通过binlog进行缓存/ES的增量更新。当缓存/ES更新出现问题时,应该回退binlog到过去某个位置进行重新同步,并提供全量刷新缓存/ES的方法,如下图所示。

之前的老顾有篇文章中介绍了缓存与数据库一致性的问题,有一个方案就是binlog日志;小伙伴们可以去看看

2、下发任务另一种常见应用场景是下发任务,当数据变更时需要通知其他依赖系统。其原理是任务系统监听数据库变更,然后将变更的数据写入MQ/kafka进行任务下发,比如商品数据变更后需要通知商品详情页、列表页、搜索页等先关系统。这种方式可以保证数据下发的精确性,通过MQ发送消息通知变更缓存是无法做到这一点的,而且业务系统中不会散落着各种下发MQ的代码,从而实现了下发归集,如下图所示。

3、数据异构在大型网站架构中,DB都会采用分库分表来解决容量和性能问题,但分库分表之后带来的新问题。比如不同维度的查询或者聚合查询,此时就会非常棘手。一般我们会通过数据异构机制来解决此问题。

所谓的数据异构,那就是将需要join查询的多表按照某一个维度又聚合在一个DB中。让你去查询。canal就是实现数据异构的手段之一。

用canal来订阅binlog,可异构系统

4、冗余字段在微服务设计中,每个服务都会对应数据库以及表;虽然微服务很强大,增加很多系统灵活性;但是也增加了复杂度;如:数据库和表的独立分离,导致有些join查询不便。我们常用的方法就是设计表字段的冗余。

但是冗余方案,会有一些问题

上面2张表,位于不同的微服务,即不同的数据库。为了方便在查询order订单的时候,显示下单用户的真实姓名;就在order表中对用户truename进行了冗余设计。但是如果user的服务对user的truename进行更新修改;那么就导致了order表中的truename与user的truename不一致。

上面的场景在我们实际开发过程是非常常见的。当然为了解决这个问题,用binlog方式就非常简单了;利用canal组件即可解决。

总结老顾今天介绍了基于binlog的canal的基本原理,以及使用场景。当然不限于以上的使用场景,只要跟mysql的binlog有关都可以。下篇文章老顾会重点讲解canal的使用方法。

---End---

老顾的微服务网关分享课程,请大家多多支持

推荐阅读

大厂如何基于binlog解决多机房同步mysql数据(一)?

大厂如何基于binlog解决多机房同步mysql数据(二)?

可用于大型应用的微服务生态灰度发布如何实现?

一线大厂级别公共Redis集群监控,细化到每个项目实例

Sharding-jdbc的实战入门之水平分表(一)

Sharding-Jdbc之水平分库和读写分离(二)

a、dubbo如何处理业务异常,这个一定要知道哦!

b、企业级SpringBoot应用多个子项目配置文件规划、多环境支持(一)

c、企业级SpringBoot应用多个子项目配置文件规划、多环境支持(二)

d、企业级SpringBoot应用多个子项目配置文件之配置中心(三)

e、利用阿里开源工具进行排查线上CPU居高问题

f、阿里二面:如何快速排查死锁?如何避免死锁?

g、微服务分布式架构中,如何实现日志链路跟踪?

h、网关如何聚合各个微服务的接口文档?

i、Kubernetes之POD、容器之间的网络通信

j、K8S中的Service的存在理由

k、企业微服务项目如何进入K8S的全过程

l、阿里开源项目Sentinel限流、降级的统一处理

m、大厂二面:Redis的分布式布隆过滤器是什么原理?

1、基于RocketMq的SpringCloud Stream框架实战入门

2、如何搭建消息中间件应用框架之SpringCloud Stream

3、面试必备:网关异常了怎么办?如何做全局异常处理?

4、Gateway网关系列(二):SpringCloud Gateway入门实战,路由规则

5、Gateway网关系列开篇:SpringCloud的官方网关Gateway介绍

6、API网关在微服务架构中的应用,这一篇就够了

7、学习Lambda表达式看这篇就够了,不会让你失望的哦(续篇)

8、Lambda用在哪里?几种场景?

9、为什么会出现Lambda表达式,你知道吗?

10、不说“分布式事务”理论,直接上大厂阿里的解决方案,绝对实用

11、女程序员问到这个问题,让我思考了半天,Mysql的“三高”架构

12、大厂二面:CAP原则为什么只能满足其中两项?而不能同时满足

13、阿里P7二面:聊聊零拷贝的原理

14、秒杀系统的核心点都在这里,快来取

15、你了解如何利用token方式实现分布式Session吗?

16、Mysql索引结构演变,为什么最终会是那个结构呢?让你一看就懂

17、一场比赛涉及到的知识,用通俗易通的方式介绍并发协调

18、企业实战Redis全方面思考,你思考了吗?

19、面试题:Thread的start和run的区别

20、面试题:什么是CAS?CAS的作用以及缺点

21、如何访问redis中的海量数据?避免事故产生

22、如何解决Redis热点问题?以及如何发现热点?

23、如何设计API接口,实现统一格式返回?

24、你真的知道在生产环境下如何部署tomcat吗?

25、分享一线互联网大厂分布式唯一ID设计 之 snowflake方案

26、分享大厂分布式唯一ID设计方案,快来围观

27、你想了解一线大厂的分布式唯一ID生成方案吗?

28、你知道如何处理大数据量吗?(数据拆分篇)

29、如何永不迁移数据和避免热点? 根据服务器指标分配数据量(揭秘篇)

30、你知道怎么分库分表吗?如何做到永不迁移数据和避免热点吗?

31、你了解大型网站的页面静态化吗?

32、你知道如何更新缓存吗?如何保证缓存和数据库双写一致性?

33、你知道怎么解决DB读写分离,导致数据不一致问题吗?

34、DB读写分离情况下,如何解决缓存和数据库不一致性问题?

35、你真的知道怎么使用缓存吗?

36、如何利用锁,防止缓存击穿?重构思想的重要性

37、海量订单产生的业务高峰期,如何避免消息的重复消费?

38、你知道如何保障生产端100%消息投递成功吗?

39、微服务下的分布式session该如何管理?

40、阿里二面:filter、interceptor、aspect应如何选择?很多人中招

41、互联网架构重要组员CDN,很多高级开发都没有实操过,来看这里

42、阿里二面:CDN缓存控制原理,看看能不能难住你

43、SpringCloud Alibaba之Nacos多环境多项目管理

44、SpringCloud Alibaba系列之Nacos配置中心玩法

45、SpringCloud Alibaba之Nacos注册中心

46、SpringCloud Plus版本之SpringCloud Alibaba

47、SpringCloud Alibaba之Nacos集群、持久化

48、SpringCloud Alibaba之Nacos共享配置、灰度配置

49、SpringCloud Alibaba之Sentinel工作原理

50、SpringCloud Alibaba之Sentinel流控管理

51、SpringCloud Alibaba之Sentinel降级管理

52、SpringCloud Alibaba之Sentinel热点参数限流

53、SpringCloud Alibaba之Sentinel的API实战

本文标签:场景组件基于

原文链接:https://www.xgfox.com/kfbc/867.html

本文版权:如无特别标注,本站文章均为原创。