持久化队列与死信队列是什么
持久化队列(PQ)把进入 Logstash 的事件先落盘再消费:进程重启不会丢掉在途数据,磁盘写满前还会对上游施加背压。配合死信队列(DLQ),解析失败的毒丸事件会被单独存起来,便于事后分析而不是反复重试拖垮管道。这两项配置是日志链路上「不丢数据」的关键保障,代价是需要规划磁盘空间并持续监控水位。
基本信息
| 配置位置 | logstash.yml |
|---|---|
| 关键项 | queue.type、path.queue、queue.max_bytes、queue.checkpoint.writes |
| 死信队列 | dead_letter_queue.enable、dead_letter_queue.max_bytes |
| 适用版本 | Logstash 7.x / 8.x |
| 前置条件 | 磁盘空间与目录写入权限 |
典型使用场景
- 重启不丢数据:升级或重启期间事件先落盘,恢复后继续消费
- 削峰缓冲:上游突发流量由磁盘队列吸收,避免直接丢弃
- 背压传导:队列满时停止拉取,让上游自行缓冲与重试
- 毒丸隔离:解析失败的事件进死信队列,不影响正常数据处理
- 故障取证:分析死信队列里的事件,定位上游格式问题
使用要点
- 队列目录必须独占,多个实例共用同一目录会互相破坏数据
- 磁盘水位要早于队列容量上限设置告警,磁盘写满的影响面更大
- 检查点写入间隔影响性能与恢复精度,需要权衡后设定
- 死信队列里的数据要定期查看与清理,否则会持续占用空间
- 队列容量结合峰值流量与下游恢复时间一起估算
logstash.yml 配置
logstash.yml 配置
queue.type: persisted
path.queue: /usr/share/logstash/data/queue
queue.max_bytes: 4gb
queue.checkpoint.writes: 1024
dead_letter_queue.enable: true
dead_letter_queue.max_bytes: 1gb配置项读法
| 配置项 | 作用 | 注意 |
|---|---|---|
| queue.type | 选择队列类型 | persisted 才会真正落盘 |
| queue.max_bytes | 队列容量上限 | 与磁盘可用空间一起规划 |
| checkpoint.writes | 检查点写入频率 | 影响性能与恢复精度 |
| dead_letter_queue.enable | 开启死信队列 | 便于隔离异常事件 |
| dead_letter_queue.max_bytes | 死信容量上限 | 写满后会丢弃新条目 |
背压是逐级传导的:队列满时 Logstash 停止从采集端拉取,采集端继续重试与本地缓冲,最终上限取决于上游的磁盘空间。