文章插图
前言距离上一篇文章发布又过去了两周,这次先填掉上一篇秒杀系统文章结尾处开的坑,介绍一下数据库中间件Canal的使用 。
「Canal用途很广,并且上手非常简单,小伙伴们在平时完成公司的需求时,很有可能会用到 。」
举个例子:
公司目前有多个开发人员正在开发一套服务,为了缩短调用延时,对部分接口数据加入了缓存 。一旦这些数据在数据库中进行了更新操作,缓存就成了旧数据,必须及时删除 。
删除缓存的代码「理所当然可以写在更新数据的业务代码里」,但有时候者写操作是在别的项目代码里,你可能无权修改,亦或者别人不愿你在他代码里写这种业务之外的代码 。(毕竟多人协作中间会产生各种配合问题) 。又或者就是单纯的删除缓存的操作失败了,缓存依然是旧数据 。
【阿里开源MySQL中间件Canal快速入门】正如上篇文章缓存与数据库双写一致性实战里面所说,我们可以将缓存更新操作完全独立出来,形成一套单独的系统 。「Canal正是这么一个很好的帮手 。」 能帮我们实现像下图这样的系统:
文章插图
「本篇文章的要点如下:」
- Canal是什么
- Canal工作原理
- 数据库的读写分离
- 数据库主从同步
- 数据库主从同步一致性问题 异步复制全同步复制半同步复制
- Canal实战 开启MySQL Binlog配置Canal服务运行Canal服务JAVA客户端Demo
?阿里开源MySQL中间件Canal快速入门Canal是什么众所周知,阿里是国内比较早地大量使用MySQL的互联网企业(去IOE化:去掉IBM的小型机、Oracle数据库、EMC存储设备,代之以自己在开源软件基础上开发的系统),并且基于阿里巴巴/淘宝的业务,从 2010 年开始,业务逐步尝试数据库日志解析获取增量变更进行同步,由此衍生出了大量的数据库增量订阅和消费业务 。
欢迎关注我的个人公众号获取最全的原创文章:「后端技术漫谈」(二维码见文章底部)
?
Canal应运而生,它通过伪装成数据库的从库,读取主库发来的binlog,用来实现「数据库增量订阅和消费业务需求」 。
「Canal用途:」
- 数据库镜像
- 数据库实时备份
- 索引构建和实时维护(拆分异构索引、倒排索引等)
- 「业务 cache 缓存刷新」
- 带业务逻辑的增量数据处理
https://github.com/alibaba/canal
在这里就不再摘抄项目简介了,提炼几个值得注意的点:
- canal 使用 client-server 模式,数据传输协议使用 protobuf 3.0(很多RPC框架也在使用例如gRPC)
- 当前的 canal 支持源端 MySQL 版本包括 5.1.x , 5.5.x , 5.6.x , 5.7.x , 8.0.x
- canal 作为 MySQL binlog 增量获取和解析工具,可将变更记录投递到 MQ 系统中,比如 Kafka/RocketMQ 。
数据库的读写分离为了应对高并发场景,MySQL支持把一台数据库主机分为单独的一台写主库(主要负责写操作),而把读的数据库压力分配给读的从库,而且读从库可以变为多台,这就是读写分离的典型场景 。
文章插图
数据库主从同步实现数据库的读写分离,是通过数据库主从同步,让从数据库监听主数据库Binlog实现的 。大体流程如下图:
?
MySQL master 将数据变更写入二进制日志( binary log, 其中记录叫做二进制日志事件binary log events,可以通过 show binlog events 进行查看)
MySQL slave 将 master 的 binary log events 拷贝到它的中继日志(relay log)
MySQL slave 重放 relay log 中事件,将数据变更反映它自己的数据
?
文章插图
详细主从同步原理在这里就不展开细说了 。
可以看到,这种架构下会有一个问题,「数据库主从同步会存在延迟,那么就会有短暂的时间,主从数据库的数据是不一致的 。」
这种不一致大多数情况下非常短暂,很多时候我们可以忽略他 。
但一旦要求数据一致,就会引申出如何解决这个问题的思考 。
推荐阅读
- 基于MIT协议,一个开源的Python微信公众号开发框架——WeRoBot
- mysql5.7性能提升一百倍调优宝典
- IT管理者应该了解的四项开源工具
- 免费且开源的流程图工具 Draw.io
- 在 Linux 上使用开源软件创建 SDN
- 18条MySQL优化技巧
- MySQL库表设计小技巧
- MySQL数据库教程-环境与集成开发工具
- 开源技术大神总结的7条Linux核心知识点
- 一文看懂开源许可证,能不能商用再也不抓瞎