Solr/Lucene MMapDirectory的小细节

来源:互联网 发布:同望预算软件 编辑:程序博客网 时间:2024/06/07 20:12

小时候测试 HdfsDirectory 时,把directoryFactory改成 solr.HdfsDirectoryFactory。经测试发现HdfsDirectoryFactory并不适合我,又改成 solr.MMapDirectory。As you know缺省情况下Solr用的solr.NRTCachingDirectoryFactory(至少4.2之后)。

假如没有比较实时的 softCommitTracker,MMapDirectory或是NrtCachingDiectory并不会有太大的影响。当比较实时的索引之后,在MMapDirectory情况下,会产生大量的小索引文件。其实,这个是一件很恐怖的事,会造成大量的索引合并,然后给IO造成巨大的压力。特别是单Node里有多个Shard时,此时就非常明显了。

IO一直报警,那就得找原因找方案了。看了一下索引文件目录出现大量的小文件,与我配置的IndexConfig出入太大。然后检查commitTracker配置和mergePolicy,也就是说一开始并没有意识到DirectoryFactory。只是commitTracker和mergePolicy都没有问题,所以只有DirectoryFactory会影响了。

注意:
你当然知道commitTracker分hard commit和soft commit即CommitTracker, SoftCommitTracker。那你知道这其中的差异吗?
你会说,它们的软提交写内存,硬提交写硬盘。其实不完全对
在FSDirectory下,它们的区别是flush和force的区别。
只有在NrtCachingDirectory下,它们才有写内存,和写磁盘的区别

还有一点,只有hard commit才会冲刷UpdateLog即tlog。

到这里,你可能觉得这事就结束,其实还没有。
NrtCachingDirectoryFactory默认DEFAULT_MAX_MERGE_SIZE_MB=4DEFAULT_MAX_CACHED_MB=48。即是单索引大于4Mb就会直接写磁盘,最多存48Mb的索引在内在上。当然,如果你的索引冲刷不是很快的情况下,这个配置没问题。但由于我一个softCommitTracker,会产生6Mb左右的索引,所以我又把maxMergeSize=12mb, maxCachedSize=64mb

至此,完全结束了,IO不再告警了。

0 0