Kafka アプリケーションを理解するための 2 つの図

Kafka アプリケーションを理解するための 2 つの図

[[270715]]


Kafka の用語

ブローカー: メッセージを保存する中間の Kafka クラスターは、複数のサーバーで構成されるクラスターです。

トピック: Kafka によってメッセージに提供される分類方法。ブローカーは、さまざまなトピックのメッセージ データを保存するために使用されます。

プロデューサー: ブローカー内のトピックにデータを生成します。

コンシューマー: ブローカー内のトピックからデータを取得します。

Kafka における用語設計:

1. ブローカー

中央の Kafka クラスターはメッセージを保存し、複数のサーバーで構成されたクラスターです。

2. トピックとメッセージ

Kafka はすべてのメッセージを複数のトピックに整理して保存します。各トピックは複数のパーティションに分割でき、各パーティションは 1 つのメッセージで構成されます。各メッセージには、受信順序を表す増加するシーケンス番号が付けられ、パーティションに順番に格納されます。

このようにして、メッセージは ID の形式で整理されます。

プロデューサーはトピックを選択し、割り当て戦略に従ってパーティションの末尾に追加されるメッセージを生成します。

コンシューマーはトピックを選択し、ID によってメッセージの消費を開始する場所を指定します。消費が完了した後も ID は保持され、次回はこの位置から、または他の任意の位置から消費を継続できます。

上記の ID は Kafka ではオフセットと呼ばれます。この組織および処理戦略には、次の利点があります。

消費者はニーズに応じてオフセット消費を柔軟に指定できます。

メッセージの不変性を保証し、同時消費に対するスレッドの安全性を提供します。各コンシューマーは独自のオフセットを保持し、相互に干渉しないため、スレッドの安全性の問題はありません。

メッセージ アクセスの並列効率。各トピックのメッセージは複数のパーティションに編成され、パーティションはクラスター サーバーに均等に分散されます。メッセージの生成と消費時に、指定されたパーティションにルーティングされるため、競合が減少し、プログラムの並列機能が向上します。

メッセージング システムのスケーラビリティを向上します。各トピックに保存されるメッセージは非常に大きくなる可能性があります。パーティションはメッセージを複数のサブメッセージに分割するために使用され、責任あるバランス戦略を通じてパーティションが異なるサーバーに割り当てられます。この方法では、マシンがいっぱいになったときに、容量を拡張することでメッセージを均等に再配布できます。

メッセージの信頼性を確保します。メッセージは消費された後も削除されず、オフセットをリセットすることで再度消費できるため、メッセージが失われることはありません。

柔軟な永続戦略。ブローカーのストレージスペースを節約するために、期間 (最終日など) を指定してメッセージを保存できます。

バックアップの高可用性。メッセージはパーティション単位で複数のサーバーに分散され、パーティション単位でバックアップされます。バックアップ戦略は、リーダー 1 人とフォロワー N 人で、リーダーが読み取りおよび書き込み要求を受け入れ、フォロワーがリーダーを受動的に複製します。パーティションの高可用性を確保するために、リーダーとフォロワーはクラスター内に分散されます。

3. パーティション

各トピックは 1 つ以上のパーティションに分割され、パーティション内の各メッセージには連続 ID、つまりオフセットが付けられ、保存されたデータには構成可能な保存時間があります。

4. プロデューサー

プロデューサーがメッセージを生成するには、次のパラメータが必要です。

トピック: メッセージを生成するトピック。

パーティション: メッセージを生成するパーティション。

key: キーに従ってメッセージを異なるパーティションに分割します。

メッセージ: メッセージ。


5. 消費者

従来のメッセージング システムには 2 つのモードがあります。

公開と購読

Kafka は、コンシューマー グループを通じて 2 つのモードを統合します。各コンシューマーは、コンシューマー グループ名で自身をマークし、システムはコンシューマー グループを名前でグループ化し、メッセージをコピーしてすべてのグループに配布します。各グループでは 1 つのコンシューマーだけがメッセージを消費できます。以下のように表示されます。

したがって、2 つの極端なケースを推測できます。

  • すべてのコンシューマーが同じコンシューマー グループを持つ場合、システムはキュー モードになります。
  • 各コンシューマーのコンシューマー グループが異なる場合、システムはパブリッシュ サブスクライブ システムになります。

知らせ:

1. コンシューマー グループはトピックとパーティションの分離を提供します。たとえば、上の図でコンシューマー グループ A のコンシューマー C2 に障害が発生した場合、コンシューマー C1 は P1 と P2 を受け取ります。つまり、他のコンシューマーに障害が発生した後でも、コンシューマー グループのバランスを再調整できます。以下のように表示されます。

2. 複数のコンシューマーが同時にメッセージを消費すると、メッセージの混乱が発生しやすくなります。コンシューマーを同期に制限することで、メッセージの順序は保証されますが、プログラムの同時実行性は大幅に低下します。

