用 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有点耶2 天前
MVCC深入:Read View、版本链与快照读——InnoDB并发控制的内核
数据库·mysql·架构
DBA_G2 天前
从地面到云霄:GBase数据库在民航三大场景的落地实践
数据库
自由能燃气设备2 天前
商用全预混低氮冷凝锅炉免费方案vs付费方案对比+选型避坑指南
大数据·数据库·人工智能
科创致远2 天前
科创致远 ESOP 系统核心效能与实战价值展示
大数据·数据库·人工智能·精益工程
geovindu2 天前
sql: Transaction & Concurrency Patterns using postgresql 18
postgresql·数据库开发·数据库架构
2601_962218612 天前
万象生鲜系统称重自动多退少补算法解决生鲜非标品痛点
大数据·数据库·人工智能·python·算法
张洛闻Eren2 天前
k8s云原生【第十课】:水平 Pod 自动扩缩容
运维·数据库·云原生·kubernetes·github
于平安2 天前
MySQL-触发器
数据库·mysql
白远山2 天前
上海24小时自助健身房解决方案实战指南与经验分享
java·数据库·架构·需求分析
Omics Pro2 天前
斯坦福Nature+Science|广义虚拟细胞基础大模型
数据库·人工智能·算法·机器学习·自然语言处理