Kafka がなぜこんなに素晴らしいのかについての 6 つの質問!

Kafka がなぜこんなに素晴らしいのかについての 6 つの質問!

[[379856]]

この記事はWeChatの公開アカウント「sowhat1412」から転載したもので、著者はsowhat0125です。この記事を転載する場合は、sowhat1412 公開アカウントにご連絡ください。

1 Kafka の紹介

1.1 Kafka の概要

Kafka アーキテクチャ

Kafka は、パブリッシュ/サブスクライブ モデルに基づく分散メッセージ キューです。 Kafka は強力なスループットを活かして、主にビッグデータのリアルタイム処理の分野で使用されています。データの収集、転送、保存のプロセスにおいて重要な役割を果たします。

  1. Apache Kafka は Scala で記述されており、Apache Software Foundation によって開発されたオープンソースのメッセージング システム プロジェクトです。このプロジェクトの目標は、リアルタイム データを処理するための、統合された高スループット、低レイテンシのプラットフォームを提供することです。
  2. Kafka は分散メッセージ キューです。 Kafka はメッセージを保存するときにトピックに従ってメッセージを分類します。 Kafka クラスターは複数の Kafka インスタンスで構成され、各インスタンス サーバーはブローカーと呼ばれます。
  3. Kafka クラスターとコンシューマーはどちらも、システムの可用性を確保するためにメタ情報を保存するのに ZooKeeper クラスターに依存しています。

1.2 Kafkaの利点

  1. 複数のプロデューサーとコンシューマーをサポートします。
  2. ブローカーの水平展開をサポートします。
  3. レプリカ セット メカニズムにより、データの冗長性が実現され、データが失われないことが保証されます。
  4. データはトピック別に分類されています。
  5. 圧縮されたデータをバッチで送信することで、データ転送のオーバーヘッドが削減され、スループットが向上します。
  6. 複数のモードでのメッセージをサポートし、メッセージはディスクに基づいてデータの永続性を実現します。
  7. ビッグデータの場合、高性能な情報処理により、1 秒未満のメッセージ遅延を保証できます。
  8. コンシューマーは複数のトピックからのメッセージをサポートできます。
  9. CPU、メモリ、ネットワークの消費量は比較的少ないです。
  10. データセンター間でのデータ複製とミラーリング クラスターをサポートします。

1.3 Kafka の欠点

  1. データはバッチで送信されるため、真の意味でのリアルタイムにはなりません。
  2. 統合パーティション内のメッセージの順序付けのみをサポートし、グローバルなメッセージの順序付けを実現することはできません。
  3. 監視は完璧ではなく、プラグインのインストールが必要です。
  4. データは失われ、トランザクションはサポートされません。
  5. データが繰り返し消費され、メッセージの順序が乱れる可能性があります。固定パーティション内のメッセージの順序付けは可能ですが、トピックに複数のパーティションがある場合は順序付けが保証されないため、Zookeeper のサポートが必要になります。トピックは通常手動で作成する必要があり、展開とメンテナンスのコストは MQ よりも高くなります。

1.4 Kafka アーキテクチャ

  1. ブローカー: Kafka サーバーはブローカーです。クラスターは複数のブローカーで構成されます。ブローカーは複数のトピックに対応できます。
  2. プロデューサー: メッセージ プロデューサーは、Kafka ブローカーにメッセージを送信するクライアントです。
  3. コンシューマー: 消費のために Kafka ブローカーからメッセージをプルするメッセージ コンシューマー。メッセージは、コンシューマーの消費能力に基づいて適切な速度で消費できます。
  4. トピック: キューとして理解できます。生産者と消費者の両方が同じ問題に直面しています。
  5. パーティション: スケーラビリティを実現するために、非常に大きなトピックを複数のブローカーに分散できます。トピックは複数のパーティションに分割できます。各パーティションは順序付けられたキューであり、バランスのとれたプロデューサー共有メカニズムに少し似ています。
  6. レプリケーション: クラスター内のノードに障害が発生した場合でも、ノード上のパーティション データが失われず、Kafka が引き続き動作できるようにするために、Kafka はレプリケーション メカニズムを提供します。トピックの各パーティションには、複数のレプリカ、リーダー、および複数のフォロワーが存在します。
  7. リーダー: パーティションには 1 つのリーダーが存在します。プロデューサーがデータを送信するオブジェクトとコンシューマーがデータを消費するオブジェクトは、どちらもリーダーです。
  8. フォロワー: 各パーティションにはフォロワーが 1 つあり、リーダーからのデータをリアルタイムで同期し、リーダーとのデータの同期を維持します。リーダーが失敗すると、フォロワーが新しいフォロワーになります。 Kafka のレプリカの数はブローカーの数を超えることはできないことに注意してください。
  9. コンシューマー グループ: コンシューマー グループは複数のコンシューマーで構成されます。グループ内の各コンシューマーは、異なるパーティションからデータを消費する責任があります。パーティションは 1 つのグループ内のコンシューマーによってのみ消費されます。消費者グループは互いに影響を及ぼしません。すべてのコンシューマーはコンシューマー グループに属します。つまり、コンシューマー グループは論理的なサブスクライバーです。
  10. オフセット: コンシューマーが特定のトピックからのメッセージを消費するときに、開始オフセットを指定できます。

