>source

호출하는 이상한 문제가 있습니다.fetchIndex 명령 REST를 통해. fetchIndex를 사용하여 한 solrcloud 인스턴스에서 다른 인스턴스로 데이터를 전파하려고합니다. 문서를 읽으면 이것이 가능해야 함을 나타내는 것 같습니다.

fetchindex

Force the specified slave to fetch a copy of the index from its master. http://slave_host:port/solr/core_name/replication?command=fetchindex

If you like, you can pass an extra attribute such as masterUrl or compression (or any other parameter which is specified in the tag) to do a one time replication from a master. This obviates the need for hard-coding the master in the slave.

내가 겪고있는 문제는 복제가 시작될 때 예기치 않은 예외가 많다는 것입니다. 예를 들어 'slave'노드에서 :

2020-12-15 00:17:17.442 INFO  (explicit-fetchindex-cmd) [   ] o.a.s.h.IndexFetcher Starting replication process
2020-12-15 00:17:17.445 INFO  (explicit-fetchindex-cmd) [   ] o.a.s.h.IndexFetcher Number of files in latest index in master: 17
2020-12-15 00:17:17.449 INFO  (explicit-fetchindex-cmd) [   ] o.a.s.u.DefaultSolrCoreState New IndexWriter is ready to be used.
2020-12-15 00:17:17.449 INFO  (explicit-fetchindex-cmd) [   ] o.a.s.h.IndexFetcher Starting download (fullCopy=false) to NRTCachingDirectory([email protected]:\scratch\solr-7.7.3\example\cloud\node1\solr\techproducts_shard1_replica_n1\data\index.20201215001717446 [email protected]; maxCacheMB=48.0 maxMergeSizeMB=4.0)
2020-12-15 00:17:17.455 ERROR (explicit-fetchindex-cmd) [   ] o.a.s.h.IndexFetcher Error fetching file, doing one retry...:org.apache.solr.common.SolrException: Unable to download _0.si completely. Downloaded 551!=533
        at org.apache.solr.handler.IndexFetcher$FileFetcher.cleanup(IndexFetcher.java:1700)
        at org.apache.solr.handler.IndexFetcher$FileFetcher.fetch(IndexFetcher.java:1580)
        at org.apache.solr.handler.IndexFetcher$FileFetcher.fetchFile(IndexFetcher.java:1550)
        at org.apache.solr.handler.IndexFetcher.downloadIndexFiles(IndexFetcher.java:1030)
        at org.apache.solr.handler.IndexFetcher.fetchLatestIndex(IndexFetcher.java:569)
        at org.apache.solr.handler.IndexFetcher.fetchLatestIndex(IndexFetcher.java:346)
        at org.apache.solr.handler.ReplicationHandler.doFetch(ReplicationHandler.java:425)
        at org.apache.solr.handler.ReplicationHandler.lambda$fetchIndex$0(ReplicationHandler.java:346)
        at java.lang.Thread.run(Thread.java:748)

이러한 예외로 인해 복제가 중단됩니다. 이와 같은 오류를 참조하는 몇 가지 질문이 있습니다.solr ReplicationHandler-SnapPull이 파일을 다운로드하지 못했습니다.),하지만이 상황과 관련이없는 것 같습니다.

문제는 기본 solr 설치 만 사용하고 특별한 데이터를 사용하지 않고 재현하기가 매우 간단합니다. Solr 7.7.3을 사용하고 있습니다.

재현 단계 :

  • '마스터'머신에서 solr의 포장을 풉니 다.
  • 실행 ./bin/solr -e cloud 예제 solr 클라우드를 배포합니다. 다음을 제외한 모든 기본값을 수락합니다.
    • 컬렉션 이름을 '시작하기'대신 'techproducts'로 지정
    • 'sample_techproducts_configs'구성 집합을 선택합니다.
  • 샘플 techproducts 데이터를 solr에로드하십시오. bin/post -c techproducts ./example/exampledocs/* .
  • 다른 컴퓨터 또는 VM에서 1 단계와 2 단계를 반복합니다. techproducts 데이터를로드하지 마십시오. 대신 fetchIndex를 사용하여 복제하려고합니다.
  • 우편 배달부 또는 선택한 REST 클라이언트를로드하고 두 번째 시스템에서 fetchIndex 명령을 호출합니다. GET http://<second machine>:8983/solr/techproducts/replication?command=fetchindex&masterUrl=http://<first machine>:8983/solr/techproducts
  • 이렇게하면 '슬레이브'머신의 로그에 위에 표시된 오류 출력이 생성됩니다. Solr 7.7.3을 사용하는 작업에 묶여 있지만 다른 JVM과 Windows 및 Linux 호스트를 모두 사용해 보았습니다. 모든 조합은 동일한 결과를 산출합니다.

    뭔가 빠진 것 같긴한데 뭔지 모르겠어요. 조언이나 제안은 매우 도움이 될 것입니다.

    SolrJ를 통해 프로그래밍 방식으로이 동작을 올바르게 호출하는 방법도 궁금하지만이 문제가 해결되면 다른 질문으로 남겨 두는 것이 가장 좋습니다.

    편집하다: 예제 클라우드의 샤드/복제본 수를 하나로 줄임으로써이 절차를 사용하여 성공적으로 복제 할 수있었습니다. 이제 이러한 인덱스 복제를 샤드별로 수행하기 위해 수행해야 할 작업을 조사하고 있지만 아직 답을 찾을 수 없습니다.

    • 답변 # 1

      이 프로세스 초기에 컬렉션과 코어를 통합했지만 눈치 채지 못했습니다. 제공된 REST URL에서

      GET http://:8983/solr/techproducts/replication?command=fetchindex&masterUrl=http://:8983/solr/techproducts

      핵심 이름이 아닌 컬렉션 이름을 발행했습니다. 적절한 예 :

      GET http://:8983/solr/techproducts_shard1_replica_n1/replication?command=fetchindex&masterUrl=http://:8983/solr/techproducts_shard1_replica_n1

      물론 전체 클라우드 인스턴스를 올바르게 복제하려면이 REST 요청을 각 코어에 대해 반복해야합니다. 이상하게도 Solr은 복제 엔드 포인트가 코어가 아닌 컬렉션으로 호출 될 때 명시적인 오류 메시지를 생성하지 않지만 그럼에도 불구하고 복제를 시도합니다. 당연히 하나 이상의 샤드가 관련되면 대상 노드가 "이동 대상"에 도달하려고 시도합니다. 컬렉션에 대한 쿼리가 모든 코어에 도달 할 수 있으며 해당 파일이 예상과 일치하지 않아 위의 오류 메시지가 표시됩니다.

  • 이전 algorithm - Elixir에서 "문자열의 첫 번째 고유 문자"해결
  • 다음 r - ggplot이 각각의 모든 티켓 마크에 대한 레이블을 표시하도록하는 방법