インタビュアー:カフカをご存知ですか? Kafka ログセグメントの読み取りと書き込みの方法について説明します。

インタビュアー:カフカをご存知ですか? Kafka ログセグメントの読み取りと書き込みの方法について説明します。

[[332223]]

私がこの記事を書いた理由は、以前のインタビューでインタビュアーからこの質問をされたからです。面接官はこう尋ねました。「Kafka に精通しているとおっしゃいましたが、ソース コードは読みましたか? では、Kafka ログ セグメントの読み取りと書き込みの方法を教えてください。」

私は心の中で静かに言いました。「しまった...ソースコードを少し読んだと言ったのに、少しじゃなかった。これについて言及するべきではなかった!」ではどうすればいいでしょうか?家に帰って通知を待つしかありません。

しかし、将来的に地位を取り戻すためには、ただ座って死を待つわけにはいきません。私たちは少しずつから数十億まで、一歩ずつ進んでいかなければなりません。今日は、ソース コード レベルで Kafka ログ セグメントを読み書きする方法について説明します。

Kafka のストレージ構造

ご存知のとおり、Kafka のトピックには複数のパーティションを含めることができます。パーティションは、実際には最小の読み取りおよび保存構造です。つまり、コンシューマーはトピックをサブスクライブしているように見えますが、実際にはトピックの下のパーティションからメッセージを取得します。メッセージを送信するプロデューサーの場合も同様です。

トピックとパーティションの関係

上図は全体的な論理関係を示しています。ディスク上の実際のコードにマップされた関係を次の図に示します。

各パーティションは、ディスク上のサブディレクトリである Log オブジェクトに対応します。サブディレクトリの下には、複数のログ セグメントのグループ、つまり複数のログ セグメントが存在します。ログ セグメントの各グループには、メッセージ ログ ファイル (log で終わる)、変位インデックス ファイル (index で終わる)、およびタイムスタンプ インデックス ファイル (timeindex で終わる) が含まれます。実際、.txnindex、.deleted など、他のサフィックスを持つファイルもあります。スペースが限られているため、ここでは説明しません。

以下はログの定義である

以下はログセグメントの定義です

indexIntervalBytes は、インデックスを作成する前に挿入されるメッセージの数として理解できます。このことから、Kafka のインデックスは実際にはスパース インデックスであり、インデックス ファイルがメモリを占有しすぎるのを防ぎ、より多くのインデックスをメモリに格納できることがわかります。対応する値はブローカー側のパラメータ log.index.interval.bytes で、デフォルトは 4 KB です。

インデックスを介してメッセージを検索する実際のプロセスは、最初にオフセットを介してインデックスが配置されているファイルを見つけ、次にバイナリ検索を介してターゲットに最も近いインデックスを見つけ、最後にメッセージ ファイルを順番に走査してターゲット ファイルを見つけることです。この操作の時間計算量は O(log2n)+O(m) です。ここで、n はインデックス ファイル内のインデックスの数、m はスパース性です。

これは空間と時間の交換であり、データ構造とアルゴリズムのバランスです。素晴らしいですね!

rollJitterMsについて話しましょう。これは実際には妨害値です。対応するパラメータは log.roll.jitter.ms です。これは実際にはログ セグメントのセグメンテーションに関係しています。 log.segment.bytes はログ セグメント ファイルのサイズを制御します。デフォルトは 1G です。つまり、ファイル ストレージが 1G を超えると、新しいファイルが書き込まれます。これは寸法としてのサイズに基づいています。時間に基づいてセグメント化されるパラメーター log.segment.ms もあります。

このパラメータを設定した後、パーティションが多数あり、このパラメータがグローバルであるため、多数のファイルを同時に分割する必要がある場合、ディスク IO はそれを処理できません。したがって、分割するには rollJitterMs を設定する必要があります。

Redis Cache の有効期限はどうですか?多数のキャッシュが同時に期限切れになり、キャッシュがデータベースに侵入するのを防ぐために、有効期限に乱数を追加します。ほら、知識は普遍的なものなんだ!

ログセグメントの書き込み

1. 現在のログ セグメントが空かどうかを判断します。空の場合は、後でログセグメントを分割するための基準として時間を記録します。

2. 変位値が適正であることを確認します。最後に、AbstractIndex.toRelative(..) メソッドが呼び出され、オフセットが 0 未満か、最大 int 値より大きいかが判断されます。

3. メッセージを追加すると、実際に FileChannel を通じてメッセージが書き込まれます。もちろん、メモリとページ キャッシュにのみ書き込まれます。ディスクをフラッシュするかどうかは構成によって異なります。

4. ログ セグメントの最大タイムスタンプと、最大タイムスタンプに対応する変位値を更新します。このタイムスタンプは、実際には定期的なログ削除の基準として使用されます。

5. 必要に応じてインデックスエントリを更新します (bytesSinceLastIndexEntry > indexIntervalBytes)

最後にフローチャート

メッセージ作成プロセス

ログセグメントの読み取り

1. 最初のメッセージのオフセットに従って、OffsetIndex を通じて対応するメッセージの物理的な位置とサイズを見つけます。

2. LogOffsetMetadata を取得します。メタデータには、メッセージのオフセット、メッセージが配置されているセグメントの開始オフセット、および物理的な場所が含まれます。

