Kafka には 3 つの非常に重要な構成パラメータがあります。acks
と min.insync.replicas
および replication factor
のうち、< a i=4> はプロデューサーの設定パラメータです。 はブローカーの設定パラメータです。これら 3 つのパラメータは、プロデューサーのデータ損失を防ぐ上で大きな役割を果たします。acks
min.insync.replicas
1. パーティションのコピー
1. Kafka のトピックはパーティション化でき、パーティションに対して複数のコピーを構成できます。この構成はreplication.factor
パラメータを通じて変更できます。
2. Kafka には、リーダー レプリカとフォロワー レプリカの 2 種類のパーティション レプリカがあります。各パーティションの作成時に、1 つのレプリカをリーダー レプリカとして選択する必要があり、残りのレプリカは自動的にフォロワー コピーになります。
3. Kafka では、フォロワー コピーは外部にサービスを提供しません。つまり、フォロワー コピーはコンシューマーやプロデューサーからの読み取りおよび書き込みリクエストに応答できません。すべてのリクエストはリーダーによって送信される必要があります。リーダー コピーがそれを処理します。つまり、すべての読み取りおよび書き込みリクエストは、リーダー コピーが配置されているブローカーに送信される必要があり、ブローカーが処理を担当します。フォロワー コピーはクライアント リクエストを処理せず、その唯一のタスクは次のとおりです。リーダー コピーから読み取りメッセージを非同期にプルし、独自のコミット ログに書き込み、リーダー レプリカとの同期を実現します。
4. Kafka のデフォルトのレプリカ係数replication.factor
は 3 です。つまり、各パーティションにはリーダー コピーが 1 つとフォロワー コピーが 2 つだけあります。詳細は次の図に示すとおりです。あ>
5. 前述したように、プロデューサー クライアントはリーダー ブローカーにのみ書き込み、フォロワーはデータを非同期にコピーします。 Kafka は分散システムであるため、リーダーとリアルタイムに同期できないリスクが避けられないため、これらのフォロワーがリーダーに追いついているかどうか、つまり、フォロワーは最新のデータを同期しました つまり、カフカは、どのような条件でフォロワーのコピーがリーダーと同期できるのかを明確に伝えたいのです。これが、後述する ISR 同期コピーのメカニズムです。
2. 同期レプリカ
1. 同期レプリカ (ISR) は同期レプリカと呼ばれ、ISR 内のレプリカはすべてリーダーと同期しているレプリカであるため、リストにないフォロワーはリーダーと同期していないと見なされます。では、ISR には何が存在するのでしょうか?どのコピーが存在するのでしょうか?まず、リーダー コピーが常に ISR に存在することは明らかであり、フォロワー コピーが ISR に存在するかどうかは、フォロワー コピーがリーダー コピーと「同期」されているかどうかによって決まります。
絶叫のヒント: 「フォロワー コピーがリーダー コピーと同期しているかどうか」についての理解は次のとおりです。
1. 上記の同期は完全な同期を意味するものではありません。つまり、フォロワー コピーがリーダー コピーとの同期に遅れを生じた場合、ISR リストから追い出されるという意味ではありません。
2. Kafka のブローカー側には、フォロワー コピーとリーダー コピー間の最大時間間隔を示すパラメーター
replica.lag.time.max.ms
があります。デフォルトは 10 秒です。これは、次のようになります。フォロワー コピーとリーダー コピー間の時間間隔が 10 秒を超えない場合、フォロワー コピーとリーダー コピーは同期していると見なすことができるため、現在のフォロワー コピーがリーダー コピーより数秒遅れている場合でも、フォロワー コピーとリーダー コピーは同期していると見なされます。メッセージがリーダー コピーに 10 秒以内に追いつく限り、追い出されることはありません。
3. フォロワー コピーが ISR リストから追い出された場合、リーダー コピーの進行状況に追いつくと、再び ISR リストに追加されるため、ISR は動的リストであり、静的ではありません。
2. 上の図に示すように、Broker3 のパーティション 1 コピーは指定時間を超え、リーダー コピーと同期していないため、ISR リストから除外されます。この時点の ISR は [1,3] です。
3. acks確認メカニズム
1. acks パラメータは、プロデューサがメッセージが正常に書き込まれたとみなす前に、メッセージを受信する必要があるパーティション レプリカの数を指定します。このパラメータは、メッセージが失われるかどうかに関して重要な役割を果たします。このパラメータの構成は次のとおりです。
- acks=0 は、プロデューサーがメッセージを正常に書き込む前にサーバーからの応答を待たないことを意味します。つまり、問題が発生してサーバーがメッセージを受信しないと、プロデューサーはメッセージを知る方法がありません。構成変更時にサーバーからの応答を待つ必要がないため、ネットワークがサポートする最大速度でメッセージを送信でき、非常に高いスループットを実現します。
- acks=1 は、クラスターのリーダー パーティション コピーがメッセージを受信している限り、成功した応答 ack をプロデューサーに送信することを意味します。この時点で、プロデューサーは ack を受信した後、メッセージが正常に書き込まれたとみなすことができます。メッセージをリーダー パーティション コピーに書き込むことができない場合 (ネットワーク上の理由、リーダー ノードのクラッシュなど)、プロデューサーはエラー応答を受信します。プロデューサーがエラー応答を受信すると、データ損失を避けるために、データはこのメソッドのスループットは、非同期送信が使用されるか同期送信が使用されるかによって異なります。
重大なヒント: プロデューサがエラー応答を受信した場合、メッセージが再送信されてもデータ損失が発生する可能性があります。たとえば、メッセージを受信していないノードが新しいリーダーになった場合、メッセージは失われます。
- acks =all は、レプリケーションに参加しているすべてのノード (ISR リストのコピー) がメッセージを受信した場合にのみ、プロデューサーがサーバーから応答を受信することを意味します。このモードは最高レベルで最も安全であり、ブローカー以上のものを保証します。このモードでは待ち時間が長くなります。
4. 最小限の同期コピー
1. 上で述べたように、acks=all の場合、成功した応答をプロデューサーに送信する前に、すべてのレプリカを同期する必要があります。実際、ここには問題があります: リーダー レプリカが唯一の同期レプリカである場合はどうなるでしょうか?これは acks=1 と同等であるため、安全ではありません。
2. Kafka のブローカー側はパラメータmin.insync.replicas
を提供します。このパラメータは、メッセージが「実際の書き込み」とみなされる前に書き込まれるコピーの最小数を制御します。値のデフォルトは 1 です。実稼動環境を 1 より大きい値に設定すると、メッセージの耐久性が向上します。同期されたレプリカの数が構成された値よりも少ない場合、プロデューサはエラー応答を受信するため、メッセージが失われていないことを確認します。
4.1、ケース1
1. 以下の図に示すように、min.insync.replicas=2 および acks=all の場合、ISR リストに [1,2] しかない場合、3 は ISR リストから追い出されます。 2 つのレプリカが同期され、プロデューサーは成功の応答を受け取ります。
4.2、ケース2
1. 下図のように、min.insync.replicas=2の場合、ISRリストに[1]しかない場合、2と3がISRリストから追い出され、acks=allの場合、番号を書き込むことができません。成功; acks= 0 または acks=1 の場合、データは正常に書き込まれます。
4.3、ケース3
1. この状況は誤解を招きやすいため、acks=all および min.insync.replicas=2 で、ISR リストが [1,2,3] の場合、すべての同期レプリカがメッセージを同期するまで待機します。成功した応答の ack をプロデューサーに送信します。min.insync.replicas=2 は最小限の制限にすぎないため、つまり、同期レプリカが構成された値より小さい場合、例外がスローされ、acks=all が必要です。すべての ISR が正常な応答を送信できるのは、リストのすべてのコピーが同期されている場合のみであることを確認します。
5. まとめ
-
acks=0 を指定すると、プロデューサーはメッセージを正常に書き込む前にサーバーからの応答を待機しません。
-
acks=1 の場合、クラスターのリーダー パーティション コピーがメッセージを受信している限り、成功した応答の ack がプロデューサーに送信されます。
-
acks=all。これは、レプリケーションに参加しているすべてのノード (ISR リストのコピー) がメッセージを受信した場合にのみ、プロデューサーがサーバーから応答を受信することを意味します。このとき、ISR 同期の数がコピー数が未満です。値が
min.insync.replicas
の場合、メッセージは書き込まれません。
元のアドレス:Kafka プロデューサー ACK メカニズムの分析