Kafka はパーティションの概念を使用して、パーティション内のメッセージの順序を確保し、上記の問題を軽減します。パーティション内のメッセージは複製され、すべてのグループに配布されますが、各グループ内の 1 つのコンシューマーだけがメッセージを消費できます。このセマンティクスにより、グループがパーティションからのメッセージを同時にではなく同期的に消費することが保証されます。トピックにパーティションが 1 つしかない場合は、このトピックの同時消費が順序付けられ、それ以外の場合は単一のパーティションのみが順序付けられます。

一般的なメッセージ システムでは、コンシューマーには 2 つの消費モデルがあります。

プッシュ: メッセージが極めてリアルタイムであるという利点があります。欠点は、消費者の消費能力と飽和度が考慮されていないため、生産者が消費者を圧倒してしまう可能性が高くなることです。

プル:消費速度と消費量を制御して、消費者が飽和しないようにできることが利点です。欠点は、データがない場合に空のポーリングが発生し、CPU が消費されることです。

Kafka はプルと構成可能なパラメータを使用して、データが存在し、データ量が一定量に達した場合にのみコンシューマー側がプル操作を実行し、それ以外の場合はブロック状態のままになるようにします。 Kakfa は、整数値のコンシューマー位置を使用して単一パーティションの消費ステータスを記録します。単一パーティション内の単一メッセージは、コンシューマー グループ内の 1 つのコンシューマーのみが消費できるため、メンテナンスが簡単になり、オーバーヘッドが低くなります。消費が完了し、ブローカーは確認を受け取り、ポジションは次の消費のオフセットを指します。メッセージは削除されないため、消費が完了して位置が更新された後でも、コンシューマーはオフセットをリセットして履歴メッセージを再消費できます。

メッセージ送信セマンティクス

プロデューサーの視点

メッセージは最大 1 回送信されます。プロデューサーはメッセージを非同期に送信するか、メッセージを同期的に送信しますが、再試行回数は 0 です。

メッセージは少なくとも 1 回送信されます。プロデューサーはメッセージを同期的に送信し、失敗またはタイムアウトした場合に再試行します。

メッセージは一度だけ送信されます。以降のバージョンでサポートされます。

消費者の視点

メッセージは最大 1 回消費されます。つまり、コンシューマーは最初にメッセージを読み取り、次に位置を確認し、最後にメッセージを処理します。

メッセージは少なくとも 1 回は消費されます。つまり、コンシューマーは最初にメッセージを読み取り、次にメッセージを処理し、最後に位置を確認します。

メッセージの消費は 1 回のみ行われます。

知らせ:

メッセージ処理後の出力先 (データベースなど) がメッセージ更新の冪等性を保証できる場合、複数回の消費でも正確に 1 回のセマンティクスが保証されます。

出力側が 2 フェーズ コミット プロトコルをサポートできる場合、位置の確認と出力メッセージの処理が同時に成功または失敗することを保証できます。

メッセージ処理の出力端に更新された位置を保存することで、位置の確認と出力メッセージの処理の原子性(シンプルかつ普遍的)が保証されます。

可用性

Kafka では、通常、すべてのノードが同期されています。ノードが同期していない場合は、システム全体に問題があり、フォールト トレラントが必要であることを意味します。

同期とは以下を表します。

ノードは Zookeeper に接続できます。

ノードがフォロワーの場合、コンシューマーの位置はリーダーから離れすぎてはいけません (差は設定可能です)。

パーティション内で同期しているノードはセットを形成し、それがパーティションの ISR となります。

Kafka は、次の 2 つの方法で障害を許容します。

データバックアップ:パーティション単位でのバックアップ、コピー数の設定が可能。レプリカの数が N の場合、1 つのリーダーと N-1 つのフォロワーを表します。フォロワーはリーダーの消費者とみなされ、リーダーのメッセージを引き出して自分のシステムに追加します。

フェイルオーバー:

1. リーダーが同期していない場合、システムはフォロワーから新しいリーダーを選出します。

2. フォロワーのステータスが非同期になると、リーダーはフォロワーを ISR から削除します。フォロワーが回復してデータ同期を完了すると、再び ISR に入ります。

さらに、Kafka には、プロデューサーがメッセージを生成すると、そのメッセージがすべての ISR によって確認された場合にのみ、メッセージが正常に送信されるという保証があります。正常に送信されたメッセージのみがコンシューマーによって消費されます。

したがって、N 個のレプリカがあり、N 個のレプリカが ISR にあり、N-1 個のレプリカが異常な場合でも、システムはサービスを提供できます。

N 個のレプリカすべてが失敗したと仮定すると、ノードは回復後にデータを同期するプロセスに直面します。この期間中、ISR にはノードが存在しないため、パーティション サービスは利用できなくなります。 Kafka は、これを処理するために劣化測定を使用します。つまり、そのデータをベンチマークとして使用して、最初に回復したノードをサービスを提供するリーダーとして選択します。この対策はダーティー・リーダー選挙と呼ばれます。リーダーは主にサービスを提供する責任があるため、Kafka ブローカーは複数のパーティションのリーダーを異なるサーバーに分散してリスクを分散します。各パーティションにはリーダーが存在します。各パーティションでリーダー選出プロセスを実行すると、多数のリーダー選出プロセスが生成されます。 Kakfa は軽量なアプローチを採用しており、ブローカー クラスターから 1 つをコントローラーとして選択します。このコントローラは、障害が発生したブローカーを監視し、パーティションのマスターをバッチで選択します。

