티스토리 뷰
카프카 시작하기
일반화된 유형의 데이터를 발행하고 구독할 수 있는 중앙 집중화된 시스템
카프카는 분산 커밋 로그 로, 저장된 데이터는 순서가 유지되고 지속성 있게 보관되며 결정적으로 읽을 수 있고, 데이터를 분산시켜 저장할 수 있음
카프카 기본 구성 요소
- 메시지: 데이터 기본 단위. key 라는 메타데이터 포함할 수 있으며 데이터를 저장할 파티션을 결정하기 위해 사용됨 카프카는 효율성을 위해 메시지를 배치 단위 로 저장
- 스키마: 메시지의 형식. 카프카는 잘 정의된 스키마를 공유 저장소에 저장함으로써 구버전, 신버전 형식을 동시에 지원하도록 하는 사전 작업 없이도 메시지를 처리할 수 있음
- 토픽과 파티션:
- 카프카에서 메시지는 토픽 단위로 저장. 토픽은 여러개의 파티션 으로 나뉨.
- 각 파티션은 서로 다른 서버에 저장될 수 있기 때문에, 하나의 토픽이 여러 개의 서버로 수평적으로 확장되어 하나의 서버의 용량을 넘어서는 성능 보여줄 수 있음
- 파티션은 복제 가능함, 즉 서로 다른 서버들이 동일한 파티션의 복제본을 저장하고 있기 때문에 장애가 발생해도 파티션을 읽거나 쓸 수 없는 상황이 생기지 않음
- 프로듀서: 메시지를 생성. 메시지를 쓸 때 파티션 사이에 균등하게 쓸 수 있거나, 프로듀서가 특정한 파티션을 지정해서 메시지를 쓰기도 함 (키 값과 키 값의 해시를 특정 파티션으로 대응시켜 주는 파티셔너를 사용해서 구현됨)
- 컨슈머: 메시지를 읽음. 1개 이상의 토픽을 구독해서 저장된 메시지들을 각 파티션에 쓰여진 순서대로 읽음. 메시지의 offset 을 기록함으로써 어느 메시지까지 읽었는지 유지.컨슈머 그룹 은 토픽에 저장된 데이터를 읽어오기 위해 협업하는 하나 이상의 컨슈머로 이루어짐.컨슈머를 수평 확장할 수 있고, 컨슈머 중 하나에 장애가 발생하더라도 그룹 안의 다른 컨슈머들이 장애가 발생한 컨슈머가 읽고 있던 파티션을 재할당 받은 후 이어서 데이터를 읽어올 수 있음
- 컨슈머 그룹은 각 파티션이 하나의 컨슈머에 의해서만 읽히도록 함
- 파티션 별로 다음 번에 사용 가능한 offset 값을 저장하며, 이 offset을 통해 컨슈머가 읽기 작업을 정지했다가 다시 시작하더라도 마지막으로 읽었던 메시지의 바로 다음 메시지부터 읽을 수 있음.
- 브로커와 클러스터:브로커는 클러스터의 일부로 작동하며, 하나의 브로커가 클러스터 컨트롤러 역할을 함.파티션은 클러스터 안 브로커 중 하나가 담당하며, 브로커를 파티션 리더 라고 부름.각 파티션의 메시지를 중복 저장함으로써 리더 브로커에 장애가 발생했을 때 팔로워 중 하나가 리더 역할을 이어받을 수 있도록 함.
- 모든 프로듀서는 리더 브로커에 메시지를 발행하지만, 컨슈머는 리더나 팔로워 중 하나로부터 데이터를 읽어 옴.
- 복제된 파티션은 여러 브로커에 할당되는데 이건 팔로워 라고 부름.
- 클러스터 컨트롤러는 파티션을 브로커에 할당하거나 장애가 발생한 브로커를 모니터링 함.
- 하나의 카프카 서버를 브로커 라고 부름. 브로커는 프로듀서로부터 메시지 전달받아 오프셋을 할당한 뒤 디스크 저장소에 씀.
왜 카프카인가?
- 다중 프로듀서
- 다중 컨슈머: 상호 간섭 없이 여러 컨슈머가 어떠한 메시지 스트림도 읽을 수 있음
- 디스크 기반 보존: 보유 규칙과 함께 메시지 저장, 서로 다른 메시지 스트림이 컨슈머에 필요에 따라 서로 다른 기간동안 보존될 수 있음
- 확장성: 브로커 늘려도 작동
- 고성능
- 플랫폼 기능
카프카 환경 설정 in WSL2, docker
version: '2.1'
services:
zoo1:
image: confluentinc/cp-zookeeper:7.3.2
hostname: zoo1
container_name: zoo1
ports:
- "2181:2181"
environment:
ZOOKEEPER_CLIENT_PORT: 2181
ZOOKEEPER_SERVER_ID: 1
ZOOKEEPER_SERVERS: zoo1:2888:3888
kafka1:
image: confluentinc/cp-kafka:7.3.2
hostname: kafka1
container_name: kafka1
ports:
- "9092:9092"
- "29092:29092"
- "9999:9999"
environment:
KAFKA_ADVERTISED_LISTENERS: INTERNAL://kafka1:19092,EXTERNAL://${DOCKER_HOST_IP:-127.0.0.1}:9092,DOCKER://host.docker.internal:29092
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: INTERNAL:PLAINTEXT,EXTERNAL:PLAINTEXT,DOCKER:PLAINTEXT
KAFKA_INTER_BROKER_LISTENER_NAME: INTERNAL
KAFKA_ZOOKEEPER_CONNECT: "zoo1:2181"
KAFKA_BROKER_ID: 1
KAFKA_LOG4J_LOGGERS: "kafka.controller=INFO,kafka.producer.async.DefaultEventHandler=INFO,state.change.logger=INFO"
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 1
KAFKA_TRANSACTION_STATE_LOG_MIN_ISR: 1
KAFKA_JMX_PORT: 9999
KAFKA_JMX_HOSTNAME: ${DOCKER_HOST_IP:-127.0.0.1}
KAFKA_AUTHORIZER_CLASS_NAME: kafka.security.authorizer.AclAuthorizer
KAFKA_ALLOW_EVERYONE_IF_NO_ACL_FOUND: "true"
depends_on:
- zoo1
출처:
- 카프카 핵심 가이드 2nd Edition
- Apache Kafka Series - Learn Apache Kafka for Begginers v3
'공부 > Kafka' 카테고리의 다른 글
카프카 내부 매커니즘 - 2 (0) | 2024.11.10 |
---|---|
카프카 컨슈머 (0) | 2024.10.20 |
카프카 프로듀서 (0) | 2024.10.13 |