Kafka はどのようにして 1 秒あたり数百万件という超高速同時書き込みを実現するのでしょうか?

Kafka はどのようにして 1 秒あたり数百万件という超高速同時書き込みを実現するのでしょうか?

この記事では、インターネット企業での面接で頻繁に技術テストのポイントにもなる Kafka のアーキテクチャ設計原則について説明します。

Kafka は、高スループットと低レイテンシを備えた、高同時実行性と高性能を備えたメッセージ ミドルウェアです。ビッグデータ分野で広く利用されています。適切に構成された Kafka クラスターでは、1 秒あたり数十万または数百万という超高速の同時書き込みも実現できます。

では、Kafka はどのようにしてこのような高いスループットとパフォーマンスを実現するのでしょうか?この記事ではそれについて詳しく説明します。

ページキャッシュ技術 + ディスクシーケンシャル書き込み

まず、Kafka はデータを受信するたびに、次の図に示すようにそれをディスクに書き込みます。

そこで、疑問が湧いてきます。データがディスクベースで保存され、データがディスク ファイルに頻繁に書き込まれると、パフォーマンスが非常に低下するのでしょうか?ディスクの書き込みパフォーマンスが非常に悪いと誰もが思うはずです。

はい、本当に上の図のように単純なものであれば、パフォーマンスは確かに悪いです。

しかし実際には、Kafka にはデータ書き込みパフォーマンスを確保するための非常に優れた設計があります。まず、Kafka はオペレーティング システムのページ キャッシュに基づいてファイルの書き込みを実装します。

オペレーティング システム自体には、メモリ内のキャッシュであるページ キャッシュと呼ばれるキャッシュ レイヤーがあります。これを OS キャッシュと呼ぶこともできます。これは、オペレーティング システム自体によって管理されるキャッシュを意味します。

ディスク ファイルに書き込む場合、OS キャッシュに直接書き込むことができます。つまり、メモリに書き込むだけです。次に、オペレーティング システムは、OS キャッシュ内のデータを実際にディスク ファイルにフラッシュするタイミングを決定します。

この 1 つのステップだけで、実際にはディスクではなくメモリに書き込まれるため、ディスク ファイルの書き込みパフォーマンスが大幅に向上します。次の図を参照してください。

もう 1 つの重要な点は、Kafka がデータを書き込むときに、ディスクの順序で書き込むことです。

つまり、データはファイル内のランダムな場所で変更されるのではなく、ファイルの末尾にのみ追加されます。

通常の機械式ディスクは、ランダムに書き込む場合、つまり、データを書き込むためにファイル内の特定の場所を見つける必要がある場合、パフォーマンスが非常に低くなります。

ただし、ファイルの末尾に追加してデータを順次書き込む場合、順次ディスク書き込みのパフォーマンスは、メモリへの書き込みのパフォーマンスと基本的に同じになります。

上の図では、Kafka がデータを書き込むときに、OS レベルのページ キャッシュに基づいてデータを書き込むため、パフォーマンスが非常に高いことが誰もが知っています。本質的には、メモリに書き込むだけです。

また、ディスクシーケンシャル書き込みを使用しているため、データをディスクにフラッシュした場合でもパフォーマンスが非常に高く、メモリへの書き込みとほぼ同じです。

上記 2 つの点に基づき、Kafka はデータの書き込みにおいて非常に高いパフォーマンスを実現します。考えてみてください。Kafka が 1 個のデータを書き込むのに 1 ミリ秒かかるとしたら、1 秒あたり 1,000 個のデータを書き込むことはできるでしょうか?

しかし、Kafka のパフォーマンスが非常に高く、データの書き込みに 0.01 ミリ秒しかかからない場合はどうなるでしょうか?では、1秒間に10万個のデータを書き込むことは可能でしょうか?