1.5 ZooKeeper 機能

ZooKeeper は Kafka で重要な役割を果たし、一般的に次の機能を提供します。

1.5.1 ブローカー登録

ブローカーは分散してデプロイされ、互いに独立していますが、クラスター全体でブローカーを管理するには、ZooKeeper などの登録システムが必要です。

1.5.2 トピックの登録

Kafka では、同じトピックのメッセージは複数のパーティションに分割され、複数のブローカーに分散されます。これらのパーティションの情報とブローカーとの対応する関係も Zookeeper によって管理され、専用ノードによって記録されます。

1.5.3 プロデューサー負荷分散

同じトピック メッセージは複数のブローカーに分割されて配布されるため、プロデューサーはこれらの分散ブローカーにメッセージを合理的に送信する必要があります。

従来の 4 層負荷分散では、IP アドレスとポートに基づいてプロデューサーに関連付けられたブローカーが決定されます。通常、プロデューサーは単一のブローカーにのみ対応しますが、実際のシステムでは、各プロデューサーによって生成されるメッセージの量と各ブローカーによって保存されるメッセージの量は異なります。

負荷分散には Zookeeper を使用します。各ブローカーは起動時にブローカー登録プロセスを完了するため、プロデューサーはノード内の変更を通じてブローカー サーバー リストの変更を動的に認識し、動的な負荷分散メカニズムを実現します。

1.5.4 コンシ​​ューマー負荷分散

複数のコンシューマーが対応するブローカー サーバーからメッセージを適切に受信できるようにするには、Kafka のコンシューマーも負荷分散される必要があります。各コンシューマー グループには複数のコンシューマーが含まれており、各メッセージはグループ内の 1 つのコンシューマーにのみ送信されます。さまざまなコンシューマー グループは、互いに干渉することなく、独自の特定のトピックでメッセージを消費します。

1.5.5 パーティションとコンシューマーの関係

Kafka は各コンシューマー グループにグローバルに一意のグループ ID を割り当て、グループ内のコンシューマーはその ID を共有します。 Kafka では、各パーティション情報は同じグループ内の 1 つの Consumer のみが使用できると規定されており、パーティションと Consumer の関係は Zk に記録されます。各コンシューマーがメッセージ パーティションの消費権限を決定したら、Zookeeper 内の対応するメッセージ パーティションの一時ノードにそのコンシューマー ID を書き込む必要があります。

1.5.6 メッセージ消費進捗オフセット記録

コンシューマーが指定されたメッセージ パーティションを消費する場合、コンシューマーが再起動された後、または他のコンシューマーがメッセージ パーティションのメッセージ消費を再び引き継いだ後でも、前回の進行状況からメッセージを消費し続けることができるように、パーティション メッセージの消費進行状況のオフセットを Zookeeper に定期的に記録する必要があります。

1.5 7 消費者登録

同じトピックの下にある異なるパーティションからのメッセージが複数のコンシューマーによって可能な限り均等に消費されるように、コンシューマーとメッセージ パーティションを割り当てるプロセス。

コンシューマーが起動すると、ZK の下にノードが作成され、各コンシューマーはコンシューマー グループ内のコンシューマーの変更を登録してリッスンし、コンシューマーの負荷分散を保証します。

