Solr8.8.0非集群模式下repeater请求不存在索引文件异常咨询
问题分析与解决方案
一、Repeater获取不存在文件名称的原因
非SolrCloud模式的主从复制分为两个核心步骤:首先Repeater向Leader发送请求获取当前最新索引版本对应的全量文件列表,之后Repeater对比本地已有文件,向Leader请求缺失的文件。你遇到的文件不存在问题,通常有两个触发原因:
- Leader在返回文件列表后、Repeater发起文件请求前,触发了Lucene的段合并操作:Lucene会将多个小段合并为更大的段提升查询性能,合并完成后旧的段文件(包括你报错中的
_9.fdm)会被自动删除,此时Repeater拿着之前获取的旧文件列表发起请求,就会出现文件不存在的异常。 - 你报错中的索引路径为
/app/solr/testCore/data/index.20210817190431551,属于带时间戳的快照式索引目录,如果Leader在返回文件列表后刚好切换到新的索引快照,旧的快照目录被清理,也会导致旧目录下的文件无法访问。
二、问题解决办法
永久修复方案
- 调整旧段/旧快照保留时长
在Leader节点的solrconfig.xml索引配置块中,增加旧段文件的保留时间,确保保留时长大于单次索引复制的最长耗时:
<indexConfig> <mergePolicyFactory class="org.apache.lucene.index.TieredMergePolicyFactory"> <!-- 调大合并段阈值,减少合并频率,单位MB --> <int name="maxMergedSegmentMB">5120</int> </mergePolicyFactory> <!-- 合并完成后旧段至少保留1800秒,可根据实际复制时长调整 --> <keepFullyDeletedSegmentsSeconds>1800</keepFullyDeletedSegmentsSeconds> <!-- 如果使用快照目录模式,调整旧快照保留数量,至少保留2个以上快照 --> </indexConfig>
- 配置Repeater复制重试策略
在Repeater节点的solrconfig.xml的ReplicationHandler配置中,增加文件请求失败后的重试次数和间隔,遇到文件不存在异常时自动重新拉取最新的索引文件列表后重试:
<requestHandler name="/replication" class="solr.ReplicationHandler"> <lst name="slave"> <str name="masterUrl">http://你的Leader节点地址:8983/solr/testCore/replication</str> <int name="replicationInterval">60</int> <!-- 最多重试5次 --> <int name="maxRetries">5</int> <!-- 每次重试间隔30秒 --> <int name="retryWaitTime">30</int> </lst> </requestHandler>
临时修复方案
如果当前报错持续出现,可手动触发Repeater全量复制:先清空Repeater本地的索引目录,然后调用Repeater的复制接口http://你的Repeater节点地址:8983/solr/testCore/replication?command=fullcopy,重新从Leader拉取完整的最新索引即可消除报错。
内容的提问来源于stack exchange,提问作者user2137216
相关产品推荐
相关产品推荐

