이미지
https://hub.docker.com/r/apache/kafka
- Kafka 3.0.0부터 KRaft모드를 지원 해서 Zookeeper 없이 Kafka를 동작
- https://www.c-sharpcorner.com/article/apache-kafka-without-zookeeper/
- https://kafka.apache.org/documentation/#kraft
- https://kafka.apache.org/documentation/#zk_depr
env 설정
# broker.env
## Kafka 브로커가 특정 IP 주소와 포트에서 수신 대기하도록 설정하는 데 사용
KAFKA_LISTENERS: PLAINTEXT://:9092,CONTROLLER://:9093 # default PLAINTEXT://:9092
## 클라이언트가 Kafka 브로커에 접근할 때 사용할 주소를 정의
## not valid to advertise the 0.0.0.0 meta-address
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://localhost:19092 # default null
## 다른 컨트롤러들과 통신 → 클러스터 내에서 리더 선출과 같은 작업을 협력하여 수행할 수 있도록
## broker와 controller 공통 env
KAFKA_CONTROLLER_QUORUM_VOTERS: 1@controller:9093
- replication-factor
- Kafka 클러스터 broker 서버들에 총 몇개 topic 있을건지? → 안정성
- partitions
- 개별 broker 당 몇개의 통로 ? → 병렬처리
# broker.env
KAKFA_DEFAULT_REPLICATION_FACTOR: 3 # default 1
## 소비자 오프셋 저장하는 내장된 토픽인 __consumer_offsets 토픽의 복제 요소를 지정
## replication-factor와 동일하게
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 3 # default 3
## 트랜잭션 로그가 여러 브로커에 복제되어 내결함성을 보장
## replication-factor와 동일하게
KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 3 # default 3
## 최소 ISR 수 지정
KAFKA_TRANSACTION_STATE_LOG_MIN_ISR: 2 # default 2
## topic마다 default partition 수
KAFKA_NUM_PARTITIONS: 1 # default 1
./kafka-topics.sh --bootstrap-server localhost:9092 --create --topic topic01 -replication-factor 2 –partitions 1
./kafka-topics.sh --bootstrap-server localhost:9092 --create --topic topic02 -replication-factor 3 –partitions 1
# broker.env
## 프로듀서나 컨슈머가 존재하지 않는 토픽에 접근하려고 할 때 브로커가 토픽을 자동으로 생성할지 여부
## 프로덕션 환경에서는 false로 설정하여 불필요한 토픽 생성을 방지
KAFKA_AUTO_CREATE_TOPIC_ENABLE: true # default true
구조
Kafka에는 로그, 이벤트 topic
이벤트 topic은 왜 ? → 멀티 모듈 기능 구현
구축
docker-compose up -d
docker exec --workdir /opt/kafka/bin/ -it broker sh
# 진입
## --bootstrap-server는 advertised_listener 호스트:포트
./kafka-topics.sh --bootstrap-server <Private IP>:19092 --create --topic test-topic
연습
같은 VPC - EC2 인스턴스 2개
- producer, comsumer
- kafka
⇒ 통신 테스트
- 기본적으로 같은 VPC는 프라이빗 IP로 내부 통신 가능
- 프라이빗 서브넷의 인스턴스로 진입하려면, 퍼블릭 서브넷의 인스턴스에서 ssh -i <key> <AMI>@<private IP>
- 같은 VPC 내 내부 통신 확인하려면 ping <private IP>
Todo
- [x] broker, controller - 1개, localhost
- [x] broker -1, controller - 1개, public ip
- [x] localhost 되는지 다시 확인 후 네트워크 구조 확인
- docker exec -it <container> ip addr
- 외부 클라이언트는 브로커에 접근할 때 호스트 IP와 포트 19092를 사용
- [x] create topic 자동 될 수 있는지
- https://kafka.apache.org/documentation/#brokerconfigs_auto.create.topics.enable
- 근데, 없는 topic에 produce하면 자동으로 topic 생기지 않음
- Kafka CLI를 사용하여 토픽 생성
- Kafka Admin 클라이언트를 사용하여 프로그램 내에서 토픽 생성
- [ ] replication-factor, partition 수 조정 및 env 설정
참고
https://investment-engineer.tistory.com/6
https://velog.io/@shinmj1207/Apache-Kafka-Docker-환경에서-Spring-boot-Kafka-연동하기
https://velog.io/@kimsei1124/Apache-Kafka-with.-docker-compose
'DevOps' 카테고리의 다른 글
[Kafka] Kafka란? (0) | 2024.08.19 |
---|---|
Docker로 MariaDB 연결, 웹에서 DB 내용 띄우기 (0) | 2024.08.19 |