본문 바로가기

공부방/Kafka

Kafka

zookeeper -> kafka 실행

# 
kafka-topics --bootstrap-server 192.168.56.101:9092

# topic 생성
kafka-topics --bootstrap-server localhost:9092 --create --topic test_topic_01

# 9092 브로커에 생성 되어있는 topic들을 확인할 수 있다.
kafka-topics --bootstrap-server localhost:9092 --list

# partition 3개를 가지는 topic을 만든다.
kafka-topics --bootstrap-server localhost:9092 --create --topic test_topic_02 --partitions 3

# topic의 정보를 살펴봄?
kafka-topics --bootstrap-server localhost:9092 --describe --topic test_topic_02

kafka-topics --bootstrap-server localhost:9092 --create --topic test_topic_03 --partitions 3 --replication-factor 2

# default partiont의 개수는 1개 (설정 확인 방법)
cd $CONFLUENT_HOM/etc/kafka
vi server.properties
설정값이 지정되어 있는 것을 확인할 수 있음
num.partitions=1

## 로그가 저장되는 곳
cd $CONFLUENT_HOM/etc/kafka
vi server.properties
설정값이 지정되어 있는 것을 확인할 수 있음
log.dirs

# topic 삭제
kafka-topics --bootstrap-server localhost:9092 --delete --topic test_topic_02

cd $CONFLUENT_HOME/bin

# topic 생성
kafka-topics --bootstrap-server localhost:9092 --create --topic test-topic

# 브로커로 
kafka-console-producer --bootstrap-server localhost:9092 --topic test-topic
>> 메세지 발송 가능
>> aaa

# 컨슈머로 받아오기
kafka-console-consumer --bootstrap-server localhost:9092 --topic test-topic
>> 값이 안나옴

# 컨슈머 환경설정
값이 나오게 하려면 컨슈머 환경 파라미터를 이해할 필요가 있다.
auto.offset.reset 이라는 환경 설정이 존재
consumer에는 많은 환경 파라미터가 존재
auto.offset.reset Consumer가 Topic에 처음 접속하여 message를 가져올 때 
가장 오래된 처음 offset 부터 가져올 것인지 (broker message offset) (--from-beginning) 
가장 최근인 마지막 offset부터 가져올 것인지를 설정하는 파라미터 ()

# 가장 처음 메세지 부터 가지고 옴
kafka-console-consumer --bootstrap-server localhost:9092 --topic test-topic --from-beginning

serialize => send할 때 객체 직렬화 (Serialize) byte 코드로 변환
partitional => broker로 보낼 때 여러개의 파티션이 있다면 어떤 파티션으로 갈지 파티션을 결정하는 단계

broker는 serialized된 byte code만 받는다. (byte array)

 

 

Partitional

Prodcer를 통해 메세지 전송시 토픽의 어떤 파티션으로 전송 할지 결정하는 로직

라운드 로빈 (Round Robin) : 파티션 별로 순차적 전송

 

Topic이 여러 개의 파티션을 가질 때 메세지의 전송 순서가 보장되지 않은 채로 Consumer에서 읽혀질 수 있음

전송 순서를 보장하려면 partition을 하나로 사용해야 한다.

multipartition일 때는 전송 순서를 보장하지 않는다! (분산 시스템이기 때문에, 속도 보장)

 

1. 메세지 key는 업무 로직이나 메세지 Produce/Consume시 분산 성능 영향을 고려하여 생성.

2. 특정 key 값을 가지는 메시지는 특정 파티션으로 고정되어 전송됨

3. 특정 key 값을 가지는 메세지는 단일 파티션 내에서 전송 순서가 보장되어 consumer에서 읽혀짐

key값의 hashing 알고리즘을 통과시켜서 어떤 partition으로 갈 것인지 고정시킬 수 있다.

 

key: 01, 03은 partition#0 으로 key 02: partition #1로 이동

 

실습

// producer
kafka-console-producer --bootstrap-server localhost:9092 --topic test-topic --property key.separator=: --property parse.key=true

// consumer
kafka-console-consumer --bootstrap-server localhost:9092 --topic test-topic --property print.key=true --property print.value=true --from-beginning

 

 

# kafka topic 생성
kafka-topics --bootstrap-server localhost:9092 --create --topic multipart-topic --partitions 3

