분산 시스템과 주키퍼
1. 분산 시스템의 핵심 기초 용어¶
분산 시스템을 설계하기 위해 반드시 이해해야 할 두 가지 개념적 단위입니다.
- 노드 (Node): 분산 시스템 내에서 독립적으로 실행되는 프로세스(Process)입니다. 그래프 이론에서 유래했으며, 노드 간 연결은 네트워크 통신이 가능함을 의미합니다.
- 클러스터 (Cluster): 서로 연결된 노드들의 집합입니다. 대개 동일한 코드를 실행하며 하나의 거대한 작업을 나누어 처리하는 공동의 목표를 가집니다.
2. 분산 시스템 설계의 도전 과제¶
많은 데이터를 병렬로 처리하려면 작업을 분배해야 하는데, 이때 발생하는 현실적인 문제들입니다.
작업 분배의 방식과 한계¶
- 수동 분배: 관리자가 직접 작업을 할당하는 방식입니다. 초당 수천 개의 요청이 들어오는 환경에서는 확장성(Scalability)이 없어 불가능합니다.
- 마스터(리더) 노드 지정: 특정 노드 하나가 작업 분배와 결과 수집을 전담합니다.
- 문제점: 마스터 노드에 장애가 발생하면 클러스터 전체가 마비되는 단일 장애점(SPOF)이 됩니다.
- 동적인 리더 선출: 모든 노드가 리더의 상태를 감시하다가, 리더가 중단되면 자동으로 새 리더를 선출하는 알고리즘이 필요합니다.
구현의 어려움¶
- 각 노드는 기본적으로 자신만 인식하며 클러스터의 전체 구성원을 알지 못합니다.
- 따라서 서비스 레지스트리(Service Registry), 서비스 디스커버리(Discovery), 그리고 고장 감지 장치(Failure Detector)가 필수적입니다.
3. 해결책: 아파치 주키퍼 (Apache ZooKeeper)¶
복잡한 분산 코디네이션 알고리즘을 매번 구현할 필요 없이, 이를 대신 처리해 주는 오픈 소스 분산 코디네이터입니다.
- 사용처: 카프카(Kafka), 하둡(Hadoop), HBase 등 대규모 프로젝트에서 검증됨.
- 신뢰성: 주키퍼 자체도 3개 이상의 노드로 구성된 클러스터로 동작하여 높은 가용성을 보장합니다.
주키퍼의 데이터 모델: Z노드 (ZNode)¶
주키퍼는 파일 시스템과 유사한 트리 구조의 추상화 계층을 제공하며, 각 요소를 Z노드라고 부릅니다.
| Z노드 유형 | 설명 | 핵심 특징 |
|---|---|---|
| 영구 노드 (Persistent) | 세션이 종료되어도 삭제되지 않음 | 다시 연결되어도 데이터가 그대로 보존됨 |
| 임시 노드 (Ephemeral) | 생성한 노드와 주키퍼의 연결이 끊기면 즉시 삭제됨 | 다른 노드의 장애(Crash)를 감지하는 핵심 도구 |
주키퍼 다운로드 https://zookeeper.apache.org/¶
주키퍼 클라이언트 스레딩 모델¶
- 응용 프로그램을 실행하면 main() 메서드를 실행하는 메인 스레드 외에, 주키퍼 객체 생성 시 두 개의 스레드가 추가로 생성됩니다.
- IO 스레드: 응용 프로그램과 주키퍼 서버 사이의 모든 네트워크 통신을 담당합니다. 세션 관리, 타임아웃 처리, 요청 및 응답 전송 등을 처리하며 사용자가 직접 상호작용하지 않습니다.
- 이벤트 스레드: 주키퍼 상태 변경(연결/해제) 및 Z노드 워처(Watcher), 트리거 이벤트를 처리합니다. 모든 이벤트는 주키퍼로부터 도착한 순서대로 실행됩니다.
4. 첫 번째 설계: 리더 선출 알고리즘 (3단계)¶
주키퍼의 특성을 활용하여 클러스터 내에서 리더를 선출하는 구체적인 과정입니다. 여기서 주키퍼는 "번호표 기계"와 "공고판"역할을 할 뿐이고, 다음 알고리즘을 직접 구현.
-
1단계: 후보 자원 (Candidate Registration)
- 모든 노드가 주키퍼에 접속하여
/election이라는 부모 노드 아래에 자신만의 Z노드를 생성합니다. - 이때 주키퍼는 노드가 생성된 순서대로 고유한 번호를 부여하여 이름을 지정합니다.
- 모든 노드가 주키퍼에 접속하여
-
2단계: 목록 조회 (Querying Candidates)
- 각 노드는
/election노드에 속한 모든 자식 노드(후보들)의 목록을 요청하여 가져옵니다.
- 각 노드는
-
3단계: 리더 판정 (Leader Determination)
- 가져온 목록 중 자신이 생성한 Z노드의 번호가 가장 작다면, 해당 노드가 스스로를 리더로 간주합니다.
- 번호가 가장 작지 않다면 리더가 아님을 인지하고, 선출된 리더의 지시를 기다리거나 상태를 감시합니다.
📝 최종 요약¶
- 노드/클러스터: 분산 시스템의 기본 단위.
- 주키퍼: 복잡한 분산 알고리즘을 쉽게 구현하게 돕는 도구(트리 구조 모델 사용).
- 리더 선출: 임시 노드와 순차 번호를 활용해 가장 낮은 번호를 가진 노드를 리더로 선정하는 방식.