Druid markUnused接口延迟标记Segment为Unused的原因及解决方法
Druid Segment标记为Unused延迟问题排查与解决
问题背景
我有一个名为test的数据源,包含一个Segment,想要删除该Segment。根据文档,删除Segment需先将其标记为Unused,再执行Kill操作。我向以下端点发送POST请求,请求体中携带目标Segment ID:
POST http://<ip>:<coordinator_port>/druid/coordinator/v1/datasources/test/markUnused
请求体:
{ "segmentIds":[ "test_2024-02-01T00:00:00.000Z_2024-03-01T00:00:00.000Z_2024-01-30T06:16:15.950Z_6" ] }
首次调用返回结果:
{ "numChangedSegments": 0 }
几小时后再次发送相同请求,返回结果:
{ "numChangedSegments": 1 }
相关信息:
- Druid版本:26.0.0
- 数据源摄入类型:Kafka
延迟原因分析
- Segment处于活跃写入状态:由于数据源是Kafka实时摄入类型,目标Segment可能仍被Kafka索引任务持续写入数据。Druid不允许将正在写入的Segment标记为Unused,必须等Segment关闭(转为只读状态,不再接收新数据)后才能操作。
- Coordinator元数据刷新周期过长:Coordinator会定期扫描并刷新Segment的状态元数据,默认周期可能长达数小时,只有当Coordinator检测到Segment已关闭后,
markUnused请求才能生效。
实现立即标记Unused的方法
方法1:手动关闭目标Segment
通过Coordinator API手动关闭活跃的Kafka Segment,关闭后即可立即执行markUnused操作:
POST http://<ip>:<coordinator_port>/druid/coordinator/v1/datasources/test/segments/<segment_id>/shutdown
将<segment_id>替换为你要操作的目标Segment ID。
方法2:缩短Coordinator元数据刷新周期
修改Coordinator的runtime.properties配置文件,缩短Segment状态检查的周期,让Coordinator更快识别到Segment状态变化:
# 调整为5分钟(单位:毫秒),默认通常为1小时 druid.coordinator.period.metadataRefresh=300000
修改后重启Coordinator服务即可生效。
方法3:使用强制标记参数(谨慎操作)
在markUnused请求体中添加"force": true参数,跳过Segment活跃状态检查。注意:仅确认该Segment不再写入数据时使用,避免数据丢失:
{ "segmentIds":[ "test_2024-02-01T00:00:00.000Z_2024-03-01T00:00:00.000Z_2024-01-30T06:16:15.950Z_6" ], "force": true }
内容的提问来源于stack exchange,提问作者Bharathwajan
相关产品推荐
相关产品推荐