3. minOneMessage が true かどうかを判断します。その場合は、メッセージ サイズを返すように調整します。実際、単一のメッセージが maxSize より大きい場合に、コンシューマーが飢餓状態になるのを防ぐためにこれを返すことができます。

4. 最大 fetchSize を計算します。これは、(最大物理変位 - このメッセージの開始物理変位) と調整済み最大サイズ (前の操作の調整済み最大サイズがすでにメッセージの最小サイズであるため、これはよくわかりません) の最小値です。

5. FileRecordsのsliceメソッドを呼び出して、指定された場所から指定されたサイズのメッセージセットを読み取り、FetchDataInfoを構築して返します。

ここに別のフローチャートを示します。

メッセージの読み取りプロセス

まとめ

転んだところから立ち上がるべきですよね?これを実行すれば、次回面接官からこの質問をされても怖くなくなるでしょう。

ソースコードはまあまあです、ハハハハ(まずは勢いが必要です)

実際、これは Kafka ソースコードの氷山の一角に過ぎず、まだ長い道のりが残っています。 Kafka Broker は Scala で書かれていますが、言語は問題ではありません。読みにくくなく、コメントも豊富です。知らない文法に出会ったら、調べれば終わりです。

したがって、ソース コードから始めて、ソース コードから理解することを強くお勧めします。今回お話ししたappend関数とread関数は非常にコアな関数ですが、一見すると複雑なものではないので、「ソースコード」という言葉に怖気付かないでください。

ソースコードを読むことで、内部設計の原則をより深く理解し、コーディング スキルを向上させることができます (ソースコードを見て、自分もこのように書けることに気づくことがよくあります)。もちろん、システムアーキテクチャ機能もあります。

じゃあ、僕にとって一番大事なのは、自慢できることなんです(笑)。

メロドラマ

白氏は監視画面を見つめながら、「なぜ? Kafka Broker の物理ディスク I/O 負荷が急に高くなったのはなぜ?」と考えていました。老白の頭に数本の髪の毛が逆立っているのが、彼をとても無力に見せている。

「log.segment.ms パラメータを設定しましたか? log.roll.jitter.ms を試してください。」老白が顔を上げると、私は背が高く堂々とした姿と光沢のある禿げ頭を残して、すでにオフィスから出て行っていました。

「ハゲて強くなった」

<<:  エッジコンピューティングを通じてスマートシティは高度な都市計画へと移行

>>:  人工知能と機械学習はCOVID-19と戦うために何ができるでしょうか?

推薦する

オンサイト最適化の方法についての簡単な分析

オンサイト最適化の主なポイントは、データを分析し、既存のウェブサイトの条件下でユーザーがどのコンテン...

仮想デスクトッププロジェクトにおけるサーバー数の簡単な計算方法

デスクトップ クラウドに必要なサーバーの数は、仮想マシンの負荷と密接に関係しています。ユーザー数が比...

#韩国VPS# 2sync-$18/KVM/2Gメモリ/10gSSD/100gトラフィック/1Gbps

2sync は 2009 年に設立されたインドのムンバイの会社です。現在の事業には、ドメイン名、仮想...

量子コンピューティングの可能性を解き放つ:ゲームを変える技術

量子コンピューティングは、技術進歩における次のフロンティアとして長い間歓迎されてきました。比類のない...

v6node: 米国/ドイツ VPS、年間 36 ユーロ、4G メモリ/2 コア/40GNVMe/8T トラフィック、IPv6 のみ

v6node は今年設立された VPS 会社で ()、IPv6 ベースの VPS に注力しています。...

リンクの人気度とウェブサイトのトラフィックを増やす方法

1. 友好的なリンクを確立するウェブサイトのコンテンツに関連する他のウェブサイトへのリンクを確立しま...

テンセントと奇虎の敵対関係:テンセントが開放を加速し、360の株価が急騰

テンセントの市場支配力の乱用に対するQihoo 360の控訴が最高人民法院で始まる中、インターネット...

impactvps-12USD/8GB RAM/8コア/90GB SSD/10IPv4/4TBトラフィック/10Gポート

Impactvps のアメリカ退役軍人の日特別プロモーションはかなり前に発表されていましたが、私はな...

WeChat以外にソーシャル分野で戦争はありません!

ソーシャルの世界では、WeChatは2位だと言っていますが、誰も立ち上がって1位だと言う勇気がないの...

プロのSEO担当者の一日

夜も遅くなり、皆が寝静まった頃、私はコンピューターの前に一人座り、機械的にキーボードを叩き、クライア...

#ReliableOVZ: Ramnode-10% オフ/5 つのコンピュータ ルーム/G ポート/DDoS 保護/Windows

誰もが理解し、区別して購入する方法を知ることができるように、ramnode について簡単に説明します...

Zhihu の収益化構造を分析: 大手 V は本当に儲かるのか?

最近、知乎はニューヨーク証券取引所で正式に鐘を鳴らした。周元氏はその場で、知乎の成長に付き添った優秀...

仕事再開後、ネットプロモーション会社の金儲けの助っ人登場

ショートビデオ、セルフメディア、インフルエンサーのためのワンストップサービス仕事を再開した後、クライ...