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 のテクノロジー スイートでデジタル変革をリード

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

推薦する

ウェブサイトの重量増加の新たな方向性は、ブランドプロモーションに向かうことです

ウェブサイトの重みを改善することは、SEO を行うすべての人が毎日行っていることです。しかし、ウェブ...

エッジコンピューティングとは何かを3分で理解する

エッジコンピューティングとは何ですか?実際のところ、中国では現在、エッジ コンピューティングの厳密か...

登録料 5.99 ドル、組織 + 1G のスペース + ウェブサイト ビルダー + 60 のメール アカウント

bigrock は割引コード BIGORG を使用して .org ドメイン名を 5.99 ドルで登録...

詳細が成功か失敗かを決める:ウェブサイトのディレクトリパスの最適化設計方法

ウェブサイトの最適化において、多くのウェブマスターは全体的な最適化戦略を追求していますが、いくつかの...

ムーンライトブログの成功を分析する

コアヒント:私は Moonlight Blog を長い間知っており、頻繁に訪問しています。私は長い間...

外部リンクプロモーションの4つの原則:より多く、より広く、より詳細に、より革新的に

外部リンクプロモーションはウェブマスターが日々繰り返している作業とも言え、SEO業界でも非常に重要な...

SUSE、openEuler向けコンテナインフラプラットフォーム構築のためRFO SIGを設立

北京時間9月7日、SUSEが創設したRFO SIGが、オイラーオープンソースコミュニティの技術委員会...

大規模アプリケーションのパフォーマンスの課題を克服するにはどうすればよいでしょうか?

[51CTO.com クイック翻訳] Web スケールのアプリケーションでは、優れたユーザー エクス...

RegVPS-$7/Windows/512 メモリ/15g ハードドライブ/1T トラフィック/ロシア/スイス/ドイツ/米国

RegVPSはロシア(2009年)に登録された会社です。現在、ロシア、スイス、ドイツ、米国の4つのデ...

EasyStackとChina Power Interconnectionが戦略的に協力し、産業用インターネットクラウドプラットフォームの実装を推進

最近、EasyStack と中国電子工業インターネット株式会社 (CEC インターネット) は、中国...

オラクルはクラウドプラットフォームを全面的にアップグレードし、新たなクラウドビジネスを強化

2017年はクラウドコンピューティングの発展が全面的に加速し、特にインフラやプラットフォームレベルで...

SEOERは、ブランドワードの構築がウェブサイトにとって重要であることに注意してください。

おそらく、タイトルだけではブランドの本当の意味を理解することはできないでしょう。おそらく、自分自身が...

クラウドとオンプレミス間のセキュリティギャップを埋める方法

ただし、東西トラフィック、つまり内部ネットワークとデータセンターを通過するがネットワーク境界を越えな...

HPA PaaS プラットフォームのサポートにより、事務職女子がプログラマーになれる方法!

[[345506]]簡単に自己紹介をさせてください。私は普通の会社員女子です。 [[345507]]...