ZooKeeper

2023. 6. 4. 19:57Spring Boot

ZooKeeper는 Apache Software Foundation에서 개발한 분산 시스템을 위한 고가용성 코디네이션 서비스입니다. 분산 애플리케이션에서 노드 간 동기화, 구성 관리, 그룹 서비스, 리더 선출 등 다양한 코디네이션 작업을 쉽게 수행할 수 있도록 지원하는 시스템입니다. ZooKeeper는 주로 대규모 분산 환경에서 신뢰성과 안정성을 높이기 위해 사용됩니다.

주요 기능과 개념을 요약하면 다음과 같습니다:

  1. 중앙화된 설정 관리: ZooKeeper는 분산 애플리케이션에서 필요한 설정 정보를 중앙에 저장하고 이를 여러 노드에 동일하게 배포할 수 있도록 합니다. 이러한 중앙화된 설정 관리 기능 덕분에 노드들이 동일한 정보를 바탕으로 동작할 수 있습니다.
  2. 분산 락 (Distributed Lock): 분산 시스템에서는 리소스 접근을 조율하기 위해 락이 필요할 때가 많습니다. ZooKeeper는 특정 자원을 하나의 노드가 사용할 수 있도록 락을 설정하여 여러 노드 간 동시 접근 문제를 방지합니다.
  3. 노드 감시 (Watcher): 특정 이벤트가 발생하면 이를 감지하고 특정 동작을 수행할 수 있도록 하는 감시 기능을 제공합니다. 예를 들어, 특정 데이터가 변경되면 이를 감지하여 다른 노드가 바로 업데이트된 데이터를 사용할 수 있도록 합니다.
  4. 리더 선출: ZooKeeper는 노드 중에서 대표 노드를 선출할 수 있는 기능을 제공합니다. 분산 시스템에서 리더 노드를 설정하여 특정 작업을 한 노드가 대표로 처리하도록 할 수 있습니다.
  5. ZNode: ZooKeeper는 데이터를 트리 구조로 관리하며, 각 노드는 ZNode라고 부릅니다. ZNode는 영속적(Persistent) 노드와 임시(Ephemeral) 노드로 나뉘며, 임시 노드는 세션이 종료되면 자동으로 삭제됩니다.
  6. 고가용성: ZooKeeper는 여러 서버로 구성된 클러스터 환경에서 동작하며, 장애가 발생하더라도 빠르게 복구되어 가용성을 높입니다.

사용 예시

  • Hadoop 및 HBase와 같은 분산 데이터 저장소에서 마스터 서버의 고가용성을 위해 ZooKeeper를 활용합니다.
  • Kafka와 같은 메시징 시스템에서 브로커 정보를 관리하고 장애 복구 및 재시작을 지원합니다.
  • Microservices 환경에서는 서비스 디스커버리와 같은 역할을 ZooKeeper로 수행하여 각 서비스가 어떤 포트에서 동작하는지 관리할 수 있습니다.

ZooKeeper는 분산 시스템의 안정성과 확장성을 높이는 데 큰 기여를 하며, 많은 기업에서 널리 사용되고 있습니다.

ZooKeeper와 Kafka

ZooKeeper는 여러 개의 Kafka 브로커들로 구성된 클러스터 환경에서 각 브로커의 상태를 관리하고 조율하는 핵심 역할을 합니다. Kafka 시스템은 기본적으로 분산 환경에서 메시지를 안정적으로 처리하고, 고가용성을 보장하기 위해 ZooKeeper에 의존합니다.

ZooKeeper가 Kafka 클러스터에서 하는 주요 역할

  1. 브로커 상태 관리:
    • ZooKeeper는 Kafka 브로커들이 현재 동작 중인지, 또는 비정상적으로 종료되었는지 등을 모니터링합니다. 이를 통해 클러스터 전체의 상태를 파악하고 장애가 발생했을 때 빠르게 복구할 수 있습니다.
  2. 리더 선출:
    • Kafka는 파티션(partition)이라는 단위로 데이터를 분산 저장하고, 각 파티션에는 리더(leader)와 팔로워(follower) 브로커가 있습니다. 특정 파티션의 리더 브로커가 장애가 발생하면 ZooKeeper가 새로운 리더를 선출하여 데이터 처리가 지속될 수 있도록 합니다.
  3. 구성 정보 저장:
    • Kafka는 토픽(topic), 파티션 정보, ACL(Access Control List) 등 클러스터 구성 정보를 ZooKeeper에 저장합니다. 이 구성 정보는 Kafka 브로커들이 공유하여 동일한 설정 하에서 일관되게 동작할 수 있도록 합니다.
  4. 컨슈머 오프셋 관리:
    • ZooKeeper는 컨슈머(consumer)가 메시지를 어디까지 처리했는지에 대한 오프셋(offset) 정보를 관리합니다. 이를 통해 컨슈머가 시스템을 다시 시작하거나 장애 복구가 필요할 때 마지막으로 처리한 위치부터 이어서 처리할 수 있습니다. (단, 최근 버전의 Kafka에서는 컨슈머 오프셋을 ZooKeeper가 아닌 Kafka 자체에 저장하는 방식으로 발전했습니다.)

ZooKeeper가 Kafka 클러스터에서 필수적인 이유

ZooKeeper는 Kafka 브로커 간의 조율과 신뢰성을 보장하며, 이를 통해 Kafka 클러스터가 고가용성과 장애 복구 능력을 유지할 수 있게 합니다. Kafka는 분산 환경에서 메시지를 안정적으로 송수신해야 하므로, ZooKeeper와 같은 중앙화된 코디네이션 서비스가 필요한 것입니다.

다만, 최근 Kafka의 발전으로 인해 Kafka KRaft (Kafka Raft)라는 새로운 클러스터 관리 방식이 추가되었으며, 이를 통해 ZooKeeper 없이 Kafka 클러스터를 운영하는 옵션도 존재하게 되었습니다. KRaft는 Kafka 내에서 자체적으로 코디네이션 기능을 수행하도록 하여, ZooKeeper를 제거하고도 안정성을 유지할 수 있게 해줍니다. 하지만 기존에는 ZooKeeper가 Kafka 환경의 필수적인 요소였고, 많은 시스템에서 여전히 사용되고 있습니다.

'Spring Boot' 카테고리의 다른 글

Spring Auto Configuration  (0) 2023.08.04
Spring Initializr(spring-boot-starter-parent)  (0) 2023.08.04
Lombok  (0) 2023.04.27
SLF4J  (0) 2023.04.17
@Autowired  (0) 2023.04.17