[Kafka][Error] Messages are rejected since there are fewer in-sync replicas than required

Joney의 SW 공부 블로그·2023년 10월 16일
0

Kafka study

목록 보기
4/4

배경

Kafka 구축 후, Producer가 데이터를 송신할 때, 아래와 같은 error가 발생하는 경우가 있다.

Messages are rejected since there are fewer in-sync replicas than required

원인

Kafka 토픽은 replication을 하는데(정확히는 파티션을 replication함), Producer가 송신한 데이터가 몇 개의 replica까지 보장할건지 설정할 수 있다. (acks로 설정)

acks=all # 기본값

acks는 ISR의 팔로워로부터 데이터에 대한 ack를 어디까지 기다릴지를 설정하는건데, 예를 들어 all로 설정하면, Kafka에서 설정한 min.insync.replicas만큼 replication이 성공해야 송신이 성공된다.

min.insync.replicas는 최소 replication 숫자를 설정해주는 건데, replication을 하는 팔로워를 어디까지 보장할지를 설정해주는 부분이다.

min.insync.replicas=2

예를 들어 1로 하게 되면, 리더만 데이터를 받고 팔로워가 replication을 하는거는 보장하지 않는다. 데이터 유실이 염려되면 1로 설정하지 않는 것이 좋다.

해당 error가 발생하는 원인은 replica factor보다 min.insync.replicas가 커서 발생하는 문제였다.


해결

브로커 수와 replica factor, 메시지 송신 보장 정도를 고려하여, min.insync.replicas를 적절하게 설정해주면 된다.

cli로 설정하는 방법

kafka-configs.sh --bootstrap-server {bootstrap_server} --alter --entity-type topics --entity-name {topic_name} --add-config min.insync.replicas={num}

권장 설정

Kafka에서는 브로커 3개와 replica factor를 3으로 설정할 것을 권장하고 있다.한 브로커가 리더를 맡고 나머지는 replica를 하는 형태이다.

여기서 min.insync.replicas 설정은 2를 권장하고 있는데, 그 이유는 Producer는 acks를 all로 설정하기를 권장하는데, min.insync.replicas가 3이게 되면, 하나의 브로커가 다운되게 되면 Producer는 다운된 브로커가 다시 기동할 때까지 데이터를 송신할 수 없게 되고 시스템이 멈추기 때문이다.

profile
SW 지식 노트 블로그

0개의 댓글