【问题标题】:Solr indexing issue (out of memory) - looking for a solutionSolr 索引问题(内存不足) - 寻找解决方案
【发布时间】:2013-12-26 12:07:36
【问题描述】:

我有一个包含 5000 万个文档的大型索引。都在同一台机器上运行(没有分片)。 我没有可以让我更新所需文档的 ID,因此对于每次更新,我必须删除整个索引并从头开始索引所有内容,并仅在完成索引时提交。

我的问题是每运行几个索引,我的 Solr 就会因内存不足异常而崩溃,我正在运行 12.5 GB 内存。 据我了解,直到提交所有内容都保存在内存中,所以我将 100M 文档而不是 50M 存储在内存中。我对吗? 但是我在索引时无法提交,因为我一开始就删除了所有文档,然后我会使用部分索引运行,这很糟糕。

是否有任何已知的解决方案?分片可以解决它还是我仍然会遇到同样的问题? 是否有允许我进行软提交但在硬提交之前不会更改索引的标志?

【问题讨论】:

  • 使用两个 solr 内核。一种用于生产,一种用于索引。然后您可以使用 intercommits 或 autocommit 进行索引。索引完成后切换内核。
  • 你在使用软提交吗?

标签: solr out-of-memory


【解决方案1】:

您可以使用主从复制。只需要一台机器来做你的索引(master solr),然后,如果它完成了,你可以告诉从机从主机复制索引。 slave会下载新的索引,只有下载成功才会删除旧的索引。所以还是很安全的。

http://wiki.apache.org/solr/SolrReplication

另一个避免所有这些复制设置的解决方案是使用反向代理,将 nginx 或类似的东西放在你的 solr 前面。使用一台机器索引新数据,另一台机器进行搜索。而且您可以让反向代理始终指向当前未进行任何索引的代理。

如果你做其中之一,那么你可以随意提交。

而且因为在同一台机器上进行索引和搜索通常是一个坏主意,所以我更喜欢使用主从解决方案(更不用说你有 50M 文档)。

【讨论】:

    【解决方案2】:

    内存不足错误可以通过为容器的 jvm 提供更多内存来解决,这与您的缓存无关。 为垃圾收集使用更好的选项,因为错误的来源是您的 jvm 内存已满。 增加线程数,因为如果达到一个进程的线程数,就会产生一个新进程(其线程数与前一个进程相同,内存分配相同)。

    请写一下 CPU 峰值,以及您正在使用的任何其他类型的缓存机制

    您可以尝试一件事,将所有自动预热设置为 0,这会加快提交时间

    问候

    拉贾特

    【讨论】:

      猜你喜欢
      • 2012-07-10
      • 1970-01-01
      • 2022-10-24
      • 1970-01-01
      • 1970-01-01
      • 2014-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多