2016-07-01 14 views
3

Lässt sagen, die Partition hat 4 Replikate (1 Führer, 3 Anhänger) und alle sind derzeit synchron. min.insync.replicas ist auf 3 eingestellt und request.required.acks ist auf all oder -1 eingestellt.Kafka nicht committed Nachrichten

Der Produzent sendet eine Nachricht an den Anführer, der Anführer fügt sie dem Protokoll hinzu. Danach stürzten zwei der Replikate ab, bevor sie diese Nachricht abrufen konnten. Ein verbleibendes Replikat hat die Nachricht erfolgreich abgerufen und an ihr eigenes Protokoll angehängt.

Der Leader, nach bestimmten Timeout, wird einen Fehler (NotEnoughReplicas, denke ich) an den Hersteller senden, da min.insync.replicas Bedingung nicht erfüllt ist.

Meine Frage ist: Was wird mit der Nachricht geschehen, die an den Führer und eine der Logs des Replikats angehängt wurde?

Wird es an die Verbraucher geliefert, wenn abgestürzte Replikate wieder online gehen und der Broker neue Nachrichten akzeptiert und festlegt (d. H. Hohe Wasserzeichen werden im Protokoll weitergeleitet)?

Antwort

1

Wenn es keine min.insync.replicas verfügbar ist und Produzent verwendet ack = alle, dann wird die Nachricht nicht verpflichtet und Verbraucher wird diese Nachricht nicht erhalten, auch nach abgestürzte Replikate kommen zurück und werden erneut zur ISR-Liste hinzugefügt. Sie können dies auf folgende Weise testen.

starten zwei Makler mit min.insync.replicas = 2

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

erstellen Thema mit 1 Partition und RF = 2. Stellen Sie sicher, dass sich beide Broker in der ISR-Liste befinden.

$ ./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 

Konsole Console-Hersteller und Konsole ausführen. Stellen Sie sicher, dass das Produkt ack = -1 verwendet

$ ./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 

Produzieren Sie einige Nachrichten. Der Verbraucher sollte sie erhalten.

Töten Sie einen der Makler (Ich tötete Broker mit ID = 2). Überprüfen Sie, dass die ISR-Liste auf einen Broker reduziert ist.

$ ./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 

Versuchen Sie erneut zu produzieren. In dem Hersteller sollten Sie einige

Error: NOT_ENOUGH_REPLICAS 

(eine pro Wiederholungs) und schließlich

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

Consumer nicht erhalten diese Nachrichten bekommen.

Starten Sie den getöteten Broker neu und versuchen Sie erneut zu produzieren. Der Kunde erhält diese Nachricht, aber nicht die Nachricht, die Sie gesendet haben, als eines der Replikate ausgefallen ist.

Verwandte Themen