docker compose 를 이용하여 kafka 로컬 환경 세팅을 쉽게 할 수 있다.
- docker compose 에 대해 궁금하다면? https://yonikim.tistory.com/155
kafka 와 영혼의 단짝인 zookeeper, 추가로 kafka 운영 모니터링 툴 중 하나인 akhq 까지 해서 총 3개의 서비스를 띄워볼 것이다.
Kafka 와 Zookeeper 란?
Kafka 와 Zookeeper 는 대규모 분산 시스템에서 메시지 브로커 및 분산 데이터 저장소를 구축하는데 사용되는 두가지 주요 서비스이다.
※ Kafka
1. 역할
- kafka 는 분산 데이터 스트리밍 플랫폼으로, 대용량의 실시간 데이터를 효과적으로 처리하고 저장할 수 있다.
- 고성능, 내결함성, 확장성을 갖춘 메시지 브로커 역할을 수행한다.
- 데이터 생산자(Producer) 와 데이터 소비자(Consumer) 간의 효율적인 메시지 전달을 지원하며, 메시지는 토픽과 파티션에 저장된다.
- Kafka 에 좀더 자세히 알고 싶다면? https://yonikim.tistory.com/143
2. Zookeeper 와의 관계
- kafka 는 zookeeper 를 통해 브로커의 메타데이터를 관리하고, 리더와 팔로워 간의 분산된 메시지 처리를 조율한다.
- kafka 의 브로커들은 zookeeper 에 자신의 상태 정보를 저장하고, 이 정보를 통해 클러스터의 안정성과 가용성을 유지한다.
※ Zookeeper
1. 역할
- zookeeper 는 분산 응용 프로그램을 위한 좌표 서비스 및 구성 관리 시스템이다.
- 분산 시스템에서 일관성과 동기화를 관리하고, 서버의 동적 구성 변경 및 리더 선출과 같은 작업을 담당한다.
- kafka 와 같은 분산 시스템에서 zookeeper 는 주키퍼 앙상블을 통해 안정적인 쿼럼을 형성하여 중요한 메타데이터 및 상태를 저장한다.
2. Kafka 에서의 역할
- kafka 는 자신의 상태 정보를 zookeeper 에 저장하고, 리더와 팔로워의 브로커를 선출하는데 zookeeper 를 사용한다.
- kafka 의 토픽, 파티션, 오프셋, 컨슈머 그룹 등의 메타데이터를 저장하고 관리한다.
Akhq 란?
Akhq(A Kafka GUI for Apache Kafka) 는 kafka 를 위한 오픈 소스 웹 기반 관리 도구이다. kafka 클러스터를 모니터링하고 관리하는데 도움을 주며, kafka 토픽, 컨슈머 그룹, 메시지 브로커 등을 시각적으로 관리할 수 있는 사용자 친화적인 인터페이스를 제공한다.
akhq 의 주요 특징은 아래와 같다.
1. 웹 기반 인터페이스: akhq 는 웹 브라우저에서 실행되며, 사용자가 편리하게 kafka 클러스터를 모니터링하고 관리할 수 있도록 도와준다.
2. 토픽 및 컨슈머 그룹 관리: 토픽 생성, 토픽의 파티션 및 오프셋 관리, 컨슈머 그룹의 소비자 목록과 오프셋 확인 등을 수행할 수 있다.
3. 리더 및 파티션 상태 확인: kafka 브로커의 상태, 토픽의 파티션 정보, 각 파티션의 리더와 팔로워 정보를 시각화하여 확인할 수 있다.
4. 메시지 검색 및 전송: 특정 토픽의 메시지를 검색하고, 원하는 토픽으로 메시지를 전송할 수 있는 기능을 제공한다.
5. ACL(액세스 제어 목록) 관리: kafka 의 액세스 제어를 관리하고 설정할 수 있다.
6. 스키마 레지스트리 지원: Avro 또는 다른 스키마 형식을 사용하는 메시지의 스키마 관리를 지원한다.
7. 사용자 관리: 다양한 사용자 및 권한을 관리할 수 있다.
사전 준비사항
Docker 설치: https://yonikim.tistory.com/19
Docker compose 설정파일 작성
▷ docker-compose-kafka.yml
version: "3"
services:
zookeeper:
image: confluentinc/cp-zookeeper:latest
ports:
- 22181:2181
environment:
ZOOKEEPER_CLIENT_PORT: 2181
ZOOKEEPER_TICK_TIME: 2000
ZOOKEEPER_INIT_LIMIT: 5
ZOOKEEPER_SYNC_LIMIT: 2
kafka:
image: confluentinc/cp-kafka:latest
depends_on:
- zookeeper
ports:
- 29092:29092
environment:
KAFKA_BROKER_ID: 1
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka:9092,PLAINTEXT_HOST://localhost:29092
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT
KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXT
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
akhq:
image: tchiotludo/akhq
environment:
AKHQ_CONFIGURATION: |
akhq:
connections:
local:
properties:
bootstrap.servers: "kafka:9092"
ports:
- 8080:8080
links:
- kafka
Zookeeper 환경변수 설정
- ZOOKEEPER_CLIENT_PORT
- zookeeper의 포트를 지정한다.
- 컨테이너 내부에서 2181 포트로 실행된다. (Default)
- ZOOKEEPER_TICK_TIME
- zookeeper가 클러스터를 구성할 때 동기화를 위한 기본 틱 시간을 지정한다.
- millisecond 로 지정할 수 있으며, 2000 으로 설정한 경우 2초가 된다. (Default)
- ZOOKEEPER_INIT_LIMIT
- 초기화를 위한 제한 시간을 설정한다.
- 주키퍼 클러스터는 쿼럼이라는 과정을 통해서 마스터를 선출하게 된다. 이때 주키퍼들이 리더에게 커넥션을 맺을 때 지정할 초기 타임아웃 시간이다.
- 타임아웃 시간은 이전에 지정한 ZOOKEEPER_TICK_TIME 단위로 설정된다.
- 타임아웃 시간은 ZOOKEEPER_TICK_TIME * ZOOKEEPER_INIT_LIMIT = 2000 * 5 = 10,000 (10초) 가 된다.
- 이 옵션은 멀티 브로커에서 유효한 속성이다.
- ZOOKEEPER_SYNC_LIMIT
- zookeeper 리더와 나머지 서버들의 싱크 제한 시간이다.
- 해당 시간 내에 싱크 응답이 오는 경우 클러스터가 정상적으로 구석되어 있음을 알 수 있다.
- 싱크 시간은 ZOOKEEPER_TRICK_TIME * ZOOKEEPER_SYNC_LIMIT = 2000 * 2 = 4000 (4초) 가 된다.
Kafka 환경변수 설정
- KAFKA_BROKER_ID
- kafka 브로커 아이디를 지정한다. 유니크한 값이어야 하며, 단일 브로커에선 없어도 무방하다.
- KAFKA_ZOOKEEPER_CONNECT
- kafka 가 연결될 zookeeper 를 지정한다.
- KAFKA_ADVERTISED_LISTENERS
- 외부에서 접속하기 위한 리스너 설정을 해준다.
- KAFKA_LISTENER_SECURITY_PROTOCOL_MAP
- 보안을 위한 프로토콜 매핑을 해준다. 이 값은 KAFKA_ADVERTISED_LISTENERS 와 함께 key-value 로 지정한다.
- KAFKA_INTER_BROKER_LISTENER_NAME
- 도커 내부에서 사용할 리스너 이름을 지정한다.
- KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR
- 싱글 브로커인 경우에 지정한다. 멀티 브로커는 기본값을 사용하므로 해당 설정이 필요없다.
Akhq 환경변수 설정
- AKHQ_CONFIGURATION
- 여러개의 kafka 클러스터를 관리할 수 있다.
version: "3"
services:
akhq:
image: tchiotludo/akhq
environment:
AKHQ_CONFIGURATION: |
akhq:
connections:
kafka_sasl:
properties:
bootstrap.servers: "${KAFKA_HOST_SASL}"
security.protocol: SASL_SSL
sasl.mechanism: SCRAM-SHA-512
sasl.jaas.config: org.apache.kafka.common.security.scram.ScramLoginModule required username="${USERNAME}" password="${PASSWORD}";
kafka_ssl:
properties:
bootstrap.servers: "${KAFKA_HOST_SSL}"
security.protocol: SSL
local:
properties:
bootstrap.servers: "kafka:9092"
ports:
- 8080:8080
links:
- kafka
Docker compose 실행하기
$ docker compose -f docker-compose-kafka.yml up -d
Docker Desktop 애플리케이션을 확인해보면, 아래 이미지와 같이 3개의 서비스가 띄워져 있는 걸 확인할 수 있다.
Akhq 에는 localhost:8080 를 통해 접근할 수 있다.
'Kafka' 카테고리의 다른 글
[Kafka] 카프카란 무엇인가 (1) | 2023.12.07 |
---|