SolrCloud 운영 중 발생하는 주요 장애와 해결 방안

1. ZooKeeper 대체 설정 방법

Solr의 zkcli.sh 스크립트 대신 Tomcat의 catalina.sh에 직접 JVM 옵션을 추가하여 ZooKeeper 설정을 관리할 수 있습니다.

vim /data/solr-cloud/tomcat/apache-tomcat-8.0.53/bin/catalina.sh
# cygwin=false(약 109번째 줄) 앞에 추가:
JAVA_OPTS="$JAVA_OPTS -DzkHost=zoo1:2181,zoo2:2181,zoo3:2181 -Dbootstrap_confdir=/data/solr-cloud/tomcat/solrhome/collection1/conf -Dcollection.configName=myconf -DnumShards=3"

옵션 설명

  • -DnumShards=3: 클러스터의 샤드 개수를 3으로 지정합니다.
  • -Dcollection.configName: ZooKeeper에 업로드할 설정 파일의 이름을 지정합니다. 생략 시 기본값은 "configuration1"입니다.
  • -Dbootstrap_confdir: 모든 인덱스 저장소가 이 디렉토리의 설정 파일을 동기화하도록 합니다. ZooKeeper가 이 경로의 설정 파일을 중앙 관리합니다.
  • -Djetty.port=8080: Jetty의 수신 포트로, Tomcat 포트와 일치해야 합니다. 이 값을 catalina.sh에서 설정하면 solr.xml의 설정을 덮어씁니다.

주의사항

  • -Dbootstrap_confdir, -DnumShards, -Dcollection.configName은 SolrCloud 첫 실행 시에만 필요합니다. 이후 변경 시 다시 실행해야 ZooKeeper가 업데이트됩니다.
  • 설정 변경을 방지하려면 단일 Tomcat 인스턴스의 catalina.sh에만 이 옵션을 추가하고, 다른 노드에는 추가하지 않는 것이 좋습니다.

2. Solr 서비스 접속 불가

문제

Tomcat 관리 페이지는 정상이지만 Solr 서비스에 접근할 수 없는 현상.

해결 방법

Tomcat의 가상 경로를 통해 Solr 서비스를 게시할 때 발생하는 일반적인 문제입니다. $TOMCAT_HOME/logs 디렉토리의 로그를 확인하여 오류 원인을 찾으십시오.

실제 사례: solr.xml 파일이 solrhome에 없어서 Tomcat이 Solr 애플리케이션을 로드하지 못했습니다. 해당 파일을 추가한 후 Tomcat을 재시작하여 문제를 해결했습니다.

3. 노드가 "Recovering" 또는 "Gone" 상태

문제

Solr 웹 관리 페이지의 [Cloud] 탭에서 일부 노드가 정상적으로 시작되지 않은 상태로 표시됩니다.

해결 방법

ZooKeeper가 여러 설정 파일 세트를 관리하는 경우 발생합니다. 다음 단계로 해결합니다:

  1. Tomcat과 ZooKeeper 서비스를 중지합니다.
  2. ZooKeeper/data/version-2ZooKeeper/datalog/version-2 디렉토리를 삭제합니다(data/myid는 유지).
  3. ZooKeeper 클러스터를 재시작합니다.
  4. zkcli.sh를 사용하여 설정 파일을 다시 업로드합니다.
  5. Tomcat 서비스를 시작합니다.

ZooKeeper CLI를 통한 설정 파일 삭제 명령어 예시:

[zk: localhost:2181(CONNECTED) 0] ls /
[configs, zookeeper, overseer, aliases.json, live_nodes, collections, overseer_elect, clusterstate.json]
[zk: localhost:2181(CONNECTED) 1] ls /configs
[myconf, conf]
[zk: localhost:2181(CONNECTED) 2] rmr /configs/conf
[zk: localhost:2181(CONNECTED) 3] ls /configs
[myconf]

4. 클러스터 불안정 및 모니터링 장애

4.1 노드 중단

문제

대량 데이터(수십억 레코드, 각 70개 필드)를 2시간 넘게 가져오는 동안 일부 노드가 중단됩니다. 느린 디스크 I/O로 인해 메모리 캐시가 디스크로 플러시되지 못해 인덱싱 시간이 초과되고, ZooKeeper가 해당 노드를 실패로 표시하여 불일치가 발생합니다.

주요 오류 메시지:

