Zookeeper 사용 목적과 사례 중심으로 정리
분산시스템을 무조건 만나게 되는 주키퍼. 이번 포스트에선 주키퍼를 사용하는 이유와 사례를 중점적으로 살펴보자.
Why Zookeepr?
카프카나 하둡, 클릭하우스 같은 분산 시스템 서비스는 여러개의 서버가 동시에 동작하는 시스템이다. 서버들이 유기적 협력하기 위해선 서로가 어떤 상태인지, 어떤 책임을 맡고 있고 무엇을 할 수 있는지 모니터링 할 수 있는 환경이 필요하다. 예를 들어 특정 서버가 죽어 버리면 다른 서버에서 장애를 발견하고 복구 작업이 진행할 수 있어야 하고 서버 마다 갖고 있는 테이블을 어딘가에 공유할 수 있어야 한다.
시스템마다 서버끼리 상태를 공유할 수 있는 환경을 독자적으로 만들 수도 있겠지만 매 시스템마다 만들기는 버겁다. 감사하게도 아파치에서 분산시스템에서 범용적으로 사용할 수 있는 중앙집중식 데이터 저장소, 주키퍼를 만들어뒀다. 분산 시스템은 주키퍼에서 제공하는 기능을 사용해서 데이터의 일관성을 유지하고 서버간 여러가지 상태 정보를 관리할 수 있게 됐다.
사용사례
카프카
카프카는 주키퍼 데이터 노드를 이용해 다음의 정보를 저장한다
- 브로커 등록 정보: broker id, 호스트 명과 포트, 브로커가 관리하는 파티션 정보가 포함된다
- 토픽 및 파티션 정보: 토픽의 파티션 개수, 리더 파티션 정보, 파티션 복제본 목록 등등. 카프카 클러스터가 파티션 리더를 식별하고 요청을 처리하는데 사용한다
- 리더 선출 정보: 주키퍼를 이용해서 파티션의 리더를 관리한다. 파티션 리더 정보가 변경되면 주키퍼를 업데이트한다
브로커가 여러개 있는 경우 카프카의 경우 주키퍼의 데이터 노드를 활용해 브로커들끼리 서로를 모니터링하고 브로커와 파티션 리더 간의 일관성을 유지하면서 장애 발생시 자동으로 대응할 수 있도록 돕는다.
예를들어 파티션 리더 선출 (leader election) 이 발생하는 경우 카프카의 브로커들은 주키퍼 데이터 노드를 통해서 파티션의 리더와 팔로워 정보 전체적인 상태 정보를 가져오고 내부적으로 업데이트 한다. 특정 브로커가 장애를 일으키는 경우도 마찬가지로 주키퍼에 있는 데이터 노드를 이용해 상태 정보를 확인하는 방식이다.
클릭하우스
클릭하우스는 여러 노드에 데이터를 분산하여 저장하는 분산 데이터베이스다. 주키퍼에 다음과 같은 정보를 저장한다
- 테이블 메타데이터: 분산 테이블의 샤드 정보, 각 샤드의 레플리카 정보가 Zookeeper 에 저장된다.
- 분산 쿼리 상태: 분산 쿼리를 처리할 때 각 노드의 상태, 쿼리의 진행 상황등이 Zookeeper 에 저장된다.
- 복제 로그: 복제 테이블을 사용할 경우 복제 로그가 Zookpeer 에 저장돼서 노드의 데이터 복제가 동기화 될 수 있다.
주키퍼는 카프카나 클릭하우스의 특정한 지식을 갖고 있지 않고 카프카, 클릭하우스를 위해 설계된 시스템도 아니다. 분산시스템을 위한 범용적인 중앙 집중식 서비스로 카프카와 클릭하우스는 주키퍼에서 제공하는 기능을 활용해 데이터 관리, 조정, 동기화 역할을 수행할 뿐이다.
리더와 팔로워
주키퍼 또한 여러 서버가 동시에 동작하는 분산 시스템이기 때문에 서버 간에 일관성과 가용성을 유지할 수 있는 장치가 필요하다. 주키퍼는 내부적으로 리더, 팔로워 구조를 사용해서 관리한다.
리더
중앙 조절 역할을 한다.
- 쓰기 요청 처리: 주키퍼의 모든 쓰기 요청은 리더 노드에서 우선적으로 처리되고 팔로워 노드에 복제 된다. 이런 방식으로 클러스 전체가 일관성을 유지한다.
- 트랜잭션 관리: 트랜잭션 로그를 관리하고 커밋하기 전에 팔로워 노드의 동의를 받는다.
팔로워
리더를 보조하는 역할을 한다
- 읽기 요청 처리: 클라이언트의 읽기 요청은 팔로워 노드에서 분산되어 처리된다. 굳이 리더에서 읽을 필요는 없으므로
- 리더 감시: 리더의 상태를 지속적으로 모니터링한다. 만약 리더가 응답하지 않거나 장애가 발생하면 팔로워 노드들은 리더 선출 프로세스를 시작한다
데이터 쓰기에 리더가 중요한 역할을 하므로 만약 리더가 장애가 발생하는 경우 주키퍼 시스템 전체에 문제가 발생할 수 있다. 이를 방지하기 위해 팔로워는 리더를 지속적으로 감시하고 문제가 발생하는 경우 재선출 작업을 실시한다.