構成メッセージを失うことなく、カフカのプロデューサー

最終的にはカフカはオンライン多くは、この質問に答える前に、私たちは明確でなければならないと言って?データ(データの損失)を失うことになる「責任の境界。」いわゆる責任は、生産と消費の完全なプロセスでメッセージの境界を決定することであることを確認し、それが失われないようにするために責任がある人です。メッセージが失われても実際にそこにあれば、それは明らかに体の責任である、と改良や調整を行うことができます。

責任の上に描かれ、実際には、公式には非常に明確な答えを与えられています。

公表されたメッセージがコミットされたら、それは、このメッセージは、「生きている」遺骨を書かれていた先のパーティションを複製限り1つのブローカーとして失われることはありません。

我々は完全にこの文を理解していれば、その後、質問「のメッセージが失われているかどうかは、」自己を解消することができます。この文には、2つの重要なポイントがあります。

  1. コミット:カフカは唯一の保証配信を作った(配信保証)メッセージに提出されました、メッセージが正常に送信されていないカフカは、その公約しません

  2. 生きている:限り、ブローカーのまだ生きている(生きている)のメッセージが失われていない保存するニュース記事があるとして

カフカは(生きている)ブローカーが生きているどのようにそれを定義しますか?非常に単純なだけでなく、二つの条件:

  1. ノードのプロセスは存続しなければならない、と飼育係とのセッションを維持しています

  2. ノードは、フォロワである場合、それは遠くないスケジュール・リーダー・ノードの背後にあること、メッセージの差のリーダーを有するノードの数が多すぎることができないです。カフカの観点によれば、このノードが従動ISRでなければならない場合(で同期レプリカ、即ちレプリカノードリーダーと同期)

もちろん、私は個人的にとてもデフォルトの設定とバグの一部とはまだ原因がカフカ上記必ずしも百パーセントを達成することができませんでしたが、この記事の設定によって、ほとんどのケースでは、あなたが何のニュースもしない支援することであることを保証することが分かっていないため、ということに疑いはありません損失。

大丈夫、シリアはさらに直接的な構成で、ADO。以下のパラメータのリストとベストプラクティスは、より優れた永続的なデータを確保することができます(もちろん、トレードオフ、スループットを犠牲にして)。

  • block.on.buffer.full =真

  • ACKを=すべて

  • 再試行= MAX_VALUE

  • max.in.flight.requests.per.connection = 1

  • 使用KafkaProducer.send(レコード、コールバック)

  • いかなるメッセージのみ送信コールバックメソッドを使用すると、失われることが意図されていない場合、無障害場合にも問題を確保するために、次いで、プロデューサは失敗コールバックロジックの場合に直ちに閉鎖されなければならない:閉じる(0)

  • unclean.leader.election.enable =偽

  • replication.factor = 3

  • min.insync.replicas = 2

  • replication.factor> min.insync.replicas

  • enable.auto.commit =偽

  • 手動の変位、その後、メッセージ処理の完了後に提出された変位を提出

それでは、なぜデータが失われます。

1.プロデューサー端

Kafka0.9が正式にJavaバージョンのプロデューサーを使用してScalaのプロデューサーの古いバージョンを置き換える - この記事は、カフカ0.9バージョンの後にプロデューサーを説明します。

背景送信者IOスレッドが緩衝地帯をスキャンし続ける一方でKafkaProducer.sendだけで、バッファ(すなわちRecordAccumulator、基本的にキャッシュレコードにキューを使用して)にメッセージを入れるように、新しいバージョンでは、デフォルトでは非同期配信メカニズムを使用していますバッチの条件を満たした後、送信するメッセージのカプセル化。明らかに、このプロセスは、データ損失の窓を持っています:クライアント側に送信する前にIOスレッドがハングアップした場合は、アキュムレータに蓄積されたデータが失われる可能性が持っていません。しかし、明らかに、これはカフカは、すべての後に、メッセージが正常に送信されていない、それはまだカフカによって引き継がれていない、ことを保証する責任の境界内に作られたではありません。しかし、上記のリスト中のいくつかのパラメータは、まだあなたがこの場合のデータの損失を回避できます。

