目次
1.ストレージ構造の概要
- 各パーティション(フォルダー)は、同じサイズのセグメント(セグメント)の複数のデータファイルに均等に分散される巨大なファイルに相当します。ただし、各セグメントファイルのメッセージ数は必ずしも同じではありません。この機能により、古いセグメントファイルの高速削除が容易になります。(デフォルトでは、各ファイルのサイズは1Gです)
- 各パーティションは、順次読み取りと書き込みをサポートする必要があるだけです。セグメントファイルのライフサイクルは、サーバー構成パラメーターによって決定されます。
1.ファイルストレージ構造を部分的にセグメント化する
セグメントファイル構成:2つの部分で構成されます。それぞれインデックスファイルとデータファイルです。これら2つのファイルは1つずつ対応し、ペアで表示されます。サフィックス”.index”
とサフィックスは“.log”
それぞれsegment
インデックスファイルとデータファイルを表します。
セグメントファイルの命名規則:グローバルパーティションの最初のセグメントは0から始まり、各セグメントファイルの名前は、前のセグメントファイルの最後のメッセージのオフセット値である可能性があります。
最大値は64ビット長です。19桁の長さはゼロで埋められます。
itcast@Server-node:/mnt/d/kafka_2.12-2.2.1$ ll /tmp/kafka/log/heima-0/
total 20480
drwxr-xr-x 1 itcast sudo 512 Aug 29 09:38 ./
drwxrwxrwx 1 dayuan dayuan 512 Aug 29 09:41 ../
-rw-r--r-- 1 itcast sudo 10485760 Aug 29 09:38 00000000000000000000.index
-rw-r--r-- 1 itcast sudo 0 Aug 29 09:38 00000000000000000000.log
-rw-r--r-- 1 itcast sudo 10485756 Aug 29 09:38 00000000000000000000.timeindex
-rw-r--r-- 1 itcast sudo 8 Aug 29 09:38 leader-epoch-checkpoint
itcast@Server-node:/mnt/d/kafka_2.12-2.2.1$
2、ログインデックス
1.データファイルのセグメンテーション
クエリの効率を解決するKafkaの方法の1つは、データファイルをセグメント化することです。たとえば、100個のメッセージがあり、それらのオフセットは0から99です。データファイルが5つのセグメントに分割され、最初のセグメントが0〜19、2番目のセグメントが20〜39というように、各セグメントが個別のデータファイルに配置され、データファイルの名前がセグメント内の最小オフセットに基づいているとします。このように、指定されたオフセットでメッセージを検索する場合、バイナリ検索を使用して、メッセージが含まれているセグメントを見つけることができます。
2.オフセットインデックス
データファイルのセグメンテーションにより、より小さなデータファイルでオフセットに対応するメッセージを見つけることができますが、オフセットに対応するメッセージを見つけるには、シーケンシャルスキャンが必要です。検索効率をさらに向上させるために、Kafkaはセグメント化されたデータファイルごとにインデックスファイルを作成します。ファイル名はデータファイル名と同じですが、ファイル拡張子は.indexです。
例:絶対オフセットが7のメッセージを検索するには:
1つ目は、バイナリ検索を使用して、どのLogSegmentにあるかを判別することです。これは、当然、最初のセグメントにあります。このセグメントのインデックスファイルを開き、バイナリ検索を使用して、オフセットが指定されたオフセット以下であるインデックスエントリの中から最大のオフセットを見つけます。当然、オフセット6のインデックスが探しています。インデックスファイルから、データファイル内のオフセット6のメッセージの位置が9807であることがわかります。
データファイルを開き、オフセット7のメッセージが見つかるまで9807の場所から順番にスキャンします。
この一連のメカニズムは、整然としたオフセットに基づいています。インデックスファイルはメモリにマップされるため、検索速度は依然として非常に高速です。
つまり、Kafkaは、メッセージストレージパーティション(Partition)、セグメント(logsegment)、およびスパースインデックスを使用して、これらの手段を使用して高効率を実現します。
3、ログのクリーンアップ
1.ログの削除
Kafkaログマネージャーでは、カスタム削除戦略が可能です。現在の戦略は、変更時刻がN日前のログを削除することです(時間で削除)。別の戦略も使用できます。最後のNGBデータを保持する戦略(サイズで削除)です。削除中の読み取り操作のブロックを回避するために、コピーオンライト実装が採用されています。削除操作が実行されると、読み取り操作のバイナリ検索機能は、Javaと同様に静的スナップショットコピーで実際に実行されますCopyOnWriteArrayList
。Kafka消費ログ削除の考え方:Kafkaは、トピック内の大きなパーティションファイルを複数の小さなファイルセグメントに分割します。複数の小さなファイルセグメントを使用すると、消費されたファイルを定期的にクリアまたは削除して、ディスク使用量を減らすことができます。
log.cleanup.policy=delete 启用删除策略
直接删除,删除后的消息不可恢复。可配置以下两个策略:
清理超过指定时间清理:
log.retention.hours=16
超过指定大小后,删除旧的消息:
log.retention.bytes=1073741824
2.ログ圧縮
データを圧縮し、各キーの最後のバージョンのデータのみを保持します。まず、log.cleaner.enable=true
デフォルトで無効になっているブローカーの構成で有効クリーナーを設定します。トピック構成でlog.cleanup.policy=compact
圧縮を有効にする戦略を設定します。
圧縮されたオフセットは不連続である可能性があります。たとえば、これらのオフセットのメッセージがマージされているため、上の図には5と7がありません。これらのオフセットからメッセージが消費されると、このオフセットよりも大きいオフセットに対応するメッセージが取得されます。たとえば、オフセットが5のメッセージを取得しようとすると、実際にはオフセットが6のメッセージが取得され、この位置から消費が開始されます。
この戦略は、特別なシナリオにのみ適しています。たとえば、メッセージのキーはユーザーIDであり、メッセージ本文はユーザーの情報です。この圧縮戦略により、すべてのユーザーの最新情報がメッセージセット全体に保存されます。
圧縮戦略は削除をサポートします。最新バージョンのキーにコンテンツがない場合、キーは削除されます。これも上記のロジックに準拠しています。
第四に、ディスクストレージの利点
Kafkaが設計されたとき、メッセージを書き込むためにファイル追加メソッドを使用します。つまり、新しいメッセージはログファイルの最後にのみ追加でき、書き込まれたメッセージは変更できません。このメソッドは、一般的な順次書き込みです。ジャッジ操作なので、Kafkaがディスクを記憶媒体として使っていても、達成できるスループットは非常に印象的です。
Kafkaは大量のページキャッシュを使用します。これは、Kafkaが高スループットを実現するための重要な要素の1つでもあります。
加えて、メッセージシーケンス加え、ページキャッシュと他の技術、カフカも使用していますゼロコピー、さらにパフォーマンスを向上させる技術を。「ゼロコピーテクノロジー」では、ディスクファイルのデータをページキャッシュに1回コピーしてから、ページキャッシュからネットワークに直接データを送信するだけで済み(異なるサブスクライバーに送信する場合は、同じページキャッシュを使用できます)、回避できます。コピー操作を繰り返します。消費者が10人の場合、従来の方法では、データのコピー回数は4 * 10 = 40回ですが、「ゼロコピーテクノロジー」の使用は1 + 10 = 11回で済み、1回はディスクからページキャッシュにコピーされ、10回は10人の消費者がそれぞれページキャッシュを1回読み取ります。
総括する
この章では、主に、Kafka独自のログ形式、ログインデックス、ログクリーンアップなど、Kafkaのストレージに関連する知識ポイントについて説明します。また、基盤となる物理ストレージの知識も含まれます。この章を学習することで、カフカのコアメカニズムをより深く理解することができます。
Kafkaパーティション管理(優先コピーの選択、パーティションの再配布)に関心のある学生は、リンクをクリックして私の最後の記事を読むことができます。この記事には、この記事の入手方法も含まれています。