コンシューマーはブローカー リストを監視し、変更があった場合はコンシューマーの負荷分散を実行します。

2 Kafka 生成プロセス

2.1 書き方

プロデューサーはプッシュ モードを使用してブローカーにメッセージを公開します。各メッセージはパターンに追加され、ディスクへの順次書き込みとなります。シーケンシャル書き込みはランダム書き込みよりも少なくとも 3 桁高速です。

2.2 パーティション

2.2.1 パーティションの概要

メッセージが送信されると、基本的にはディレクトリであるトピックに送信されます。トピックはいくつかのパーティション ログで構成されます。組織構造は次の図のようになります。

分割が起こる

各パーティション内のメッセージは順序付けられ、生成されたメッセージはパーティション ログに継続的に追加され、各メッセージには一意のオフセット値が割り当てられていることがわかります。

消費者

パーティショニングにより、クラスターの拡張が容易になり、同時実行性が向上します。

画像理解:

Kafka のデザインは、道路輸送と同じように、生活からインスピレーションを得ています。出発点と目的地が異なれば、必要な高速道路(トピック)も異なります。高速道路には複数の車線(区画)を設けることができます。交通量の多い高速道路(トピック)では、スムーズな交通を確保するためにより多くの車線(パーティション)が必要ですが、交通量の少ない高速道路では、無駄を避けるために車線を少なくする必要があります。料金所は消費者のようなものです。車が多い場合は、料金所を複数開設して一括して料金を徴収することで渋滞を回避することができます。車が少ない場合は、車の合流を可能にするために、いくつかの料金所を開設するだけで済みます。

2.2.2 パーティショニングの原則

プロデューサーから送信されたデータを ProducerRecord オブジェクトにカプセル化する必要があります。

データのカプセル化

  1. パーティションが指定されている場合、指定された値がパーティション値として直接使用されます。
  2. パーティション値が指定されていないがキーが使用可能な場合、パーティション値はキーのハッシュ値とトピックのパーティション数の剰余をとることによって取得されます。
  3. パーティション値もキー値もない場合は、最初の呼び出しでランダムな整数が生成され (その後の呼び出しごとに整数が増加します)、この値の係数とトピックで使用可能なパーティションの合計数を取得することでパーティション値が取得されます。これは、ラウンドロビン アルゴリズムと呼ばれることがよくあります。

2.3 Kafkaファイル保存メカニズム

Kafka ストレージ構造

  1. Kafka では、メッセージはトピック別に分類されます。生産者と消費者は両方ともトピック指向です。トピックは単なる論理的概念ですが、パーティションは物理的な概念です。各パーティションはログ ファイルに対応します。各パーティションは、データ インデックスを保存するために .index を使用し、データを保存するために .log を使用します。インデックス ファイル内のメタデータは、対応するログ ファイル内のメッセージの物理オフセット アドレスを指します (kaldi、Neo4j を参照)。
  2. ログ ファイルが大きくなりすぎてデータの配置が非効率になるのを防ぐために、Kafka は各パーティションを複数のセグメントに分割するシャーディングおよびインデックス作成メカニズムを採用しています。各セグメントは .index と .log に対応します。これらのファイルは、トピック名 + パーティション番号という名前のフォルダーにあります。たとえば、トピック first には 3 つのパーティションがあり、対応するフォルダーは first-0、first-1、first-2 です。
  1. 1000000000000000000000.index  
  2. 20000000000000000000000.log
  3. 3000000000000000170410.インデックス 
  4. 4000000000000000170410.log
  5. 5000000000000000239430.インデックス 
  6. 6000000000000000239430.log

注: インデックス ファイルとログ ファイルの名前は、現在のセグメントの最初のメッセージのオフセットに基づいて付けられます。

データ検索プロセス

2.4 メッセージ実行順序を保証する方法

2.4.1 障害

Kafka にはトピック、パーティション、コンシューマーが 1 つずつありますが、コンシューマーは内部でマルチスレッド消費を実行するため、データの順序が乱れる可能性があります。

マルチスレッド消費

データは順番に異なるパーティションに書き込まれ、異なるコンシューマーによって消費されます。ただし、各コンシューマーの実行時間は固定ではありません。最初にメッセージを読み取ったコンシューマーが最初に操作を完了するという保証はありません。その結果、メッセージは順番に実行されず、データ順序エラーが発生します。

