用 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

相关推荐
qq_192779876 小时前
高级爬虫技巧:处理JavaScript渲染(Selenium)
jvm·数据库·python
u0109272716 小时前
使用Plotly创建交互式图表
jvm·数据库·python
爱学习的阿磊6 小时前
Python GUI开发:Tkinter入门教程
jvm·数据库·python
tudficdew7 小时前
实战:用Python分析某电商销售数据
jvm·数据库·python
sjjhd6527 小时前
Python日志记录(Logging)最佳实践
jvm·数据库·python
Configure-Handler8 小时前
buildroot System configuration
java·服务器·数据库
2301_821369618 小时前
用Python生成艺术:分形与算法绘图
jvm·数据库·python
电商API_180079052479 小时前
第三方淘宝商品详情 API 全维度调用指南:从技术对接到生产落地
java·大数据·前端·数据库·人工智能·网络爬虫
2401_832131959 小时前
Python单元测试(unittest)实战指南
jvm·数据库·python
打工的小王10 小时前
redis(四)搭建哨兵模式:一主二从三哨兵
数据库·redis·缓存