2017-06-23 7 views
0

カフカドキュメントのクイックスタートを試しています。リンクはhttps://kafka.apache.org/quickstartです。 私は3つのブローカーを展開してトピックを作成しました。プロデューサーをテストする: カフカ高可用性機能が動作しない

➜ kafka_2.10-0.10.1.0 bin/kafka-topics.sh --describe --zookeeper 
    localhost:2181 --topic my-replicated-topic 
    Topic:my-replicated-topic PartitionCount:1 ReplicationFactor:3 
    Configs: 
    Topic: my-replicated-topic Partition: 0 Leader: 2 Replicas: 2,0,1 
    Isr: 2,1,0 

は、それから私は、 "私の-複製され、話題を--topic 9092ビン/ kafka-console-producer.sh --brokerリストはlocalhost" を使用します。 "bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --from-beginning-topic my-replicated-topic"を使用してコンシューマをテストします。 プロデューサとコンシューマは正常に動作します。 サーバー1または2を強制終了すると、プロデューサとコンシューマは正常に動作します。

しかし、サーバー0を終了してプロデューサ端末にメッセージを入力すると、コンシューマは新しいメッセージを読み取ることができません。 私は、サーバー0、消費者の印刷ログを殺すとき:

[2017-06-23 17:29:52,750] WARN Auto offset commit failed for group console-consumer-97540: Offset commit failed with a retriable exception. You should 
retry committing offsets. 
(org.apache.kafka.clients.consumer.internals.ConsumerCoordinator) 
[2017-06-23 17:29:52,974] WARN Auto offset commit failed for group console- 
consumer-97540: Offset commit failed with a retriable exception. You should 
retry committing offsets. 
(org.apache.kafka.clients.consumer.internals.ConsumerCoordinator) 
[2017-06-23 17:29:53,085] WARN Auto offset commit failed for group console- 
consumer-97540: Offset commit failed with a retriable exception. You should 
retry committing offsets. 
(org.apache.kafka.clients.consumer.internals.ConsumerCoordinator) 
[2017-06-23 17:29:53,195] WARN Auto offset commit failed for group console- 
consumer-97540: Offset commit failed with a retriable exception. You should 
retry committing offsets. 
(org.apache.kafka.clients.consumer.internals.ConsumerCoordinator) 
[2017-06-23 17:29:53,302] WARN Auto offset commit failed for group console- 
consumer-97540: Offset commit failed with a retriable exception. You should 
retry committing offsets. 
(org.apache.kafka.clients.consumer.internals.ConsumerCoordinator) 
[2017-06-23 17:29:53,409] WARN Auto offset commit failed for group console- 
consumer-97540: Offset commit failed with a retriable exception. You should 
retry committing offsets. 
(org.apache.kafka.clients.consumer.internals.ConsumerCoordinator) 

を、私は、サーバー0、消費者の印刷メッセージを再起動し、いくつかのログ警告:

hhhh 
hello 
[2017-06-23 17:32:32,795] WARN Auto offset commit failed for group console- 
consumer-97540: Offset commit failed with a retriable exception. You should 
retry committing offsets. 
(org.apache.kafka.clients.consumer.internals.ConsumerCoordinator) 
[2017-06-23 17:32:32,902] WARN Auto offset commit failed for group console- 
consumer-97540: Offset commit failed with a retriable exception. You should 
retry committing offsets. 
(org.apache.kafka.clients.consumer.internals.ConsumerCoordinator) 

この混乱しme.Whyサーバーを0はとても特殊で、サーバー0はリーダーではありません。

と私は、サーバー0で印刷されたサーバーのログは以下のように多くの情報を持っていることに気づいた:

[2017-06-23 17:32:33,640] INFO [Group Metadata Manager on Broker 0]: Finished 
loading offsets from [__consumer_offsets,23] in 38 milliseconds. 
(kafka.coordinator.GroupMetadataManager) 
[2017-06-23 17:32:33,641] INFO [Group Metadata Manager on Broker 0]: Loading 
offsets and group metadata from [__consumer_offsets,26] 
(kafka.coordinator.GroupMetadataManager) 
[2017-06-23 17:32:33,646] INFO [Group Metadata Manager on Broker 0]: Finished 
loading offsets from [__consumer_offsets,26] in 4 milliseconds. 
(kafka.coordinator.GroupMetadataManager) 
[2017-06-23 17:32:33,646] INFO [Group Metadata Manager on Broker 0]: Loading 
offsets and group metadata from [__consumer_offsets,29] 
(kafka.coordinator.GroupMetadataManager) 

