Offsets in Zookeeper oder Kafka gespeichert?

8

Ich bin ein wenig verwirrt darüber, wo Offsets gespeichert sind, wenn man Kafka und Zookeeper benutzt. Offsets scheinen in manchen Fällen in Zookeeper gespeichert zu sein, in anderen Fällen sind sie in Kafka gespeichert.

Was bestimmt, ob der Offset in Kafka oder in Zookeeper gespeichert ist? Und was für Vor- und Nachteile?

NB: Natürlich könnte ich den Offset auch in einem anderen Datenspeicher speichern, aber das ist nicht Teil des Bildes für diesen Beitrag.

Einige weitere Details zu meinem Setup:

  • Ich führe diese Versionen aus: KAFKA_VERSION="0.10.1.0", SCALA_VERSION="2.11"
  • Ich verbinde mich mit Kafka / Zookeeper über den kafka-Knoten meiner NodeJS-Anwendung.
Nikola Schou 14.12.2016, 07:46
quelle

2 Antworten

21

Ältere Versionen von Kafka (vor 0.9) speichern Offsets nur in ZK, während neuere Versionen von Kafka standardmäßig Offsets in einem internen Kafka-Thema mit dem Namen __consumer_offsets speichern (neuere Version könnte aber trotzdem zu ZK gehen).

Der Vorteil der Übertragung von Offsets an den Broker besteht darin, dass der Kunde nicht von ZK abhängig ist und Clients daher nur mit Brokern sprechen müssen, was die Gesamtarchitektur vereinfacht. Auch bei großen Bereitstellungen mit vielen Verbrauchern kann ZK zu einem Engpass werden, während Kafka diese Last problemlos verarbeiten kann (das Verpflichten von Offsets ist dasselbe wie das Schreiben zu einem Thema und Kafka skaliert hier sehr gut - tatsächlich standardmäßig __consumer_offsets wird mit 50 Partitionen IIRC erstellt.

Ich bin nicht vertraut mit NodeJS oder kafka-Knoten - es hängt von der Client-Implementierung ab, wie Offsets festgeschrieben sind.

Lange Rede, kurzer Sinn: Wenn Sie die Broker 0.10.1.0 verwenden, können Sie Offsets für das Thema __consumer_offsets festlegen. Aber es hängt von Ihrem Client ab, ob er dieses Protokoll implementiert.

Genauer gesagt, hängt es von Ihrer Broker- und Client-Version (und welcher Consumer-API, die Sie verwenden) ab, da ältere Clients mit neueren Brokern sprechen können. Zuerst müssen Sie die Broker- und Client-Version 0.9 oder größer haben, um Offsets in die Kafka-Themen schreiben zu können. Wenn jedoch ein älterer Client eine Verbindung zu einem 0.9 -Makler herstellt, werden weiterhin Offsets an ZK übergeben.

Für Java-Konsumenten:

Es hängt davon ab, was der Verbraucher benutzt: Vor 0.9 gibt es zwei "alte Verbraucher", nämlich "High-Level-Consumer" und "Low-Level-Consumer". Beide legen Offsets direkt an ZK fest. Seit 0.9 wurden beide Verbraucher zu einem einzigen Verbraucher zusammengeführt, der als "neuer Verbraucher" bezeichnet wird (er vereinheitlicht im Wesentlichen die niedrigen und hohen APIs beider alten Verbraucher - das heißt, in 0.9 gibt es drei Arten von Verbrauchern). Der neue Verbraucher verpflichtet sich, den Brokern (dh dem internen Kafka-Thema) einen Ausgleich zu gewähren.

Um das Upgrade zu erleichtern, gibt es auch die Möglichkeit, Offsets mit alten Consumern zu "committen" (ab 0.9 ). Wenn Sie dies über dual.commit.enabled aktivieren, werden Offsets an ZK und das __consumer_offsets -Thema übergeben. Dadurch können Sie von der alten Consumer-API zur neuen Consumer-API wechseln, während Sie Offsets von ZK nach __consumer_offsets topic verschieben.

    
Matthias J. Sax 14.12.2016, 19:40
quelle
1

Alles hängt davon ab, welchen Verbraucher Sie verwenden. Sie sollten den richtigen Verbraucher basierend auf Ihrer Kafka-Version auswählen.

für die Version 0.8 Broker verwenden HighLevelConsumer . Die Offsets für Ihre Gruppen sind in zookee gespeichert.

Für Broker 0.9 und höher sollten Sie das neue ConsumerGroup verwenden. Die Offsets werden bei Kafka-Brokern gespeichert.

Beachten Sie, dass HighLevelConsumer weiterhin mit Versionen nach 0.8 funktioniert, aber in 0.10.1 nicht mehr unterstützt wird und die Unterstützung wahrscheinlich bald wieder verschwindet. Das ConsumerGroup verfügt über rollierende Migrationsoptionen, um den Wechsel von HighLevelConsumer zu erleichtern, wenn Sie dazu verpflichtet waren, es zu verwenden.

    
Xiaoxin 19.01.2017 19:45
quelle