Logstash 从 MySQL 同步数据到 Kafka

📋 配置概述

本指南提供完整的 Logstash 配置,用于将 MySQL 数据同步到 Kafka。

⚙️ 基础配置

1. 全量数据同步配置

ruby 复制代码
# mysql_to_kafka_full.conf
input {
  jdbc {
    # MySQL 连接配置 - 请修改以下信息
    jdbc_connection_string => "jdbc:mysql://数据库IP:3306/数据库名"
    jdbc_user => "数据库用户名"
    jdbc_password => "数据库密码"
    
    # JDBC 驱动配置
    jdbc_driver_library => "/usr/share/logstash/drivers/mysql-connector-java.jar"
    jdbc_driver_class => "com.mysql.cj.jdbc.Driver"
    
    # SQL 查询 - 请修改表名
    statement => "SELECT * FROM 你的表名"
    
    # 分页设置(提高大表性能)
    jdbc_paging_enabled => true
    jdbc_page_size => 50000
    
    # 连接池配置
    jdbc_pool_timeout => 300
    connection_retry_attempts => 3
    connection_retry_attempts_wait_time => 10
    
    # 调度(每分钟执行一次)
    schedule => "* * * * *"
    
    # 元数据记录
    last_run_metadata_path => "/tmp/last_run_metadata"
    clean_run => false
    record_last_run => true
  }
}

filter {
  # 添加处理时间戳 - 请根据实际字段修改
  date {
    match => [ "create_time", "yyyy-MM-dd HH:mm:ss" ]
    target => "@timestamp"
    timezone => "UTC"
  }
  
  # 移除不需要的字段
  mutate {
    remove_field => ["@version", "jdbc_url"]
  }
  
  # 添加自定义字段
  mutate {
    add_field => {
      "source_database" => "你的数据库名"
      "source_table" => "你的表名"
      "sync_timestamp" => "%{@timestamp}"
    }
  }
}

output {
  # 输出到 Kafka - 请修改Kafka地址和Topic
  kafka {
    bootstrap_servers => "kafka1:9092,kafka2:9092"
    topic_id => "你的kafka_topic名称"
    codec => json
    
    # Kafka 生产者配置
    acks => "1"
    batch_size => 16384
    linger_ms => 100
    compression_type => "snappy"
    
    # 消息键设置(可选)
    message_key => "%{id}"  # 使用记录ID作为消息键
  }
  
  # 调试输出(可选)
  stdout { 
    codec => rubydebug 
  }
}

2. 增量数据同步配置

ruby 复制代码
# mysql_to_kafka_incremental.conf
input {
  jdbc {
    # 数据库连接信息 - 请修改
    jdbc_connection_string => "jdbc:mysql://数据库IP:3306/数据库名"
    jdbc_user => "数据库用户名"
    jdbc_password => "数据库密码"
    jdbc_driver_library => "/usr/share/logstash/drivers/mysql-connector-java.jar"
    jdbc_driver_class => "com.mysql.cj.jdbc.Driver"
    
    # 增量查询 - 基于更新时间戳(请修改表名和字段名)
    statement => "SELECT * FROM 你的表名 WHERE update_time > :sql_last_value AND update_time < NOW() ORDER BY update_time ASC"
    
    # 跟踪列配置(请修改为实际的增量字段)
    use_column_value => true
    tracking_column => "update_time"
    tracking_column_type => "timestamp"
    last_run_metadata_path => "/tmp/last_run_incremental"
    
    # 分页设置
    jdbc_paging_enabled => true
    jdbc_page_size => 10000
    
    # 更频繁的调度
    schedule => "*/5 * * * * *"  # 每5秒
    
    # 连接设置
    connection_retry_attempts => 5
    jdbc_validate_connection => true
  }
}

filter {
  # 日期处理(请修改字段名)
  date {
    match => [ "update_time", "yyyy-MM-dd HH:mm:ss" ]
    target => "@timestamp"
  }
  
  # 数据转换
  mutate {
    convert => {
      "id" => "integer"
      # 添加其他需要转换的字段
    }
    remove_field => ["@version"]
  }
  
  # 添加元数据
  mutate {
    add_field => {
      "sync_type" => "incremental"
      "batch_timestamp" => "%{@timestamp}"
    }
  }
}

output {
  kafka {
    # Kafka配置 - 请修改
    bootstrap_servers => "kafka1:9092,kafka2:9092"
    topic_id => "你的增量数据topic"
    codec => json
    message_key => "%{id}"  # 请修改为主键字段
    
    # 生产配置
    acks => "1"
    batch_size => 16384
    compression_type => "snappy"
  }
}

