Kafka のメッセージ ログ ファイルの詳細な説明: トピック メッセージ分類、パーティション パーティション、セグメント セグメンテーション、オフセット インデックス ファイル

1. カフカの紹介

Kafka は、Zookeeper の調整に基づいてクラスター内で実行される、高スループットの分散パブリッシュ/サブスクライブ メッセージング システムです。パーティションと複数のレプリカをサポートし、非常に優れた負荷分散機能、処理パフォーマンス、およびフォールト トレランスを備えています。Kafka はパブリッシュ/サブスクライブ モデルを使用しており、メッセージ プロデューサがメッセージを Kafka メッセージ センター (ブローカー) に送信し、コンシューマがセンターからメッセージを読み取ります。
ここに画像の説明を挿入します
ブローカーKafka クラスター内のサーバー ノードであり、各ブローカーはプロデューサーからメッセージを受信し、メッセージ キューに格納する独立したサーバーです。同時に、消費者からのリクエストも処理し、消費者にメッセージを送り返します。ブローカーはメッセージを保存し、システムに登録されているコンシューマーに通知するだけです。Consumer は、監視と設定に基づいてブローカーからメッセージをアクティブにプルします。

ZooKeeper は、クラスターの構成、ステータス、メタデータ情報を管理し、分散メッセージング システムが正常に動作するようにするために使用されます。

2. Kafka のメッセージ ログ ファイル

1. メッセージの分類

Kafka のデータ単位はメッセージと呼ばれ、メッセージはデータベース内の「データ行」または「レコード」とみなすことができます。Kafka はトピックに従ってメッセージを分類、編成、管理します。各トピックは互いに独立しており、相互に影響しません。トピックは、メッセージの種類を区別するためにビジネス システムによって指定され、プロデューサーとコンシューマーはトピックを通じて接続されます。プロデューサによって生成されたメッセージはトピックに入れられ、トピックのメッセージは指定されたコンシューマまたはコンシューマ グループによって消費されます。

2. メッセージのパーティション化されたストレージ

物理的には、異なるトピックのメッセージは別々に保存されます。各トピックのメッセージは、複数のパーティションの論理パーティションに分割して保存できます。各パーティションは、同じトピックのメッセージのみを保存できる独立したメッセージ ログとして理解できます。このトピックに属します。最も粒度の細かい論理ストレージです。Kafka では、各パーティションは独立したファイル ディレクトリに対応しており、ファイル ディレクトリの命名規則は、トピック名 + パーティションのシリアル番号です。

同じトピックの下にあるメッセージがプロデューサーによって送信されると、Kafka はパーティション戦略 (範囲割り当て、ラウンドロビン割り当て、スティッキー割り当てなど) に従ってメッセージをトピックの対応するパーティションに割り当てます。話題は全く違います。

3. メッセージの ID 識別子のオフセット

単一のパーティションでは、格納されたメッセージは順序付けされます。各メッセージがパーティションに追加されると、パーティション内の異なるメッセージを区別するために、パーティション単位で一意のオフセットが順番に増分的に割り当てられます。オフセットはオフセットとも呼ばれます。連番はメッセージの ID に相当します。長さは 20 桁です。20 桁未満の場合は、0 が追加されます。このパーティション内のメッセージの一意の番号です。Kafka は、同じパーティション内のメッセージが同じであることを保証します。順序付けされていますが、異なるパーティション内の同じトピックのメッセージの順序が狂っています。

4. メッセージログの分割

メッセージ ログが継続的に追加されるとファイルが大きくなり、検索効率が低下するのを防ぐために、パーティションを複数のセグメントに分割してデータを整理します。ディスク上では、各セグメントはメッセージとメッセージを格納するメッセージ ログ ファイルで構成されます。 2 つのインデックス ファイルで構成され、各ログ ファイルには 1 つ以上のメッセージが含まれます。各ログ ファイルの命名規則は「{baseOffset}.log」です。ここで、baseOffset はログ ファイル内の最初のメッセージのオフセットです。

セグメントには、メッセージログが追加で書き込まれます。ログファイルまたはインデックスファイルが一定のサイズを超える場合、または現在のタイムファイルの作成時間が指定された時間間隔(上記の条件はパラメータで設定されます)より大きい場合、ログはログに追加されます。ファイルとインデックス ファイルを分割して新しいセグメントを生成します。新しいセグメントでは、名前として最新のオフセットが使用されます。最初のセグメントに格納される最初のメッセージの開始シーケンス番号は 0 であるため、ファイル名は 20 ビット長の 0 で付けられます。

5. トピック、パーティション、セグメントの関係

以下は、トピック、パーティション、セグメント、およびログ ファイル間の論理関係図です。
ここに画像の説明を挿入します

