Apache Kafka 환경 설정 및 단일 노드 실행
Apache Kafka는 고성능 분산 스트리밍 플랫폼으로, 실시간 데이터 처리 파이프라인 및 스트리밍 애플리케이션 구축에 널리 사용됩니다. Kafka를 사용하기 위해서는 먼저 ZooKeeper가 필요합니다. 본 가이드에서는 Kafka와 함께 제공되는 ZooKeeper 스크립트를 사용하여 단일 인스턴스를 시작하고, 이후 여러 Kafka 브로커로 구성된 클러스터를 설정하는 방법을 다룹니다.
1. Kafka 다운로드 및 압축 해제
먼저 Kafka 바이너리를 다운로드하고 원하는 디렉터리에 압축을 해제합니다. 다음은 예시 명령어입니다. (버전은 예시이며, 최신 버전을 확인하여 사용하세요.)
# /usr 디렉토리로 이동 (원하는 위치에 따라 변경 가능)
cd /usr
# kafka 디렉토리 생성
mkdir kafka
# kafka 디렉토리로 이동
cd kafka
# Kafka 2.12-2.3.0 버전 다운로드 (미러 링크 또는 공식 사이트에서 최신 버전 확인)
wget https://archive.apache.org/dist/kafka/2.3.0/kafka_2.12-2.3.0.tgz
# 압축 해제
tar -zxvf kafka_2.12-2.3.0.tgz
# 압축 해제된 디렉토리로 이동
cd kafka_2.12-2.3.0
2. ZooKeeper 시작
Kafka는 메타데이터 관리 및 클러스터 조정을 위해 ZooKeeper에 의존합니다. Kafka 패키지에는 테스트용으로 사용할 수 있는 ZooKeeper 스크립트가 포함되어 있습니다.
bin/zookeeper-server-start.sh config/zookeeper.properties
ZooKeeper 서버가 성공적으로 시작되면, 새로운 터미널 창을 열어 Kafka 브로커를 시작합니다.
3. Kafka 브로커 시작
새 터미널에서 Kafka 브로커를 시작합니다. 이는 클러스터의 첫 번째 노드가 됩니다.
bin/kafka-server-start.sh config/server.properties
이제 단일 Kafka 브로커가 실행 중인 상태입니다.
Kafka 토픽 생성 및 메시지 전송/수신
1. 새로운 토픽 생성
메시지를 주고받기 위해서는 토픽을 생성해야 합니다. 다음은 'my-first-topic'이라는 이름으로 복제 계수 1, 파티션 1을 갖는 토픽을 생성하는 명령입니다.
bin/kafka-topics.sh --create --bootstrap-server localhost:9092 --replication-factor 1 --partitions 1 --topic my-first-topic
생성된 토픽 목록은 다음 명령어로 확인할 수 있습니다.
bin/kafka-topics.sh --list --bootstrap-server localhost:9092
# 출력 예시:
# my-first-topic
2. 메시지 발행 (Producer)
콘솔 프로듀서를 사용하여 'my-first-topic'으로 메시지를 보낼 수 있습니다. 명령어를 실행한 후 프롬프트에 메시지를 입력하고 Enter를 누르면 됩니다.
bin/kafka-console-producer.sh --broker-list localhost:9092 --topic my-first-topic
> 첫 번째 메시지입니다.
> 또 다른 메시지를 보냅니다.
3. 메시지 구독 (Consumer)
다른 터미널 창을 열어 콘솔 컨슈머를 시작하고 'my-first-topic'에서 메시지를 구독합니다. `--from-beginning` 옵션은 컨슈머 시작 전의 모든 메시지도 가져오도록 합니다.
bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic my-first-topic --from-beginning
# 프로듀서가 보낸 메시지가 여기에 표시됩니다.
# 첫 번째 메시지입니다.
# 또 다른 메시지를 보냅니다.
이 단계까지 성공했다면 Kafka를 통해 메시지를 정상적으로 주고받을 수 있음을 확인한 것입니다.
다중 노드 Kafka 클러스터 구성
고가용성과 확장성을 위해 여러 Kafka 브로커로 구성된 클러스터를 설정할 수 있습니다. 여기서는 단일 머신에서 세 개의 브로커로 이루어진 클러스터를 구성하는 방법을 설명합니다.
1. 추가 브로커 설정 파일 생성
기존의 server.properties 파일을 복사하여 두 개의 새로운 설정 파일을 만듭니다.
cp config/server.properties config/server-1.properties
cp config/server.properties config/server-2.properties
2. 브로커 설정 수정
각각의 새로운 설정 파일(server-1.properties, server-2.properties)을 열어 다음 파라미터들을 고유하게 설정합니다. broker.id는 클러스터 내에서 각 브로커를 식별하는 고유한 ID이며, listeners와 log.dirs는 동일한 머신에서 여러 브로커가 충돌하지 않도록 다른 포트와 로그 디렉터리를 사용하도록 변경합니다.
# config/server-1.properties 파일 수정
broker.id=1
listeners=PLAINTEXT://:9093
log.dirs=/tmp/kafka-logs-1
# config/server-2.properties 파일 수정
broker.id=2
listeners=PLAINTEXT://:9094
log.dirs=/tmp/kafka-logs-2
3. 추가 Kafka 브로커 실행
기존에 실행 중인 첫 번째 브로커(config/server.properties)와 함께, 새로 생성된 설정 파일들을 사용하여 나머지 두 브로커를 시작합니다.
# 백그라운드에서 실행하려면 &를 붙입니다.
bin/kafka-server-start.sh config/server-1.properties &
bin/kafka-server-start.sh config/server-2.properties &
이제 세 개의 Kafka 브로커가 실행 중인 클러스터가 구성되었습니다.
4. 복제 토픽 생성
클러스터의 이점을 활용하기 위해 복제 계수를 3으로 설정한 새로운 토픽을 생성합니다. 'cluster-replicated-topic'이라는 이름으로 생성합니다.
bin/kafka-topics.sh --create --bootstrap-server localhost:9092 --replication-factor 3 --partitions 1 --topic cluster-replicated-topic
5. 토픽 파티션 상태 확인
생성된 복제 토픽의 상세 정보를 확인하여 클러스터 내에서 파티션이 어떻게 분산되고 복제되었는지 볼 수 있습니다.
bin/kafka-topics.sh --describe --bootstrap-server localhost:9092 --topic cluster-replicated-topic
출력 결과는 다음과 유사할 것입니다:
Topic: cluster-replicated-topic PartitionCount:1 ReplicationFactor:3 Configs:segment.bytes=1073741824
Topic: cluster-replicated-topic Partition: 0 Leader: 1 Replicas: 0,1,2 Isr: 0,1,2
Leader: 해당 파티션의 모든 읽기/쓰기 요청을 처리하는 브로커입니다. 각 브로커는 클러스터 내 여러 파티션의 리더가 될 수 있습니다.Replicas: 해당 파티션의 로그를 복제하는 모든 브로커의 목록입니다. 리더 브로커도 이 목록에 포함됩니다.Isr (In-Sync Replicas): 현재 리더와 동기화된 상태를 유지하는 복제본(replica)들의 집합입니다. 이 목록은 리더에게 최신 상태로 유지되고 있는 복제본들을 나타냅니다. 메시지는 ISR 내의 모든 복제본이 메시지를 기록해야만 "커밋"된 것으로 간주됩니다.
6. 복제 토픽을 이용한 메시지 송수신
새로 생성한 'cluster-replicated-topic'으로 메시지를 발행하고 구독하여 정상 작동하는지 확인합니다.
# Producer
bin/kafka-console-producer.sh --broker-list localhost:9092 --topic cluster-replicated-topic
> 클러스터 메시지 1
> 클러스터 메시지 2
# Consumer (새로운 터미널)
bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --from-beginning --topic cluster-replicated-topic
클러스터 메시지 1
클러스터 메시지 2
내결함성 테스트
Kafka 클러스터의 주요 장점 중 하나는 내결함성입니다. 브로커 중 하나가 실패하더라도 시스템은 계속해서 작동합니다. 이를 테스트해 보겠습니다.
1. 리더 브로커 식별 및 종료
이전 --describe 명령의 출력에서 'cluster-replicated-topic'의 리더가 1번 브로커(ID: 1)임을 확인했다고 가정합니다. 이제 이 브로커를 종료하여 내결함성을 테스트합니다.
먼저 실행 중인 Kafka 브로커 프로세스 목록을 확인하여 1번 브로커의 PID를 찾습니다. server-1.properties 파일을 사용하여 시작된 프로세스를 찾을 수 있습니다.
# PID 찾기 (예시)
ps aux | grep server-1.properties
# 출력 예시 (PID는 다를 수 있음):
# user 12345 0.0 3.6 6867572 606204 pts/1 Sl+ 17:38 1:38 java ... server-1.properties
# 해당 PID (예: 12345)를 사용하여 프로세스 종료
kill -9 12345
2. 클러스터 상태 재확인
1번 브로커가 종료된 후 토픽의 상태를 다시 확인합니다.
bin/kafka-topics.sh --describe --bootstrap-server localhost:9092 --topic cluster-replicated-topic
출력 결과는 다음과 유사할 것입니다:
Topic: cluster-replicated-topic PartitionCount:1 ReplicationFactor:3 Configs:segment.bytes=1073741824
Topic: cluster-replicated-topic Partition: 0 Leader: 0 Replicas: 0,1,2 Isr: 0,2
여기서 중요한 변화는 다음과 같습니다:
Leader가 0번 또는 2번 브로커 중 하나로 변경된 것을 확인할 수 있습니다. Kafka는 자동으로 사용 가능한 ISR 멤버 중 하나를 새로운 리더로 선출합니다.Isr목록에서 종료된 1번 브로커(ID: 1)가 제거된 것을 볼 수 있습니다.
이 상태에서도 여전히 'cluster-replicated-topic'으로 메시지를 보내고 받을 수 있습니다. 이는 Kafka가 브로커 장애 발생 시에도 데이터의 가용성과 일관성을 유지하며 내결함성을 제공함을 의미합니다.