したがって、1 秒あたり数万、数十万のデータを確実に書き込むには、各データの書き込みパフォーマンスを可能な限り向上させ、単位時間あたりに書き込めるデータ量を増やしてスループットを向上させることがポイントになります。

ゼロコピー技術

書くことについて話した後は、消費について話しましょう。

ご存知のとおり、Kafka からデータを取得する必要が頻繁に生じます。消費時には、次の図に示すように、実際に Kafka のディスク ファイルからデータの一部を読み取り、下流のコンシューマーに送信する必要があります。

では、データがディスクから頻繁に読み取られ、消費者に送信される場合は、パフォーマンスのボトルネックはどこにあるのでしょうか?

Kafka が最適化を行わず、単にディスクからデータを読み取って下流のコンシューマーに送信すると仮定すると、プロセスは次のようになります。

  • まず、読み取るデータが OS キャッシュにあるかどうかを確認します。そうでない場合は、ディスク ファイルからデータを読み取り、OS キャッシュに格納します。
  • 次に、オペレーティング システムの OS キャッシュからアプリケーション プロセスのキャッシュにデータをコピーし、アプリケーション プロセスのキャッシュからオペレーティング システム レベルのソケット キャッシュにデータをコピーします。
  • *** ソケット キャッシュからデータを抽出し、ネットワーク カードに送信し、*** 下流の消費に送信します。

全体のプロセスを下の図に示します。

上の写真を見ると、不要なコピーが 2 つあることがわかります。 1 つはオペレーティング システムのキャッシュからアプリケーション プロセスのキャッシュにコピーされ、次にアプリケーション キャッシュからオペレーティング システムのソケット キャッシュにコピーされます。

これら 2 つのコピーを実行するために、途中で複数のコンテキスト スイッチが発生しました。アプリケーションが実行されている場合もあれば、実行のためにコンテキストがオペレーティング システムに切り替えられている場合もあります。

したがって、このデータ読み取り方法では、より多くのパフォーマンスが消費されます。この問題を解決するために、Kafka はデータの読み取り時にゼロコピー技術を導入します。

つまり、オペレーティング システムのキャッシュ内のデータは、データをコピーする 2 つの手順をスキップして、ネットワーク カードに直接送信され、下流の消費者に送信されます。ソケット キャッシュには記述子のみがコピーされ、データはコピーされません。

この素晴らしいプロセスを体験するには、下の写真をご覧ください。

ゼロコピー テクノロジーを使用すると、OS キャッシュ内のデータをアプリケーション キャッシュにコピーしたり、アプリケーション キャッシュからソケット キャッシュにコピーしたりする必要がありません。両方のコピーが省略されるため、ゼロコピーと呼ばれます。

ソケット キャッシュはデータ記述子をコピーするだけで、その後、データは OS キャッシュからネットワーク カードに直接送信されます。このプロセスにより、データ消費中のファイル データの読み取りパフォーマンスが大幅に向上します。

また、ディスクからデータを読み取るときに、まずそのデータが OS キャッシュ メモリ内にあるかどうかがチェックされることに気づくでしょう。そうであれば、データは実際にはメモリから直接読み取られます。

Kafka クラスターが適切に調整されている場合、大量のデータが OS キャッシュに直接書き込まれ、その後、そのデータが OS キャッシュから読み取られることがわかります。

これは、Kafka が完全にメモリに基づいてデータの書き込みと読み取りを提供するのと同じであり、全体的なパフォーマンスが非常に高くなります。

余談ですが、次回機会があれば Elasticsearch のアーキテクチャ原則についてお話ししたいと思います。実際、基盤となる ES は、Kafka の原理に似た OS キャッシュに基づく大量データの高性能な取得も実装しています。

要約する

この記事で紹介した Kafka の基盤となるページ キャッシュ テクノロジ、ディスク シーケンシャル書き込みの考え方、ゼロ コピー テクノロジの応用を通じて、各 Kafka マシンが最下層でデータの書き込みと読み取りを行う際にどのような考え方を採用しているか、また、そのパフォーマンスが非常に高く、1 秒あたり数十万のスループットを達成できる理由を、誰もが理解できるはずです。