上の図では、partition0 の Segment0 に格納されている最初のメッセージのオフセットは 0、最後のメッセージのオフセットは 123456788、2 番目のセグメントの最初のメッセージのオフセットは 123456789、そして最後のセグメントはxxxxxxxxxxxxxxxxxxxxxです。

3. Kafkaのメッセージログファイルのインデックスファイル

1. Kafka インデックス ファイル

Kafka のログ ファイルは通常非常に大きく、各メッセージは固定長ではありません。読み取りと処理には多くの時間とリソースが消費される可能性があります。読み取りと処理の速度を向上させるために、Kafka はログ ファイルごとに 2 つのインデックス ファイルを作成します。それらは、オフセット インデックス ファイル (ファイル拡張子 ".index") とタイムスタンプ インデックス ファイル (ファイル拡張子 ".timeindex") です。どちらのインデックス ファイルもスパース インデックスであるため、各メッセージがインデックス ファイル内に対応するインデックス エントリを持つことは保証されません。そのため、インデックス ファイルのサイズを大幅に削減できるため、インデックス ファイルのキャッシュ ロードが可能になり、クエリ速度が向上します。

Kafka の異なるバージョンのログ ファイルとインデックス ファイルは多少異なりますが、記録される基本情報は似ており、異なるバージョンのログ ファイルとインデックス ファイルの実装メカニズムも同様です。

2. オフセットインデックスファイル

".index" オフセット インデックス ファイルは、メッセージ オフセット offset とログ ファイルに保存されているメッセージの物理アドレスとの間のマッピング関係を確立するために使用されます。書き込まれたメッセージの長さが一定量 (パラメータで指定) を超えた場合、オフセット インデックス ファイルをシフトすると、オフセット インデックス エントリが追加されます。これには、メッセージのオフセットと物理ファイル内のその位置が含まれます。

ログ ファイル名には保存されたメッセージのベース オフセットがプレフィックスとして付加されるため、コンシューマがメッセージを読みたい場合、まずパーティション内のログ ファイル名のリストを取得して並べ替え、二分法を使用して対応するログを見つけます。メッセージのオフセット (x と仮定します) に従ってファイルを検索し、対応するログ ファイルを見つけた後、対応するオフセット インデックス ファイルでバイナリ検索を使用して、x 以下の最大のインデックス エントリをすばやく見つけることができます (x と仮定します)。オフセットは y)、ログ データ ファイル内で y が格納されている位置 p を取得し、オフセット x のメッセージが見つかるまで p から順にログ ファイルをスキャンします。

3. タイムスタンプインデックスファイル

".timeindex" ファイルには、メッセージのタイムスタンプとメッセージのオフセット オフセット間のマッピング関係が保存され、タイムスタンプに従ってメッセージを断片化し、各フラグメントの最後のメッセージのタイムスタンプと対応するオフセット オフセットを記録します。時系列順にメッセージをすばやく検索します。Kafka によって書き込まれたメッセージの長さが一定量 (パラメータで指定) を超えるか、新しいメッセージのタイムスタンプと前のインデックス エントリのタイムスタンプが一定の長さ (パラメータで指定) を超えると、タイムスタンプ インデックス エントリが作成されます。タイムスタンプインデックスファイルに追加されます。

指定したタイムスタンプを持つログ メッセージをクエリする必要がある場合は、二分法を使用して、まずタイムスタンプ インデックス ファイル内でターゲット タイムスタンプ以下の最大のインデックス項目 x を検索し、そのインデックス項目に対応するオフセット y を取得します。 y に基づいてオフセットをクエリします。 ファイルにインデックスを付けて、メッセージが配置されているログ ファイルの場所 p を読み取ります。

4. インデックスファイルの概要

同じ Kafka パーティション内のメッセージのオフセットは順番に増加します。パフォーマンスを向上させるために、同じパーティション内のログ ファイルは複数のセグメントに分割されます。各セグメントには一定量のメッセージ データが保存され、各セグメントにはオフセット インデックス ファイルとタイムスタンプ インデックスがあります。ファイルの場合、これら 2 種類のインデックス ファイルは係数インデックスです。

オフセット インデックス ファイルには、メッセージのオフセットと実際のストレージ ファイルの場所の間のマッピング関係が保存され、メッセージのオフセットによってメッセージにアクセスするために使用されます。タイムスタンプ インデックス ファイルには、タイムスタンプとオフセットの間のマッピング関係が保存されます。これは、時間によってメッセージにアクセスするために使用されます。使用する場合、実際にデータにアクセスするには、タイムスタンプ インデックスをオフセット インデックスと組み合わせる必要があります。

