인프런 커뮤니티 질문&답변

김대호님의 프로필 이미지
김대호

작성한 질문수

[아파치 카프카 애플리케이션 프로그래밍] 개념부터 컨슈머, 프로듀서, 커넥트, 스트림즈까지!

kafka-console-consumer.sh

현재 진도까지의 test topic에 대해서 질문있습니다

작성

·

882

0

좋은 강의 만들어주셔서 감사합니다.
 
test라는 토픽은 ReplicaFactor가 1이고 insync가 2인 상태입니다.
 
저는 이 설정이 에러가 안터지는것도 왜인지 궁금했습니다.
 
복제본의 갯수가 insync replica숫자보다 낮으면 insync 파티션갯수가 워터마크 복제 요구치보다 낮을텐데 그럼 해당 토픽에 들어간 데이터는 영영 볼수없는건가 라고 생각했기 때문입니다.
 
그래도 정상적으로 consume할수있는것은 카프카가 내부에서 파티션갯수와 insync갯수의 max값을 비교하는 로직을 통해 조정해서 작동하고있는것으로 생각해도 괜찮을까요?

답변 1

1

데브원영 DVWY님의 프로필 이미지
데브원영 DVWY
지식공유자

김대호님 답변드립니다.

1) test 토픽이 RF=1, min.insync.replicas=2 가 에러가 아닌 이유

min.insync.replicas는 acks=all(-1)옵션인 프로듀서가 해당 토픽에 레코드를 전송할 때 체크하는 최소 복제 단위 옵션이기 때문에 생성 자체로는 에러가 나지 않습니다. 그렇기 때문에 프로듀서가 acks=all(-1)로 해당 토픽에 전송시에 에러가 나는 모습을 보실 수 있습니다.

$ bin/kafka-console-producer.sh --bootstrap-server my-kafka:9092 --topic test --request-required-acks -1
>a
[2022-07-24 12:40:13,377] WARN [Producer clientId=console-producer] Got error produce response with correlation id 12 on topic-partition test-0, retrying (2 attempts left). Error: NOT_ENOUGH_REPLICAS (org.apache.kafka.clients.producer.internals.Sender)
[2022-07-24 12:40:13,493] WARN [Producer clientId=console-producer] Got error produce response with correlation id 13 on topic-partition test-0, retrying (1 attempts left). Error: NOT_ENOUGH_REPLICAS (org.apache.kafka.clients.producer.internals.Sender)
[2022-07-24 12:40:13,597] WARN [Producer clientId=console-producer] Got error produce response with correlation id 14 on topic-partition test-0, retrying (0 attempts left). Error: NOT_ENOUGH_REPLICAS (org.apache.kafka.clients.producer.internals.Sender)
[2022-07-24 12:40:13,702] ERROR Error when sending message to topic test with key: null, value: 0 bytes with error: (org.apache.kafka.clients.producer.internals.ErrorLoggingCallback)
org.apache.kafka.common.errors.NotEnoughReplicasException: Messages are rejected since there are fewer in-sync replicas than required.

2) 컨슈머는 min.insync.replicas=2 옵션을 충족하지 못하는 워터마크 때문에 토픽에서 데이터를 못가져 오는 것인가?

기본적으로 default 옵션일 경우 컨슈머는 min.insync.replicas 기준으로 레코드를 가져오는 것이 아니라 리더 파티션에 존재하는 레코드를 기준으로 컨슘을 진행합니다. 

(이 부분은 강의 수정하였습니다.)

김대호님의 프로필 이미지
김대호

작성한 질문수

질문하기