複数の消費者

2.4.2 解決策

同じメッセージが同じパーティション、1 つのトピック、1 つのパーティション、1 つのコンシューマー、および内部シングルスレッド消費に送信されるようにします。

  • 同じパーティションに書き込まれる情報は順序どおりでなければなりません。
  • 情報にキーを割り当てると、同じキーが同じパーティションに書き込まれます。
  • 同じパーティションから読み取られる情報は順序どおりでなければなりません。

単一スレッド消費

1 に基づいて、コンシューマーは情報 ID に応じて異なるキューにマッピングされ、消費が高速化されます。

メモリキュー

4 データの信頼性

4.1 メッセージパッシングセマンティクス

メッセージ配信セマンティクスにより、Kafka はメッセージがプロデューサーとコンシューマー間で送信されることを保証します。配送保証には 3 つの種類があります。

  1. 最大 1 回: 最大 1 回、メッセージが失われる可能性がありますが、繰り返し送信されることはありません。
  2. 少なくとも 1 回: 少なくとも 1 回、メッセージは失われることはありませんが、繰り返し送信される可能性があります。
  3. 正確に 1 回: 正確に 1 回配信されます。メッセージは一度だけ処理されます。なくさないで、繰り返さないで、ただ一度だけ。

理想的には、システムがメッセージを厳密に 1 回だけ配信することを望みますが、これを実現するのは困難です。次に、メッセージの伝達プロセスについて簡単に説明します。

4.2 生産者からブローカーへの情報

4.2.1 プロデューサー情報はブローカーに送信される

一般的な手順は次のとおりです。

  1. プロデューサーは、ZK からターゲット パーティションのリーダー メタデータを見つけます。
  2. プロデューサーはリーダーにメッセージを送信します。
  3. リーダーはメッセージを受け入れて保持し、acks 構成に基づいてフォロワーを同期する方法を選択します。
  4. フォロワーは、上記のようにデータを同期した後、リーダーに ack を送信します。
  5. リーダーとフォロワーの同期が完了すると、リーダーはプロデューサーに ack メッセージを送信します。

リーダー応答 ACK の場合、Kafka はユーザーに 3 つの信頼性レベルを提供し、ユーザーは信頼性とレイテンシの要件に基づいてトレードオフを行うことができます。

  • リクエスト.必須.acks = 0

プロデューサーはブローカーの ack を待たないので、レイテンシは最小限に抑えられます。ブローカーはデータをディスクに書き込む前に返します。ブローカーに障害が発生すると、データが失われる可能性があります。これは、「最大 1 回」モードに相当します。

ディスクが正常にアップロードされない場合、情報は失われ、通常は本番環境では使用されません。

  • リクエスト.必須.acks = 1

これがデフォルト値です。プロデューサーはブローカーの ack を待ちます。パーティション リーダーは、データをディスクに正常にフラッシュした後、ack を返します。フォロワーの同期が成功する前にリーダーに障害が発生すると、データが失われます。リーダーが情報を返すと成功とみなされます。

  • リクエスト.必須.acks = -1 / すべて

プロデューサーはブローカーの ack を待機し、パーティションのリーダーとフォロワー (ISR 内) がすべてデータをディスクに正常にフラッシュした後にのみ ack を返します。

ただし、リーダーがメッセージを受信して​​ OK を返し、フォロワーがメッセージを受信したもののリーダーが ack の送信に失敗した場合、プロデューサーはメッセージをフォロワーに再送信します。

「少なくとも 1 回」モードに対応します。

4.2.2 冪等性を保証する方法

ビジネスでデータが正確に 1 回だけであることが必要な場合、Kafka の初期バージョンでは、ダウンストリームでのみ重複排除できます。現在では、べき等性が導入されており、プロデューサーが重複メッセージをいくつ送信しても、サーバーは 1 つのデータのみを保持することになります。

少なくとも 1 回 + べき等性 = 正確に 1 回

