Kafka はなぜこんなに速いのでしょうか?

Kafka はなぜこんなに速いのでしょうか?

Kafka は LinkedIn が立ち上げた高スループットの分散メッセージング システムです。簡単に言えば、パブリッシングとサブスクリプションに基づくメッセージ キューです。古いものを見直して新しいものを学び、優れたフレームワークを繰り返し学習することで、必ず何かが得られます。

[[402438]]

画像はPexelsより

アプリケーションシナリオ

Kafka のアプリケーション シナリオは次のとおりです。

  • 非同期分解: 上流と下流の間に強い依存関係がないビジネス関係、または単一の要求に対してすぐに処理する必要のないビジネス。
  • システム バッファリング: 特に処理速度が遅いサービスの場合、サービス システムのスループットの一貫性の問題を解決するのに役立ちます。
  • ピーク除去効果: 短期間に時々発生する極端なトラフィックに対して、バックエンド サービスを保護できます。
  • データ ストリーム処理: リアルタイムのデータ ストリーム処理のために Spark を統合します。

Kafka トポロジー図 (マルチコピー メカニズム)

上図から、Kafka は分散されており、パーティションごとに複数のコピーが存在し、クラスター全体の管理は Zookeeper によって行われていることがわかります。

Kafka コアコンポーネント

① ブローカー

Kafka サーバーはメッセージの保存と転送を担当します。ブローカーは Kafka ノードを表します。ブローカーには複数のトピックを含めることができます。

②トピック

メッセージ カテゴリ。Kafka はトピックに従ってメッセージを分類します。

③パーティション

トピックのパーティション。トピックには複数のパーティションを含めることができ、トピック メッセージは各パーティションに保存されます。

トピックは複数のパーティションに分割できるため、Kafka には並列処理機能が提供されており、これが Kafka の高スループットの理由の 1 つです。

パーティションは物理的に複数のセグメント ファイルで構成され、各セグメントは同じサイズで、順番に読み書きされます (ランダム書き込みが不要なため、Kafka が比較的高速である理由の 1 つでもあります)。

各セグメント データ ファイルは、セグメント内の最小オフセットを使用し、ファイル拡張子は .log になります。オフセット付きのメッセージを検索する場合は、バイナリ検索を使用して、メッセージが配置されているセグメントをすばやく見つけます。

④オフセット

ログ内のメッセージの位置は、パーティション上のメッセージのオフセットとして理解でき、これはメッセージを表す一意のシーケンス番号でもあります。

また、マスターとスレーブ間で同期する必要がある情報でもあります。

⑤プロデューサー

プロデューサーは、Kafka ブローカーにメッセージを送信する役割を担うクライアントです。

⑥消費者

メッセージ コンシューマー。Kafka ブローカーでメッセージを消費する役割を担います。

⑦消費者団体

消費者グループ。各消費者はグループに属している必要があります。 (注: パーティションはグループ内の 1 つのコンシューマーのみが使用でき、コンシューマー グループは相互に影響を与えません。)

⑧飼育係

Kafka クラスターを管理し、クラスター ブローカー、トピック、パーティションなどのメタデータの保存を担当します。また、ブローカーの障害検出、パーティション リーダーの選出、負荷分散などの機能も担当します。

サービスガバナンス

Kafka は分散パブリッシュ/サブスクライブ システムなので、クラスター間でデータの同期と一貫性が実現されれば、Kafka はメッセージを失わないのでしょうか?システムがクラッシュしたときにリーダー選出を実行するにはどうすればよいでしょうか?

①データ同期

Kafka では、パーティションにはリーダーと複数のフォロワーが存在します。プロデューサーがパーティションにデータを書き込む場合、データはリーダーにのみ書き込まれ、その後、データは他のレプリカに複製されます。

各フォロワーは、定期的にリーダーにメッセージを受け取るコンシューマーとして理解できます。データが同期された後にのみ、Kafka はプロデューサーに ACK を返し、メッセージが保存されたことを通知します。

②ISR

Kafka では、パフォーマンスを確保するために、マスターとスレーブのデータを同期するために強力な一貫性方式を使用しません。

代わりに、同期レプリカのリストが維持されます。リーダーは、すべてのフォロワーが同期を完了するまで待つ必要はありません。 ISR 内のフォロワーがデータ同期を完了すると、プロデューサーに ACK を送信し、メッセージの同期が完了したと見なすことができます。

同時に、ISR 内のフォロワーがあまりにも遅れていることが判明した場合は、そのフォロワーは削除されます。

具体的なプロセスは以下のとおりです。

上記のアプローチでは、Kafka がメッセージを失わないことを保証することはできません。 Kafka は、メッセージが最大限失われないようにマルチコピー メカニズムを使用しますが、データがシステム ページ キャッシュに書き込まれているがまだディスクにフラッシュされていない場合、マシンが突然クラッシュしたり電源が失われたりすると、当然メッセージは失われます。

③Kafka障害回復