もう一つの問題は、プロデューサースクランブルメッセージの問題です。クライアントコードが順次同じパーティションに次の2つのステートメントのメッセージて送信を実行すると仮定

producer.send(RECORD1)。
producer.send(RECORD2)。

このとき、(そのような一時的なネットワーク・ジッタ等の)何らかの理由の結果が正常に送信されていないRECORD1場合、一方カフカ1よりリトライメカニズム及び構成max.in.flight.requests.per.connectionの大きい(デフォルト値は、本来5 1より大きい)の後、次いで、リトライがスクランブルメッセージをもたらす、わずかRECORD2後パーティションに成功し、RECORD1をRECORD1。はるかに強い一定の要件は、シーンの順番は、このような状況のために許可されていないことを確認します。

これら二つの質問のプロデューサーを考えると、どのように我々はそれを避ける必要がありますか?非同期送信データが失われる可能性がありますので、私は同期伝送が常に正しいことができます変更:情報の損失の問題のために、プログラムはこれがあると考えるのは簡単ですか!このように:

producer.send(レコード)に.get();

だから、それはするが、パフォーマンスは悪くなる、そのような使用はお勧めできません。そのため、意図的に構成リストをまとめました。個人的に私は、構成リストが起こってからデータの損失に生産終了を回避するために:(ここに説明し、より良いことができるはずだと思い、意思決定ソフトウェア構成の多くは、トレードオフになっている、次のような構成も例外ではありません。これらの構成のアプリケーション、あなたかもしれません)あなたのプロデューサ/コンシューマスループットが高いデータセキュリティと引き換えにあなたのため、これは正常です、低下する発見

  • block.on.buffer.full = trueパラメータ0.9.0.0これはプロデューサーがバッファされるまで待たなければならないので、ということなので、ここではそれが明示的にtrueに設定されている、「非推奨」としてマークされますが、その意味の観点から非常に直感的なされてきたがそれが利用可能になります。緩衝地帯の生産や生産の早すぎる枯渇した場合、プロデューサーは、例外がスローされます

  • ACK =すべてはよく理解し、私たちは「コミット」であること、成功したメッセージの提出とみなされているすべてのフォロワーに対応するために持っています

  • 再試行= MAX無限の再試行、あなたが実現するまで、問題があります

  • max.in.flight.requests.per.connection =クライアントの要求に対する非制限応答の数は、単一の接続を介して送信することができます。この値は、もはや同じブローカーが応答要求の前にリクエストを送信することができますセットカフカブローカークライアントによって表されます。

  • 使用KafkaProducer.send(レコード、コールバック)が代わりに、メッセージ処理ロジックの送信失敗をカスタマイズする(レコード)コールバックメソッドを送信します

  • 好ましくは、コールバックロジック明示的に近いproducer.close(0)注:このパラメータは、スクランブルされたメッセージを回避するために設けられています

  • 回避データ消失するために、非コピーISRは、リーダーとして選出されることはできませんunclean.leader.election.enable = falseを閉じ汚れリーダー選挙、

  • replication.factor> = 3これは完全に個人的な勧告である、参照はHadoopの三業界全体のバックアップポリシーに行われています

  • min.insync.replicas>多くのコピーが成功したことが、また、パラメータの永続データを強化するように書き込まれる少なくとも1つのニュース。ACKのと組み合わせて使用​​します

  • 両者が等しい場合replication.factor> min.insync.replicasを確認し、パーティションのコピーが正常に動作しないときハングアップ。これは、典型的にreplication.factor = min.insync.replicas + 1に提供され

公開された107元の記事 ウォン称賛29 ビュー180 000 +

おすすめ

転載: blog.csdn.net/zhangyingchengqi/article/details/104797206