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가 여러 설정 파일 세트를 관리하는 경우 발생합니다. 다음 단계로 해결합니다:
- Tomcat과 ZooKeeper 서비스를 중지합니다.
ZooKeeper/data/version-2와ZooKeeper/datalog/version-2디렉토리를 삭제합니다(data/myid는 유지).- ZooKeeper 클러스터를 재시작합니다.
zkcli.sh를 사용하여 설정 파일을 다시 업로드합니다.- 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)을 초과하는 로그가 생성됩니다.
해결 방법
- 모든 ZooKeeper 노드를 중지합니다.
${ZK_HOME}/data/version-2/와${ZK_HOME}/datalog/version-2디렉토리로 이동합니다.- 스냅샷 파일(
snapshot.xxx)과 로그 파일(log.xxx)의 버전 번호(접미사 시작 숫자)를 확인합니다. - 모든 ZooKeeper 노드의 데이터를 백업합니다.
- 정상 상태로 추정되는 버전 이후의 스냅샷과 로그 파일을 모든 ZooKeeper 노드에서 삭제합니다.
- 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 내부에서 자동으로 조정되며, 현재 수동 개입 방법은 없습니다.