べき等性を有効にし、プロデューサー パラメータで enable.idompotence = true を設定します。冪等性が有効なプロデューサーには、初期化中に PID が割り当てられます。同じパーティションに送信されたメッセージにはシーケンス番号が付加され、ブローカーはそれをキャッシュして一意性を判断します。ただし、PID を再起動すると変更されます。同時に、異なるパーティションには異なる主キーが存在します。冪等性は、パーティション間セッションに対して Exactly Once を保証することはできません。

4.3 Kafkaブローカー情報はディスクに保存される

データ保存プロセス

Kafka Broker が情報を受け取った後、それをディスクに書き込む方法は、通常 2 つの値を持つ producer.type によって設定されます。

デフォルト モードの sync では、データが最終的にディスクに書き込まれて初めて正常であるとみなされます。

非同期モードでは、データは OS のページ キャッシュに更新された後に返されます。このとき、突然マシンに問題が発生すると、情報が失われてしまいます。

4.4 コンシ​​ューマーはKafkaブローカーからデータを消費する

消費データ

コンシューマーは、トピックを一緒に消費する 1 人以上のコンシューマーで構成されるコンシューマー グループの形式で機能します。各パーティションは、グループ内の 1 つのコンシューマーのみが一度に読み取ることができますが、複数のグループが同時にパーティションを消費することは可能です。コンシューマーに障害が発生した場合、他のグループ メンバーは、以前に障害が発生したコンシューマーによって読み取られたパーティションを自動的に読み取って負荷分散します。コンシューマー グループは、ブローカーからメッセージをプルして、次の 2 つの段階で消費します。

データを取得してオフセットを送信します。

データの処理を開始します。

最初にオフセットを送信してからデータを処理すると、データ処理中に例外が発生し、データが失われる可能性があります。最初にデータを処理してからオフセットを送信した場合、オフセットを送信しないと情報が重複して消費される可能性があります。

追伸:

プル モードの欠点は、Kafka にデータがない場合、コンシューマーがループに陥り、空のデータを返し続ける可能性があることです。この問題に対処するために、Kafka コンシューマーはデータを消費するときに時間パラメータのタイムアウトを渡します。消費可能なデータがない場合、消費者は一定期間待機してから戻ります。この期間をタイムアウトと呼びます。

5 Kafka パーティション割り当て戦略

同じ group.id 内のコンシューマーの場合、トピック内の複数のパーティションでメッセージを消費するための特定のパーティション割り当て戦略があります。

Kafka には 2 つのパーティション割り当て戦略があり、partition.assignment.strategy を通じて設定されます。

  • RangeAssignor 範囲パーティション分割戦略。これはデフォルト モードでもあります。
  • RoundRobinAssignor 割り当て戦略、ラウンドロビン パーティション モード。

5.1 RangeAssignor 範囲分割戦略

範囲分割戦略はトピックごとに行われます。まず、同じトピック内のパーティションをシリアル番号で並べ替え、コンシューマーをアルファベット順に並べ替えます。パーティションが 10 個あり、コンシューマーが 3 個ある場合、ソートされたパーティションは p0 ~ p9 になります。消費者がソートを終えると、C1-0、C2-0、C3-0 になります。パーティション/コンシューマーの数によって、各コンシューマーが消費するパーティションの数が決まります。数値を均等に分割できない場合は、最初の数人の消費者がさらに 1 つのパーティションを消費します。

消費者消費区分
C1-0 p0、1、2、3のパーティションを消費する
C2-0 消費4、5、6ゾーン
C3-0 消費7、8、9ゾーン

範囲パーティション分割の欠点:

上記は 1 つのトピックのみを対象としています。 C1-0 コンシューマーがさらに 1 つのパーティションを消費することの影響は大きくありません。 N を超えるトピックがある場合、トピックごとに、コンシューマー C1-0 はさらに 1 つのパーティションを消費します。トピックの数が多いほど、他のコンシューマーよりも多くのパーティション C1-0 が消費することになります。これは、範囲パーティション分割の明らかな欠点です。

5.2 RoundRobinAssignor ポーリングパーティション戦略

RoundRobin ポーリング パーティショニング戦略では、すべてのパーティションとすべてのコンシューマーをリストし、それらを hascode で並べ替え、最後にポーリング アルゴリズムを通じて各コンシューマーにパーティションを割り当てます。ポーリング パーティションは次の 2 つのケースに分けられます。

  • 同じ消費者グループ内の消費者のサブスクリプション情報は同じです
  • 同じ消費者グループ内の消費者のサブスクリプション情報が異なります