一貫性

上記のソリューションは高いデータ可用性を保証しますが、一貫性が犠牲になって高可用性が損なわれる場合もあります。強力な一貫性を実現したい場合は、次の対策を講じることができます。

ダーティリーダー選出を無効にします。 ISR にノードがない場合、完全に同期されていないノードが存在するよりも、サービスを提供しない方が適切です。

メッセージが送信される前に、少なくとも min_isr 個のノードによって確認される必要があることを保証するために、ISR の最小数 min_isr を設定します。

持続性

以下の事実に基づいて、Kafka はメッセージを保存するためにメモリではなくディスクに大きく依存しています。

ハードディスクは安いが、メモリは高い

シーケンシャルリード+プリリード操作によりキャッシュ***レートを向上できる

オペレーティングシステムは余剰メモリをページキャッシュとして使用し、先読み+ライトバック技術と連携してキャッシュからデータを読み取り、キャッシュに書き込んだ後に返す(オペレーティングシステムがバックグラウンドでフラッシュする)ことで、ユーザープロセスの応答速度を向上させます。

Javaオブジェクトの実際のサイズは理想的なサイズよりも大きいため、メッセージをメモリに保存するには非常にコストがかかります。

ヒープメモリ使用量が増加し続けると、GCジッタが大きくなる

ファイルの順次読み込みと書き込みの設計思想に基づいて、コードは簡単に書けます

永続的なデータ構造の選択に関しては、Kafka は Btree ではなくキューを使用します。

Kafka にはオフセットに基づく単純な読み取りと追加操作のみがあるため、キューベースの操作の時間計算量は O(1) ですが、Btree ベースの操作の時間計算量は O(logN) です。

多数のファイルを読み書きする場合、キューベースの読み取りと追加では 1 回のディスク シークのみが必要ですが、Btree では複数回のシークが必要になります。ディスクアドレス指定プロセスにより、読み取りと書き込みのパフォーマンスが大幅に低下します。

<<:  レガシーアプリケーションを最新化するための Docker ツール

>>:  分散ロックには Redis と Zookeeper のどちらを使用すればよいでしょうか?

推薦する

モバイルゲームユーザーがゲームを入手する6つの方法をすべてご存知ですか?

ユーザーがゲームを入手するには、一般的に、推奨ダウンロードと検索ダウンロードの 2 つの方法がありま...

Xiake Station Group System V3の無料版の経験とWORDPRESSプラットフォームの実践的な経験

最近、サイトグループで遊びたくなって、朝A5を開いて、Xiakeサイトグループシステムの無料版がある...

ステーショングループ操作は不正行為ですか?

【はじめに】Pi Zirui の SEO に関する詳細な分析を読んで、いくつか考えました。SEO の...

Linode - 20ドルで簡単なチュートリアルを入手

今日はアメリカの独立記念日です。多くの企業がプロモーションを行っていますが、どれもいつもと同じ手法で...

SEOとUEOの観点から外部リンクの関連性の重要性を分析する

最適化作業に携わる多くの友人は、外部リンクがサイト最適化に欠かせない要素であるため、これを非常に重視...

ウェブサイトの寿命を維持する方法の簡単な分析

ウェブサイトが立ち上げられると、オンライン上にはたくさんのウェブサイトが立ち上げられることになります...

ALTタグのSEO効果の分析例

画像の ALT 属性値にはまだこの段階で SEO 効果があるのか​​どうかについて議論している初心者...

中国のトップ 10 検索エンジンについての簡単な説明 (パート 1)

現在、中国の検索エンジンは混乱状態にあります。百度、捜索、捜狗、有道、ヤフー、ビング、グーグル、そし...

大手企業は4億7000万人の中流階級の交通をめぐって競争している

2015年、『エコノミスト』誌は、2015年までに中国の中流階級人口が4億7000万人を超えると予測...

iSoftStoneと他の7社が共同でソフトウェアテスト能力認定コンソーシアム(CBSTC)を設立

デジタル時代において、ソフトウェアは重要なインフラストラクチャであり、品質は最も基本的な要件です。ソ...

サーバーへのDDoS攻撃を防ぐ方法

8月25日夜、ハマーの「ナッツフォン」の発売が何らかの理由で延期され、PPTには多くの誤りや欠落があ...

超格安ブログホストのおすすめ、海外ホスト、(専用)専用ブログホスト

現在のホスティング市場の価格はますます高くなっています。Bluehost に代表されるブログホストは...

友達リンクは偽物と本物で、これがランキングの達成方法です

2018年最もホットなプロジェクト:テレマーケティングロボットがあなたの参加を待っています周知のよう...

SEO最適化に影響を与えずにウェブサイトのタイトルを変更する方法

2018年最もホットなプロジェクト:テレマーケティングロボットがあなたの参加を待っていますウェブサイ...