展开菜单
首页 精品内容 本月促销 装机必备 Windows PDF教程 macOS软件 IOS软件 Android AI 专题
全部分类

当前位置:

首页 > 编程开发 > 怎么使用SpringBoot+Canal实现数据库实时监控

怎么使用SpringBoot+Canal实现数据库实时监控

Canal工作原理Canal模拟MySQLslave的交互协议,伪装自己为MySQLslave,向MySQLmaster发送dump协议MySQLmaster收到dump请求,开始推送binarylog给slave(也就是Canal)Canal解析binarylog对象(原始为byte流)MySQL打开binlog模式在MySQL配置文件my.cnf设置如下信息:[mysqld]#打开binloglog-bin=mysql-bin#选择ROW(行)模式binlog-format=ROW#配置MySQLre

本文目录

      Canal 工作原理

      怎么使用SpringBoot+Canal实现数据库实时监控

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

      • MySQL master 收到 dump 请求,开始推送 binary log 给 slave(也就是 Canal)

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

      MySQL 打开 binlog 模式

      在 MySQL 配置文件 my.cnf 设置如下信息:

      [mysqld]
      # 打开binlog
      log-bin=mysql-bin
      # 选择ROW(行)模式
      binlog-format=ROW
      # 配置MySQL replaction需要定义,不要和canal的slaveId重复
      server_id=1

      改了配置文件之后,重启 MySQL,使用命令查看是否打开 binlog 模式:

      SHOW VARIABLES LIKE 'log_bin';

      怎么使用SpringBoot+Canal实现数据库实时监控

      查看 binlog 日志文件列表:SHOW BINARY LOGS;

      查看当前正在写入的 binlog 文件:SHOW MASTER STATUS; 记录文件名 File 和 Position 值。

      启动 Canal 服务

      详细配置可以参考:

      conf\example\instance.properties
       
      #################################################
      ## mysql serverId , v1.0.26+ will autoGen 
      # canal.instance.mysql.slaveId=0        //每个instance都会伪装成一个mysql slave , 此id对于canal前端的Mysql实例而言,必须是唯一的,但是同一个Canal中相同的instance,此slaveld应该一样
       
      # enable gtid use true/false
      canal.instance.gtidon=false 
       
      # position info
      canal.instance.master.address=127.0.0.1:3306    //需要连接的数据库地址及端口
      canal.instance.master.journal.name=             //需要读取的起始的binlog文件
      canal.instance.master.position=                 //需要读取的起始的binlog文件的偏移量
      canal.instance.master.timestamp=                //需要读取的起始的binlog的时间戳 
      canal.instance.master.gtid=
       
      # rds oss binlog
      canal.instance.rds.accesskey=
      canal.instance.rds.secretkey=
      canal.instance.rds.instanceId=
       
      # table meta tsdb info
      canal.instance.tsdb.enable=true                  //v1.0.25版本新增,是否开启table meta的时间序列版本记录功能
      #canal.instance.tsdb.url=jdbc:mysql://127.0.0.1:3306/canal_tsdb  //v1.0.25版本新增,table meta的时间序列版本的本地存储路径,默认为instance目录
      #canal.instance.tsdb.dbUsername=canal
      #canal.instance.tsdb.dbPassword=canal
       
      #canal.instance.standby.address =
      #canal.instance.standby.journal.name =
      #canal.instance.standby.position =
      #canal.instance.standby.timestamp =
      #canal.instance.standby.gtid=
       
      # username/password
      canal.instance.dbUsername=canal                  //数据库账号
      canal.instance.dbPassword=canal                  //数据库密码
      canal.instance.connectionCharset = UTF-8         //数据库解析编码格式
      canal.instance.defaultDatabaseName =test         //数据库连接时默认schema
      # enable druid Decrypt database password
      canal.instance.enableDruid=false
      #canal.instance.pwdPublicKey=MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBALK4BUxdDltRRE5/zXpVEVPUgunvscYFtEip3pmLlhrWpacX7y7GCMo2/JM6LeHmiiNdH1FWgGCpUfircSwlWKUCAwEAAQ==
      
      # table regex
      canal.instance.filter.regex=.*\\..*              //mysql 数据解析关注的表,Perl正则表达式.
      # table black regex
      canal.instance.filter.black.regex=              //canal将会过滤那些不符合要求的table,这些table的数据将不会被解析和传送 
      #################################################
      conf\canal.properties
      #################################################
      ######### 		common argument		############# 
      #################################################
      canal.id= 1                       	#每个canal server实例的唯一标识
      canal.ip=                           #canal server绑定的本地IP信息,如果不配置,默认选择一个本机IP进行,
      canal.port=11111                    #canal server提供socket tcp服务的端口
      canal.metrics.pull.port=11112
      canal.zkServers=                    #canal server链接zookeeper集群的链接信息
       
      # flush data to zk
      canal.zookeeper.flush.period = 1000 #canal持久化数据到zookeeper上的更新频率,单位毫秒
      canal.withoutNetty = false
       
      # tcp, kafka, RocketMQ
      canal.serverMode = tcp
       
      # flush meta cursor/parse position to file
       
      canal.file.data.dir = ${canal.conf.dir}    #canal持久化数据到file上的目录
       
      canal.file.flush.period = 1000             #canal持久化数据到file上的更新频率,单位毫秒
       
      ## memory store RingBuffer size, should be Math.pow(2,n)
       
      canal.instance.memory.buffer.size = 16384  #canal内存store中可缓存buffer记录数,需要为2的指数
      ## memory store RingBuffer used memory unit size , default 1kb
      canal.instance.memory.buffer.memunit = 1024  #	内存记录的单位大小,默认1KB,和buffer.size组合决定最终的内存使用大小
      ## meory store gets mode used MEMSIZE or ITEMSIZE
      canal.instance.memory.batch.mode = MEMSIZE  #canal内存store中数据缓存模式
                                                  1. ITEMSIZE : 根据buffer.size进行限制,只限制记录的数量
                                                  2. MEMSIZE : 根据buffer.size * buffer.memunit的大小,限制缓存记录的大小    
      
      canal.instance.memory.rawEntry = true	
       
      ## detecing config
      canal.instance.detecting.enable = false    #是否开启心跳检查
       
      #canal.instance.detecting.sql = insert into retl.xdual values(1,now()) on duplicate key update x=now()
      canal.instance.detecting.sql = select 1        #心跳检查sql
      canal.instance.detecting.interval.time = 3     #心跳检查频率,单位秒 
      canal.instance.detecting.retry.threshold = 3   #心跳检查失败重试次数
      ##非常注意:interval.time * retry.threshold值,应该参考既往DBA同学对数据库的故障恢复时间,  
      ##“太短”会导致集群运行态角色“多跳”;“太长”失去了活性检测的意义,导致集群的敏感度降低,Consumer断路可能性增加。  
       
      canal.instance.detecting.heartbeatHaEnable = false #心跳检查失败后,是否开启自动mysql自动切换
                                                         #说明:比如心跳检查失败超过阀值后,如果该配置为true,canal就会自动链到mysql备库获取binlog数据	false
      
       
      # support maximum transaction size, more than the size of the transaction will be cut into multiple transactions delivery
      canal.instance.transaction.size =  1024   #	最大事务完整解析的长度支持超过该长度后,一个事务可能会被拆分成多次提交到canal store中,无法保证事务的完整可见性
       
      # mysql fallback connected to new master should fallback times
      canal.instance.fallbackIntervalInSeconds = 60  #canal发生mysql切换时,在新的mysql库上查找            binlog时需要往前查找的时间,单位秒
      说明:mysql主备库可能存在解析延迟或者时钟不统一,需要回退一段时间,保证数据不丢
       
      # network config
      canal.instance.network.receiveBufferSize = 16384  #网络链接参数,SocketOptions.SO_RCVBUF
      canal.instance.network.sendBufferSize = 16384     #网络链接参数,SocketOptions.SO_SNDBUF
      canal.instance.network.soTimeout = 30             #网络链接参数,SocketOptions.SO_TIMEOUT
       
      # binlog filter config
      canal.instance.filter.druid.ddl = true          
       
      canal.instance.filter.query.dcl = false           #ddl语句是否隔离发送,开启隔离可保证每次只返回发送一条ddl数据,不和其他dml语句混合返回.(otter ddl同步使用)
       
      canal.instance.filter.query.dml = false           #是否忽略DML的query语句,比如insert/update/delete table.(mysql5.6的ROW模式可以包含statement模式的query记录)
       
      canal.instance.filter.query.ddl = false           #是否忽略DDL的query语句,比如create table/alater table/drop table/rename table/create index/drop index. (目前支持的ddl类型主要为table级别的操作,create databases/trigger/procedure暂时划分为dcl类型)
       
      canal.instance.filter.table.error = false
      canal.instance.filter.rows = false
      canal.instance.filter.transaction.entry = false
       
      # binlog format/image check
      canal.instance.binlog.format = ROW,STATEMENT,MIXED 
      canal.instance.binlog.image = FULL,MINIMAL,NOBLOB
       
      # binlog ddl isolation
      canal.instance.get.ddl.isolation = false
       
      # parallel parser config
      canal.instance.parser.parallel = true
      ## concurrent thread number, default 60% available processors, suggest not to exceed Runtime.getRuntime().availableProcessors()
      #canal.instance.parser.parallelThreadSize = 16
      ## disruptor ringbuffer size, must be power of 2
      canal.instance.parser.parallelBufferSize = 256
       
      # table meta tsdb info                       //关于时间序列版本
      canal.instance.tsdb.enable=true
      canal.instance.tsdb.dir=${canal.file.data.dir:../conf}/${canal.instance.destination:}
      canal.instance.tsdb.url=jdbc:h3:${canal.instance.tsdb.dir}/h3;CACHE_SIZE=1000;MODE=MYSQL;
      canal.instance.tsdb.dbUsername=canal
      canal.instance.tsdb.dbPassword=canal
      # dump snapshot interval, default 24 hour
      canal.instance.tsdb.snapshot.interval=24
      # purge snapshot expire , default 360 hour(15 days)
      canal.instance.tsdb.snapshot.expire=360
       
      # rds oss binlog account
      canal.instance.rds.accesskey =
      canal.instance.rds.secretkey =
       
      #################################################
      ######### 		destinations		############# 
      #################################################
      canal.destinations= example
      # conf root dir
      canal.conf.dir = ../conf
      # auto scan instance dir add/remove and start/stop instance
      canal.auto.scan = true                       #开启instance自动扫描
                                  如果配置为true,canal.conf.dir目录下的instance配置变化会自动触发:
      a. instance目录新增: 触发instance配置载入,lazy为true时则自动启动
      b. instance目录删除:卸载对应instance配置,如已启动则进行关闭
      c. instance.properties文件变化:reload instance配置,如已启动自动进行重启操作
      canal.auto.scan.interval = 5                 #instance自动扫描的间隔时间,单位秒
       
      canal.instance.tsdb.spring.xml=classpath:spring/tsdb/h3-tsdb.xml
      #canal.instance.tsdb.spring.xml=classpath:spring/tsdb/mysql-tsdb.xml
       
      canal.instance.global.mode = spring     #instance管理模式,Production级别我们要求使用spring  
      canal.instance.global.lazy = false             #全局lazy模式
      #canal.instance.global.manager.address = 127.0.0.1:1099  #全局的manager配置方式的链接信息
       
      #canal.instance.global.spring.xml = classpath:spring/memory-instance.xml
      canal.instance.global.spring.xml = classpath:spring/file-instance.xml #全局的spring配置方式的组件文件
       
      #canal.instance.global.spring.xml = classpath:spring/default-instance.xml

      1)canal.deployer-1.1.5\conf\canal.properties 进行全局配置,可以修改 IP、端口号或实例

      # 默认有一个 example,需要增加实例的可以配置
      canal.destinations = example

      2)canal.deployer-1.1.5\conf\example\instance.properties 进行局部实例配置,可以修改数据库账号和密码、数据库表名、binlog 文件名和 position 等

      # 没有改变的就没有贴出来,注意 MySQL 的用户名和密码
      canal.instance.master.address=192.168.58.131:3306
      # username/password
      canal.instance.dbUsername=test
      canal.instance.dbPassword=liubihao
      canal.instance.connectionCharset = UTF-8
      # enable druid Decrypt database password
      canal.instance.enableDruid=false
      # table regex
      canal.instance.filter.regex=.*\\..*
      # table black regex
      canal.instance.filter.black.regex=

      ysql 数据解析m关注的表,Perl正则表达式.
      多个正则之间以逗号(,)分隔,转义符需要双斜杠(\\) 

      常见例子:

      • 1.  所有表:.*   or  .*\\..*

      • 2.  canal schema下所有表: canal\\..*

      • 3.  canal下的以canal打头的表:canal\\.canal.*

      • 4.  canal schema下的一张表:canal.test1

      • 5.  多个规则组合使用:canal\\..*,mysql.test1,mysql.test2 (逗号分隔)

      • bin/start.sh 启动服务(Windows 系统为 bin/start.bat)

      怎么使用SpringBoot+Canal实现数据库实时监控

      后端进行相应配置

      修改 pom.xml

      
        com.alibaba.otter
        canal.client
        1.1.4
      

      新建 CanalClient.java

      package org.nwpu.atcss.util;
      
      import com.alibaba.otter.canal.client.CanalConnector;
      import com.alibaba.otter.canal.client.CanalConnectors;
      import com.alibaba.otter.canal.protocol.CanalEntry.*;
      import com.alibaba.otter.canal.protocol.Message;
      import org.springframework.stereotype.Component;
      
      import java.util.List;
      import java.net.InetSocketAddress;
      
      @Component
      public class CanalClient {
        private static void printEntries(List entries) throws Exception {
          for (Entry entry : entries) {
            if (entry.getEntryType() != EntryType.ROWDATA) {
              continue;
            }
      
            RowChange rowChange = RowChange.parseFrom(entry.getStoreValue());
      
            EventType eventType = rowChange.getEventType();
            System.out.println(String.format("================> binlog[%s:%s] , name[%s,%s] , eventType : %s",
                                             entry.getHeader().getLogfileName(), entry.getHeader().getLogfileOffset(),
                                             entry.getHeader().getSchemaName(), entry.getHeader().getTableName(), eventType));
      
            for (RowData rowData : rowChange.getRowDatasList()) {
              switch (rowChange.getEventType()) {
                case INSERT:
                  System.out.println("INSERT ");
                  printColumns(rowData.getAfterColumnsList());
                  break;
                case UPDATE:
                  System.out.println("UPDATE ");
                  printColumns(rowData.getAfterColumnsList());
                  break;
                case DELETE:
                  System.out.println("DELETE ");
                  printColumns(rowData.getBeforeColumnsList());
                  break;
                default:
                  break;
              }
            }
          }
        }
      
        private static void printColumns(List columns) {
          for (Column column : columns) {
            System.out.println(column.getName() + " : " + column.getValue() + " update=" + column.getUpdated());
          }
        }
      
        public static void main(String[] args) throws Exception {
          // hostname, port, destination, username, password
          CanalConnector connector = CanalConnectors.newSingleConnector(new InetSocketAddress("127.0.0.1", 11111), "example", "", "");
          try {
            connector.connect();
            // 监听的表,格式为数据库.表名,数据库.表名
            connector.subscribe(".*\\..*");
            connector.rollback();
      
            while (true) {
              Message message = connector.getWithoutAck(100); // 获取指定数量的数据
              long batchId = message.getId();
              if (batchId == -1 || message.getEntries().isEmpty()) {
                Thread.sleep(1000);
                continue;
              }
              // System.out.println(message.getEntries());
              printEntries(message.getEntries());
              connector.ack(batchId); // 提交确认,消费成功,通知server删除数据
              // connector.rollback(batchId);// 处理失败, 回滚数据,后续重新获取数据
            }
          } catch (Exception e) {
            System.out.println("Something Error.");
          } finally {
            connector.disconnect();
          }
        }
      }

      测试

      启动 CanalClient.java;

      修改本地数据库内容之后,控制台成功监听并报告更新信息。

      怎么使用SpringBoot+Canal实现数据库实时监控

      本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
      作者最新文章
      编程开发
      相关文章 更多
      精品专题 更多
      装机必备

      正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

      Windows

      正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

      PDF教程

      正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

      macOS软件

      正软商城macOS软件专区,精选适用于Mac电脑的办公、设计、影音、效率、开发和系统工具,提供软件功能介绍、macOS兼容版本、正版授权及购买下载服务。

      IOS软件

      正软商城iOS软件专区,精选适用于iPhone和iPad的办公、学习、影音、设计、效率及AI应用,提供功能介绍、适用设备、系统要求和正版获取方式等信息。

      AI

      正软商城AI软件专区,汇集AI写作、AI绘画、AI视频、AI办公、AI编程、AI翻译、智能客服和数据分析等人工智能工具,提供功能介绍、适用平台、收费方式及正版购买信息。

      Mac软件 更多
      AirBuddy 3 macOS版
      AirBuddy 3 macOS版

      AirBuddy 3 是面向 macOS 的蓝牙外设增强工具,可集中查看 AirPods、Beats 与苹果设备电量,提供快速连接、播放控制、电量提醒、桌面小组件和多台 Mac 外设接力等功能。

      AirServer macOS版
      AirServer macOS版

      AirServer macOS版可把 Mac 转换为无线投屏接收端,通过 AirPlay 或 Google Cast 接收手机、平板和电脑画面,并支持多设备同时连接、高清镜像及会话录制,适合家庭娱乐、课堂教学、会议演示和应用展示。

      AnyDesk macOS版
      AnyDesk macOS版

      AnyDesk macOS版是一款适用于远程办公、设备维护和客户支持的远程桌面工具,可连接并操作异地计算机,支持文件传输、无人值守访问、会话权限控制及跨平台协作。

      Beamer 4 macOS版
      Beamer 4 macOS版

      Beamer 4是面向macOS的本地视频投屏工具,可将Mac中的影片投放到Apple TV、Chromecast及兼容设备,支持常见格式、多类字幕、环绕声、播放列表和电视遥控操作。

      Boom 3D macOS版
      Boom 3D macOS版

      Boom 3D macOS版是一款系统级音效增强工具,可为音乐、电影、游戏和流媒体提供3D虚拟环绕声、31段均衡器、音量增强及应用独立音量控制,并支持本地播放器与多种音频输出设备。

      Boris FX macOS版
      Boris FX macOS版

      Boris FX macOS版是一套面向剪辑、合成、调色及动态图形工作的专业后期工具,涵盖视觉特效、平面与三维跟踪、转描、画面修复、粒子动画和音频清理,可配合多种主流宿主软件使用。

      Capto macOS版
      Capto macOS版

      Capto 是面向 macOS 的屏幕截图、高清录屏与媒体编辑工具,支持区域及整屏捕获、网页长截图、双音轨处理、图片和视频标注、素材分类与多渠道分享,适合教师、学生、内容创作者及需要制作演示教程的用户。

      ChemDraw macOS版
      ChemDraw macOS版

      ChemDraw macOS版是一款面向化学学习、科研和制药工作的专业结构绘图工具,可创建分子、反应及生物聚合物图形,并提供结构整理、格式转换和科研成果展示能力。

      Cursor Crane macOS版
      Cursor Crane macOS版

      Cursor Crane 是一款仅面向 macOS 的键盘操控效率工具,可通过提示标签、网格、文字查找和窗口模式完成点击、滚动、定位与切换,并支持屏幕内容提取、脚本及工作流扩展。

      Deep Freeze 冰点还原 macOS版
      Deep Freeze 冰点还原 macOS版

      Deep Freeze 冰点还原 macOS版通过冻结系统配置,让受保护的Mac在重新启动后回到预设状态,并提供解冻空间、维护计划、密码保护及Apple Remote Desktop管理能力。

      Focusky macOS版
      Focusky macOS版

      Focusky macOS版是一款面向教学课件、商务汇报、产品展示和动画宣传内容的演示制作工具。它通过无限画布、路径编排、缩放旋转转场及多媒体编辑,将传统逐页幻灯片转化为更具空间感的动态演示。

      Folder Colorizer 2 macOS版
      Folder Colorizer 2 macOS版

      Folder Colorizer 2 macOS版是一款直观的文件夹外观定制工具,可更换颜色,添加表情、贴纸及图片背景,并支持批量处理、智能推荐和恢复默认样式,帮助用户更快辨认工作、学习与生活资料。

      WINDOWS 更多
      Fuzor Windows版
      Fuzor Windows版

      Fuzor Windows版是一套面向建筑、工程与施工团队的BIM/VDC平台,可汇集多来源模型和进度数据,完成实时可视化、4D施工推演、场地物流规划、问题检查、成果演示及团队协同。

      Gety Windows版
      Gety Windows版

      Gety Windows版是一款本地AI文件搜索工具,可索引电脑中的文档和图片,通过全文搜索、语义检索与OCR快速定位内容,并提供原版式预览、筛选和AI工具连接功能。

      iMazing Windows版
      iMazing Windows版

      iMazing Windows版是一款面向iPhone、iPad和iPod用户的本地设备管理工具,可在电脑上完成多版本备份、照片与音乐传输、信息导出、应用数据管理以及新旧设备迁移。

      Mercalli Windows版
      Mercalli Windows版

      Mercalli是一款面向Windows用户的专业视频稳定与画面修复工具,可分析手持、运动相机、无人机和长焦素材中的抖动,校正滚动快门及CMOS果冻效应,并提供曝光、色彩、锐度和镜头画面优化功能。

      NiceLabel Windows版
      NiceLabel Windows版

      NiceLabel是面向Windows平台的商业条码标签设计与打印工具,可制作文字、图像、条码及变量数据标签,并支持数据库连接、批量打印、打印自动化和集中管理,适用于制造、仓储、物流及零售等场景。

      pdfFactory Windows版
      pdfFactory Windows版

      pdfFactory是一款面向Windows的PDF虚拟打印机,可从支持打印的应用程序创建PDF,在保存前完成即时预览、页面排序、旋转、删除及多文档合并,并支持字体嵌入、邮件发送等办公功能。

      Polarr Windows版
      Polarr Windows版

      Polarr Windows版是一款面向摄影爱好者与内容创作者的照片编辑工具,提供曝光和色彩调整、曲线、HSL、滤镜、局部蒙版、人像修饰、叠加效果及批量导出等功能,适合日常修图、社交媒体配图和较细致的影像后期处理。

      AIDA64 Windows版
      AIDA64 Windows版

      AIDA64是一款面向Windows电脑用户的系统信息、硬件诊断与基准测试工具,可识别处理器、主板、显卡、存储设备和系统组件,并实时监控温度、电压、功耗及风扇转速,适合装机验收、性能比较和稳定性排查。

      Portraiture Windows版
      Portraiture Windows版

      Portraiture Windows版是一款面向人像摄影后期的智能润饰插件,可在Photoshop、Lightroom Classic和Affinity中完成皮肤平滑、AI区域识别、肤色统一及补光处理,

      priPrinter 7 Windows版
      priPrinter 7 Windows版

      priPrinter 7 Windows版是一款虚拟打印机与打印预览工具,可接收其他程序的打印任务,在输出前调整页面顺序、边距与版式,并添加水印、页码或批注。专业版还支持文本修正、内容脱敏、打印历史和PDF发布。

      PSD Manager Windows版
      PSD Manager Windows版

      PSD Manager是适用于Windows版Autodesk 3ds Max的渲染后期插件,可把画面、渲染元素、对象及材质蒙版整理成分层PSD或PSB文件,便于在Photoshop、Affinity Photo和After Effects

      RayFire Windows版
      RayFire Windows版

      RayFire是运行于Windows版Autodesk 3ds Max中的破碎与刚体动力学插件,集成实时Voronoi切割、交互式拆除、爆炸、裂纹、缓存和体素等工具,适合影视特效、游戏动画及建筑坍塌镜头制作。