티스토리 뷰
kafka의 개념에 대한 내용은 아래 글을 통해 어느정도 알아보았다.
이번 포스팅에서는 kafka-UI 툴을 통한 kafka 관리를 직접 실습하며 추가 개념 학습을 진행하겠다.
kafka cluster 구성
로컬 환경
- macOS(intel 칩)
[docker-compose.yml]
version: '3.8'
networks:
kafka_network:
services:
zookeeper:
image: confluentinc/cp-zookeeper:7.3.10
container_name: zookeeper
networks:
- kafka_network
ports:
- "2181:2181"
environment:
ZOOKEEPER_CLIENT_PORT: 2181
ZOOKEEPER_TICK_TIME: 2000
kafka1:
image: confluentinc/cp-kafka:7.3.10
container_name: kafka1
networks:
- kafka_network
depends_on:
- zookeeper
ports:
- "19092:19092"
environment:
KAFKA_BROKER_ID: 1
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
KAFKA_LISTENERS: PLAINTEXT://kafka1:9092,EXTERNAL://0.0.0.0:19092
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka1:9092,EXTERNAL://localhost:19092
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,EXTERNAL:PLAINTEXT
KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXT
KAFKA_AUTO_CREATE_TOPICS_ENABLE: "false" # 운영환경에서는 false
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 3
kafka2:
image: confluentinc/cp-kafka:7.3.10
container_name: kafka2
networks:
- kafka_network
depends_on:
- zookeeper
ports:
- "19093:19093"
environment:
KAFKA_BROKER_ID: 2
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
KAFKA_LISTENERS: PLAINTEXT://kafka2:9092,EXTERNAL://0.0.0.0:19093
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka2:9092,EXTERNAL://localhost:19093
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,EXTERNAL:PLAINTEXT
KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXT
KAFKA_AUTO_CREATE_TOPICS_ENABLE: "true"
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 3
kafka3:
image: confluentinc/cp-kafka:7.3.10
container_name: kafka3
networks:
- kafka_network
depends_on:
- zookeeper
ports:
- "19094:19094"
environment:
KAFKA_BROKER_ID: 3
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
KAFKA_LISTENERS: PLAINTEXT://kafka3:9092,EXTERNAL://0.0.0.0:19094
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka3:9092,EXTERNAL://localhost:19094
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,EXTERNAL:PLAINTEXT
KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXT
KAFKA_AUTO_CREATE_TOPICS_ENABLE: "true"
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 3
kafka-ui:
image: provectuslabs/kafka-ui:latest
container_name: kafka-ui
depends_on:
- kafka1
- kafka2
- kafka3
ports:
- "9090:8080"
environment:
KAFKA_CLUSTERS_0_NAME: "kafka_cluster"
KAFKA_CLUSTERS_0_BOOTSTRAPSERVERS: "kafka1:9092,kafka2:9092,kafka3:9092"
KAFKA_CLUSTERS_0_ZOOKEEPER: "zookeeper:2181" # 옵션
networks:
- kafka_network
macOS 인텔 칩 환경에서 네트워크 설정이 단순하게 구성이 되지않아, 비교적 복잡하게 됬지만
네트워크 설정 이외의 kafka 설정은 os 환경에 종속적이지 않으니 문제되지 않을 것이다.
우선 kafka 브로커 인스턴스는 3개를 설정하였고, 아래와 같이 Replication_Factor를 3으로 설정하였다.
하나의 리더와 두개의 팔로워에 메시지가 복제된다는 것을 의미한다.
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 3
아래 설정도 중요한 부분인데 TOPIC 자동 설정을 disable 하였다.
TOPIC 마다 보관 정책, partition수 등의 정책을 별도로 관리하기 위해 자동 생성을 막고 직접 수동 생성을 하도록 하였다.
KAFKA_AUTO_CREATE_TOPICS_ENABLE: "false"
마지막 kafka-ui를 설정하여 kafka UI 툴을 제공하도록 하였다.
UI 툴을 통해 카프카 클러스터 및 토픽을 관리할 수 있다.
kafka UI 사용법
위의 docker 설정에서 9090 포트로 kafka-ui를 설정하였으므로 localhost:9090으로 접속할 수 있다.
대시보드
대시보드에 접속하면 위와 같이 kafka_cluster 구성 정보를 확인할 수 있다.
하나의 cluster가 구동 중이고 브로커 인스턴스가 3개임을 알 수 있다.
아직 Topic을 생성하지 않았으므로 Topics 항목이 0이고, Partitions 또한 0으로 나타난다.
Production 항목은 생성된 전체 이벤트의 데이터 크기이고,
Consumption은 소비한 전체 이벤트의 데이터 크기이다.
Topic 생성하기
Topics 메뉴에 접속하고 Add a Topic 버튼을 통해 Topic을 만들어보자.
Topic을 생성하기 위해 위 접속 경로를 따라오면 위와 같은 화면을 볼 수 있다.
각 항목에 대해 알아보자.
- Number of Partitions : Topic의 파티션 수를 설정할 수 있다.
- Cleanup policy : 오래된 메시지 처리 정책
- Delete : 메시지가 일정 시간(retention.ms) 또는 일정 크기(retention.bytes)가 지나면 자동으로 삭제됩니다.
- Compact : key에 대해 가장 최신 메시지만 남기고 이전 메시지는 삭제
key에 대해 저장되는 정보가 상태 정보라면 마지막 변경된 상태만 유효하므로 이전 메시지를 삭제해도 괜찮다.
다만, 반드시 순차적으로 모두 처리되어야할 이벤트라면 Compact 사용시 메시지 유실 가능성이 높아지므로,
Delete를 통해 시간이나 크기를 충분히 크게 설정하는 것이 좋다. - Delete, Compact : 삭제와 압축이 둘 다 동작. 특정 시나리오에 따라 유연하게 메시지를 관리
- Min In Sync Replicas : Partition의 leader가 데이터 쓰기 작업을 위해, 최소 몇 개의 Replica와 동기화를 이뤄야 하는지 값
일반적으로 min.insync.replicas=2를 추천한다.(leader 포함)
모든 브로커가 인-싱크-레플리카(ISR)에 항상 들어있다고 보장하기 어렵다.
네트워크 지연, 일시적인 장애, 재조정 등으로 ISR 집합이 잠시 2개 이하로 떨어질 수 있는데,
이때, 너무 높은 값으로 설정되어있다면 쓰기 불가 상태가 되고 이로인해 가용성이 떨어지게 된다. - Replica Factor : 해당 토픽의 각 파티션을 몇 개의 브로커에 복제할 것인지 설정
- Time to retain data : 메시지 보관 기간
이 값을 넘어가게 되면 Cleanup 정책에 의해 처리됨 - Max size on disk in GB : 디스크에 저장할 전체 메시지 데이터의 크기
이 값을 넘어가게 되면 Cleanup 정책에 의해 처리됨 - Maximum message size in bytes : 하나의 메시지에 대한 최대 데이터 크기
이 값을 넘어가게 되면 예외(RecordTooLargeException) 발생
각 항목에 대해 적절한 설정을 진행하고 토픽을 만들어보자.
Topic을 생성하면 아래와 같이 Topic 상세 화면을 볼 수 있다.
이제 각 항목에 대해 알아보자.
- URP : ISR에 포함되지 않은 파티션의 수
- ISR : 파티션 복제본 갯수
partition이 3개로 설정했고 각 파티션의 replica factor를 3으로 설정했으므로 3x3=9가 된다. - Segment Size : 로그파일 사이즈
- Segment Count : 로그 파일의 갯수(순차 io에 의해 Partition이 저장하는 로그파일이 여러개의 로그파일로 늘어날 수 있음)
Replicas를 보면 초록색으로 표시된 번호가 있고, 검정색으로 표시된 번호가 있는데,
초록색은 leader 브로커이고, 검정색은 follower 브로커를 의미한다.
각 Partition에 메시지를 하나씩 발행하니 아래와 같이
Next Offset이 모두 1로 변하게 됬고, Message Count도 1로 변했다.
Topics에서 Consumer 탭을 누르면 Consumer Group에 대한 정보를 알 수 있다.
- Active Consumers : 현재 kafka와 연결된 활성 Consumer의 수
- Consumer Lag : 지연 컨슈머 수
- Coordinator : 코디네이터 역할을 하는 브로커 번호
- Consumer Group 마다 하나의 Coordinator 브로커가 존재
- Partition 할당 및 리밸런싱
- 오프셋 저장 및 조회
Consumers
Consumer 탭을 보자.
Consumer Group 내에서 처리하는 Topic은 2개이고,
각 토픽에 Partition을 각각 3개로 설정, 이에대한 Consumer도 1대1 매핑되도록 3개를 설정했다.
따라서 전체 Members(Consumer의 수)는 6개가 된다.
Coordinator ID = 2 라는건 2번 브로커가 코디네이터 역할을 수행한다는 것이다.
Brokers
- Broker Count : 브로커 인스턴스 수
- Active Controller : 현재 컨트롤러 역할을 하는 브로커 ID
- Online : 전체 파티션 수와 그 중 online 상태인 파티션 수
__consumer_offset Topic이 기본적으로 파티션 50개를 가지고 있음 - In Sync Replicas : ISR에 포함된 전체 복제본 수, (전체 Partition 수)X(Replica Factor)
__consumer_offset Topic이 50개, 생성한 2개 토픽의 파티션이 각각 3 이므로
전체 Partition 수는 56이고 Replica Factor는 3으로 설정했으므로 56*3 = 168 - Out Of Sync Replicas : ISR에서 벗어난 복제본 수
- Leaders : 각 브로커가 리더역할을 수행하는 파티션의 수
기본 파티션 50개와 생성한 파티션의 6개로 전체 56개가 골고루 배치 됨을 확인할 수 있다. - Lead skew : 파티션 리더 분산의 불균형 정도(0에 가까울 수록 이상적)
- Online partitions : 브로커가 현재 참여 중인 Partition 수
'소프트웨어 > kafka' 카테고리의 다른 글
[Spring Kafka 연동] 전송방식 설정부터 에러처리 핸들링까지 (3) | 2025.08.03 |
---|---|
[Kafka] Consumer의 동작 원리 (1) | 2025.08.01 |
[Kafka 개념] Producer의 동작 원리 (1) | 2025.07.31 |
[Kafka 개념] Replication (3) | 2025.07.29 |
[Kafka 개념] 카프카 아키텍쳐 (2) | 2025.07.28 |