alibaba_canal mysql监控工具使用

 

 

一. canal 简介

canal是阿里巴巴开发的一套能够实时监控数据库变更的工具工程。实用性非常强大。主要支持的数据库是MySQL。能够通过监控MySQL二进制日志的方式,实时洞察数据库的增删改操作。

源码地址:https://github.com/alibaba/canal/

功能作用:能够实现数据库同步、监控数据库、等需要实时洞察数据库变动的业务场景

maven依赖:需要手动安装maven依赖,源码下载地址:https://github.com/chenqian56131/spring-boot-starter-canal,下载后进入starter-canal目录,CMD指定mvn install 即可安装完成

在项目中导入依赖:

<dependency>
    <groupId>com.xpand</groupId>
    <artifactId>starter-canal</artifactId>
    <version>0.0.1-SNAPSHOT</version>
</dependency>

1. canal的原理分析

官方给出的架构图:

原理分析:MySQL数据库开启二进制文件日志后,所有的操作都会被二进制文件记录。canal程序绑定MySQL后,通过读取二进制日志文件,来获取数据的变动。就相当于监听了MySQL日志的slave从数据库。从而实现能够动态监听的作用。

使用步骤:

①安装canal server,配置需要监听的MySQL数据库,并启动

②在java程序中导入依赖,配置文件连接到canal server

③通过canal提供的API编写方法完成数据库的监听

二. canal监听MySQL示例

通过下面的demo,演示canal是如何监听MySQL的,本例中的MySQL与canal server均部署在同一台服务器

1. 开启mysql二进制日志,并创建canal账号

查看是否开启二进制日志:show variables like 'log_bin'; ON为开启,OFF为关闭

MySQL的二进制日志一定要开启,才能够保证canal能够实时监听。本例的MySQL以及canal都是通过docker容器运行。

-- 通过docker安装的mysql配置文件路径:/etc/mysql/mysql.conf.d 下的mysqld.cnf

-- 直接安装在Linux上的MySQL配置文件: /etc/my.cnf

在配置文件中添加如下配置:

log-bin=mysql-bin

server-id=123321

其中mysql-bin代表的是basename就是生成二进制日志文件的前缀部分,默认的位置在datadir目录下

server-id需要是唯一的。详情介绍可以参考博客:https://www.linuxidc.com/Linux/2018-10/154696.htm

配置canal连接数据库的账号:

CREATE USER 'canal'@'%' IDENTIFIED BY 'canalTest123456@';  //创建用户、密码
GRANT SELECT,REPLICATION SLAVE, REPLICATION CLIENT, SUPER ON *.* TO 'canal'@'%';  //设置访问权限
FLUSH PRIVILEGES;

2. canal server安装

2.1 docker安装canal

①拉取canal的docker镜像:docker pull canal/canal-server

启动canal:docker run -p 11111:11111 -d --name canal canal/canal-server

②启动后进入容器修改配置文件

进入canal的配置文件路径:/home/admin/canal-server/conf

[root@fc805e84d1dc conf]# pwd
/home/admin/canal-server/conf
[root@fc805e84d1dc conf]# ls
canal_local.properties  canal.properties  example  logback.xml  metrics  spring
[root@fc805e84d1dc conf]#

其中canal_local.properties文件是canal的配置文件,example中的instance.properties配置的是监听数据库的配置

instance.properties中的数据库信息设置为需要监控的数据库即可

canal.instance.master.address=124.70.157.112:3306
canal.instance.dbUsername=canal
canal.instance.dbPassword=canalTest123456@

2.2 Linux安装canal

首先下载canal的源码: https://github.com/alibaba/canal/releases

官网配置文档说明:https://github.com/alibaba/canal/wiki/QuickStart

下载的版本是:

canal.deployer-1.1.3.tar.gz

下载后解压到/opt/canal路径下

bin:启动(sh bin/startup.sh)、重启、停止命令

conf:配置文件 数据库的配置文件在:conf/example/instance.pr

logs:日志文件,启动失败可以查看日志文件

 修改MySQL实例配置文件conf/example/instance.properties

配置完成后启动canal server :  sh bin/startup.sh 

注意服务器的11111端口一定要是开放的

3. java程序连接canal监控MySQL

①maven依赖:starter-canal 是手动编译安装到maven的,参考上面简介 ↑

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>com.xpand</groupId>
            <artifactId>starter-canal</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>
    </dependencies>

②application文件配置:

server:
  port: 8088

spring:
  application:
    name: canal-test

canal:
  client:
    instances:
      example:
        host: 47.111.172.11
        port: 11111

③启动类添加注解:

@EnableCanalClient

④编写监控类:

@CanalEventListener
public class Canalconfig {
    /**
     * @UpdateListenPoint :注解是监控更新的
     * @DeleteListenPoint :注解是监控删除的
     * @param eventType :时间类型
     * @param rowData: 修改的数据对象,可以通过该对象获取修改前和修改后的数据
     */
    @InsertListenPoint
    public void insertLs(CanalEntry.EventType eventType, CanalEntry.RowData rowData) {
        for (CanalEntry.Column column : rowData.getAfterColumnsList()) {
            System.out.println("列明:" + column.getName() + "          数据:" + column.getValue());
        }
    }


    /**
     * 自定义监控类型
     * @param eventType
     * @param rowData
     */
    @ListenPoint(
            eventType = {CanalEntry.EventType.DELETE,CanalEntry.EventType.DELETE},  //指定监控的事件类型
            schema = {"db01"},                                                      //指定数据库
            table = {"tb_user"},                                                    //指定表
            destination = "example"                                                 //指定canal实例
    )
    public void myself(CanalEntry.EventType eventType, CanalEntry.RowData rowData) {
    }
}

⑤启动测试

当被监控的数据库发生变更时,可发现监控信息

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值