1. カフカの背景Kafka はもともと Linkedin によって開発されました。これは、Zookeeper 調整に基づいた分散型、パーティション化された、マルチレプリカの分散メッセージング システムです。最大の特徴は、Hadoop ベースのバッチ処理システム、低遅延リアルタイムシステム、Storm/Spark ストリーミング処理エンジン、Web/nginx ログ、アクセスログ、メッセージングサービスなど、さまざまな需要シナリオに合わせて大量のデータをリアルタイムで処理できることです。Scala で記述されています。 Linkedin は 2010 年にこれを Apache Foundation に寄贈し、トップ オープン ソース プロジェクトとなりました。 今日の社会では、ビジネス、ソーシャルネットワーキング、検索、ブラウジングなどのさまざまなアプリケーションシステムが、情報工場のようにさまざまな情報を絶えず生み出しています。ビッグデータの時代において、私たちは次のような課題に直面しています。
上記の課題は、生産者がさまざまな情報を生産し、消費者がその情報を消費(処理・分析)するというビジネス需要モデルを形成します。プロデューサーとコンシューマーの間で通信を行うには、両者の橋渡しとなるメッセージング システムが必要です。ミクロの観点から見ると、この要件は、異なるシステム間でメッセージを送信する方法としても理解できます。 分散メッセージング システムである Kafka は次のように誕生しました。
2. メッセージング システムを使用する理由
これにより、同じインターフェース制約に準拠している限り、両側での処理を個別に拡張または変更できます。
メッセージ キューは、データが完全に処理されるまでデータを保持するため、データ損失のリスクを回避できます。多くのメッセージ キューで採用されている「挿入、取得、削除」パラダイムでは、キューからメッセージを削除する前に、処理システムはメッセージが処理されたことを明確に示し、使用が完了するまでデータが安全に保存されるようにする必要があります。
メッセージ キューは処理を分離するため、追加の処理を追加するだけで、メッセージのエンキューと処理の頻度を簡単に増やすことができます。
アプリケーションはトラフィックが急増しても機能し続ける必要がありますが、このようなトラフィックの急増はまれです。このようなピークトラフィックを処理するためだけに、常にスタンバイ状態にリソースを投資するのは大きな無駄です。メッセージ キューを使用すると、突然の過負荷要求によって主要コンポーネントが完全にクラッシュすることなく、突然のアクセス圧力に耐えることができます。
システムの 1 つのコンポーネントに障害が発生しても、システム全体に影響が及ぶことはありません。メッセージ キューはプロセス間の結合を減らすため、メッセージを処理するプロセスがクラッシュした場合でも、キューに追加されたメッセージはシステムの回復後に引き続き処理できます。
ほとんどのユースケースでは、データが処理される順序が重要です。ほとんどのメッセージ キューは本質的に順序付けられており、データが特定の順序で処理されることを保証します。 (Kafka はパーティション内のメッセージの順序を保証します)
これは、システムがデータを通過する速度を制御および最適化し、生成されたメッセージと消費されたメッセージの処理速度の不一致を解決するのに役立ちます。
多くの場合、ユーザーはメッセージをすぐに処理することを望まなかったり、その必要がありません。メッセージ キューは、ユーザーがメッセージをキューに入れてもすぐには処理しない、非同期処理メカニズムを提供します。必要な数のメッセージをキューに入れて、必要なときに処理することができます。 3. Kafka の基本アーキテクチャ3.1.トポロジー3.2.名詞の概念
4. Kafka の基本機能
デザインコンセプト
アプリケーションシナリオ
5. プッシュモードとプルモード5.1.ピアツーピアモード上の図に示すように、ポイントツーポイント モードは通常、プルまたはポーリング メッセージング モデルに基づいており、キューに送信されたメッセージが 1 つのコンシューマーのみによって処理されるという特徴があります。プロデューサーがメッセージをメッセージ キューに入れると、コンシューマーはメッセージを積極的にプルして消費します。ポイントツーポイント モデルの利点は、コンシューマーがメッセージをプルする頻度を自分で制御できることです。ただし、コンシューマー側では、メッセージ キューに消費する必要があるメッセージがあるかどうかを認識できないため、コンシューマー側でそれを監視するための追加のスレッドが必要になります。 5.2.パブリッシュ・サブスクライブモデル上図に示すように、パブリッシュ・サブスクライブモデルは、メッセージ送信をベースとしたメッセージ伝送モデルです。このモデルには複数の異なるサブスクライバーを含めることができます。プロデューサーがメッセージをメッセージ キューに入れると、キューはこのタイプのメッセージをサブスクライブしているコンシューマーにメッセージをプッシュします (WeChat パブリック アカウントと同様)。コンシューマーは受動的にプッシュ通知を受信するため、メッセージ キュー内で消費を待機しているメッセージがあるかどうかを感知する必要はありません。ただし、consumer1、consumer2、consumer3 のマシンのパフォーマンスは異なるため、メッセージを処理する能力も異なりますが、メッセージ キューはコンシューマーの消費速度を認識できません。したがって、プッシュの速度はパブリッシュ/サブスクライブ モデルの問題になります。 3 つのコンシューマーの処理速度がそれぞれ 8M/s、5M/s、2M/s であると仮定します。キューのプッシュ速度が 5M/s の場合、consumer3 はそれに耐えられません。キューのプッシュ速度が 2M/s の場合、consumer1 と consumer2 は大量のリソースを浪費します。 5.3.カフカの選択メッセージング システムとして、Kafka はプロデューサーがブローカーにメッセージをプッシュし、コンシューマーがブローカーからメッセージをプルするという従来のアプローチに従います。 Facebook の Scribe や Cloudera の Flume などの一部のログ中心のシステムは、プッシュ モデルを使用します。実際、プッシュ モードとプル モードにはそれぞれ長所と短所があります。 プッシュ モードでは、メッセージの送信レートがブローカーによって決定されるため、消費レートが異なるコンシューマーに適応することが困難です。プッシュ モードの目的は、できるだけ早くメッセージを配信することですが、これにより、コンシューマーがメッセージを処理する時間が十分になくなる可能性が高まり、通常はサービス拒否やネットワークの輻輳が発生します。プル モードでは、コンシューマーの消費容量に基づいて適切な速度でメッセージを消費できます。 Kafka の場合、プル モードの方が適しています。プル モードを使用すると、ブローカーの設計を簡素化できます。コンシューマーはメッセージの消費速度を個別に制御できます。同時に、消費者は、一括消費または個別消費のいずれかの消費方法を自分で制御できます。同時に、異なる送信セマンティクスを実現するために、異なる送信方法を選択することもできます。 6. Kafkaワークフロー6.1.データの送信上記のアーキテクチャ図を見ると、プロデューサーはプロデューサーであり、データのエントリ ポイントです。図の赤い矢印に注意してください。データを書き込むとき、プロデューサーは常にリーダーを探し、フォロワーに直接データを書き込むことはありません。リーダーはどうやって見つけますか?執筆プロセスはどのようなものですか?次の図を見てみましょう。
6.1.1.メッセージの順序の確保 注目すべき点は、メッセージがリーダーに書き込まれた後、フォロワーが同期のために積極的にリーダーに近づくことです。プロデューサーはプッシュ モードを使用してブローカーにデータを公開します。各メッセージはパーティションに追加され、ディスクに順番に書き込まれるため、同じパーティション内のデータの順序が保証されます。書き方の図は次のようになります。 6.1.2.メッセージペイロードの分割 前述のように、データは異なるパーティションに書き込まれるので、なぜ Kafka をパーティション分割する必要があるのでしょうか?パーティション分割の主な目的は次の通りだと推測できると思います。
負荷分散に詳しい人なら、サーバーにリクエストを送信すると、サーバーがリクエストを読み込み、トラフィックを別のサーバーに分散する可能性があることを知っているはずです。では、Kafka では、トピックに複数のパーティションがある場合、プロデューサーはどのパーティションにデータを送信するかをどのように知るのでしょうか? Kafka にはいくつかの原則があります。
6.1.3.メッセージが失われないようにする メッセージが失われないようにすることは、メッセージ キュー ミドルウェアの基本的な保証です。では、プロデューサーは、Kafka にメッセージを書き込むときにメッセージが失われないようにするにはどうすればよいでしょうか?実際、これは上記の書き込みフローチャートで説明されており、ACK 応答メカニズムを介して行われます。プロデューサーがキューにデータを書き込むときに、Kafka がデータを受信したことを確認するかどうかを決定するパラメータを設定できます。このパラメータに設定できる値は 0、1、またはすべてです。 0 は、プロデューサーがクラスターにデータを送信するときにクラスターが戻るのを待つ必要がなく、メッセージが正常に送信されたことを保証しないことを意味します。最も安全性は低いですが、最も効率的です。 1 は、プロデューサーがクラスターにデータを送信するときに、リーダーが応答する限り次のデータを送信でき、リーダーがデータを正常に送信することを保証することを意味します。 all は、プロデューサーがクラスターにデータを送信するときに、すべてのフォロワーが次のデータを送信する前にリーダーからの同期を完了する必要があり、リーダーがデータを正常に送信し、すべてのレプリカがバックアップされることを保証することを意味します。セキュリティは最も高いが、効率は最も低い。 最後に、存在しないトピックにデータを書き込む場合、正常に書き込むことができるかどうかに注意してください。 Kafka はトピックを自動的に作成し、デフォルトの構成ではパーティションとレプリカの数は 1 になります。 6.2.データの保存プロデューサーがデータを Kafka に書き込んだ後、クラスターはデータを保存する必要があります。 Kafka はデータをディスクに保存します。一般的に、ディスクへのデータの書き込みは時間のかかる操作であり、このような高同時実行コンポーネントには適していないと考えられています。 Kafka は最初に別のディスク領域を割り当て、データを順番に書き込みます (ランダム書き込みよりも効率的です)。 6.2.1.パーティション構造 前述したように、各トピックは 1 つ以上のパーティションに分割できます。トピックはより抽象的であると考えるなら、パーティションはより具体的なものです。パーティションはサーバー上で 1 つずつフォルダーとして表されます。各パーティション フォルダーには、複数のセグメント ファイル グループがあります。セグメント ファイルの各グループには、.index ファイル、.log ファイル、および .timeindex ファイル (以前のバージョンでは使用できません) の 3 つのファイルが含まれています。ログ ファイルは実際にメッセージが保存される場所であり、インデックス ファイルとタイムインデックス ファイルはメッセージを取得するために使用されるインデックス ファイルです。 上記のように、このパーティションには 3 つのセグメント ファイル グループがあります。各ログ ファイルのサイズは同じですが、保存されるメッセージの数は必ずしも同じではありません (各メッセージのサイズは一貫していません)。ファイルはセグメントの最小オフセットに基づいて名前が付けられます。たとえば、000.index には、オフセットが 0 から 368795 までのメッセージが格納されます。Kafka は、セグメンテーション + インデックスを使用して、検索効率の問題を解決します。 6.2.2.メッセージ構造 上記のログ ファイルは、実際にメッセージが保存される場所です。プロデューサーでメッセージを 1 つずつ Kafka に書き込みます。では、ログに保存されるメッセージはどのようなものなのでしょうか?メッセージには主に、メッセージ本文、メッセージ サイズ、オフセット、圧縮タイプなどが含まれます。知っておく必要がある最も重要な 3 つの事項は次のとおりです。
6.2.3.ストレージ戦略 Kafka は、メッセージが消費されたかどうかに関係なく、すべてのメッセージを保存します。では、古いデータを削除する戦略は何でしょうか?
Kafka が特定のメッセージを読み取る時間の計算量は O(1) O ( 1 ) であるため、ここで期限切れのファイルを削除しても Kafka のパフォーマンスは向上しないことに注意してください。 6.3.消費データメッセージがログ ファイルに保存されると、コンシューマーはそれを使用できるようになります。メッセージ キュー通信の 2 つのモードについて説明する際に、ポイントツーポイント モードとパブリッシュ サブスクライブ モードについて説明しました。 Kafka はパブリッシュ/サブスクライブ モデルを採用しています。コンシューマーは Kafka クラスターからメッセージをアクティブにプルします。プロデューサーと同様に、コンシューマーもメッセージを発信する際にリーダーを探します。 複数のコンシューマーがコンシューマー グループを形成でき、各コンシューマー グループにはグループ ID があります。同じコンシューマー グループ内のコンシューマーは、同じトピックの下にある異なるパーティションからデータを消費できますが、グループ内の複数のコンシューマーが同じパーティションからデータを消費することはありません。次の図を見てみましょう。 この図は、コンシューマー グループ内のコンシューマーの数がパーティションの数よりも少ない状況を示しています。そのため、コンシューマーが複数のパーティションからデータを消費する状況が発生し、消費速度は 1 つのパーティションのみを処理するコンシューマーの処理速度ほど速くありません。コンシューマー グループ内のコンシューマーの数がパーティションの数より多い場合、同じパーティションからデータを消費するコンシューマーが複数存在することになりますか?上で述べたように、これは起こりません!追加のコンシューマーはどのパーティションからもデータを消費しません。したがって、実際のアプリケーションでは、コンシューマー グループ内のコンシューマーの数をパーティションの数と一致させることが推奨されます。 データの保存に関するセクションでは、パーティションが複数のセグメントに分割される方法について説明しました。各セグメントには、.log、.index、.timeindex ファイルが含まれています。保存される各メッセージには、オフセット、メッセージ サイズ、メッセージ本文などが含まれます。セグメントとオフセットについては何度も説明しました。セグメント+オフセットを使用してメッセージを検索するにはどうすればよいですか?オフセットが 368801 のメッセージを検索する必要がある場合、どのようなプロセスになりますか?次の図を見てみましょう。 1. まず、オフセット 368801 メッセージが配置されているセグメント ファイルを検索します (バイナリ検索を使用)。ここでは、2 番目のセグメント ファイルにあります。 2. 見つかったセグメントの .index ファイルを開きます (つまり、開始オフセットが 368796+1 である 368796.index ファイル、インデックス内のオフセット 368801 のメッセージのオフセットは 368796+5=368801 なので、ここで見つかる相対オフセットは 5 です)。ファイルは、相対オフセットと対応するメッセージの物理オフセットの関係を格納するためにスパース インデックスを使用するため、相対オフセットが 5 のインデックスを直接見つけることはできません。ここで、バイナリ検索方式は、相対オフセットが指定された相対オフセット以下であるインデックス エントリの中で最大の相対オフセットを見つけるためにも使用され、相対オフセットが 4 のインデックスが見つかります。 3. 相対オフセットが 4 のインデックスに基づいて、メッセージ ストレージの物理オフセット位置は 256 であると決定されます。データ ファイルを開き、オフセットが 368801 のメッセージが見つかるまで、位置 256 から順番にスキャンします。 このメカニズムは、オフセットが順序付けられているという事実に基づいており、セグメント + 順序付けされたオフセット + スパース インデックス + バイナリ検索 + シーケンシャル検索などの複数の方法を使用して、データを効率的に検索します。この時点で、消費者は処理のために処理する必要があるデータを取得できます。では、各消費者はどのようにして消費した場所を記録するのでしょうか?以前のバージョンでは、コンシューマーは消費されたオフセットを Zookeeper で管理し、一定期間ごとにレポートしていました。これにより、重複した消費やパフォーマンスの低下につながる可能性があります。新しいバージョンでは、コンシューマーによって消費されたオフセットは、Kafka クラスターの consumer_offsets トピックで直接管理されるようになりました。 |
<<: HDC.Cloud 2021: ファーウェイが業界の包括的なクラウド化とインテリジェントなアップグレードを加速する6つの革新的な製品をリリース
>>: デル、クラウドコンピューティング事業Boomiの売却を検討中と報道
Webの発展に伴い、フロントエンドアプリケーションはますます複雑になり、バックエンドをベースにしたJ...
最近、「十年の塵と土、遥かに白雲に達する」をテーマにした和信創天の次世代クラウドデスクトップVENG...
偶然ネットで、Google が最近、アカウント開設時に Google Adwords の手数料 35...
[[214980]] Modisのレポートによると、ハイテク関連の雇用機会は2024年までに12%増...
情報ネットワークの急速な発展に伴い、多くの中小企業がインターネットを通じて自社のブランドや製品を宣伝...
Didi Takeoutは「9つの都市」戦略の下、西方への進出を続けており、最近は成都への進出も発表...
Dogyunは数日前に香港MGデータセンターで国際回線付きVPSを開設しました。中国本土に面した国際...
第三のプラットフォームとして、Fanli.comが電子商取引の世界で生き残るのは容易ではありません。...
若者を虜にする者に未来はある。 01 Bilibiliは非常に人気があります、本当に人気があります。...
「グッズ付きライブ配信」が流行っています。化粧品を売る人もいれば、家電を売る人もいますが、データセン...
感謝祭、ブラックフライデー、サイバーマンデーが重なるので、プロモーションには最適な時期です。まだ素晴...
この記事はWeChat公式アカウント「Mayuan Technology Column」から転載した...
長年にわたり、我が国は新世代の情報産業の発展を非常に重視してきました。国務院は「クラウドコンピューテ...
民間の食品安全警告ネットワークは「窓から投げ出され」、政府の資金援助を拒否「Throw Out th...
月給5,000~50,000のこれらのプロジェクトはあなたの将来です本日、小小科堂 SEO 独習ネッ...