3つのEC2インスタンスでKafkaクラスターを実行しています。各インスタンスはkafka(0.11.0.1)とzookeeper(3.4)を実行しています)。それぞれに20個のパーティションと3個のReplicationFactorがあります。
今日、一部のパーティションが3つのノードすべてへの同期を拒否していることに気付きました。次に例を示します。
bin/kafka-topics.sh --zookeeper "10.0.0.1:2181,10.0.0.2:2181,10.0.0.3:2181" --describe --topic prod-decline
Topic:prod-decline PartitionCount:20 ReplicationFactor:3 Configs:
Topic: prod-decline Partition: 0 Leader: 2 Replicas: 1,2,0 Isr: 2
Topic: prod-decline Partition: 1 Leader: 2 Replicas: 2,0,1 Isr: 2
Topic: prod-decline Partition: 2 Leader: 0 Replicas: 0,1,2 Isr: 2,0,1
Topic: prod-decline Partition: 3 Leader: 1 Replicas: 1,0,2 Isr: 2,0,1
Topic: prod-decline Partition: 4 Leader: 2 Replicas: 2,1,0 Isr: 2
Topic: prod-decline Partition: 5 Leader: 2 Replicas: 0,2,1 Isr: 2
Topic: prod-decline Partition: 6 Leader: 2 Replicas: 1,2,0 Isr: 2
Topic: prod-decline Partition: 7 Leader: 2 Replicas: 2,0,1 Isr: 2
Topic: prod-decline Partition: 8 Leader: 0 Replicas: 0,1,2 Isr: 2,0,1
Topic: prod-decline Partition: 9 Leader: 1 Replicas: 1,0,2 Isr: 2,0,1
Topic: prod-decline Partition: 10 Leader: 2 Replicas: 2,1,0 Isr: 2
Topic: prod-decline Partition: 11 Leader: 2 Replicas: 0,2,1 Isr: 2
Topic: prod-decline Partition: 12 Leader: 2 Replicas: 1,2,0 Isr: 2
Topic: prod-decline Partition: 13 Leader: 2 Replicas: 2,0,1 Isr: 2
Topic: prod-decline Partition: 14 Leader: 0 Replicas: 0,1,2 Isr: 2,0,1
Topic: prod-decline Partition: 15 Leader: 1 Replicas: 1,0,2 Isr: 2,0,1
Topic: prod-decline Partition: 16 Leader: 2 Replicas: 2,1,0 Isr: 2
Topic: prod-decline Partition: 17 Leader: 2 Replicas: 0,2,1 Isr: 2
Topic: prod-decline Partition: 18 Leader: 2 Replicas: 1,2,0 Isr: 2
Topic: prod-decline Partition: 19 Leader: 2 Replicas: 2,0,1 Isr: 2
ノード2のみがすべてのデータを同期しています。ブローカー0と1を再起動しようとしましたが、状況は改善されませんでした。さらに悪化しました。ノード2を再起動したいのですが、ダウンタイムまたはクラスター障害が発生すると想定しているため、可能であれば回避したいと思います。
ログに明らかなエラーが表示されないため、状況をデバッグする方法を理解するのに苦労しています。ヒントをいただければ幸いです。
ありがとう!
編集:いくつかの追加情報...ノード2(完全なデータを持つもの)のメトリックを確認すると、一部のパーティションが正しく複製されていないことがわかります。
$>get -d kafka.server -b kafka.server:type=ReplicaManager,name=UnderReplicatedPartitions *
#mbean = kafka.server:type=ReplicaManager,name=UnderReplicatedPartitions:
Value = 930;
ノード0と1はそうではありません。彼らはすべてが大丈夫だと思っているようです:
$>get -d kafka.server -b kafka.server:type=ReplicaManager,name=UnderReplicatedPartitions *
#mbean = kafka.server:type=ReplicaManager,name=UnderReplicatedPartitions:
Value = 0;
これは予想される動作ですか?
replica.lag.time.max.ms
を増やしてみてください。
説明は次のようになります。
レプリカがreplica.lag.time.max.ms
より長くフェッチ要求を送信できなかった場合、レプリカは停止していると見なされ、ISRから削除されます。
レプリカがリーダーからreplica.lag.time.max.ms
より長く遅れ始めた場合、レプリカは遅すぎると見なされ、ISRから削除されます。したがって、トラフィックが急増し、メッセージの大量のバッチがリーダーに書き込まれる場合でも、レプリカが常にreplica.lag.time.max.msのリーダーの後ろに留まらない限り、ISRの内外でシャッフルされません。