用 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

相关推荐
野犬寒鸦19 分钟前
从零起步学习并发编程 || 第六章:ReentrantLock与synchronized 的辨析及运用
java·服务器·数据库·后端·学习·算法
indexsunny33 分钟前
互联网大厂Java面试实战:Spring Boot微服务在电商场景中的应用与挑战
java·spring boot·redis·微服务·kafka·spring security·电商
TTBIGDATA1 小时前
【Atlas】Ambari 中 开启 Kerberos + Ranger 后 Atlas Hook 无权限访问 Kafka Topic:ATLAS_HOOK
大数据·kafka·ambari·linq·ranger·knox·bigtop
晚霞的不甘2 小时前
揭秘 CANN 内存管理:如何让大模型在小设备上“轻装上阵”?
前端·数据库·经验分享·flutter·3d
市场部需要一个软件开发岗位2 小时前
JAVA开发常见安全问题:纵向越权
java·数据库·安全
海奥华22 小时前
mysql索引
数据库·mysql
2601_949593653 小时前
深入解析CANN-acl应用层接口:构建高效的AI应用开发框架
数据库·人工智能
javachen__3 小时前
mysql新老项目版本选择
数据库·mysql
Dxy12393102163 小时前
MySQL如何高效查询表数据量:从基础到进阶的优化指南
数据库·mysql
Dying.Light3 小时前
MySQL相关问题
数据库·mysql