我对luceue和NFS了解不够导致线上的项目出现了这种情况。希望热心的朋友能够为我提供可以解决问题的方法。
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
luceue 版本:5.5
osc问题在这里:https://www.oschina.net/question/224858_2269172
我们使用了3台服务器部署了tomcat,使用阿里云的SLB做了负载均衡。
至于索引的构建,添加另外使用了一台JOB服务器,定时向挂载的NFS盘commit,这里用的也是阿里云NAS服务,以NFS协议挂载。3台应用服务器以只读模式挂载NFS磁盘,用于响应搜索请求。配置看上去已经完成了,只需要根据特性在代码上做些调整。
- 我使用了lucene提供的搜索器管理类(SearcherManager)用于近时搜索,定期调用SearcherManager.maybeRefresh()方法检测索引的更新状态尝试获取更新后的IndexReader。在没有使用NFS的服务之前,服务状态一直良好。
- 由于NFS服务本身的限制,文件删除状态不能够被挂载机器及时的检测到,lucene官方文档建议在这种环境下使用自定义索引删除策略(IndexDeletionPolicy)来确保服务能够正常进行。
- 于是,我自定义了索引删除策略(IndexDeletionPolicy)在lucene初始化的时候进行配置(IndexWriterConfig),确保索引删除(IndexComment.delete())的时间和检测刷新尝试获取新读取器的过程(SearcherManager.maybeRefresh())不可能重叠。
- 部署运行之后,能够发现,调用SearcherManager.maybeRefresh()方法的过程中,segment文件FileNotFoundException异常已经不再出现,说明产生的效果,但原本的关键问题并没有解决。
此异常直接导致jvm崩溃
@红薯 老大,osc现在luceue搜索仍然使用的是NFS做的索引共享么?希望能够给我些建议。刚才看到几年前的帖:
https://www.oschina.net/question/12_2137731
这两天我们的几台tomcat也是CPU跑高,也让我不得不怀疑是NFS的锅,因为相同的环境,没有挂载NFS的服务器一直没有任何异常。
连续几天半夜被报警短信催起床启动已经崩溃的服务,真是折磨!
希望有经验的朋友能够为小弟提供些建议,帮助我解决这个问题,感激不尽!
引用来自“布谷鸟”的评论
@cole_yang 你好, 我能够确保写是独立的线程,并且3个读取索引的tomcat对NFS成功的应用了只读的权限,我更怀疑是IndexReader/IndexWriter更新策略没有处理好,但对实现机制不清楚,文档看了又看多是对其描述不理解,自然也找不到问题所在了。 另外,如果我关闭了JOB机器上增量更新索引的线程,就不会出现崩溃的问题,可以断定就不是内存的原因,毕竟我只使用了NIOFSDirectory或者MMapDirectory(在linux环境64位jdk下),从来没有用过RAMDirectory,内存溢出应该也会显更加具体的错误信息。 我也想过使用一些系统组件为3台机器同步索引文件,可是这对我又是另外一个难题。 感谢你的回复!