CentOS 기반 ZooKeeper 클러스터 구동 시 발생 가능한 서비스 접속 실패 및 네트워킹 이슈 진단 가이드

Apache ZooKeeper 클러스터 상태 이상 징후 및 원인 분석

CentOS 운영 체제 상에서 ZooKeeper(예: 3.4.10 버전) 를 클러스터 형태로 구축한 후, 설치 과정은 완료되었으나 bin/zkServer.sh status 명령을 통해 노드 상태를 조회할 때 오류가 발생할 수 있습니다. 일반적으로 Error contacting service, Connection Timeout, 혹은 Connection Refused 메시지가 관찰되는 현상은 단순한 서비스 미실행이 아닌 시스템 구성의 부조화로 인한 경우가 많습니다.

해당 문제는 JDK 환경 설정, 네트워크 방화벽 정책, 포트 충돌, 그리고 노드 간 동기화 정보 오류 등이 복합적으로 작용할 가능성이 높습니다. 아래 절차에 따라 단계적으로 문제를 격리하고 해결하시길 권장합니다.

1. 시스템 로그 검토

문제 파악의 첫 단추는 설치된 ZooKeeper 디렉토리 내부의 로그 파일을 확인하는 것입니다. 주로 zookeeper.out 파일에 구체적인 에러 스택 정보가 기록되어 있습니다.

[root@node1 zookeeper-3.4.10]# vim zookeeper.out

로그 내의 에러 메시지를 기준으로 검색하거나 해당 메시지 코드가 의미하는 바를 확인하여 방향성을 잡아야 합니다. 이 작업에는 루트 권한이 필요합니다.

2. 설정 일관성 및 호스트 매핑 확인

클러스터 간의 통신 안정성을 위해 다음 항목들이 엄격히 일치하는지 검증해야 합니다.

  • zoo.cfg 설정: dataDir, dataLogDir 경로가 실제로 존재하며 접근 권한이 올바른지 확인합니다. 또한 server.X 형식의 설정값에서 정의된 호스트명이 정확한지 교차 검토합니다.
  • myid 파일: 각 노드의 데이터 디렉토리에 있는 myid 파일 내의 숫자가 zoo.cfgserver.X 설정값의 순번 (X) 과 정확히 동일한지 확인합니다. 형식이 텍스트 정수가 아닌 경우 문제가 발생합니다.
  • Hosts 파일: /etc/hosts 파일에서 각 IP 주소가 하나의 호스트명으로 올바르게 매핑되어 있는지 확인합니다. 중복 매핑이나 잘못된 엔트리 제거가 필요할 수 있습니다.

3. 네트워크 및 방화벽 설정 점검

ZooKeeper 클러스터는 노드 간 특정 포트를 통해 통신합니다. 방화벽이 이를 차단하지 않도록 주의해야 합니다.

  • 방화벽 서비스 제어: 테스트 환경의 경우 방화벽을 일시 중단하여 네트워크 연결성을 먼저 확보하는 것이 효율적입니다. 모든 노드에서 다음 작업을 수행합니다.
# 방화벽 시작
systemctl start firewalld.service

# 방화벽 중지 (통신 방해 요소 제거)
systemctl stop firewalld.service
  • 포트 충돌 확인: ZooKeeper 기본 포트인 2181 번 포트를 다른 프로세스가 점유하고 있지는 않은지 확인해야 합니다.
netstat -apn | grep 2181
# 만약 포트가 사용 중이고 서비스가 아닌 경우 강제 종료
kill -9 <PROC_ID>

4. JAVA 환경 변수 재설정

ZooKeeper 는 JVM 위에서 동작하므로 JAVA 환경이 제대로 구성되어 있지 않으면 실패할 수 있습니다.

java -version
echo $JAVA_HOME

환경 변수가 unset 이거나 경로를 잘못 가리키고 있다면 /etc/profile 파일을 수정하고, 변경 사항을 적용하기 위해 source /etc/profile 을 반드시 실행해야 합니다. 필요 시 JDK 를 재설치하여 컴퓨팅 환경을 깨끗하게 만듭니다.

5. 잔여 데이터 삭제 및 권한 부여

이전에 실행되었던 프로세스가 비정상적으로 종료되어 생성된 임시 파일들이 새로운 구동을 방해할 수 있습니다. 모든 클러스터 노드에서 다음과 같이 정리 작업을 수행합니다.

# 데이터 디렉토리 내 버전 스냅샷 및 PID 파일 삭제
rm -rf version-2/ zookeeper_server.pid

# 디렉토리 전체에 대해 읽기/쓰기/실행 권한 확장
chmod -R 777 <zookeeper_install_path>

6. 프로세스 강제 재시작

위의 세팅이 모두 이루어졌음에도 상태가 No quorum이거나 에러가 지속되면, 현재 메모리상에 남아있는 죽은 자바 프로세스를 완전히 제거한 후 다시 시작해야 할 필요가 있습니다.

  1. jps 명령어로 현재 실행 중인 프로세스를 목록화합니다.
  2. 상대응하는 ZooKeeper 관련 프로세스를 kill -9 명령으로 강제로 종료합니다.
  3. 모든 노드에서 프로세스를 종료시킨 뒤, 다시 start 명령을 발령합니다.

특정 노드에서 재시작이 계속 실패한다면 해당 노드를 집중적으로 진단하고 여러 번 반복 시도하여 안정적인 상태로 끌어올립니다.

7. 클러스터 관리 자동화 스크립트

여러 대의 서버를 수동으로 관리하기 어렵기 때문에 Bash 스크립트를 활용하여 일괄 구동 및 상태 확인을 수행할 수 있습니다. 아래 예시는 SSH 를 사용하여 원격 노드에 접속하여 명령어를 연쇄적으로 실행하는 구조입니다.

#!/bin/bash

# 클러스터 노드 목록 정의
NODES=("zk-master-01" "zk-slave-01" "zk-slave-02")
ZOOKEEPER_BIN="/opt/zookeeper/zookeeper-3.4.10/bin"

echo "=== ZooKeeper Cluster Startup Sequence Initiated ==="

for node in "${NODES[@]}"; do
    echo "Sending start command to $node..."
    ssh root@"$node" "source /etc/profile && ${ZOOKEEPER_BIN}/zkServer.sh start"
done

sleep 5 # 서비스 시작 대기 시간 확보

echo "=== Verifying Node Status ==="

for node in "${NODES[@]}"; do
    echo "--- Checking status on $node ---"
    ssh root@"$node" "source /etc/profile && jps && ${ZOOKEEPER_BIN}/zkServer.sh status"
done

echo "=== Sequence Completed ==="

위와 같은 자동화 도구와 체계적인 체크리스트를 이용하면 복잡한 클러스터 환경에서도 재현 가능한 서비스를 구축하는 데 도움이 됩니다. 각 단계마다 시스템 상태를 모니터링하며 이상이 없는지 지속적으로 확인하는 것이 중요합니다.

태그: ZooKeeper CentOS ShellScript Network Troubleshooting

5월 26일 08:36에 게시됨