5.2.1 消費者のサブスクリプション情報は消費者グループ内で同じです

同じコンシューマー グループ内のすべてのコンシューマーが同じメッセージをサブスクライブする場合、ラウンドロビン戦略のパーティション分散は均一になります。

たとえば、同じコンシューマー グループに 3 つのコンシューマー C0、C1、C2 があり、すべて 2 つのトピック t0 と t1 をサブスクライブしており、各トピックに 3 つのパーティション (p0、p1、p2) がある場合、サブスクライブされたパーティションは t0p0、t0p1、t0p2、t1p0、t1p1、t1p2 として識別できます。最終的なパーティション割り当て結果は次のとおりです。

消費者消費区分
C0 t0p0、t1p0パーティションを使用する
C1 t0p1、t1p1パーティションを使用する
C2 t0p2、t1p2パーティションを使用する

5.2.1 消費者グループ内で消費者サブスクリプション情報が異なる

同じコンシューマー グループ内で、サブスクライブされたメッセージが異なるため、パーティション割り当ては完全なポーリング割り当てではなく、パーティション割り当てが不均一になる可能性があります。コンシューマーがコンシューマー グループ内のトピックをサブスクライブしない場合、パーティションを割り当てるときに、このコンシューマーにはこのトピックのどのパーティションも割り当てられません。

たとえば、同じコンシューマー グループに 3 つのコンシューマー C0、C1、C2 があるとします。 3 つのトピック t0、t1、t2 をサブスクライブします。これら 3 つのトピックには、それぞれ 1、2、3 つのパーティションがあります (つまり、t0 には 1 つのパーティション (p0)、t1 には 2 つのパーティション (p0、p1)、t2 には 3 つのパーティション (p0、p1、p2) があります)。つまり、コンシューマー全体によってサブスクライブされるすべてのパーティションは、t0p0、t1p0、t1p1、t2p0、t2p1、および t2p2 として識別できます。次に、コンシューマー C0 はトピック t0 をサブスクライブし、コンシューマー C1 はトピック t0 と t1 をサブスクライブし、コンシューマー C2 はトピック t0、t1、および t2 をサブスクライブします。最終的なパーティション割り当て結果は次のとおりです。

消費者消費区分
C0 t0p0パーティションを使用する
C1 t1p0パーティションを使用する
C2 t1p1、t2p0、t2p1、t2p2パーティションを使用する

6 Kafka の効率的な読み取りと書き込み

Kafka が数百万 TPS をサポートできるのは、次の機能によるものです。

6.1 シーケンシャルなデータの読み取りと書き込み

情報は、多数のプラッタで構成されるハードディスクに保存されます。顕微鏡でプラッターを観察すると、プラッターの表面が凹凸になっていることがわかります。隆起した部分は磁化されて数字の 1 を表し、凹んだ部分は磁化されていなくて数字の 0 を表します。したがって、ハードディスクはテキスト、画像、その他の情報をバイナリ形式で保存できます。

ディスクフロアプラン

上の写真はハードディスクの実際の写真です。内部構造が理解できない可能性があります。もっと鮮明な画像を見てみましょう。

ディスクの内部

  1. このシステムは、人間の髪の毛の直径のわずか 1000 分の 1 の高さでディスク表面上を浮上する磁気ヘッドを介してディスク表面からデータを読み取ります。
  2. ハードドライブのプラッターは CD に似ています。プラッターには上面と下面の 2 つの面があり、それぞれの面にデータを保存できます。
  3. 各ディスク表面は多数の同心円状のトラックに分割され、同心円の半径は異なります。
  4. すべてのディスク上の同じトラックがシリンダーを構成し、同じトラック上の同じセクターはクラスターと呼ばれます。データはシリンダーに従って上から下へ読み書きされます。シリンダーがいっぱいになると、次のセクターに移動してデータの書き込みを開始します。
  5. トラックは弧(セクター)に分割され、各セクターは 512 バイトとその他の情報を保存するために使用されます。同心円は弧は同じですが半径が異なるため、外側の円の線速度は内側の円の線速度よりも大きくなります。
  6. システムが一度に 1 つのセクターを読み取るのは非効率すぎるため、オペレーティング システムはブロックごとにデータを読み取ります。ブロックは通常、複数のセクターで構成されます。各ブロックのサイズは4〜64KBです。
  7. ページ、デフォルトのサイズは 4KB です。オペレーティング システムは、多くの場合、メモリとハード ディスクの 2 つのストレージ デバイスと通信します。ブロックの概念と同様に、仮想の基本単位が必要です。そのため、メモリを操作する際には、最小単位として仮想ページという概念が使用されます。ハードディスクを扱う場合、ブロックが最小単位となります。

