2016-07-01 2 views
3

파티션에 4 개의 복제본 (리더 1 명, 팔로어 3 명)이 있으며 모두 현재 동기화되어 있다고 가정 해 보겠습니다. min.insync.replicas이 3으로 설정되고 request.required.acks이 모두 또는 -1로 설정됩니다.카프카 커밋되지 않은 메시지

생산자가 리더에게 메시지를 보내면 리더는이를 리더의 로그에 추가합니다. 그 후,이 메시지를 가져 오기 전에 두 개의 복제본이 충돌했습니다. 남아있는 복제본 하나가 메시지를 성공적으로 가져 와서 자체 로그에 추가했습니다.

리더는 특정 시간 초과 후 min.insync.replicas 조건이 충족되지 않아서 제작자에게 오류 (NotEnoughReplicas, 제 생각 엔)를 보냅니다.

내 질문은 : 리더와 복제본 로그 중 하나에 첨부 된 메시지는 어떻게됩니까?

크래시 된 복제본이 온라인 상태가되어 브로커가 새 메시지를 수락하고 커밋하기 시작하면 (즉, 높은 워터 마크가 로그에 전달됨) 소비자에게 전달됩니까?

답변

0

내 이해에서 워터 마크가 모두 실패하기 전까지는 진행되지 않습니다. 후속 브로커가 복구되어 포착했습니다.

더 자세한 내용은이 블로그 게시물을 참조하십시오 : 어떤 거기 min.insync.replicas 사용할 수 있으며 생산자가 ACK를 사용하는 경우 http://www.confluent.io/blog/hands-free-kafka-replication-a-lesson-in-operational-simplicity/

+0

브로커가 생산자와 동일한 것을 인정하지 않았음에도 메시지가 궁극적으로 소비자에게 전달됩니다. – Vikk

+0

이 경우 예. –

1

을 = 모든 다음 메시지가 최선을 다하고되지 않고 소비자 후에도, 그 메시지를받을 수 없습니다 충돌 한 복제본이 다시 돌아오고 ISR 목록에 다시 추가됩니다. 다음과 같은 방법으로 테스트 할 수 있습니다. min.insync.replicas = 2

$ ./bin/kafka-server-start.sh ./config/server-1.properties 
$ ./bin/kafka-server-start.sh ./config/server-2.properties 

시작이 브로커는 1 개 파티션 및 RF = 2 항목을 만듭니다. 두 브로커가 모두 ISR 목록에 있는지 확인하십시오.

$ ./bin/kafka-topics.sh --zookeeper zookeeper-1 --create --topic topic1 --partitions 1 --replication-factor 2 
Created topic "topic1". 
$ ./bin/kafka-topics.sh --zookeeper zookeeper-1 --describe --topic topic1 
Topic:topic1 PartitionCount:1 ReplicationFactor:2 Configs: 
     Topic: topic1 Partition: 0 Leader: 1 Replicas: 1,2 Isr: 1,2 

콘솔 소비자 및 콘솔 생산자를 실행하십시오. 생산품에 ack = -1을 사용하는지 확인하십시오.

$ ./bin/kafka-console-consumer.sh --new-consumer --bootstrap-server kafka-1:9092,kafka-2:9092 --topic topic1 
$ ./bin/kafka-console-producer.sh --broker-list kafka-1:9092,kafka-2:9092 --topic topic1 --request-required-acks -1 

메시지를 생성하십시오. 소비자는 그것을 받아야한다.

중개인 중 한 명을 죽이십시오 (id = 2 인 브로커를 죽였습니다). ISR 목록이 하나의 브로커로 축소되었는지 확인하십시오.

$ ./bin/kafka-topics.sh --zookeeper zookeeper-1 --describe --topic topic1 
Topic:topic1 PartitionCount:1 ReplicationFactor:2 Configs: 
     Topic: topic1 Partition: 0 Leader: 1 Replicas: 1,2 Isr: 1 

다시 작성하십시오. 생산자에서 일부

Error: NOT_ENOUGH_REPLICAS 

(하나 당 재시도)를 취득해야하며, 마지막으로

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

소비자는 이러한 메시지를받을 수 없습니다.

죽인 브로커를 다시 시작하고 다시 생성하십시오. 소비자는이 메시지를 수신하지만 복제본 중 하나가 다운 된 동안 보낸 메시지는 수신하지 않습니다.

관련 문제