Spring Data

Kafka 아키텍처와 ZooKeeper의 역할: 고가용성 분산 시스템의 설계와 관리

백엔드 유성 2023. 8. 7. 23:15

Kafka 아키텍처

Apache Kafka는 분산 스트리밍 플랫폼으로, 대용량의 데이터를 처리하고 실시간 데이터 스트리밍을 지원하는데 특화되어 있습니다. Kafka의 아키텍처는 다음과 같은 주요 요소로 구성됩니다.

 

1. 브로커 (Broker) : 데이터를 저장하고 관리하는 주체

데이터를 저장하고 관리하는 주체로서 Kafka 클러스터의 핵심 구성 요소입니다. 브로커는 Topic에 쌓인 데이터를 Partition 단위로 관리하며, 여러 개의 브로커가 클러스터를 형성하여 데이터를 분산하여 처리합니다. 각 브로커는 자신이 관리하는 Topic의 데이터를 저장하고, Consumer에게 데이터를 전달합니다.

2. 토픽 (Topic) : 여러 파티션의 집합 (데이터가 보관되는 장소)

여러 파티션의 집합으로 데이터가 보관되는 장소입니다. Kafka의 데이터는 Topic에 저장되며, Producer는 특정 Topic으로 데이터를 전송합니다. Consumer는 Topic을 구독하여 해당 Topic의 데이터를 소비합니다. 토픽은 데이터가 저장되는 공간이며, 데이터의 카테고리를 나타냅니다.

3. 파티션 (Partition) : 물리적으로 독립된 로그 파일로서 데이터를 저장하는 단위

물리적으로 독립된 로그 파일로서 데이터를 저장하는 단위입니다. 각 토픽은 하나 이상의 파티션으로 나뉘어지며, 파티션은 데이터를 순서대로 저장하고 데이터의 순서를 보장합니다. 파티션은 브로커에 분산되어 저장되며, 여러 파티션을 사용하여 데이터를 병렬 처리할 수 있습니다.

4. 프로듀서 (Producer) : Topic을 전송하는 주체

데이터를 Kafka Topic으로 발행하는 역할을 수행합니다. Producer는 Topic에 데이터를 전송하고, 데이터를 파티션에 배분하여 브로커에 저장합니다. 데이터 발행 시 데이터 키(key)를 지정할 수 있으며, 이를 통해 데이터의 파티션 분배를 조절할 수 있습니다.

5. 컨슈머 (Consumer) : Topic을 소비하는 주체

Kafka Topic을 구독하여 데이터를 소비하는 역할을 수행합니다. Consumer는 Topic의 파티션으로부터 데이터를 읽어오고, 읽어온 데이터를 처리합니다. Consumer Group이라는 개념이 있어 하나의 Topic에 여러 개의 Consumer가 소비할 수 있으며, 이를 통해 데이터의 병렬 처리가 가능해집니다.

 

 

 

ZooKeeper는 뭘까?

카프카는 한 대의 큰 창고(데이터 저장소)라고 가정해보겠습니다. 이 창고에는 많은 상자(토픽)들이 있고, 각 상자는 다시 여러 칸(파티션)들로 나눠져 있습니다. 이 창고에서 데이터를 생산하는 생산자(Producer)가 데이터를 상자(토픽)에 넣어놓고, 소비자(Consumer)가 필요할 때마다 해당 상자에서 데이터를 가져가서 사용합니다.

그런데 이 창고를 운영하려면 특별한 관리자가 필요합니다. 이 관리자는 창고 내의 상자(토픽)들이 어떤 상태인지, 어디에 위치해 있는지, 어떤 소비자가 어떤 상자를 사용하는지 등을 파악해야 합니다. 이 관리자의 역할을 ZooKeeper로 비유할 수 있습니다.

ZooKeeper는 창고 관리자로, Kafka 클러스터의 구성 정보와 상태를 추적하고 유지합니다. Kafka 브로커들과 토픽들의 정보를 관리하여 브로커들이 서로를 인식하고, 데이터의 분산 처리를 관리합니다. 브로커들이 어떤 토픽을 담당하고 있고, 각 토픽의 파티션은 어떤 브로커에 위치해 있는지를 알려주어 데이터의 정확한 처리와 병렬화를 가능하게 합니다.

즉, Kafka는 데이터의 저장과 처리를 담당하는 창고이고, ZooKeeper는 Kafka 클러스터를 관리하며 안정적인 분산 처리를 위해 필요한 정보를 추적하는 창고 관리자와 같은 역할을 합니다. 둘은 함께 협력하여 대용량 실시간 데이터 스트리밍을 위한 효율적인 시스템을 구축하는데 기여합니다.

 

 

 

ZooKeeper와의 연동과 클러스터 관리

위에서도 설명했다시피 Kafka 클러스터는 ZooKeeper와 연동되어 관리됩니다. ZooKeeper는 분산 환경에서 사용되는 코디네이션 서비스로, Kafka 클러스터의 구성 정보, 브로커 상태, Topic 파티션 배치 등을 관리합니다. 브로커는 ZooKeeper에 자신의 상태를 등록하고, 클러스터의 모든 브로커 간의 정보를 공유하여 클러스터를 관리합니다.

 

1. 클러스터 메타데이터 관리

ZooKeeper는 Kafka 클러스터의 구성 정보를 저장하고 관리합니다. 클러스터에 속한 브로커들의 정보, Topic의 파티션 정보, Topic의 구성 설정 등의 메타데이터를 저장하여 클러스터의 상태를 유지합니다.

 

2. 리더 선출

Kafka Topic의 파티션은 여러 개의 브로커에 복제될 수 있습니다. ZooKeeper는 파티션의 리더를 선출하고, 해당 파티션의 리더와 팔로워(broker 복제본) 간의 동기화를 관리합니다.

3. 브로커 상태 관리

브로커는 ZooKeeper에 자신의 상태를 등록합니다. 이를 통해 브로커의 살아있음(Heartbeat) 상태와 연결된 Topic 파티션들의 리더와 팔로워 상태를 지속적으로 감시합니다.

 

4. 동적 Topic 파티션 관리

Kafka의 Topic 파티션 수를 동적으로 조절할 수 있습니다. ZooKeeper를 통해 파티션 수를 변경하면 클러스터에서 해당 파티션들을 적절히 재배치합니다.

5. 클러스터 리더 인식

Kafka 클러스터에서 리더가 변경되거나 브로커가 추가/삭제되면, 해당 정보를 ZooKeeper를 통해 클러스터의 모든 브로커에 전달하여 업데이트합니다.

ZooKeeper와의 연동을 통해 Kafka는 분산 환경에서 안정적으로 클러스터를 운영하고 관리할 수 있습니다. ZooKeeper는 Kafka 클러스터의 중요한 부분이며, 높은 가용성과 확장성을 제공하여 데이터 스트리밍 환경에서의 신뢰성을 보장합니다.