canal监控msyql日志打印到kafka,解析日志控制台打印

一、开启mysql的binlog

vim /etc/my.cnf
在这里插入图片描述

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

二、配置canal

vim /usr/local/soft/canal-1.1.4/conf/example/instance.properties

更改用户名和密码
在这里插入图片描述
设置日志采集到kafka的topic ,以及要监控的数据库
在这里插入图片描述
vim /usr/local/soft/canal-1.1.4/conf/canal.properties

设置模式为kafka
在这里插入图片描述

三、启动zookeeper,启动kafka,启动canal

开启kafka 对应topic的消费者

kafka-console-consumer.sh --bootstrap-server  master:9092  --from-beginning --topic test_topic2

可以看到日志已经采集到kafka
在这里插入图片描述

四、打开本地idea,编写代码

添加依赖
编写的代码较多,依赖比较乱,自行选取

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>


    <groupId>com.hehe</groupId>
    <artifactId>test</artifactId>
    <version>1.0-SNAPSHOT</version>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <flink.version>1.12.2</flink.version>
        <scala.binary.version>2.11</scala.binary.version>
        <scala.version>2.11.12</scala.version>
        <log4j.version>2.12.1</log4j.version>
    </properties>

    <dependencies>

        <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-table-API-java</artifactId>
            <version>${flink.version}</version>
        </dependency>


        <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-walkthrough-common_${scala.binary.version}</artifactId>
            <version>${flink.version}</version>
        </dependency>

        <!-- Apache Flink dependencies -->
        <!-- These dependencies are provided, because they should not be packaged into the JAR file. -->
        <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-streaming-scala_${scala.binary.version}</artifactId>
            <version>${flink.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-clients_${scala.binary.version}</artifactId>
            
### Canal 实现 MySQL 数据同步的原理与配置方法 Canal 是阿里巴巴开源的一款数据库增量日志解析组件,主要用于监控数据库数据变更,并将变更数据同步到其他存储介质中。其核心功能是通过模拟 MySQL Slave 的交互协议,实时获取 MySQL 数据库的增量更新信息[^1]。 #### 一、Canal 的工作原理 Canal 的工作原理基于 MySQL 的 Binlog 日志机制。以下是 Canal 实现 MySQL 数据同步的主要步骤: 1. **Binlog 日志**:MySQL 的 Binlog 是一种二进制日志文件,记录了数据库的所有修改操作(如 INSERT、UPDATE、DELETE)。Binlog 支持两种格式:Statement 和 Row。Row 格式更适用于 Canal,因为它能够精确捕获每一行数据的变化。 2. **模拟 MySQL Slave**:Canal 模拟 MySQL 的 Slave 节点行为,向 MySQL Master 发送 Dump 协议请求,订阅所需的 Binlog 日志事件[^2]。 3. **解析 Binlog**:Canal 接收到 Binlog 后,对其进行解析并提取出数据变更事件(DML 和 DDL)。 4. **数据分发**:解析后的数据可以被发送到目标系统(如 Kafka、Elasticsearch 或其他存储系统),以实现数据同步。 #### 二、Canal 配置方法 以下是使用 Canal 实现 MySQL 数据同步的具体配置步骤: 1. **安装与部署 Canal** - 下载 Canal 的最新版本,并解压到指定目录。 - 配置 Canal 的 `canal.properties` 文件,设置 MySQL 主机地址、端口、用户名和密码等基本信息。 ```properties canal.destinations = example canal.serverMode = spring canal.metaManager = zk ``` 2. **配置实例** - 在 `conf/example/instance.properties` 文件中,配置 MySQL 数据源的相关信息: ```properties canal.instance.master.address=127.0.0.1:3306 canal.instance.dbUsername=canal canal.instance.dbPassword=canal canal.instance.connectionCharset=UTF-8 canal.instance.filter.regex=.*\\..* ``` 上述配置中,`canal.instance.master.address` 表示 MySQL 主机地址和端口;`canal.instance.filter.regex` 定义需要监听的数据库表模式。 3. **启动 Canal** - 启动 Canal Server 和 Canal Adapter。 - 确保 MySQL 的 Binlog 功能已开启,并设置为 Row 格式: ```sql SET GLOBAL binlog_format = 'ROW'; ``` 4. **数据同步到目标系统** - 如果需要将数据同步到 Kafka,可以在 Canal Adapter 中配置 Kafka 的连接信息。例如: ```yaml canal: serverHost: 127.0.0.1 serverPort: 11111 batchSize: 500 syncBatchSize: 1000 kafka: servers: localhost:9092 topic: mysql_topic ``` #### 三、代码示例 以下是一个简单的 Canal 客户端代码示例,展示如何监听 MySQL 数据变更并输出到控制台: ```java 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 java.net.InetSocketAddress; import java.util.List; public class CanalClientExample { public static void main(String[] args) { CanalConnector connector = CanalConnectors.newSingleConnector(new InetSocketAddress("127.0.0.1", 11111), "example", "", ""); connector.connect(); connector.subscribe(".*\\..*"); connector.rollback(); while (true) { Message message = connector.getWithoutAck(100); long batchId = message.getId(); List<CanalEntry.Entry> entries = message.getEntries(); for (CanalEntry.Entry entry : entries) { if (entry.getEntryType() == CanalEntry.EntryType.ROWDATA) { CanalEntry.RowChange rowChange = null; try { rowChange = CanalEntry.RowChange.parseFrom(entry.getStoreValue()); System.out.println("Event Type: " + rowChange.getEventType()); } catch (Exception e) { e.printStackTrace(); } } } connector.ack(batchId); } } } ``` ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值