用 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

相关推荐
这个DBA有点耶1 小时前
NULL不是空——数据库里最反直觉的设计,90%新人踩过的坑
数据库·mysql·代码规范
这个DBA有点耶3 小时前
AI写的SQL跑崩了生产库,这锅谁背?
数据库·人工智能·程序员
镜舟科技3 小时前
Databricks 再提 LTAP,AI 时代的数据底座为何重回大一统叙事?
数据库·架构·agent
Databend4 小时前
从湖仓升级为 Agent 时代的数据控制面,Snowflake 和 Databricks 有哪些布局
大数据·数据库·agent
ClouGence7 小时前
SQL Server CDC 能放到 Always On 备库读吗?一文讲透原理与实践
数据库·sql server
先吃饱再说1 天前
存储的进化:从 MySQL 到浏览器缓存,数据到底住在哪?
数据库
Nturmoils1 天前
字段太多看不全,ksql 的展开模式和输出控制怎么用
数据库·后端
Databend1 天前
Agent 轨迹分析与归因的数据工程实践
大数据·数据库·agent
这个DBA有点耶1 天前
SQL改写进阶:标量子查询的“隐形代价”与消除实战
数据库·mysql·架构
smallyoung1 天前
数据库乐观锁深度解析:MySQL、PostgreSQL 实战 + Spring Boot 集成指南
数据库·mysql·postgresql