You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docker环境下Logstash如何持久化存储:sql_last_value?

持久化Logstash JDBC输入的sql_last_value(Docker环境)

要实现容器重建后仍能复用上次的sql_last_value,核心是把Logstash存储该值的文件挂载到宿主机或Docker卷上,避免容器销毁时丢失数据。具体分两步操作:

1. 修改Logstash配置文件

在JDBC输入块中添加last_run_metadata_path参数,指定容器内的文件路径,用来存储sql_last_value的历史值。修改后的完整配置如下:

input {
  jdbc {
    jdbc_driver_library => "<driverpath>/mysql-connector-java-<versionNumber>.jar" 
    jdbc_driver_class => "com.mysql.jdbc.Driver"
    jdbc_connection_string => "jdbc:mysql://<MySQL host>:3306/es_db" 
    jdbc_user => "<myusername>" 
    jdbc_password => "<mypassword>" 
    jdbc_paging_enabled => true
    tracking_column => "unix_ts_in_secs"
    use_column_value => true
    tracking_column_type => "numeric"
    schedule => "*/5 * * * * *"
    # 添加以下参数,指定持久化文件路径
    last_run_metadata_path => "/usr/share/logstash/.logstash_jdbc_last_run"
    statement => "SELECT *, UNIX_TIMESTAMP(modification_time) AS unix_ts_in_secs FROM es_table WHERE (UNIX_TIMESTAMP(modification_time) > :sql_last_value AND modification_time < NOW()) ORDER BY modification_time ASC"
  }
}
filter {
  mutate {
    copy => { "id" => "[@metadata][_id]"}
    remove_field => ["id", "@version", "unix_ts_in_secs"]
  }
}
output {
  elasticsearch {
    index => "demo_idx"
    document_id => "%{[@metadata][_id]}"
    ilm_enabled => false
    cloud_id => "<cloud_id>"
    cloud_auth => "<cloud_auth>"
    ssl => true
  }
}

说明:last_run_metadata_path指定的路径是容器内部的位置,后续需要将这个路径挂载到宿主机。

2. 配置Docker挂载

通过Docker挂载,将容器内的/usr/share/logstash/.logstash_jdbc_last_run文件(或其所在目录)映射到宿主机的目录或Docker卷,确保容器销毁后文件不丢失。

方式一:使用docker run命令

docker run -d \
  --name logstash \
  -v /path/on/host/.logstash_jdbc_last_run:/usr/share/logstash/.logstash_jdbc_last_run \
  -v /path/to/your/logstash/config:/usr/share/logstash/pipeline \
  docker.elastic.co/logstash/logstash:<your-logstash-version>

注意:

  • /path/on/host/.logstash_jdbc_last_run是宿主机上的文件路径,提前创建该文件并设置权限:touch /path/on/host/.logstash_jdbc_last_run && chown 1000:1000 /path/on/host/.logstash_jdbc_last_run(Logstash容器默认使用UID=1000的用户运行)。
  • /path/to/your/logstash/config是你本地存放Logstash配置文件的目录,挂载到容器的pipeline目录。

方式二:使用docker-compose.yml

version: '3'
services:
  logstash:
    image: docker.elastic.co/logstash/logstash:<your-logstash-version>
    volumes:
      - ./logstash/config:/usr/share/logstash/pipeline
      - ./logstash/last_run:/usr/share/logstash/.logstash_jdbc_last_run
    user: "1000:1000"

注意:

  • 提前在宿主机创建./logstash/last_run文件,设置权限:touch ./logstash/last_run && chown 1000:1000 ./logstash/last_run。

验证效果

启动容器后,等待Logstash执行一次查询,此时宿主机上的挂载文件会被写入当前的sql_last_value。销毁容器后重新启动,Logstash会读取该文件的值,从上次的位置继续查询,不会从头开始。

内容的提问来源于stack exchange,提问作者Sk Monjurul Haque

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 04:20:19