SOLR重新索引时Resque任务失败触发ALB 504错误,如何解决?
问题描述
- 执行SOLR重新索引操作时,Resque队列出现大量失败任务;重试这些任务时,触发ALB默认60秒超时限制,返回504 Bad Gateway错误。
- 当前环境配置:
- 实例规格:t3.2xlarge
- SOLR_JAVA_MEM参数:
-Xms24g -Xmx24g - 已尝试调整
BATCH_SOLR_SIZE参数,从1000逐步降至100,但问题仍频繁出现。
当前solrconfig.xml配置
<?xml version="1.0" encoding="UTF-8"?> <config> <luceneMatchVersion>7.1.0</luceneMatchVersion> <dataDir>${solr.data.dir:}</dataDir> <directoryFactory name="DirectoryFactory" class="${solr.directoryFactory:solr.NRTCachingDirectoryFactory}"/> <codecFactory class="solr.SchemaCodecFactory"/> <schemaFactory class="ClassicIndexSchemaFactory"/> <indexConfig> <lockType>${solr.lock.type:native}</lockType> <infoStream>true</infoStream> </indexConfig> <jmx/> <updateHandler class="solr.DirectUpdateHandler2"> <updateLog> <str name="dir">${solr.ulog.dir:}</str> </updateLog> <autoCommit> <maxTime>25000</maxTime> <openSearcher>false</openSearcher> </autoCommit> <autoSoftCommit> <maxTime>10000</maxTime> </autoSoftCommit> </updateHandler> <query> <maxBooleanClauses>1024</maxBooleanClauses> <filterCache class="solr.FastLRUCache" size="1024" initialSize="512" autowarmCount="0"/> <queryResultCache class="solr.LRUCache" size="1024" initialSize="512" autowarmCount="0"/> <documentCache class="solr.LRUCache" size="1024" initialSize="512" autowarmCount="0"/> <enableLazyFieldLoading>true</enableLazyFieldLoading> <queryResultWindowSize>20</queryResultWindowSize> <queryResultMaxDocsCached>200</queryResultMaxDocsCached> <useColdSearcher>false</useColdSearcher> <maxWarmingSearchers>5</maxWarmingSearchers> </query> <requestDispatcher handleSelect="false"> <requestParsers enableRemoteStreaming="true" multipartUploadLimitInKB="2048000" formdataUploadLimitInKB="2048"/> <httpCaching never304="true"/> </requestDispatcher> <requestHandler name="/select" class="solr.SearchHandler"> <lst name="defaults"> <str name="spellcheck.dictionary">default</str> <str name="df">text</str> <str name="q.op">AND</str> </lst> <arr name="last-components"> <str>spellcheck</str> </arr> </requestHandler> <searchComponent name="spellcheck" class="solr.SpellCheckComponent"> <lst name="spellchecker"> <str name="name">default</str> <str name="field">text</str> <str name="classname">solr.DirectSolrSpellChecker</str> <float name="accuracy">0.5</float> <int name="maxEdits">2</int> </lst> </searchComponent> <admin> <defaultQuery>*:*</defaultQuery> </admin> </config>
排查与优化建议
1. 调整索引提交策略
当前autoSoftCommit设置为10秒一次,高频软提交会频繁生成小索引段,增加IO和CPU负载,拖慢批量索引速度。建议:
- 重新索引期间临时关闭自动软提交(完成后再恢复):
<autoSoftCommit> <maxTime>-1</maxTime> </autoSoftCommit> - 若需要保持基本的近实时查询,可延长软提交间隔至60秒以上。
2. 优化更新Handler配置
updateLog(更新日志)会记录所有更新操作,批量索引时可能成为性能瓶颈:
- 确保更新日志目录挂载高速存储(如SSD)
- 若不需要故障恢复的更新回滚能力,可临时注释掉updateLog配置,减少磁盘写入开销。
3. 调整ALB超时阈值
如果批量索引任务确实需要超过60秒的处理时间,直接修改ALB的超时设置(AWS ALB最长支持3600秒),避免ALB提前终止请求返回504错误。
4. 优化JVM与系统资源
- t3.2xlarge实例总内存32GB,分配24GB给SOLR后,剩余8GB需满足系统和其他进程需求,需检查系统是否启用swap(swap会严重降低性能,建议禁用)。
- 添加JVM GC优化参数,减少垃圾回收停顿:
-XX:+UseG1GC -XX:MaxGCPauseMillis=200 -XX:+ParallelRefProcEnabled
5. 定位性能瓶颈
- 通过SOLR Admin的
/admin/metrics页面监控CPU、内存、磁盘IO使用率,确认是否有资源耗尽情况。 - 检查索引schema,避免过多的分词器、拷贝字段或复杂字段类型,这些都会增加单文档的索引耗时。
内容的提问来源于stack exchange,提问作者Krystian Janas
相关产品推荐
相关产品推荐

