ElasticSearch索引文档自动丢失原因排查求助
Logstash的sincedb异常
虽手动指定了sincedb路径,但可能存在权限问题(Logstash进程无读写该文件的权限),或sincedb文件被意外清空、覆盖(比如Cron脚本误操作、磁盘清理工具误删)。当sincedb失效时,Logstash会重新读取整个日志文件,若索引配置为覆盖写入(如使用重复文档ID且action设为index或update),旧文档会被新写入的同ID文档覆盖,表现为旧文档丢失。默认ILM策略或索引模板自动生效
部分ELK版本中,logstash-*这类默认前缀的索引会自动应用集群内置的ILM模板,即便你未手动配置策略,模板里可能包含了滚动、删除旧数据的规则。检查集群的索引模板列表(GET _cat/templates),确认是否有针对目标索引的自动生命周期配置。磁盘水位线触发自动清理
Elasticsearch的cluster.routing.allocation.disk.watermark系列配置,会在磁盘使用率达到阈值时,自动删除最旧的索引或标记索引为只读后触发清理。检查集群磁盘使用情况,以及elasticsearch.yml中的磁盘水位线参数,确认是否近期磁盘接近阈值触发了自动删除。Cron脚本的隐性误操作
排查复制日志的Cron脚本,是否存在路径配置错误,导致在清理旧日志时误删了Elasticsearch的数据目录文件;或是复制过程中覆盖了正在被Logstash读取的日志文件,引发Logstash重复读取并覆盖旧文档。Elasticsearch分片异常
节点宕机、磁盘IO故障可能导致分片合并失败或数据损坏,进而丢失部分旧文档。查看Elasticsearch日志(elasticsearch.log),排查是否存在IndexShardRecoveryException、CorruptIndexException等错误信息。文档ID重复生成
若Logstash配置中,文档ID基于日志的时间戳、字段内容生成,当日志格式变更、时间戳生成异常时,会出现重复ID,新写入的文档会直接覆盖旧的同ID文档,造成旧文档“消失”的假象。
内容的提问来源于stack exchange,提问作者Joan