セクター: ハードディスクの最小の読み取りおよび書き込み単位

ブロック/クラスター: オペレーティングシステムがハードディスクからデータを読み書きするために使用する最小単位

ページ: メモリとオペレーティング システム間の操作の最小単位です。

ディスク アクセスの読み取り/書き込み要求の完了プロセスは、次の 3 つのアクションで構成されます。

  1. シーク: ヘッドが先頭からデータがあるトラックまで移動するのに必要な時間。平均約 10 ミリ秒です。
  2. 回転待ち時間: プラッターが回転し、要求されたデータを含むセクターを読み取り/書き込みヘッドの下に移動するのに要する時間。回転待ち時間はディスクの速度によって異なります。 5400 rpm ディスクの場合、平均すると約 5 ミリ秒になります。
  3. データ転送: ヘッドがターゲット セクターの最初の位置から移動してすべてのデータにアクセスするのにかかる時間。 5400 rpm のトラックに 400 個のセクターがある場合、1 つのセクターにアクセスするだけで 0.0278 ミリ秒かかります。

最も時間のかかる読み取りは最初の 2 つであることがわかります。順番に読み取る場合、シーク遅延と回転遅延は 1 回だけ使用する必要があります。ランダム読み取りの場合、シークと回転の遅延が複数回発生する可能性があり、その大きさは 3 桁近く異なります。

ディスクとメモリへのランダムおよびシーケンシャルな読み取りと書き込み

6.2 メモリマップファイル

  1. 仮想メモリ システムは、仮想メモリを仮想ページ (VP) と呼ばれる固定サイズのブロックに分割します。通常、各仮想ページのデフォルト サイズは 4KB です。同様に、物理メモリも 4KB の物理ページ (PP) に分割されます。
  2. サーバーは、オペレーティング システムのページを直接使用して、物理メモリからファイルへのマッピングを実装できます。データの読み取りと書き込みを行うユーザー操作はページに直接実行され、オペレーティング システムはマッピングに基づいて物理メモリ上の操作をハード ディスクに自動的に同期します。メモリの順次読み取りと書き込みに似た機能を実装します。
  3. 欠点は、ブローカー情報がディスクに書き込まれないため、データが失われる可能性があることです。

メモリマップ

6.3 ゼロコピー

6.3.1 ダイレクトメモリアクセス (DMA)

CPU は、読み取りおよび書き込み操作を実行するために IO を操作するための命令を発行します。ほとんどの場合、データをメモリに読み込んでメモリから IO に転送するだけなので、実際にデータが CPU を通過する必要はありません。

ダイレクト メモリ アクセスは、大量のデータの入出力を高速化するために開発されました。 DMA とは、外部デバイスが CPU を経由せずにシステム メモリと直接データを交換できるようにするインターフェイス テクノロジを指します。このように、データ転送速度はメモリや周辺機器の動作速度に依存します。

データ転送時に CPU がデータをコピーせずに DMA 転送のみを使用する場合、これをゼロ コピーと呼びます。 Zero Copy テクノロジーを使用すると、パフォーマンス コストを少なくとも半分に削減できます。

6.3.2 Kafka の読み取りと書き込みの比較

ゼロコピー

上記のブラック プロセスでは、ゼロ コピー テクノロジー プロセスは使用されません。

  1. DMA 転送では、ディスクはデータをオペレーティング システム メモリのページ キャッシュ領域に読み取ります。
  2. CPU はページ キャッシュ領域からユーザー メモリ領域にデータを移動してコピーします。
  3. CPU はユーザー メモリ領域からソケット キャッシュ領域にデータを移動します。
  4. DMA 転送では、データはソケット キャッシュ領域から NIC ネットワーク カード キャッシュ領域に転送されます。

