用 Logstash 把 PostgreSQL 数据实时导出到 Kafka


一、总览

组件 作用
PostgreSQL 数据源,提供 update_time 增量字段
Logstash 通过 jdbc 插件拉数据,kafka 插件写 Topic
Kafka 下游消费,支持 SASL/PLAIN 账号密码

架构图:

复制代码
PostgreSQL
    ↓  JDBC (incremental)
Logstash 管道
    ↓  SASL_PLAIN
Kafka Topic

二、准备工作(一次性)

  1. 下载 JDBC 驱动

    放入 Logstash 机器(或容器):

    复制代码
    /usr/share/logstash/postgresql-42.3.6.jar
  2. PG 侧创建增量字段索引(防止全表扫描)

    sql 复制代码
    CREATE INDEX idx_news_update_time ON news(update_time);
  3. Kafka 侧创建 Topic

    bash 复制代码
    kafka-topics.sh --create --topic pg-news --partitions 6 --replication-factor 2

三、核心配置:pg2kafka.conf

ruby 复制代码
input {
  jdbc {
    # === 连接 ===
    jdbc_connection_string => "jdbc:postgresql://postgresql-server:5432/mydb"
    jdbc_user => "postgres"
    jdbc_password => "${PG_PASSWORD}"      # K8s 用 Secret 注入
    jdbc_driver_class => "org.postgresql.Driver"
    jdbc_driver_library => "/usr/share/logstash/postgresql-42.3.6.jar"

    # === 增量 SQL ===
    statement => "
      SELECT id, title, content, update_time
      FROM   public.news
      WHERE  update_time > :sql_last_value
      ORDER  BY update_time
      LIMIT  5000"
    use_column_value => true
    tracking_column => "update_time"
    tracking_column_type => "timestamp"
    last_run_metadata_path => "/usr/share/logstash/data/pg_news_last_value"

    # 每 30 秒拉一次
    schedule => "*/30 * * * *"
  }
}

filter {
  # 统一时间戳
  mutate {
    copy => { "update_time" => "@timestamp" }
    remove_field => ["@version","update_time"]
  }
}

output {
  kafka {
    bootstrap_servers => "kafka-broker-1:9092,kafka-broker-2:9092,kafka-broker-3:9092"
    topic_id => "pg-news"
    codec => json_lines
    compression_type => "lz4"
    acks => "all"
    client_id => "logstash-pg2k-news"

    # === SASL/PLAIN 账号密码 ===
    security_protocol => "SASL_PLAINTEXT"
    sasl_mechanism => "PLAIN"
    jaas_config => 'org.apache.kafka.common.security.plain.PlainLoginModule required
                    username="${KAFKA_USER}"
                    password="${KAFKA_PASS}";'
  }
}

四、启动与验证

  1. 语法检查

    bash 复制代码
    bin/logstash --config.test_and_exit -f pg2kafka.conf
  2. 启动

    bash 复制代码
    nohup bin/logstash -f pg2kafka.conf \
         --path.logs /var/log/logstash \
         > /dev/null 2>&1 &
  3. 消费验证

    bash 复制代码
    kafka-console-consumer.sh --bootstrap-server kafka-broker-1:9092 \
                              --topic pg-news --from-beginning

    能看到实时 JSON 数据即成功。


五、多表并行(复制即可)

表名 Topic last_value 文件
news pg-news /data/pg_news_last_value
user pg-user /data/pg_user_last_value

把 pg2kafka.conf 复制一份,改三处:

  1. statement 表名
  2. tracking_column(如有不同)
  3. topic_id
  4. last_run_metadata_path 必须不同

最后在 pipelines.yml 里加一条即可:

yaml 复制代码
- pipeline.id: pg-user
  path.config: "/etc/logstash/pipeline.d/pg-user.conf"
  queue.type: persisted

相关推荐
宇宙无敌暴龙战士66610 分钟前
MySQL 8 库表操作学习笔记:SQL 基础、库表管理、约束与用户授权全流程
数据库·sql·mysql·学习笔记·后端开发
猿究院_夏燊19 分钟前
MySQL 的四种隔离级别
java·数据库·mysql
FungLeo30 分钟前
成为全栈·Go 后端篇·从 Node SQLite 到 PostgreSQL:把迁移做成独立交付物
postgresql·golang·sqlite·go·数据库迁移·成为全栈
say_fall40 分钟前
【Linux系统编程】Ext 文件系统:磁盘与存储、文件与目录、现代计算机究竟如何寻找文件
linux·运维·服务器·数据库·c++
共享家95271 小时前
408 操作系统第一章
服务器·数据库·windows
这个DBA有点耶2 小时前
连拿六年第一后宣布出海:国产数据库凭什么敢撕掉“平替”的标签?
数据库·人工智能·架构
云和恩墨3 小时前
数据库监控简史:从会回答到能交付——AI-DBA如何成为真正的数字同事
数据库·人工智能·dba
这个DBA有点耶3 小时前
为什么删掉索引后,查询瞬间变快了?探讨MySQL的随机I/O与顺序I/O博弈
数据库·mysql·代码规范
皮皮林5513 小时前
Kafka 怎么保证消费只消费一次的?
kafka
kingx34 小时前
BugKu 渗透测试 4 实战:文件上传打点,5 Flag 全通
数据库·渗透测试·web·内网渗透