インデックス ファイルはスパース インデックスであるため、ほとんどの場合、インデックスを通じてメッセージ データのおおよその場所しか見つけることができず、最終的に目的のメッセージを見つけるには、おおよその場所からメッセージを順番に読み込む必要があります。探している。メッセージ オフセットが増分されてログ ファイルに順次書き込まれ、メッセージ ログが分割されてセグメント化され、インデックス ファイルが小さくキャッシュできるため、このインデックス作成メカニズムの全体的な効率は非常に高くなります。

5. まとめ

この記事では、Kafka のメッセージ ログ ファイル、物理ストレージ パーティション、ログ ファイル セグメント、およびインデックス ファイルの論理概念とそれらの関連関係を詳しく紹介し、オフセット インデックス ファイルとタイムスタンプの論理構造とインデックス作成メカニズムについても詳しく紹介します。インデックス ファイル。OPIC メッセージ分類、パーティション パーティション、セグメント セグメンテーション、オフセット オフセット インデックス ファイル、およびその他の関連概念を理解するのに役立ちます。

6. 参考資料

  1. Kafkaにおけるトピック、パーティション、ブローカー、consumerGroup、consumerの関係、違い、存在意義
  2. Kafka はオフセットを通じてどのようにメッセージを見つけますか?
  3. Kafka ファイル ストレージ メッセージ同期メカニズム
  4. Kafka のインデックス作成メカニズムを解釈する方法
ブログを書くのは簡単ではありません。サポートしてください:

この記事を読んで少しでも勉強になったことがあれば、ぜひ「いいね!」「コメント」「集めてください!」をよろしくお願いします!

Lao Yuanの有料コラムについて

  1. 有料コラム「https://blog.csdn.net/laoyuanpython/category_9607725.html PyQt を使用したグラフィカル インターフェイス Python アプリケーションの開発」では、 Python ベースの PyQt グラフィカル インターフェイス開発の基本チュートリアルを具体的に紹介しています。対応する記事ディレクトリは「https: //blog.csdn" .net/LaoYuanPython/article/details/107580932 PyQt を使用したグラフィカル インターフェイスの開発 Python アプリケーション列ディレクトリ";
  2. 有料コラム「https://blog.csdn.net/laoyuanpython/category_10232926.html moviepy オーディオおよびビデオ開発コラム」では、moviepy オーディオおよびビデオ編集合成処理のクラス関連のメソッドと、関連する処理を行うための関連メソッドの使用について詳しく紹介しています。編集および合成シーン、対応記事 ディレクトリは「https://blog.csdn.net/LaoYuanPython/article/details/107574583 moviepy オーディオおよびビデオ開発コラム記事ディレクトリ」です。
  3. 有料コラム「https://blog.csdn.net/laoyuanpython/category_10581071.html OpenCV-Python 初心者向け問題集」は「https://blog.csdn.net/laoyuanpython/category_9979286.html OpenCV-Python Graphics and Image」処理" "付属のコラムは、OpenCV-Python のグラフィックスと画像処理を学習する際に遭遇したいくつかの問題についての著者の個人的な考察です。関連する情報は基本的に古い類人猿による繰り返しの研究の結果であり、OpenCV-Python の初心者がより深く学ぶのに役立ちます。 OpenCVを理解するには、対応する記事ディレクトリは「https://blog.csdn.net/LaoYuanPython/article/details/109713407 OpenCV-Python 初心者向け問題集列ディレクトリ」です。
  4. 有料コラム「https://blog.csdn.net/laoyuanpython/category_10762553.html Getting Started with Python Crawler 」では、初心者のインターネット フロントエンド開発者の観点から、基本的な知識を含め、クローラ開発について知っておくべきことを紹介しています。クローラーの使い方とクローラーの概要 CSDN の記事情報、ブロガー情報、記事、コメント、その他の実用的なコンテンツを取得します。

最初の 2 つの列は、一定の Python の基礎はあるものの、関連する知識がない初心者読者に適しています。3 番目の列については、「 https://blog.csdn.net/laoyuanpython/category_9979286.html OpenCV-Python グラフィックスと画像処理」を組み合わせてください。「使い方を学ぶこと。

Python の基礎が不足している同僚は、 Lao Yuan の無料コラム「 https://blog.csdn.net/laoyuanpython/category_9831699.html コラム: Python 基本チュートリアル ディレクトリ」を通じてPython をゼ​​ロから学ぶことができます。

興味があり、ラオ・ユアンを支援する意欲のある読者は、有料コラムを購入することを歓迎します。

ラオ・ユアン Python、ラオ・ユアンから Python を学びましょう!

░LaoYuanPython ブログ ディレクトリに移動します https://blog.csdn.net/LaoYuanPython

おすすめ

転載: blog.csdn.net/LaoYuanPython/article/details/132911303