I was asked to wait on state down for shard5 in motor_collection on 10.1.2.3:8088_solr 
but I still do not see the requested state. 
I see state: active live:false leader from ZK: 
Not available due to:  org.apache.solr.common.SolrException: 
No registered leader was found after waiting for 0ms , 
collection:  motor_collection slice: shard5

org.apache.solr.common.SolrException: 
ClusterState says we are the leader, but locally we don't think so.

해결 방법

Tomcat을 재시작하고 시스템이 복구될 때까지 기다린 후, 데이터를 더 작은 배치(예: 1억 레코드 단위)로 나누어 다시 가져옵니다.

4.2 Solr Cloud 모니터링 UI 표시 불가

문제

Solr Cloud UI에서 노드 상태를 보려고 하면 다음 오류가 발생합니다:

Loading of "/solr/zookeeper?wt=json" failed (HTTP-Status 500)

원인 분석

  • ZooKeeper 클라이언트(zkCli.sh)로 노드 정보 및 설정을 조회하면 정상이나, 일부 노드가 'Recovering' 상태입니다.
  • Solr의 REST API로 컬렉션 상태를 확인하면 정상입니다.
  • ZooKeeper 노드 중단 후 리더 재선출 시 클라이언트의 캐시된 리더 정보가 업데이트되지 않아 스플릿 브레인(split-brain) 현상이 발생하고, 버전 충돌이 생깁니다.

ZooKeeper 오류 로그:

org.apache.zookeeper.KeeperException$ConnectionLossException: 
KeeperErrorCode = ConnectionLoss for /overseer/queue

java.io.IOException: Packet len24038207 is out of range!
at org.apache.zookeeper.ClientCnxnSocket.readLength(ClientCnxnSocket.java:112)

근본 원인: 디스크 공간 부족으로 Solr 노드가 인덱스를 제때 쓰지 못하고, 이로 인해 ZooKeeper 노드가 실패합니다. ZooKeeper의 패킷 크기 제한(기본 4MB)을 초과하는 로그가 생성됩니다.

해결 방법

  1. 모든 ZooKeeper 노드를 중지합니다.
  2. ${ZK_HOME}/data/version-2/${ZK_HOME}/datalog/version-2 디렉토리로 이동합니다.
  3. 스냅샷 파일(snapshot.xxx)과 로그 파일(log.xxx)의 버전 번호(접미사 시작 숫자)를 확인합니다.
  4. 모든 ZooKeeper 노드의 데이터를 백업합니다.
  5. 정상 상태로 추정되는 버전 이후의 스냅샷과 로그 파일을 모든 ZooKeeper 노드에서 삭제합니다.
  6. ZooKeeper와 Solr 클러스터를 재시작합니다.

5. Tomcat 시작 지연

문제

Tomcat 재시작 시 Solr 클러스터에 접근 가능할 때까지 오랜 시간이 소요됩니다.

해결 방법

임의 노드의 conf/solrconfig.xml 파일에서 약 655~670번째 줄의 리스너를 주석 처리하여 Tomcat 시작 검사를 비활성화합니다:

<!-- QuerySenderListener takes an array of NamedList and executes a
     local query request for each NamedList in sequence. 
  -->
<listener event="newSearcher" class="solr.QuerySenderListener">
  <arr name="queries">
    <!--
       <lst><str name="q">solr</str><str name="sort">price asc</str></lst>
       <lst><str name="q">rocks</str><str name="sort">weight asc</str></lst>
      -->
  </arr>
</listener>
<listener event="firstSearcher" class="solr.QuerySenderListener">
  <arr name="queries">
    <lst>
      <str name="q">static firstSearcher warming in solrconfig.xml</str>
    </lst>
  </arr>
</listener>

설정 파일을 업데이트한 후 Tomcat을 재시작하면 문제가 해결됩니다.

6. 기타 미검증 문제

  • Solr 4.0 Admin UI에서 샤드의 마지막 Core를 삭제해도 샤드가 자동으로 제거되지 않아 클러스터 오류가 발생할 수 있습니다.
  • 특정 샤드의 모든 Core가 중단되면 새 레코드 삽입과 쿼리가 실패합니다.
  • Core가 Leader 또는 Replica 역할을 수행하는 것은 Solr 내부에서 자동으로 조정되며, 현재 수동 개입 방법은 없습니다.

태그: SolrCloud ZooKeeper Tomcat 클러스터 장애 노드 복구

7월 22일 04:22에 게시됨