Kafka は Zookeeper によって管理されるため、ここでの選択メカニズムでは Zab (Zookeeper によって使用される) が使用されます。

  • プロデューサーはリーダーにメッセージを送ります。このとき、リーダーはデータの保存を完了して突然失敗し、プロデューサーに ack を返しません。
  • ZK 選挙を通じて、フォロワーの 1 人がリーダーになります。このとき、プロデューサーは新しいリーダーに再度要求し、データを保存します。

Kafka はなぜこんなに速いのでしょうか?

① ディスクへのシーケンシャル書き込み

Kafka はシーケンシャルディスク書き込みを使用するため、ランダム書き込みに比べてアドレスの検索にかかる時間が短縮されます。 (Kafkaの各パーティションでは、メッセージが順序付けられます)

②ページキャッシュ

Kafka は、通常使用するバッファの代わりに、OS システム内のページ キャッシュを使用します。ページ キャッシュは、実際には馴染みのないものではなく、新しいものでもありません。

Linux でメモリを表示すると、バッファ/キャッシュが表示されることがよくあります。どちらも IO の読み取りと書き込みを高速化するために使用され、読み取りにはキャッシュが使用されます。

つまり、ディスクの内容をキャッシュに読み込むことができるため、アプリケーションはディスクを非常に高速に読み取ることができます。

バフは書き込みに使用されます。ディスク書き込みを開発する場合、通常、バッファに書き込んでからフラッシュすると、非常に高速になります。

Kafka は両方の長所を取り入れています。Kafka は Scala で書かれていますが、Java 仮想マシン上で実行されます。

それにもかかわらず、Kafka は依然として JVM の制限を回避しようとします。ストレージにページ キャッシュを使用するため、JVM の GC によって発生するデータの STW を回避できます。

一方、ページ キャッシュを使用すると、ゼロ コピーも実現できます。これについては、後ほど詳しく説明します。

③ゼロコピー

優れた Netty であれ、他の優れた Java フレームワークであれ、基本的にはゼロ コピーによって CPU コンテキストの切り替えとディスク IO を削減します。

もちろんカフカも例外ではありません。ゼロコピーの概念についてはここでは詳しくは繰り返しませんが、この概念について簡単に紹介したいと思います。

アプリケーションがデータを要求する従来のプロセス:

ここで、従来の方法では、4 つのコピー、2 つの DMA、2 つの CPU が使用され、CPU が 4 回切り替わることが大まかにわかります。

DMA を簡単に理解すると、I/O デバイスとメモリ間でデータを転送するときに、すべてのデータ転送タスクが DMA コントローラに引き渡され、CPU はデータ転送に関連する作業に一切関与しなくなります。

④ゼロコピー方式

最適化により、CPU には 2 つのコンテキスト スイッチと 3 つのデータ コピーしかないことがわかります。

Linux システムでは、システム コール関数「sendfile()」が提供されており、システム コールは、カーネル バッファー内のデータをユーザー状態にコピーするのではなく、ソケット バッファーに直接コピーできます。

⑤分割と細分化

前述したように、Kafka はパーティショニング モードを採用しており、各パーティションは物理セグメントに対応しています。検索時にはバイナリ検索に基づいて素早く見つけることができます。これにより、データ読み取りクエリの効率が向上するだけでなく、並列操作を行う手段も提供されます。

⑥データ圧縮

Kafka は、データに対して Gzip や Snappy などの圧縮プロトコルを提供します。これにより、メッセージ構造が圧縮され、帯域幅とデータ転送の消費が削減されます。

Kafka のインストール

①JDKをインストールする

圧縮パッケージを使用する場合は環境変数を自分で設定する必要があるため、yum を使用して直接インストールすることをお勧めします。現在の Java バージョンを確認する方法を理解しておいてください。

  1. yum -y リスト Java*

必要なバージョンをインストールします。ここでは 1.8 です。

  1. yum インストール java-1.8.0-openjdk-devel.x86_64

インストールが成功したかどうかを確認します。

  1. Java バージョン

②Zookeeperをインストールする

まず、公式 Web サイトにアクセスしてインストール パッケージをダウンロードし、解凍する必要があります。

  1. tar -zxvf zookeeper-3.4.9.tar.gz

必要なのは、このファイルをコピーして zoo.cfg という名前を付け、zoo.cfg で独自の設定を変更することだけです。

  1. cp zoo_sample.cfg zoo.cfg
  2. vim zoo.cfg

主な構成は次のように説明されます。

  1. # Zookeeper の基本単位はミリ秒です。つまり、tickTime は 2000 ミリ秒です。他の Zookeeper 構成では、変換は tickTime に基づいて行われます。
  2. ティックタイム=2000
  3. # クラスター内のフォロワー サーバー (F) とリーダー サーバー (L) 間の初期接続中に許容できるハートビートの最大数 (ティックタイムの数)。
  4. 初期制限=10
  5. #syncLimit: クラスター内のフォロワーサーバー (F) とリーダーサーバー (L) 間のリクエストとレスポンスの間で許容できるハートビートの最大数 (ティックタイムの数)
  6. 同期制限=5
  7. #データ保存フォルダ。 Zookeeperの動作中に保存する必要があるデータは2つあります。1つはスナップショットデータ(永続データ)で、もう1つはトランザクションログです。
  8. データディレクトリ=/tmp/zookeeper
  9. ## クライアントアクセスポート
  10. クライアントポート=2181

