- Kafka Broker는 Partition에 대한 Read 및 Write를 관리하는 소프트웨어
- Kafka Server라고 부르기도 하며, Topic내의 Partition들을 분산, 유지 및 관리
- 각각의 Broker들은 ID로 식별됨 (단 ID는 숫자)
- Topic의 일부 Partition들을 포함 -> Topic 데이터의 일부분(Partition)을 갖을 뿐 데이터 전체를 갖고 있지 않음
- Kafka Cluster: 여러 개의 Broker들로 구성되며, Client는 특정 Broker에 연결하면 전체 클러스터에 연결됨
- 최소 3대 이상의 Broker를 하나의 Cluster로 구성해야하지만 4대 이상을 권장한다고 함
- Broker ID와 Partition ID 간에는 아무런 관계가 없음
- Topic을 구성하는 Partition들은 여러 Broker에 분산됨
- Topic 생성시 kafka가 자동으로 Topic을 구성하는 전체 Partition들을 모든 Broker에게 할당해주고 분배해 줌
- 모든 Kafka Broker는 Bootstrap 서버라고 부름
- 하나의 Broker에만 연결하면 Cluster 전체에 연결됨 -> 하지만, 특정 Broker 장애를 대비하여, 전체 Broker List(IP, port)를 파라미터로 입력하는 것을 권장한다고 함
- 각각의 Broker는 모든 Broker, Topic, Partition에 대해 알고 있음(Metadata)
- Zookeeper는 Broker를 관리 (Broker 들의 목록/설정을 관리)하는 소프트웨어
- Zookeeper 없이는 Kafka가 작동할 수 없으며, Zookeeper는 홀수의 서버로 작동하게 설계되어 있음(최소3, 권장5)
- Zookeeper에는 Leader(writes)가 있고 나머지 서버는 Follower(reads)
- Zookeeper는 분산형 Configuration 정보 유지, 분산 동기화 서비스를 제공하고 대용량 분산 시스템을 위한 네이밍 레지스트리를 제공하는 소프트웨어
- 분산 작업을 제어하기 위한 Tree 형태의 데이터 저장소 👉 Zookeeper를 사용하여 멀티 Kafka Broker들 간의 정보(변경 사항 포함) 공유, 동기화 등을 수행
- Ensemble은 Zookeeper 서버의 클러스터
Quorum(쿼럼)은“정족수”이며, 합의체가 의사를 진행시키거나 의결을 하는데 필요한 최소한도의 인원수를 뜻함- 분산 코디네이션 환경에서 예상치 못한 장애가 발생해도 분산 시스템의 일관성을 유지시키기 위해서 사용
💡 ex) Ensemble이 3대로 구성되었다면 Quorum은 2,즉 Zookeeper 1대가 장애가 발생하더라도 정상 동작
Ensemble이 5대로 구성되었다면 Quorum은 3,즉Zookeeper 2대가 장애가 발생하더라도 정상 동작
CentOS8 에서 docker-compose를 사용해서 클러스트링을 해보았다.
3개의 Zookeeper와 3개의 Broker, AKHQ라는 Broker 데이터 리소스 모니터링 툴이다.
이미지는 Confluent에서 제공하는 이미지를 사용
- etc/hosts
그림과 같이 kafka1~3까지 등록을 해준다.
- docker-compose -f [파일명.yml] up
version: '3'
services:
zookeeper-1:
hostname: zookeeper1
image: confluentinc/cp-zookeeper:6.2.0
environment:
ZOOKEEPER_SERVER_ID: 1
ZOOKEEPER_CLIENT_PORT: 12181
ZOOKEEPER_DATA_DIR: /zookeeper/data
ZOOKEEPER_SERVERS: zookeeper1:22888:23888;zookeeper2:32888:33888;zookeeper3:42888:43888
ports:
- 12181:12181
- 22888:22888
- 23888:23888
volumes:
- ./zookeeper/data/1:/zookeeper/data
zookeeper-2:
hostname: zookeeper2
image: confluentinc/cp-zookeeper:6.2.0
environment:
ZOOKEEPER_SERVER_ID: 2
ZOOKEEPER_CLIENT_PORT: 22181
ZOOKEEPER_DATA_DIR: /zookeeper/data
ZOOKEEPER_SERVERS: zookeeper1:22888:23888;zookeeper2:32888:33888;zookeeper3:42888:43888
ports:
- 22181:22181
- 32888:32888
- 33888:33888
volumes:
- ./zookeeper/data/2:/zookeeper/data
zookeeper-3:
hostname: zookeeper3
image: confluentinc/cp-zookeeper:6.2.0
environment:
ZOOKEEPER_SERVER_ID: 3
ZOOKEEPER_CLIENT_PORT: 32181
ZOOKEEPER_DATA_DIR: /zookeeper/data
ZOOKEEPER_SERVERS: zookeeper1:22888:23888;zookeeper2:32888:33888;zookeeper3:42888:43888
ports:
- 32181:32181
- 42888:42888
- 43888:43888
volumes:
- ./zookeeper/data/3:/zookeeper/data
kafka-1:
image: confluentinc/cp-kafka:6.2.0
hostname: kafka1
depends_on:
- zookeeper-1
- zookeeper-2
- zookeeper-3
environment:
KAFKA_BROKER_ID: 1
KAFKA_ZOOKEEPER_CONNECT: zookeeper1:12181,zookeeper2:22181,zookeeper3:32181
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka1:19092
KAFKA_LOG_DIRS: /kafka
ports:
- 19092:19092
volumes:
- ./kafka/logs/1:/kafka
kafka-2:
image: confluentinc/cp-kafka:6.2.0
hostname: kafka2
depends_on:
- zookeeper-1
- zookeeper-2
- zookeeper-3
environment:
KAFKA_BROKER_ID: 2
KAFKA_ZOOKEEPER_CONNECT: zookeeper1:12181,zookeeper2:22181,zookeeper3:32181
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka2:29092
KAFKA_LOG_DIRS: /kafka
ports:
- 29092:29092
volumes:
- ./kafka/logs/2:/kafka
kafka-3:
image: confluentinc/cp-kafka:6.2.0
hostname: kafka3
depends_on:
- zookeeper-1
- zookeeper-2
- zookeeper-3
environment:
KAFKA_BROKER_ID: 3
KAFKA_ZOOKEEPER_CONNECT: zookeeper1:12181,zookeeper2:22181,zookeeper3:32181
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka3:39092
KAFKA_LOG_DIRS: /kafka
ports:
- 39092:39092
volumes:
- ./kafka/logs/3:/kafka
akhq:
image: tchiotludo/akhq:latest
hostname: akhq
depends_on:
- kafka-1
- kafka-2
- kafka-3
environment:
AKHQ_CONFIGURATION: |
akhq:
connections:
kafka:
properties:
bootstrap.servers: kafka1:19092,kafka2:29092,kafka3:39092
ports:
- 8080:8080
- 디렉토리 권한
볼륨 설정을 한 경로에 권한 문제로 kafka가 종료되는 상황이 있다. (계정문제같음) 권한 변경을 통해 해결 가능
다시 kafka 컨테이너를 실행해주면 정상 작동함
- confluent설치 - 사용할 command를 제공 해줌
curl -O http://packages.confluent.io/archive/7.0/confluent-7.0.1.tar.gz tar -zxvf confluent-7.0.1.tar.gz cd confluent-7.0.1/bin
#topic 생성 ./kafka-topics --bootstrap-server localhost:19092 --create --topic test --partitions 2 --replication-factor 3 #test라는 토픽으로 producer가 메시지를 보낼 수 있는 shell이 실행됨 ./kafka-console-producer --bootstrap-server localhost:19092 --topic test #test라는 토픽에서 consumer가 메시지를 받을 수 있는 것을 볼 수 있음 ./kafka-console-consumer --bootstrap-server localhost:19092 --topic test
그림과 같이 서로 통신이 되는 것을 볼 수 있음.
./kafka-topics --describe --bootstrap-server localhost:19092 --topic test # 브로커를 29092 39092 총 3개를 운영하고 있기 떄문에 아무거나 넣어도 상관없음