が、server1とserve2ログは、そのコンテンツを持っていません。

誰かが私のためにそれを説明することができます、ありがとう!

解決済み: _consumer-offsetsトピックのレプリケーションファクタが根本原因です。 issues.apache.org/jira/browse/KAFKA-3959

答えて

0

kafka-console-producerはデフォルトでacks = 1に設定されているため、フォールトトレラントではありません。 acks = allを設定するflagまたはconfigパラメータを追加し、topicと_consumer-offsetsの両方のトピックがレプリケーションファクタ3で作成されていれば、テストは機能します。

+0

複製因子は、topicが作成されたときに設定されるパラメータです.Producerはこのパラメータを設定する必要はありません。 –

+0

申し訳ありませんが、私はうんざりを意味します。コンソールプロデューサのデフォルトはacks = 1で、少なくとも1回は配信を保証しません。パブリッシュするときは、3つのレプリカすべてがデータを取得することを保証するために、acks = allを指定する必要があります(トピックがレプリケーションファクタ3で作成されていると仮定します)。 asks = allとreplication factor = 3を表示する私の答えを編集する必要があります –

+0

私は3つのサーバーがすべてシャットダウンした後にserver1とserver2を起動した後、レプリカファクタ2を持つ新しいトピックを作成してから、サーバー0が開始されない限り、消費者は新しいトピックのメッセージを読み取ることができません。サーバー0は非常に特殊なものであり、高可用性機能を満たしていません。それらを正しく配備しないのですか? –

0

これらのサーバーは、コンシューマーグループを管理するための負荷を共有します。

通常、それぞれの独立したコンシューマには一意のコンシューマグループIDがあり、複数のコンシューマ間で消費プロセスを分割する場合は、同じグループIDを使用します。

つまり、リーダーブローカーであること、クラスター内のKafkaサーバーでは、他のブローカーとの調整のためだけにあることです。リーダーは、現在グループIDを管理しているサーバーと(直接的に)何も関係がなく、特定の消費者のためにコミットします。

あなたが購読するたびに、グループのオフセットコミットを処理するサーバーが指定され、これはリーダー選挙とは関係ありません。

カフカクラスターが再び安定するまで(グループ管理者を他のサーバーに移動するために消費者を再配分するか、ノードが再び応答するのを待つ...)、私はエキスパートではありませんフェールオーバーがどのように起こるかを正確に伝えるのに十分です)。

+0

ありがとうございました。私はテストで1人のプロデューサーと1人の消費者しか持っていません。私がサーバー0を閉じると、私は長い時間待つ。しかし、消費者は依然としてメッセージを読むことができない。そして、3つのサーバーがすべてシャットダウンした後に初めてserver1とserver2を起動した場合、レプリカファクター2の新しいトピックを作成し、プロデューサーとコンシューマーのスクリプトを開始すると、サーバー0がない限り、消費者は新しいトピックのメッセージを読むことができません。開始しました。サーバー0は非常に特殊なものであり、高可用性機能を満たしていません。それらを正しく配備しないのですか? –

+0

サーバ0は、クラスタ内の最初のブローカ参加者です。 –

+0

これは、私がKafkaのソースコードで行った実際のチェックではなく、経験からのものです。通常、私たちは以下の原則を適用します。カフカブローカがダウンしたり再構築されると、クラスタが消費者にとって不安定になり、消費と生産(コミットを含む)の両方で障害が発生する可能性があります。 idempotence開発原則とマニュアルオフセットコミットを使用することで、消費者がクラッシュ/ハングアップするのを待つだけで、カフカサーバーが警告を出し終わったときと例外を文書化していないときはいつでもジョブが再開します。 – Fabien

関連する問題