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
相关产品推荐
相关产品推荐

