我有一个5000万个文档的大索引。所有都在同一台机器上运行(没有分片)。 我没有允许我更新想要的文档的ID,因此对于每次更新,我必须删除整个索引并从头开始索引所有内容,并在我完成索引时才在最后提交。
我的问题是每运行几次索引,My Solr因内存不足而崩溃,我运行12.5 GB内存。 从我的理解,直到提交一切都被保存在内存中,所以我存储在内存100M docs而不是50M。我对吗? 但是我在编制索引时无法提交,因为我在开头删除了所有文档,而且我将运行部分索引,这是不好的。
有没有任何已知的解决方案?可以分片解决它还是我还会遇到同样的问题? 是否有一个标志允许我进行软提交但是在硬提交之前它不会改变索引?
答案 0 :(得分:4)
您可以使用主从复制。只需要一台机器来完成索引(主solr),然后,如果它已经完成,你可以告诉从机从主机复制索引。从站将下载新索引,并且只有在下载成功时才会删除旧索引。所以这很安全。
http://wiki.apache.org/solr/SolrReplication
避免所有这些复制设置的另一个解决方案是使用反向代理,将nginx或类似的东西放在solr前面。使用一台机器索引新数据,另一台机器用于搜索。你可以让反向代理始终指向当前没有进行任何索引的代理。
如果你选择其中一个,那么你可以随意提交。
因为在同一台机器上进行索引和搜索通常是一个坏主意,我更愿意使用主从解决方案(更不用说你有50M文档)。
答案 1 :(得分:0)
内存不足错误可以通过为容器的jvm提供更多内存来解决,它与缓存无关。 使用更好的垃圾收集选项,因为错误源是你的jvm内存已满。 增加线程数,因为如果达到进程的线程数,则会生成一个新进程(其线程数与先前进程相同,内存分配相同)。
PLease还会写一些关于cpu spike以及你正在使用的任何其他类型的缓存机制
你可以尝试将所有自动预热设置为0,这会加快提交时间
问候
拉杰特