この設計アイデアは、ミドルウェア アーキテクチャを独自に設計したり、面接に出かけたりするときに非常に役立ちます。

Chinese Huperzine: 10 年以上の BAT アーキテクチャ経験、一流インターネット企業のテクニカル ディレクター。数百人のチームを率いて、数億のトラフィックを処理する複数の高同時実行システムを開発しました。長年の研究で蓄積してきた研究論文や経験の要約を文書にまとめましたので、皆様にご紹介したいと思います。 WeChat 公開アカウント: Shishan’s Architecture Notes (ID: shishan100)。

<<:  メーカーが PTC と Rockwell Automation のテクノロジー スイートでデジタル変革をリード

>>:  サーバー仮想化技術に関する深い知識

推薦する

ネットワーク スライシングとサービス品質 (QoS) の違いは何ですか?

ネットワーク スライシングは、5G が登場するほぼすべての箇所で言及されていますが、その定義は通常曖...

飲食業界におけるWeiboマーケティングはいくつかの段階に分けられる

ショートビデオ、セルフメディア、インフルエンサーのためのワンストップサービスインターネットの発展とW...

9つのマルチクラウド管理プラットフォームの評価

ハイブリッド クラウドやマルチクラウド環境の管理に役立つクラウド コンピューティング ツールとサービ...

ウェブサイトがダウングレードされた後、軽率な行動をせず、安定性を前提として維持することを忘れないでください。

ご存知のとおり、ウェブサイトの降格は、ウェブサイトを最適化する過程ですべてのウェブマスターが必ず遭遇...

Googleは中国から完全撤退?香港のドメイン名 google.com.hk を開くことができません。

eName.cnは6月3日、最近、一部のネットユーザーからGoogleが開けないとの報告があったと報...

外国貿易サイトのコンバージョン率を向上させるための見落とされがちな2、3の提案

経済危機により、海外の人々は安いものを買いたいという需要が高まっており、これは外国貿易を行っている私...

最適化の不正行為はすべて不倫のようなもの

最適化の不正行為はすべて不倫のようなもの今日では、インターネットについて少しでも知っている人なら誰で...

Kubernetes の制限とリクエストを 1 つの記事で理解する

Kubernetes でコンテナを操作する場合、関係するリソースが何であるか、そしてそれらがどのよう...

sharktech-4gメモリ/1.5Tハードディスク/100M無制限/スーパーポータブルD 50G/69ドル

ご存知のとおり、Sharktech は米国で最も強力なプロ用 D キャリアとして知られています。どれ...

ジェイド産業フォーラムはどのようにして包囲を突破したのでしょうか?

翡翠業界フォーラムといえば、私は翡翠についてあまり詳しくないのですが、なぜ今日翡翠業界フォーラムの話...

Hostgator - 仮想ホスティングが 55% オフ/メキシコ「5 月 5 日」

シンコ・デ・マヨ(メキシコの死者の祭り、一般的には5月5日として知られています)を祝うために、Hos...

ウェブサイトの最適化における無駄な動作を排除し、ウェブサイトの最適化効率を向上させる方法

現在、多くのウェブマスターは、ウェブサイトの最適化で目標を達成できていないと感じています。ウェブマス...

Baihe.comの創設者、Mu Yan氏:センセーショナルな広告は最高の効果があり、最も嫌われているビジネスモデルは最も利益をもたらす

ダークホースゲームズはクラウドファンディング、クラウドソーシング、シェアリングで大盛況です。ゲームに...

WeChat は攻撃を受けているが、誰のために攻撃を受けているのだろうか?

1月9日、張小龍が前例のない4時間に及ぶ単独演説を公の場で行った後、社会界は混乱に陥った。まず、By...