手把手告诉你如何监听 MySQL binlog 实现数据变化后的实时通知
nanshan 2024-12-02 23:29 7 浏览 0 评论
Hello 大家好,我是阿粉。不知道大家在日常的工作中有没有遇到这样的场景,很多时候业务数据有变更需要及时加载到缓存、ES 或者发送到消息队列中通知下游服务。
一般遇到这种情况下,在实时性要求不高的场景我们有两种处理模式,一种是写任务定时推送数据同步到缓存中,另一个是下游服务定时自动拉取。这两种模式都依赖服务自己的定时周期时间,很多时候不好设定具体要多久执行一次,定时时间太短在数据没有变化的时候会有很多无效的操作,如果定时时间太长可能很多时候数据的延迟会比较大,某些时候影响也不好。
那有没有一种比较好的方式可以解决这个问题呢?答案当然是肯定的。今天就给大家介绍一下 Canal,基于 MySQL 的 bin log 日志来实时监听数据变化。
什么是 Canal
官方的解释是:canal,译意为水道/管道/沟渠,主要用途是基于 MySQL 数据库增量日志解析,提供增量数据订阅和消费。
通过官方的解释我们看到,是针对 MySQL 数据库增量日志解析的,MySQL 的日志是通过 bin log 的形式存储的二进制文件,提供数据订阅和消费就是说提供对二进制文件数据的监听。当日志数据发生变化的时候就会被监听到,从而程序就可以实时获取到有变化的数据。拿到变化的数据后就可以更新进缓存,ES 或发送到消息队列中通知下游服务了。
原理
上面介绍了 Canal 的基本概念,现在我们看看 Canal是怎么实现的,我们都知道 MySQL 是支持主从同步的,而且 Slave 也是通过 bin log 日志的形式同步 master 实例数据的。所以 Canal 就巧妙的运用了这个原理,把自己模拟成一个 Slave,给 MySQL 的 master 发送 dump 协议,当 master 接受到 dump 协议的时候就以为 Canal 是一个 Slave 就会推送 bin log 给 Canal。
使用方式
开启 MySQL 的binlog
MySQL 的安装阿粉这里就不演示了,网上的文章一大把,大家可以自己去研究安装,要是 macOS 的话,终端里面输入brew install mysql 坐等搞定。
安装完成过后我们看下是否开启了 bin log ,如果没有开启则修改 my.cnf 增加 log-bin=mysql-bin 即可开启。输入命令mysql> show variables like 'log_bin'; 从图中我们可以看到阿粉这里是开启了 bin log 日志的。
接下来我们创建一个 canal 的账号,用于 canal 使用。我们创建一个 canal的账号,同时密码也是 canal。
CREATE USER canal IDENTIFIED BY 'canal';
GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'canal'@'%';
-- GRANT ALL PRIVILEGES ON *.* TO 'canal'@'%' ;
FLUSH PRIVILEGES;
安装 Canal
这里我们安装 1.1.5 的版本,可以直接 wget https://github.com/alibaba/canal/releases/download/canal-1.1.5/canal.deployer-1.1.5.tar.gz 也可以在 GitHub 上面直接下载。
下载完解压后目录如图,我们需要修改配置文件,将账号密码以及 bin log 文件名配上
配置完成过后,通过 bin 目录下的脚本进行启动,并且通过日志我们可以看到启动成功。
服务端启动成功后,我们就需要使用客户端去获取数据了,这里我们可以参考 Canal 的 GitHub 官网中提供的 example 样例去进行模拟。
这里有个坑大家要注意下,如果 MySQL 的版本是 8.0 以下应该没有这个问题,如果是 8.0 版本的,我们通过查看tail -f example.log 日志会发现如下异常Caused by: java.io.IOException: caching_sha2_password Auth failed。
阿粉这里就遇到了,经过在官方 GitHub 上面的 issue 中,如果搜索到相关的错误信息 https://github.com/alibaba/canal/issues/1700,里面有大佬给了解决方案,在 MySQL 中执行如下命令即可解决
ALTER USER 'canal'@'%' IDENTIFIED BY 'canal' PASSWORD EXPIRE NEVER;
ALTER USER 'canal'@'%' IDENTIFIED WITH mysql_native_password BY 'canal';
FLUSH PRIVILEGES;
如果没有遇到这个问题的小伙伴就可以直接忽略,接下来我们通过官方源码中的 example 示例来测试功能。把源码下载下来后找到com.alibaba.otter.canal.example.SimpleCanalClientTest 类,正常来说不需要修改什么内容,如果密码有变化的话这里可以调整,然后直接运行 main 函数即可。这个时候 MySQL,Canal,以及我们的测试类都已经启动了,下面通过执行 SQL 来创建数据库和表以及插入相应的数据,观察控制台的输出情况。
数据变更
创建数据库
mysql> create database canal_test;
Query OK, 1 row affected (0.01 sec)
mysql> use canal_test;
Database changed
mysql> show tables;
Empty set (0.00 sec)
我们通过语句create database canal_test; 创建了数据库过后,可以看到控制有如下输出,已经监听到了 bin log 的变化了。
创建测试表
再执行如下语句创建数据表
CREATE TABLE `example`
(
`id` INT(11) NOT NULL
,`username` VARCHAR(32) DEFAULT NULL COMMENT '用户名称'
,` age` INT(11) DEFAULT 0 COMMENT '用户年龄'
,` sex` INT(11) DEFAULT 0 COMMENT '用户性别 0 男 1 女'
,PRIMARY KEY (`id`)
)
ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户信息表';
可以看到成功的监听到了数据表的创建,接下来我们再试试插入数据和更新数据
## 插入语句
INSERT INTO example VALUES(1,'张三', 18,0),(2,'李四', 19,0),(3,'王五', 20,1);
## 更新语句
update example set username = '张小三' where id = 1;
从上图中我们可以看到插入的数据以及更新的数据都被实时的监听到了。监听到数据过后,我们就可以根据事件类型以及相应的库和表名来进行过滤操作了。对了,我们可以通过配置 filter 来过滤需要监听的数据库和数据表或者字段,这个都是可以实现的,避免无用的数据变更带来的影响。
对于访问 GitHub 很慢的小伙伴,阿粉已经帮大家把 Canal 的压缩包下载好了,公众号回复【canal】即可获取网盘地址。
总结
今天的文章给大家分享了 Canal 的使用,感兴趣的小伙伴可以自己去试试,如果需要的话,可以在项目中用起来,会事半功倍。
- 上一篇:在Java程序中监听mysql的binlog
- 下一篇:mysql数据库备份及其恢复
相关推荐
- 今晚拿下PHP反序列化的一系列操作
-
引言在CTF中反序列化类型的题目还是比较常见的,之前有学习过简单的反序列化,以及简单pop链的构造。这次学习内容为php内置的原生类的反序列化以及一点进阶知识。在题目给的的代码中找不到可利用的类时,这...
- Win10安装Apache和PHP(apache安装php模块)
-
说明:虽然PHPStudy之类的软件给我们提供了方便的集成环境,但是其使用的是非线程安全的PHP版本(NotThreadSafe,NTS),某些功能不可以使用。所以,我们还需要自己再安装一个Apa...
- 腾讯云云函数部署laravel项目(腾讯云函数 selenium)
-
1、购买函数套餐包在Serverless控制台,选择函数套餐包进行购买2、新建函数服务2.1、模板创建选择函数URL:新建函数URL,启用公网访问:2.1.1、postman访问首页2.1.2、pos...
- 站长教你搭建属于自己的网站(站长教你搭建属于自己的网站是什么)
-
每个人都希望可以有自己的网站,因为那样高端大气上档次,低调奢华有内涵,尤其是公司用户,一般会有自己的网站。而个人呢,也可以搭建自己的网站博客,论坛等,但是一般个人都是搭建博客的。好了,那么下面站长教你...
- 微信公众号开发出现 cURL error 60: SSL certificate problem ssl证书
-
在phpstudy的环境下如果出现这样的报错cURLerror60:SSLcertificateproblem:unabletogetlocalissuercertificat...
- 【网络安全】关于PHP Study nginx解析高危漏洞的预警通报
-
网络安全近日,山石网科安全研究院监测发现PHPStudyWindows最新版本存在nginx解析漏洞,可以造成任意代码执行。一、漏洞情况phpStudy是一个PHP调试环境的程序集成包,该程序包集成...
- PHP 环境 搭建教程(php环境搭建教程linux)
-
PHP是一种编程语言,很多网站都用PHP语言编写,我们有时候需要测试一个网站,就需要PHP环境才能运行,又要安装Apache、又要安装MySQL……真的非常麻烦。其实我们可以使用PHP集成...
- 黑客搭建钓鱼平台,手把手教你如何钓鱼?
-
跨站脚本攻击XSS:通过HTML注入篡改了网页,插入了恶意的脚本,从而用户浏览网页时,控制用户浏览器的一种攻击那么,我们搭建一个XSS钓鱼平台吧,注意:这个平台仅用于学习和测试,小伙伴们不要动有坏心思...
- php源码网站搭建方法和过程(php网站源码完整)
-
web网站是我们上网的窗口,而网站是如何搭建的呢?今天我们来做一个介绍,以php代码为例来进行介绍(后续会介绍一下java代码搭建,如果想要我这里涉及的工具或源码请私信我)。1、首先你需要去网上下载你...
- 使用VS Code调试PhpStudy环境里的代码
-
最近几个月把所有项目都迁过来VSCode了(除了因为Unity调试问题反而用回了VisualStudio),PHP也就抛弃了最强的PhpStorm。这段时间抽空在帮朋友处理PHP项目,然...
- phpstudy搭建PHP+Mysql服务(用phpstudy搭建服务器)
-
PHP是一种创建动态交互性站点的强有力的服务器端脚本语言。PHP是免费的,并且使用非常广泛。同时,对于像微软ASP这样的竞争者来说,PHP无疑是另一种高效率的选项。(1)PHP环境搭建使用V...
- Windows安装phpstudy(Windows安装mysql)
-
说明:phpstudy是一个PHP+MySQL+Apache的集成环境,可以减少单独部署各个所需软件的麻烦,以及更加方便地切换版本。phpenv、wamp等软件的作用一样。由于环境的不同,安装过程中可...
- phpstudy安装及简单使用教程(phpstudy安装教程详解)
-
phpstudy前不久爆出有后门,我的看法是,去看下是哪个版本有后门,为啥会有后门,怎么解决掉这个后门,而不是听到后门就弃用了。毕竟phpstudy绿色安装,配置简单,多版本融合,真香。前言:关于开发...
- 如何对dedeCMS的开源程序进行二次开发
-
二次开发,简单的说就是在现有的软件上进行定制修改,功能的扩展,然后达到自己想要的功能和效果,一般来说都不会改变原有系统的内核。为了让更多人了解二次开发,并更方便的了解DedeCMS的二次开发,下面将会...
- mysql基础问题三问(底层逻辑;正在执行;日志观察)
-
背景:经常面试会遇到且实际工作中也会应用到的三个场景:目录:一.mysql查询时的底层原理是什么?二.如何查看正在执行的mysql语句?三.如何观察mysql运行过程中的日志信息?-----...
你 发表评论:
欢迎- 一周热门
-
-
极空间如何无损移机,新Z4 Pro又有哪些升级?极空间Z4 Pro深度体验
-
如何在安装前及安装后修改黑群晖的Mac地址和Sn系列号
-
爱折腾的特斯拉车主必看!手把手教你TESLAMATE的备份和恢复
-
10个免费文件中转服务站,分享文件简单方便,你知道几个?
-
日本海上自卫队的军衔制度(日本海上自卫队的军衔制度是什么)
-
[常用工具] OpenCV_contrib库在windows下编译使用指南
-
UOS服务器操作系统防火墙设置(uos20关闭防火墙)
-
【系统配置】信创终端挂载NAS共享全攻略:一步到位!
-
Ubuntu系统Daphne + Nginx + supervisor部署Django项目
-
WindowsServer2022|配置NTP服务器的命令
-
- 最近发表
-
- 今晚拿下PHP反序列化的一系列操作
- Win10安装Apache和PHP(apache安装php模块)
- 腾讯云云函数部署laravel项目(腾讯云函数 selenium)
- 站长教你搭建属于自己的网站(站长教你搭建属于自己的网站是什么)
- 微信公众号开发出现 cURL error 60: SSL certificate problem ssl证书
- 【网络安全】关于PHP Study nginx解析高危漏洞的预警通报
- PHP 环境 搭建教程(php环境搭建教程linux)
- 黑客搭建钓鱼平台,手把手教你如何钓鱼?
- php源码网站搭建方法和过程(php网站源码完整)
- 使用VS Code调试PhpStudy环境里的代码
- 标签列表
-
- linux 查询端口号 (58)
- docker映射容器目录到宿主机 (66)
- 杀端口 (60)
- yum更换阿里源 (62)
- internet explorer 增强的安全配置已启用 (65)
- linux自动挂载 (56)
- 禁用selinux (55)
- sysv-rc-conf (69)
- ubuntu防火墙状态查看 (64)
- windows server 2022激活密钥 (56)
- 无法与服务器建立安全连接是什么意思 (74)
- 443/80端口被占用怎么解决 (56)
- ping无法访问目标主机怎么解决 (58)
- fdatasync (59)
- 405 not allowed (56)
- 免备案虚拟主机zxhost (55)
- linux根据pid查看进程 (60)
- dhcp工具 (62)
- mysql 1045 (57)
- 宝塔远程工具 (56)
- ssh服务器拒绝了密码 请再试一次 (56)
- ubuntu卸载docker (56)
- linux查看nginx状态 (63)
- tomcat 乱码 (76)
- 2008r2激活序列号 (65)