내 잡다한 노트
아파치의 분산 코디네이션 서비스 Zookeeper 본문
분산 코디네이션이라하면 분산 시스템에서 시스템 간으 정보 공유, 상태 체크, 서버들 간의 동기화를 위한 lock 등을 처리해주는 역할을 가지고 있다.
대규모 작업을 N개 이상의 시스템이 유기적으로 처리하는 것을 의미한다.
Zookeeper의 Znode
Znode는 디렉터리 구조 기반으로 된 Key-Value 형태의 자료구조이다.
트리구조의 디렉터리 노드 아래에 이벤트를 받고자 하는 노드를 생성 또는 삭제합니다.
주키퍼에 붙는 인코딩 서버는 자신이 바라보고 있는 노드나 그 노드의 하위 노드가 생성되거나
삭제되었을 때 이벤트를 이벤트를 받는다.
이벤트 처리는 단일 쓰레드로 순차적으로 처리하기 때문에 N대의 인코딩 서버가 동시에 같은 작업을 할당받지 않는다.
또한 Znode를 생성할 때 작업이나 서버의 상태정보를 같이 저장하여 할당받은 인코딩 서버가 작업을 진행할 때
사용할 수 있다.
1. ZooKeeper의 기본 개념
a. 중앙 집중형 서비스
- 중앙 서버 집합: ZooKeeper는 분산 시스템의 각 구성 요소들이 중앙의 ZooKeeper 서버(또는 서버 그룹)를 통해 데이터를 읽고 쓰며, 이를 기반으로 서로 간의 상태를 조정합니다.
- 데이터 모델: ZooKeeper는 파일 시스템과 유사한 계층적 네임스페이스를 제공합니다. 각 노드는 “znode”라고 불리며, 이는 디렉터리나 파일처럼 구조화되어 있습니다.
b. 데이터 일관성 및 동기화
- 강력한 일관성: 모든 클라이언트는 동일한 순서로 업데이트를 수신하게 되어, 데이터의 일관성을 보장합니다.
- 원자성: 업데이트는 원자적으로 수행되어, 일부만 적용되거나 중간 상태가 외부에 노출되지 않습니다.
- 감시자(Watcher) 메커니즘: 클라이언트는 특정 znode에 대해 감시(watch)를 설정할 수 있으며, 해당 노드에 변경이 생기면 알림을 받아 업데이트된 정보를 반영할 수 있습니다.
c. 장애 허용성과 가용성
- 복제 및 선출 알고리즘: ZooKeeper 클러스터는 여러 대의 서버로 구성되어 있으며, 리더-팔로워 구조로 동작합니다. 리더 서버가 장애가 발생하면, 선출 알고리즘을 통해 새로운 리더가 선출되어 서비스 연속성을 유지합니다.
- Quorum 기반 처리: 서버 간 다수결(Quorum)을 통해 클라이언트의 요청이 처리되므로, 일부 서버의 장애에도 시스템 전체가 정상적으로 작동합니다.
2. ZooKeeper의 아키텍처
a. 서버 구성
- 리더(Leader): 클러스터 내 모든 쓰기 요청을 관리하고, 변경사항을 다른 서버(팔로워 및 관찰자(observer) 노드)와 동기화합니다.
- 팔로워(Follower): 클라이언트 요청을 처리하고, 리더와 동기화하여 데이터를 유지합니다.
- 관찰자(Observer): 읽기 요청을 처리하며, 쓰기 요청에는 참여하지 않는 서버. 주로 읽기 부하를 분산시키기 위해 사용됩니다.
b. Znode
- 정적 노드와 동적 노드: ZooKeeper의 데이터는 znode 형태로 저장됩니다. 일반 znode는 지속적(persistent)일 수 있으며, 클라이언트와의 세션이 종료되면 사라지는 임시(ephemeral) znode도 있습니다.
- 순서 지정 노드: 자동으로 증가하는 순번을 붙여 생성되는 순차적(sequential) znode도 지원합니다. 이를 통해 고유한 식별자를 보장하고, 분산 시스템의 순서 제어에 활용할 수 있습니다.
c. 감시자(Watcher)
- 이벤트 기반 알림: 클라이언트는 특정 znode에 감시자를 설정하여, 해당 노드의 데이터나 자식 노드의 변경 이벤트가 발생할 때 알림을 받을 수 있습니다.
- 일회성 감시: 감시자는 한 번 이벤트를 감지하면 해제되므로, 지속적인 모니터링을 위해서는 이벤트 수신 후 재설정이 필요합니다.
3. ZooKeeper의 주요 활용 사례
a. 분산 락 및 동기화
- 분산 락: 여러 프로세스가 동일 자원에 접근할 때 동시 접근을 방지하기 위해, ZooKeeper를 이용해 분산 락을 구현할 수 있습니다.
- 동기화: 클러스터 내의 작업 간 동기화를 위해, ZooKeeper를 통해 상태 변화나 작업 진행 상황을 공유할 수 있습니다.
b. 구성 정보 관리
- 동적 구성: 분산 애플리케이션의 설정 정보를 중앙에서 관리하고, 실시간으로 변경 사항을 반영할 수 있습니다.
- 서비스 디스커버리: 시스템 내 각 서비스의 위치(예: IP 주소, 포트 등)를 ZooKeeper에 등록하고, 클라이언트가 이를 조회하여 동적으로 서비스를 연결할 수 있습니다.
c. 네임 서비스
- 계층적 네이밍: ZooKeeper의 계층적 네임스페이스를 활용해, 분산 시스템 내의 자원들을 논리적으로 구분하고 식별할 수 있습니다.
4. ZooKeeper 사용 시 고려사항
a. 클라이언트 연결 관리
- 세션 유지: 클라이언트는 ZooKeeper와의 연결을 유지하며, 세션 타임아웃이 발생하면 임시 znode가 삭제되는 등의 부작용이 발생할 수 있으므로, 연결 상태를 주의 깊게 모니터링해야 합니다.
- 재연결 전략: 네트워크 문제나 서버 장애 시 재연결 및 상태 동기화 로직을 구현하는 것이 중요합니다.
b. 성능 및 확장성
- 읽기/쓰기 분리: ZooKeeper는 쓰기 작업 시 일관성을 보장하기 위해 모든 서버에 동기화하는 오버헤드가 있으므로, 읽기 작업이 많은 경우에는 관찰자(observer)를 활용하는 등 읽기 부하 분산 전략이 필요합니다.
- 클러스터 크기: ZooKeeper 클러스터의 규모는 일반적으로 3~7대 정도가 적합하며, 지나치게 많은 서버가 참여할 경우 성능 저하 및 복잡도가 증가할 수 있습니다.
'분산시스템 > Zookeeper' 카테고리의 다른 글
zookeeper의 watcher 기능 (0) | 2025.02.09 |
---|