반응형
- 주키퍼(Zookeeper)는 분산 시스템의 코디네이션 서비스
- ZNode 기반 트리구조로 데이터를 관리
- 고가용성 고성능
주요 기능
- 분산 설정 관리:
- 서버간 동기화를 위한 분산 코디네이션 기능
- 분산 시스템에서 여러 애플리케이션이 동일한 설정 데이터를 공유해야 할 때 중앙 저장소 역할을 함
- 리더 선출(Leader Election):
- 분산 시스템에서 리더를 선출할 때, 투표 과정을 관리하고 리더를 선출. 이를 지속적으로 유지 및 관리
- 카프카 브로커들
- 동기화(Synchronization):
- 분산 환경에서 여러 노드(서버 또는 프로세스)가 동일한 상태를 유지하도록 지원, 데이터 일관성 유지
- 로컬 캐시 동기화 시
- 이벤트 감시(Watches):
- Zookeeper의 데이터가 변경되면 이벤트 알림을 애플리케이션에 전달하여 실시간 업데이트를 함
- watch 기능을 이용한 변경 이벤트 감지
- 분산 락 관리:
- 분산 환경에서의 데이터 접근을 제어하고 동기화를 위한 락관리
특징
- 일관성 보장:
- Zookeeper는 CAP 이론에서 CP(Consistency와 Partition Tolerance)를 보장
- 항상 데이터의 일관성을 우선
- 높은 가용성:
- 클러스터를 통해 고가용성을 제공하며, 노드 장애 시에도 서비스가 중단되지 않음
- 간단한 API:
- 클라이언트가 쉽게 사용할 수 있도록 간단한 API를 제공
- 쓰기 지연, 읽기 최적화:
- 쓰기 연산은 느릴 수 있지만 읽기 연산은 매우 빠름
기본 아키텍처
- ZNode: 주키퍼에서 데이터를 저장하는 단위로, 파일 시스템과 유사한 구조를 가짐
- 클라이언트: 주키퍼에 연결하여 데이터를 읽고 쓰는 애플리케이션
- 서버: 주키퍼의 데이터 저장 및 처리를 담당하는 노드
장점
- 분산 환경에서 복잡한 작업을 단순화함
- 높은 신뢰성과 일관성 제공
- 트랜젝션을 원자적으로 처리
- 다양한 분산 시스템과의 통합 용이
단점
- 쓰기 연산의 성능이 낮음(읽기 최적화)
- 클러스터 크기가 커질수록 성능 저하 가능
- ZooKeeper 장애 시 의존적인 애플리케이션에 문제가 발생할 수 있음
ZNode란?
- ZNode는 ZooKeeper가 관리하는 데이터 구조의 단위
- 트리 구조(파일 시스템과 유사)로 구성되며, 각 노드가 ZNode에 해당
- ZNode는 데이터와 상태 정보를 저장하고, ZooKeeper의 API를 통해 접근 가능
ZNode 기반 트리 구조의 특징
- 트리 형태:
- ZooKeeper 데이터는 / 루트에서 시작하여 트리 형태
- 예: /app/config/db, /app/config/cache.
- ZooKeeper 데이터는 / 루트에서 시작하여 트리 형태
- 데이터 크기 제한:
- 각 ZNode는 최대 1MB 크기의 데이터 저장
- ZNode는 주로 작은 상태 정보를 저장하며, 대용량 데이터는 다른 저장소를 사용해야 함
- 노드 유형:
- Persistent ZNode:
- 노드가 생성된 후 삭제 요청이 있을 때까지 유지
- Ephemeral ZNode:
- 클라이언트 세션이 종료되면 자동으로 삭제
- Sequential ZNode:
- 노드 이름에 고유한 순번을 추가하여 생성
- Persistent ZNode:
- 원자적 연산:
- ZNode의 데이터 변경은 원자적으로 이루어지며, 동시성이 보장
로컬 캐시 동기화 예시
- 디비 갱신
- 레디스 만료
- 주키퍼가 만료되었다는 이벤트를 각 서버에 전달
- 각 서버는 이벤트를 받고 로컬 캐시 만료처리
- 그 이후 새 요청이 들어오면 레디스/로컬 캐시를 최신 데이터로 갱신
세팅
자바 필요
주키퍼 압축 풀고 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
반응형
'architecture > micro service' 카테고리의 다른 글
[캐시] 캐시 관련 문제들과 캐시웜업 (0) | 2024.11.17 |
---|---|
[Dead Letter] PDL, CDL (0) | 2024.11.14 |
E2E(end to end) 테스트 (0) | 2024.11.13 |
대용량 데이터 처리 고민 (1) | 2024.11.10 |
transaction outbox pattern + polling publisher pattern (0) | 2024.11.07 |