KafkaとZookeeperを使用すると、オフセットが保存される場所について少し混乱します。オフセットはZookeeperに保存される場合と、Kafkaに保存される場合があります。
オフセットがKafkaまたはZookeeperに格納されているかどうかを決定するものは何ですか?そして、長所と短所は何ですか?
NB:もちろん、オフセットを別のデータストアに自分で保存することもできますが、それはこの投稿の写真の一部ではありません。
私のセットアップに関するいくつかの詳細:
古いバージョンのKafka(pre 0.9)はZKのみにオフセットを格納しますが、新しいバージョンのKafkaは、デフォルトで内部にKafka= __consumer_offsets
というトピックにオフセットを格納します。新しいバージョンでもZKにコミットする可能性があります)。
オフセットをブローカーにコミットする利点は、コンシューマーがZKに依存しないため、クライアントがブローカーと通信するだけでよいため、アーキテクチャ全体が簡素化されることです。また、多くの消費者がいる大規模な展開では、ZKがボトルネックになる可能性がありますが、Kafkaはこの負荷を簡単に処理できます(オフセットのコミットはトピックへの書き込みとKafkaは非常によくスケーリングします-実際には、デフォルトで__consumer_offsets
は50パーティションで作成されます(IIRC)。
私はNodeJSやkafka-nodeに精通していません-オフセットのコミット方法はクライアントの実装に依存します。
簡単に言えば、ブローカー0.10.1.0
を使用すると、トピック__consumer_offsets
にオフセットをコミットできます。ただし、このプロトコルを実装する場合は、クライアントに依存します。
より詳細には、古いクライアントは新しいブローカーと通信できるため、ブローカーとクライアントのバージョン(および使用しているコンシューマーAPI)に依存します。最初に、オフセットをKafka=トピックに書き込むことができるように、ブローカーとクライアントのバージョン0.9
以上が必要です。しかし、古いクライアントが0.9
ブローカーに接続している場合、オフセットをコミットしますZKへ。
Javaコンシューマ:
それは消費者が使用しているものに依存します:0.9より前には、2つの「古い消費者」、すなわち「高レベル消費者」と「低レベル消費者」があります。両方とも、オフセットを直接ZKにコミットします。 0.9
以降、両方のコンシューマーは「新しいコンシューマー」と呼ばれる単一のコンシューマーにマージされました(基本的に、古いコンシューマーの低レベルAPIと高レベルAPIを統合します。つまり、0.9
には3つのタイプのコンシューマーがあります)。新しいコンシューマーは、ブローカーにオフセットをコミットします(つまり、内部Kafkaトピック)
アップグレードを容易にするために、古いコンシューマを使用してオフセットを「二重コミット」する可能性もあります(0.9
時点)。 dual.commit.enabled
でこれを有効にすると、オフセットはZKと__consumer_offsets
トピックにコミットされます。これにより、オフセットをZKから__consumer_offsets
トピックに移動しながら、古いコンシューマーAPIから新しいコンシューマーAPIに切り替えることができます。
それはすべて、どのコンシューマを使用しているかによって異なります。 Kafka=バージョンに基づいて適切なコンシューマーを選択する必要があります。
バージョン0.8
ブローカーはHighLevelConsumer
を使用します。グループのオフセットは、zookeeperに保存されます。
ブローカーの場合0.9
以上では、新しいConsumerGroup
を使用する必要があります。オフセットはkafka=ブローカーで保存されます。
HighLevelConsumer
は0.8以降のバージョンでも引き続き動作しますが、0.10.1
そして、サポートはおそらくすぐになくなるでしょう。 ConsumerGroup
には、使用をコミットした場合にHighLevelConsumer
からの移行を支援するローリング移行オプションがあります。