개요
지난번에는 카프카의 기본 개념에 대해서 공부했는데, 오늘은 직접 카프카를 설치해보고 실행해보았다.
Homebrew로 Kafka 설치 및 실행하기
아파치 카프카는 다양한 운영체제에서 실행이 가능한 자바 어플리케이션이다. 나는 mac을 사용하고 있어서 homebrew를 통해 설치하려한다. Homebrew는 Mac에서 패키지를 쉽게 설치할 수 있도록 도와주는 패키지 관리 도구이다.
1. Homebrew가 설치되었는지 확인
// 버전을 확인
brew --version
// 설치되지 않았다면, Homebrew 설치
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
2. Kafka 설치
//카프카 설치
brew install kafka
//설치 확인
kafka-topics --version

Homebrew는 /usr/local/Cellar 아래 카프카를 설치한다. 각 파일은 서로 다른 디렉토리로 링크 되어있다.
- 바이너리 및 스크립트는 /usr/local/bin
- 카프카 설정은 /usr/local/ect/kafka
- 주키퍼 설정은 /usr/local/ect/zookeeper
- 카프카 데이터가 저장되는 log.dirs 설정은 /usr/local/var/lib/kafka-logs
Kafka는 기본적으로 Zookeeper가 필요하다. homebrew를 통해 카프카를 패키지를 설치하면 Zookeeper가 포함되어있다.
여러 대의 서버가 함께 작동하는 분산 시스템에서는 각 서버가 서로 누가 리더인지, 어떤 설정을 써야하는지 등을 알아야한다. 만약 서버가 하나 죽거나, 새로운 서버가 되면 어떻게 될까? 각 서버가 혼란 없이 동작할 수 있도록 '주키퍼'가 도와준다.
- 리더 선출: 여러개의 서버 중에 리더를 자동으로 선출한다.
- 설정 정보 저장: 서버가 시작할 때, 어떤 설정을 써야하는지 알아야하는데 주키퍼는 설정 정보를 중앙에서 관리해준다.
- 서버 상태 감시: 서버가 죽었는지, 새 서버가 추가됬는지 감시한다. 만약 서버가 죽으면 자동으로 대체 서버를 투입한다.
3. Zookeeper 및 Kafka 실행
// Zookeeper 실행
zookeeper-server-start /opt/homebrew/etc/kafka/zookeeper.properties
//
kafka-server-start /opt/homebrew/etc/kafka/server.properties
Homebrew로 Kakfka를 설치하면 zookeeper-server-start 방식이 기본으로 제공된다.


슥 읽어보니 설정파일을 읽어서 실행하는 것 같다.
4. 설정 확인 및 간단한 테스트
1) 토픽 생성하기
Kafka의 개념에서 공부했듯이 Kafka에서 메시지를 주고 받으려면 토픽(Topic)이 필요하다.
//토픽 생성
kafka-topics --create --topic test-topic --bootstrap-server localhost:9092 --partitions 1 --replication-factor 1
//토픽 생성 확인
kafka-topics --list --bootstrap-server localhost:9092

- test-topic 이라는 새로운 토픽을 생성하였고, 설정 값은 {} 비어 있어 기본 설정을 사용한다. 그리고 파티션 0번을 생성하고, 리더 브로커도 0번으로 배정된다.
- 곧바로 브로커 0번이 컨트롤러에서 연결이 끊겼다는데 찾아보니, 카프카가 토픽을 생성하는 동안 브로커와 일시적으로 연결이 끊길 수 있다고 한다.
- 원래 리더가 아닌 브로커에서 데이터를 가져오는 역할을 하는 ReplicaFetcher가 있는데, 지금은 브로커 0번이 유일한 브로커라서, 다른 곳에서 데이터를 가져올 필요가 없다. 그래서 removed fetcher for partitions Set
- /opt/homebrew/var/lib/kafka-logs 폴터 안에 test-topic-0 의 로그 저장소를 생성했다. offest 0 은 현재 데이터가 하나도 없다는 뜻이다.
- No checkpointed highwatermark is found : 하이워터마크가 저장되지 않았다고 한다. 찾아보니 하이워터마크는 브로커가 클라이언트(컨슈머)에게 전달할 수 있는 가장 최신 메시지의 offset을 의미한다고 한다. 개념을 공부할 때 카프카의 특징 중 장애가 발생하여 중간에 멈춰도 다시 읽었던 위치부터 읽을 수 있다는걸 알았는데, 하이워터마크가 그 역할을 하는 것 같다.
- test-topic-0 의 로그가 성공적으로 loaded 되었고, 하이워터마크가 0으로 아직 데이터가 없다는 뜻이다.
2) 프로듀서로 메세지 보내기
Kafka의 Producer를 실행해서 메시지를 보내보자
kafka-console producer --topic test-topic --bootstrap-server localhost:9092

3) 컨슈머로 메시지 읽기
Kafka의 Consumer를 실행해서 방금 보낸 메시지를 읽어보자.
kafka-console-consumer --topic test-topic --from-beginning --bootstrap-server localhost:9092

- 새로운 컨슈머가 console-consumer-25559 그룹에 가입하려고 한다. 하지만 카프카가 해당 컨슈머를 알지 못해서, 새로운 member id: console-consumer-1d48b63f- ... 를 생성해주었다.
- 컨슈머는 이 Id를 가지고 다시 그룹에 재 가입해야한다.
- 컨슈머 그룹이 리밸런싱(재조정)을 시작한다. 기존 세대(generation 0)에서 새로운 세대(generation 1)로 변경되었다. 새로운 컨슈머가 그룹에 참여했기 때문에 그룹 내에서 토픽의 파티션을 재배치한다.
- 컨슈머 그룹이 안정화(stabilized) 되었다. 리밸런싱이 완료되고 consumer-25559 그룹이 세대(generation) 1 로 변경되었다. 현재 이 그룹에는 1 mebers 가 있다. (1명의 컨슈머)
- 그룹 consumer-25559은 그룹 leader(console-consumer-1d48b63f ...)로 부터 파티션을 할당 받았다. 현재 이 그룹에는 1 members가 있으며, static 은 0이다. (고정된 멤버가 없다)
카프카 컨슈머 그룹이 생성되었고, 컨슈머가 참여하면서 자동으로 그룹 리밸런싱이 발생하였다. 컨슈머는 정상적으로 토픽의 데이터를 소비할 준비가 됬다.
결론
오늘은 homebrew를 이용해 kafka를 설치하고 실행해보았다. 간단한 메시지를 Producer로 생성하였고 Consumer로 메시지를 읽어보았다. 애플리케이션을 실행할 때마다 로그가 쭉 올라오지만, 그동안은 중요한 부분만 보거나 무심코 지나치는 경우가 많았다. 그런데 오늘은 로그를 유심히 살펴보면서, 개념으로만 배웠던 내용이 실제로 어떻게 쓰이는지 직접 확인할 수 있었다. 처음 접하는 개념들이 실제 동작하는 모습을 보니 굉장히 흥미로웠다.
'Book > 카프카 핵심 가이드' 카테고리의 다른 글
| Kafka 컨슈머 만들기: 동작 흐름과 기본 설정 이해하기 (1) | 2025.04.16 |
|---|---|
| Kafka 프로듀서 더 깊이 보기: 직렬화부터 스로틀링까지 (0) | 2025.04.10 |
| Kafka 프로듀서 만들기: 개념, 설정, 전송 방식 정리 (0) | 2025.04.07 |
| Kafka 처음 배우기: 카프카란 무엇인가? (0) | 2025.04.02 |