環境変数を設定します。

  1. vim ~/.bash_profile
  2. エクスポート ZK=/usr/ローカル/src/apache-zookeeper-3.7.0-bin
  3. エクスポート PATH=$PATH:$ZK/bin
  4. エクスポートPATH
  5. // 起動する
  6. zkServer.sh 開始

以下は起動が成功したことを示しています。

③Kafkaをインストールする

Kafka をダウンロード:

  1. https://www.apache.org/dyn/closer.cgi?path=/kafka/2.8.0/kafka-2.8.0-src.tgz

Kafka をインストールします。

  1. tar -xzvf kafka_2.12-2.0.0.tgzbr

環境変数を設定します。

  1. エクスポート ZK=/usr/ローカル/src/apache-zookeeper-3.7.0-bin
  2. エクスポート PATH=$PATH:$ZK/bin
  3. エクスポート KAFKA=/usr/ローカル/src/kafka
  4. PATH=$PATH:$KAFKA/bin をエクスポートします

Kafka を起動します。

  1. nohup kafka-server-start.sh 独自の設定ファイル path/server.properties &br

完了です!

著者: He Yongkang、Tencent CDG バックエンド R&D エンジニア。

編集者:タオ・ジアロン

出典: 公開アカウント Yunjia コミュニティ (ID: QcloudCommunity) から転載、参照: 「Kafka の詳細な理解: コア設計実践原則」

<<:  エッジコンピューティングとは具体的に何を意味するのでしょうか?

>>:  メモリ管理は2つの部分から成ります: 仮想メモリ管理

推薦する

パーソナライズされた検索と SEO

Dianshi フォーラムに、「中国の SEO レベルと世界のレベルの差はどれくらい大きいのか」とい...

ウェブマスターが語るSEO最適化の詳細を公開

ウェブマスターは、SEO 最適化を長年行ってきた結果、独自の最適化原則を持っています。たとえ全員が「...

SEO と SEM、企業はどちらに忠誠を誓うべきでしょうか?

SEO (検索エンジン最適化) 検索エンジン最適化。 SEM (検索エンジンマーケティング) 検索エ...

結婚・出会い系サイトが互いの本性をさらけ出す:Jiayuan.com 詐欺師が横行、Baihe.com は偽の実名

「真剣な交際」を促進する2つのウェブサイトが最近対立している。 (TechWeb写真) 【TechW...

すべてのマーケティングはコンテンツマーケティングです。サッスーの日本におけるマーケティングから始まりました。

たまたまサッスーの2008年の記事「小さな魔女はミルクを食べる」を読み返していたところ、日本の乳製品...

誰もがクラウド ネイティブについて話していますが、クラウド ネイティブとは正確には何でしょうか?

ほとんどの定義によれば、クラウド ネイティブとは、クラウドベースのサービスと配信モデルを最大限に活用...

2014 年のウェブサイト最適化への道についての簡単な説明

多くのウェブマスターは、外部リンクとコンテンツの重みの比率が現在どの程度なのか、またそれらの重みをど...

クラウドプロバイダーが効率性と生産性の向上にどのように役立つか

クラウド プロバイダーと提携すると、さまざまなメリットが得られ、ビジネスの効率と生産性が向上します。...

bandwagonhost-512m メモリ/5g ハードディスク/500g トラフィック/年間支払い $9.99

bandwagonhost は、IT7 Network Company (2004 年創業) のロー...

エッジコンピューティングとは何ですか?

[[203294]]クラウド コンピューティングはコンピューティング サービスの集中化であり、最も単...

SEO業界の詳細な分業と責任。方向性は明確になっていますか?

インターネットの台頭とともに、SEO 業界が静かに誕生しました。多くの人は、SEO は比較的複雑な業...

swiftslots-512Mメモリ月額支払い7ドル/Gポート

Swiftslots は 2009 年に設立されたホスティング会社ですが、現在のところあまり紹介され...

マルチクラウドとハイブリッドクラウドのどちらを選択すべきか迷っていますか?まず概念を明確にしましょう

クラウド コンピューティングは、今日の企業が収益を上げるために競争している分野です。 AWS などの...

タオバオの売り手が過労で亡くなった場合、オンラインストアを健全に運営する方法

最近、若いタオバオの出店者が過労で亡くなり、毎日店舗の営業を停止したり倒産したりするタオバオの出店者...

インターネットマーケティングソリューションの提供はSEOの未来です

現在、SEO 業界では次のような現象が起きています。初心者が Web サイト最適化ビジネスの注文を熱...