2013-12-11 4 views
0

내 solr 설정은 마스터, 중계기 및 두 개의 슬레이브로 구성됩니다. 슬레이브는 매 10 초마다 각각의 마스터를 폴링합니다. 검색은 마스터 노드에만 업데이트가 수행되는 동안 슬레이브 노드에서만 처리됩니다. 이들은 리눅스 박스의 Jboss 어플리케이션 서버에 배치됩니다. sorl 버전은 4.0입니다.SOLR - 많은 수의 공개 검색 자

우리가 직면 한 문제는 매주 한 번씩 슬레이브 노드를 다시 시작하여 현재 해결중인 며칠 내에 슬레이브 박스가 하드 디스크 공간을 모두 소모한다는 것입니다. 하드 디스크 공간이 부족한 이유는 Jboss가 수백 개의 삭제 된 인덱스 파일에 대한 참조를 보유하고 있기 때문입니다.

SolrCore에 열린 검색자가 많아서 삭제 된 파일 참조가 살아 있습니다. solrconfig.xml에 따라 언제든지 최대 2 명의 공개 검색자가 있어야합니다. enter image description here

내가 SolrCore 쿼리가 실행 된 경우에만 오픈 수색자를 보유하고 마지막 쿼리가 아직 완료되지 않은 상태에서 복제주기가 핵심의 등록 수색자을 변경 것을 입증 할 수 있었다 또 다른 것은. 쿼리가 시작될 때 검색자는 SolrCore에 의해 메모리에 영원히 저장됩니다.

이 문제는 쿼리가 우리가 작성한 SearchPlugin을 사용할 때만 발생합니다. 검색 플러그인에서 우리는 SolrRequestSolrCore 개체를 닫습니다. 그러나 여전히 연관된 검색자를 닫지 않는 것 같습니다.

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

검색이 완료 :

finally { 

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

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

나는 위의 마지막에 차단 변경 시도 :

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(); 
     } 
    } 

하지만이 또한 도움이하지 않는 것 같습니다.

위의 문제에 대한 조언이 도움이 될 것입니다.

답변

0

이 솔루션은 다소 단순한 것으로 판명되었습니다.

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 오래 유지하지 않는 것 : 그냥 portfolioIndexCore.getSearcher().get();

에 나는 호출에 의해 개방 된 SolrIndexSearcher에 decref()를 호출 한 할 필요가 모든 그래서 결국 지금으로 보이는 차단 SolrIndexSearchers가 메모리에 있습니다.

LESSON : solrCore.getSearcher().get()을 호출하여 solrIndexSearcher를 얻으려면 항상 solrIndexSearcher.decref()을 호출해야합니다.

그러나 IndexSearcher 참조를 얻는 마지막 옵션이어야합니다. 바람직한 방법은 solrRequest.getSearcher().get()이어야합니다.