반응형
  • 주키퍼(Zookeeper)는 분산 시스템의 코디네이션 서비스
  • ZNode 기반 트리구조로 데이터를 관리
  • 고가용성 고성능

 

주요 기능

  1. 분산 설정 관리:
    • 서버간 동기화를 위한 분산 코디네이션 기능
    • 분산 시스템에서 여러 애플리케이션이 동일한 설정 데이터를 공유해야 할 때 중앙 저장소 역할을 함
  2. 리더 선출(Leader Election):
    • 분산 시스템에서 리더를 선출할 때, 투표 과정을 관리하고 리더를 선출. 이를 지속적으로 유지 및 관리
    • 카프카 브로커들
  3. 동기화(Synchronization):
    • 분산 환경에서 여러 노드(서버 또는 프로세스)가 동일한 상태를 유지하도록 지원, 데이터 일관성 유지
    • 로컬 캐시 동기화 시
  4. 이벤트 감시(Watches):
    • Zookeeper의 데이터가 변경되면 이벤트 알림을 애플리케이션에 전달하여 실시간 업데이트를 함
    • watch 기능을 이용한 변경 이벤트 감지
  5. 분산 락 관리:
    • 분산 환경에서의 데이터 접근을 제어하고 동기화를 위한 락관리

 

특징

  • 일관성 보장:
    • Zookeeper는 CAP 이론에서 CP(Consistency와 Partition Tolerance)를 보장
    • 항상 데이터의 일관성을 우선
  • 높은 가용성:
    • 클러스터를 통해 고가용성을 제공하며, 노드 장애 시에도 서비스가 중단되지 않음
  • 간단한 API:
    • 클라이언트가 쉽게 사용할 수 있도록 간단한 API를 제공
  • 쓰기 지연, 읽기 최적화:
    • 쓰기 연산은 느릴 수 있지만 읽기 연산은 매우 빠름



기본 아키텍처

  • ZNode: 주키퍼에서 데이터를 저장하는 단위로, 파일 시스템과 유사한 구조를 가짐
  • 클라이언트: 주키퍼에 연결하여 데이터를 읽고 쓰는 애플리케이션
  • 서버: 주키퍼의 데이터 저장 및 처리를 담당하는 노드

장점

  • 분산 환경에서 복잡한 작업을 단순화함
  • 높은 신뢰성과 일관성 제공
  • 트랜젝션을 원자적으로 처리
  • 다양한 분산 시스템과의 통합 용이

단점

  • 쓰기 연산의 성능이 낮음(읽기 최적화)
  • 클러스터 크기가 커질수록 성능 저하 가능
  • ZooKeeper 장애 시 의존적인 애플리케이션에 문제가 발생할 수 있음

ZNode란?

 

  • ZNode는 ZooKeeper가 관리하는 데이터 구조의 단위
  • 트리 구조(파일 시스템과 유사)로 구성되며, 각 노드가 ZNode에 해당
  • ZNode는 데이터와 상태 정보를 저장하고, ZooKeeper의 API를 통해 접근 가능

 

ZNode 기반 트리 구조의 특징

  1. 트리 형태:
    • ZooKeeper 데이터는 / 루트에서 시작하여 트리 형태
      • 예: /app/config/db, /app/config/cache.
  2. 데이터 크기 제한:
    • 각 ZNode는 최대 1MB 크기의 데이터 저장
    • ZNode는 주로 작은 상태 정보를 저장하며, 대용량 데이터는 다른 저장소를 사용해야 함
  3. 노드 유형:
    • Persistent ZNode:
      • 노드가 생성된 후 삭제 요청이 있을 때까지 유지
    • Ephemeral ZNode:
      • 클라이언트 세션이 종료되면 자동으로 삭제
    • Sequential ZNode:
      • 노드 이름에 고유한 순번을 추가하여 생성
  4. 원자적 연산:
    • ZNode의 데이터 변경은 원자적으로 이루어지며, 동시성이 보장
  1.  

로컬 캐시 동기화 예시

이벤트를 감지하는 timestamp를 변경하여 (값을 수정하고) 변경 이벤트를 각 서버로 전달
https://youtu.be/BUV4A2F9i7w?si=c04ObhVx1skzBmDR

  • 디비 갱신
  • 레디스 만료
  • 주키퍼가 만료되었다는 이벤트를 각 서버에 전달
  • 각 서버는 이벤트를 받고 로컬 캐시 만료처리
  • 그 이후 새 요청이 들어오면 레디스/로컬 캐시를 최신 데이터로 갱신

세팅

자바 필요

주키퍼 압축 풀고 conf/zoo.cfg 설정 해야 함

# 기본 설정
tickTime=2000
initLimit=10
syncLimit=5

# 데이터 디렉토리 경로
dataDir=/var/lib/zookeeper

# 클라이언트 연결 포트
clientPort=2181

# 서버 설정 (클러스터 구성 시 필요)
# server.1=zookeeper1:2888:3888
# server.2=zookeeper2:2888:3888

 

  • server.3=zookeeper3:2888:3888 설정은 클러스터 내에서
    • 서버 3이 호스트 이름 zookeeper3, 데이터 통신 포트 2888, 리더 선출 포트 3888을 사용한다는 것을 의미
  • myid파일
echo "3" > /var/lib/zookeeper/myid

 

  • Zookeeper는 실행될 때 데이터 디렉토리(dataDir)에 위치한 myid 파일을 읽음
    • dataDir=/var/lib/zookeeper
  • myid 파일에 기록된 숫자를 사용하여, 설정 파일(zoo.cfg)의 server.X 항목 중 자신에게 해당하는 항목을 찾음
  • 이를 통해 클러스터 내에서 자신의 역할과 통신할 포트를 결정

 

728x90
반응형

+ Recent posts