SOLR - 大量的开放搜索者

时间:2013-12-11 09:37:19

标签: solr lucene solr4

我的solr设置包括一个主人,一个中继器和两个奴隶。从站每隔10秒轮询一次主站点。搜索仅由从站节点处理,而更新只对主节点进行。它们部署在Linux机器上的Jboss应用程序服务器上。 sorl版本是4.0。

我们面临的问题是,奴隶盒在几天内耗尽硬盘空间,我们目前通过每周重启一次从节点来解决这个问题。缺少硬盘空间的原因是Jboss持有对数百个已删除索引文件的引用。

删除的文件引用仍然存在,因为我看到SolrCore有许多开放搜索者。根据solrconfig.xml,任何时候都应该有最多2个开放搜索者。 enter image description here

我已经能够确定SolrCore仅在查询已经运行且复制周期在最后一个查询尚未完成时更改核心的注册搜索器时才能建立SolrCore。查询开始时的搜索器由SolrCore永远保存在内存中。

仅当查询使用我们编写的SearchPlugin时才会出现此问题。在搜索插件中,我们将关闭 SolrRequest SolrCore 对象。但它仍然没有关闭相关的搜索者。

SolrCore portfolioIndexCore = container.getCore(portfolioCoreName);
SolrIndexSearcher portfolioIndexSearcher = portfolioIndexCore.getSearcher().get();

搜索完成后:

finally {

      if (null != portfolioSolrReq) portfolioSolrReq.close();

      if (null != portfolioIndexCore) {
        portfolioIndexCore.close();
      }
    }

我尝试将上面的finally块更改为:

finally {

      if (null != portfolioSolrReq) portfolioSolrReq.close();

      if (null != portfolioIndexCore) {
        RefCounted<SolrIndexSearcher> searcher = portfolioIndexCore.getNewestSearcher(false);
        if (searcher.get() != portfolioIndexSearcher) {
          log.warn("Current Searcher for the Core " + portfolioIndexCore
              + " has changed. Old Searcher=[" + portfolioIndexSearcher + "], new Searcher=["
              + searcher.get() + "]");
          portfolioIndexSearcher.close();
          portfolioIndexSearcher = null;
        }
        searcher.decref();
        portfolioIndexCore.close();
      }
    }

但这似乎也没有帮助。

针对上述问题的任何指示都会非常有用。

1 个答案:

答案 0 :(得分:1)

解决方案证明相当简单。我需要做的只是调用SolrIndexSearcher上的decref(),我打开portfolioIndexCore.getSearcher().get();

所以最后阻止现在看起来像:

finally {

      if (null != portfolioSolrReq) portfolioSolrReq.close();

      if (null != portfolioIndexCore) {
        RefCounted<SolrIndexSearcher> searcher = portfolioIndexCore.getNewestSearcher(false);
        if (searcher.get() != portfolioIndexSearcher) {
          log.warn("Current Searcher for the Core " + portfolioIndexCore
              + " has changed. Old Searcher=[" + portfolioIndexSearcher + "], new Searcher=["
              + searcher.get() + "]");
          portfolioIndexSearcher.close();
          portfolioIndexSearcher = null;
        }else{
          portfolioIndexSearcher.decref()
          }
        searcher.decref();
        portfolioIndexCore.close();
      }
    }

现在,SolrCore似乎没有在内存中保留旧的SolrIndexSearchers。

课程: 如果您通过拨打solrIndexSearcher.decref()获取solrIndexSearcher,则必须始终致电solrCore.getSearcher().get()

但是,这应该是获取IndexSearcher引用的最后一个选项。优选方式应为solrRequest.getSearcher().get()