🔄 多表同步配置

ruby 复制代码
# mysql_multiple_tables.conf
input {
  # 表1配置 - 请修改
  jdbc {
    jdbc_connection_string => "jdbc:mysql://数据库IP:3306/数据库名"
    jdbc_user => "数据库用户名"
    jdbc_password => "数据库密码"
    jdbc_driver_library => "/usr/share/logstash/drivers/mysql-connector-java.jar"
    jdbc_driver_class => "com.mysql.cj.jdbc.Driver"
    
    statement => "SELECT * FROM 表1 WHERE updated_at > :sql_last_value"
    use_column_value => true
    tracking_column => "updated_at"
    tracking_column_type => "timestamp"
    last_run_metadata_path => "/tmp/last_run_table1"
    
    schedule => "*/10 * * * * *"
    type => "table1"  # 表标识
  }
  
  # 表2配置 - 请修改
  jdbc {
    jdbc_connection_string => "jdbc:mysql://数据库IP:3306/数据库名"
    jdbc_user => "数据库用户名"
    jdbc_password => "数据库密码"
    jdbc_driver_library => "/usr/share/logstash/drivers/mysql-connector-java.jar"
    jdbc_driver_class => "com.mysql.cj.jdbc.Driver"
    
    statement => "SELECT * FROM 表2 WHERE updated_at > :sql_last_value"
    use_column_value => true
    tracking_column => "updated_at"
    tracking_column_type => "timestamp"
    last_run_metadata_path => "/tmp/last_run_table2"
    
    schedule => "*/15 * * * * *"
    type => "table2"  # 表标识
  }
}

filter {
  # 根据类型添加不同处理
  if [type] == "table1" {
    mutate {
      add_field => { "topic_suffix" => "table1" }
    }
  }
  if [type] == "table2" {
    mutate {
      add_field => { "topic_suffix" => "table2" }
    }
  }
  
  # 通用处理
  mutate {
    add_field => {
      "source_host" => "数据库IP"
      "database" => "数据库名"
    }
  }
}

output {
  if [type] == "table1" {
    kafka {
      bootstrap_servers => "kafka1:9092"
      topic_id => "kafka_topic_table1"
      codec => json
      message_key => "%{id}"  # 请修改为主键
    }
  }
  if [type] == "table2" {
    kafka {
      bootstrap_servers => "kafka1:9092"
      topic_id => "kafka_topic_table2"
      codec => json
      message_key => "%{id}"  # 请修改为主键
    }
  }
}

🔧 配置参数说明

需要修改的关键参数:

参数 说明 示例
jdbc_connection_string MySQL连接字符串 jdbc:mysql://192.168.1.100:3306/mydb
jdbc_user 数据库用户名 admin
jdbc_password 数据库密码 password123
statement SQL查询语句 SELECT * FROM users
tracking_column 增量同步字段 update_time 或 id
bootstrap_servers Kafka集群地址 kafka1:9092,kafka2:9092
topic_id Kafka主题名称 user-data

可选调优参数:

  • jdbc_page_size: 分页大小,根据数据量调整
  • schedule: 执行频率,根据实时性要求调整
  • batch_size: Kafka批处理大小
  • compression_type: 压缩方式 (none, gzip, snappy, lz4)
相关推荐
2301_32241428041 小时前
基于SpringBoot+Vue的休闲零食超市管理系统的设计与实现59004-计算机毕设 原创(免费领源码+部署教程+开发环境)
java·vue.js·spring boot·redis·mysql·决策树·推荐算法
库库的数据库笔记4 小时前
国产信创数据库的MySQL兼容性深度对比解析
大数据·数据库·mysql·oceanbase·政务
吹什么轩8 小时前
MySQL:数据库基础
数据库·mysql
FluxDB8 小时前
用 Rust + GPUI 重做数据库客户端
数据库·mysql
Yyyyyy~8 小时前
【Mysql】增删查改操作
数据库·mysql
BBmmo9 小时前
MySQL 里大小写不同的邮箱,为什么会撞上唯一索引?
mysql
专注仿真10 小时前
从「能跑通」到「能交付」:一套可直接落地的电商用户行为分析平台(Python + SQLite/MySQL + Streamlit 全栈源码与部署文档)
python·mysql·sqlite
每天一道题10 小时前
Kafka 是如何工作的?从 Broker、Partition、Offset 到 Consumer Group
分布式·kafka
1024奇点10 小时前
【仓颉语言入门 · 第二篇 第 10 课】
开发语言·数据库·ide·mysql·开源
catino12 小时前
分库分表详解
mysql