赤いプロセスはゼロ コピー テクノロジーのプロセスです。

  1. DMA 転送では、ディスクはデータをオペレーティング システムのメモリのページ キャッシュ領域に読み取ります。
  2. DMA 転送では、データはシステム メモリのページ キャッシュ領域から NIC ネットワーク カードのキャッシュ領域に転送されます。

6.4 バッチ取引

コンシューマーがデータを取得すると、Kafka はデータを 1 つずつ送信するのではなく、処理のためにバッチで送信します。これにより、ネットワーク転送を節約し、システムの TPS を向上させることができます。ただし、データがリアルタイムで処理されないという欠点もあります。実際のリアルタイムは依然として Flink に依存します。

7 参考文献

Kafka にパーティショニングが必要な理由: https://www.zhihu.com/question/28925721

ディスク読み取りについて: https://blog.csdn.net/holybin/article/details/21175781

Kafka 100 万 TPS: https://mp.weixin.qq.com/s/Fb1cW0oN7xYeb1oI2ixtgQ

<<:  テンセントクラウドとサンフォーが正式に戦略提携

>>:  知っておくべきエッジコンピューティングの誤解

推薦する

10年間の努力が突然の終焉につながる:Fantong.comが崩壊した経緯

文/@董一志弁護士私のようなグルメな友人たちの辞書には、Fantong.com は間違いなく欠かせな...

検索エンジンの信頼ランキングと反トラストランキングアルゴリズム

検索エンジンが検索結果 (SERP) を表示するとき、候補結果に多くのランキング アルゴリズムを追加...

APP ブラッシング: チャネル ブラッシングを防ぐには?

名前が示すように、アプリの製品データをブラッシングすることは、非常に短い期間でそれを増やして、望まし...

基本的な検索エンジン機能: クロール、インデックス作成、関連性と重要度による並べ替え

検索エンジンには、クロールとインデックス作成、そして関連性と重要度に応じて結果の回答をランク付けする...

Cube Cloud - 春節期間中 25% オフ、CN2 GIA、韓国 + シンガポール + 香港 BGP VPS

「CubeCloud」の春節プロモーション:先行販売のVPSを除き、その他はすべて25%割引、永久に...

「2019年インダストリアルインターネット白書」の発表は、企業が経営をEBCに変革するのを助けます

デジタル変革の時代において、企業が産業用インターネットに移行することは必須です。しかし、インダストリ...

クラウド ストレージ サービス: 大規模データ ストレージと管理への新しいアプローチ

今日の企業には、デジタル変革を推進するだけでなく、データから積極的にさらなる価値を引き出すために、デ...

コミュニティユーザーのニーズの変化は、マイクロコミュニティの写真共有活動から見ることができます。

最近、自主メディアパーソンのハオ・シャオリャン氏は、康盛マイクロコミュニティ(Discuz!チームが...

マーケティングの徹底分析:なぜ Pinduoduo はわずか 3 年で 3 億人のユーザーを獲得できたのか?

月収10万元の起業の夢を実現するミニプログラム起業支援プラン競争が激しいレッドオーシャンで生き残るの...

検索エンジンは、適切なフォーマットのオリジナルコンテンツを好みます。

簡単な説明長い間何も書いていませんでした。今日は、検索エンジン最適化のためのオリジナルコンテンツの標...

インターネット情報推奨アルゴリズムの簡単な分析

ルペン氏の時代から、彼が扇動と情報発信に長けていることは公然の秘密だった。しかし今日では、ビッグデー...

「デジタルヒーロー」シリーズレポート:浙江ラジオテレビに根ざした13年間、新卒からデジタルヒーローへの昇進

浙江衛星テレビについて語るとき、「中国の声」の見事なパフォーマンス、「ランニングマン」の楽しさ、「エ...

SEO サービスの倫理規定

今日、インターネットマーケティングは商品を販売するための重要な手段となっています。インターネットを通...

EasyStor、収益10倍増達成に向けた5カ年計画を発表

2017 年 9 月 4 日、EasyStor は新しい会議室で、エンタープライズ クラウドおよび仮...

SEO担当者はウェブサイト自体に重点を置くべきである

私がこの業界に入ったとき、SEO の先輩たちがホワイト ハットとブラック ハットという 2 つの S...