# kafka topic 확인
kafka-topics --bootstrap-server localhost:9092 --describe --topic multipart-topic

# kafka producer 수행
kafka-console-producer --bootstrap-server localhost:9092 --topic multipart-topic

# kafka consumer 수행
kafka-console-consumer --bootstrap-server localhost:9092 --topic multipart-topic

# kafka consume 처음부터 수행
 kafka-console-consumer --bootstrap-server localhost:9092 --topic multipart-topic --from-beginning
# 순서가 보장 안되는 것을 알 수 있다.

# partition 정보를 같이 출력하도록
kafka-console-consumer --bootstrap-server localhost:9092 --topic multipart-topic --from-beginning --property print.partition=true

 

 

# key를 가지는 메세지 전송
kafka-console-producer --bootstrap-server localhost:9092 --topic multipart-topic --property key.separator=: --property parse.key=true

# key를 가지는 메세지 읽어드림
kafka-console-consumer --bootstrap-server localhost:9092 --topic multipart-topic --from-beginning --property print.key=true --property print.value=true --property print.partition=true

 

# producer를 이용하여 메세지를 보내보자

동일한 key는 동일한 partition에 할당되는 것을 확인할 수 있다.

 

 

# key가 없을때 메세지를 partition에 분배하는 전략

key값을 가지지 않을때 전략을 확인해보자

round robin, sticky 전

 

 

batch는 여러개의 message로 구성되어 있음

batch level 로 보내게됨

 

라운드 로빈 (Round Robin) - Kafka 2.4 버전 이전 기본 파티션 분배 전략

스티키 파티셔닝 (Sticky Partitioning) - Kafka 2.4 버전부터 기본 파티션 분배 전

 

# RoundRobin

메세지를 최대한 파티션에 균일하게 분배하는 전략

메세지 배치를 순차적으로 다른 파티션으로 전송

batch.size : 배치의 사이즈 만큼 메세지가 차면 발송

linger.ms : 시간이 되면 발송

 

문제점

메세지가 배치 데이터를 빨리 채우지 못하면서 전송이 늦어지거나 배치를 다 채우지 못하고 전송하면서 전송 성능이 떨어지는 문제 발생

 

# 스티키 파티셔닝

라운드 로빈의 성능을 개선하고자 특정 파티션으로 전송되는 하나의 배치에 메세지를 빠르게 채워 보내는 방식

배치를 채우지 못하고 전송을 하거나 배치를 채우는데 시간이 너무 오래 걸리는 문제를 개선

 

# 파일을 이용하여  메세지 보내보기

load.log 파일을 만든다

touch load.log
for i in {1..2000}
> do
> echo "test nonkey message sent test00000000000000000 $i" >> load.log
> done

consumer 실행

kafka-console-consumer --bootstrap-server localhost:9092 --topic multipart-topic --property print.partition=true

 

producer 실행

kafka-console-producer --bootstrap-server localhost:9092 --topic multipart-topic < load.log

 

# Consumer Group과 Consumer

모든 Consumer들은 단 하나의 Consumer Group에 소속되어야 함

파티션의 레코드들은 단 하나의 Consumer 에게만 할당

일반적으로 partition의 수 만큼 consumer의 수를 맞춰준다.

partition이 많을 수록 병렬적으로 분산 처리를 할 수 있는데 Consumer가 1개만 있으면 의미가 없기 떄문이다.

 

Consumer Group 내에 Consumer 변화가 있을 시 마다 파티션과 Consumer의 조합을 변경하는 Rebalancing 발생

 

case1 : Consumer 1개 증가할 경우

case2: Partition의 수 만틈 Consumer의 수가 맞춰져 있을 때

 

동일한 Consumer Group 내의 Consumer들은 작업량을 최대한 균등하게 분배

서로 다른 Consumer Group의 Consumer들은 분리되어 독립적으로 동작

 

'공부방 > Kafka' 카테고리의 다른 글

kafka-dump-log 명령어로 로그 파일의 메세지 내용 확인  (0) 2023.05.13
Kafka config 구분 및 이해  (0) 2023.05.13
Consumer group 과 Rebalancing 실습  (0) 2023.05.13
kafka  (0) 2023.05.01