Kafka を浅くから深く学ぶ: プロデューサー メッセージ パーティション メカニズムの原理

Kafka を浅くから深く学ぶ: プロデューサー メッセージ パーティション メカニズムの原理

[[322641]]

Apache Kafka を使用してメッセージを生成および消費する場合、データをすべてのサーバーに均等に分散する必要があります。

たとえば、多くの企業は Kafka を使用してアプリケーション サーバーからログ データを収集しています。特に多数のマシンで構成されたクラスター環境では、このデータは大量に存在します。 1 分ごとに生成されるログの量は GB 単位になります。そのため、このような大量のデータを Kafka の各 Broker に均等に分散させる方法が非常に重要な課題となります。

なぜパーティションするのですか?

トピックの概念は、実際のデータを運ぶ論理コンテナであり、トピックの下で複数のパーティションに分割されるというものです。つまり、Kafka のメッセージ編成方法は、実際にはトピック、パーティション、メッセージの 3 レベルの構造です。トピックの下にある各メッセージは 1 つのパーティションにのみ保存され、複数のパーティションに保存されることはありません。公式サイトのこの写真ではそれが非常にはっきりと示されています。

Kafka の 3 レベル構造は次のとおりです。

この写真を見た後、いくつか疑問が湧きました。カフカはなぜこのようなデザインになっているのでしょうか?複数のトピックを直接使用するのではなく、パーティションを使用するのはなぜですか?

パーティションの役割

実際、パーティショニングの役割は負荷分散機能を提供することであり、データをパーティショニングする主な理由はシステムの高いスケーラビリティを実現することです。

異なるパーティションを異なるノードのマシンに配置でき、データの読み取りおよび書き込み操作はパーティションの粒度で実行されるため、各ノード マシンは独自のパーティションの読み取りおよび書き込み要求処理を独立して実行できます。さらに、新しいノードマシンを追加することで、システム全体のスループットを向上させることもできます。

実際、パーティション化とパーティション化されたデータベースの概念は、1980 年代初頭にすでに専門家によって開発されていました。たとえば、Teradata と呼ばれるデータベースは、当時、パーティション化の概念を導入しました。

パーティションは、分散システムによって呼び方が異なります。たとえば、Kafka ではパーティション、MongoDB と Elasticsearch ではシャード、HBase ではリージョン、Cassandra では vnode と呼ばれます。

表面的には、実装の原則は異なるかもしれませんが、基礎となるパーティショニングの全体的な考え方は変わっていません。

パーティショニングは、負荷分散のコア機能を提供するだけでなく、ビジネスレベルのメッセージ順序付けの問題の実装など、他のビジネスレベルの要件を満たすためにも使用できます。

Kafka のパーティション戦略

Kafkaのパーティション戦略は、プロデューサーがどのパーティションにメッセージを送信するかを決定するアルゴリズムです。

Kafka はデフォルトのパーティション分割戦略を提供し、カスタム パーティション分割戦略もサポートします。

  • デフォルトのパーティション分割戦略
  • カスタムパーティション戦略

デフォルトのパーティション分割戦略

  • ラウンドロビン
  • ランダム性(非推奨)
  • メッセージキー戦略(キー順序付け)
  • 地理的分割戦略

世論調査戦略

ラウンドロビン戦略とも呼ばれ、順次割り当て

たとえば、トピックの下に 3 つのパーティションがある場合、最初のメッセージはパーティション 0 に送信され、2 番目のメッセージはパーティション 1 に送信され、3 番目のメッセージはパーティション 2 に送信されます。 4番目のメッセージが生成されると、次の図に示すように、再び開始され、パーティション0に割り当てられます。

partitioner.class パラメータを指定しない場合、プロデューサー プログラムはラウンドロビン方式でトピックのすべてのパーティションにメッセージを均等に「保存」します。

ポーリング戦略は優れた負荷分散パフォーマンスを備えています。メッセージが可能な限りすべてのパーティションに均等に分散されることを常に保証できます。デフォルトでは、これが最も合理的なパーティション分割戦略であり、最も一般的に使用されるパーティション分割戦略の 1 つです。

ランダム戦略

ランダムネス戦略とも呼ばれるランダムネスとは、次の図に示すように、任意のパーティションにメッセージをランダムに配置することを意味します。

パーティション メソッドのランダム戦略バージョンを実装する場合、非常に簡単で、必要なコードは 2 行だけです。

  1. List<PartitionInfo> パーティション = cluster.partitionsForTopic(topic);
  2. ThreadLocalRandomを返します現在の().nextInt(パーティション.size ( ));

まずトピックのパーティションの総数を計算し、それより小さい正の整数をランダムに返します。

本質的には、ランダム戦略も各パーティションにデータを均等に分散しようとしますが、実際のパフォーマンスの点ではポーリング戦略よりも劣ります。したがって、データの均一な分散を実現したい場合は、ポーリング戦略を使用することをお勧めします。

実際、ランダム戦略はプロデューサーの古いバージョンで使用されていたパーティショニング戦略であり、新しいバージョンではポーリングに変更されています。

メッセージキー戦略

キー順序付け戦略としても知られるKafkaでは、各メッセージにメッセージキーを定義することができ、これはキーと呼ばれます。

このキーは非常に便利です。顧客コード、部門番号、ビジネス ID など、明確なビジネス上の意味を持つ文字列にすることができます。メッセージのメタデータを表すためにも使用できます。

特に、Kafka がタイムスタンプをサポートしていなかった時代には、エンジニアがメッセージの作成時刻をキーに直接カプセル化していたシナリオもありました。

メッセージにキーが設定されると、同じキーを持つすべてのメッセージが同じパーティションに送信されるようになります。各パーティションでのメッセージ処理は順次行われるため、次の図に示すように、この戦略はメッセージ キー戦略と呼ばれます。

この戦略を実装するパーティション メソッドもシンプルで、次の 2 行のコードのみが必要です。

  1. List<PartitionInfo> パーティション = cluster.partitionsForTopic(topic);
  2. Mathを返します abs ( key .hashCode()) % パーティション。サイズ();

まずトピックのパーティションの総数を計算し、次にパーティションの数を法としてキーのハッシュコードの絶対値を計算します。

Kafka のデフォルトのパーティション分割戦略の選択: キーが指定されている場合、デフォルトの実装はメッセージ キー戦略です。キーが指定されていない場合は、ポーリング戦略が使用されます

地理的分割戦略

上記のパーティション分割戦略は比較的基本的な戦略です。実際、もう 1 つ、より一般的な戦略があります。それは、いわゆる地理的位置に基づくパーティショニング戦略です。

もちろん、この戦略は一般に、大規模な Kafka クラスター、特に都市、国、さらには大陸にまたがるクラスターにのみ適用できます。

カスタムパーティション戦略

デフォルトパーティションについて説明した後、カスタムパーティションについて説明しましょう

Kafkaのパーティション戦略をカスタマイズしたい場合は、プロデューサー側のパラメータpartitioner.classを明示的に設定する必要があります。

このパラメータを設定するにはどうすればいいですか?方法は非常に簡単です。プロデューサー プログラムを作成するときに、org.apache.kafka.clients.producer.Partitioner インターフェースを実装する特定のクラスを作成できます。

このインターフェースも非常にシンプルで、partition() と close() の 2 つのメソッドのみを定義します。通常は、最も重要なパーティション方法のみを実装する必要があります。コードは次のとおりです

  1. /**
  2. *指定されたレコードパーティションを計算します。
  3. *
  4. * @param topic トピック 
  5. * @param keyキー  または ない場合はnull  
  6. * @param keyBytes シリアル化されたキー  または ない場合はnull  
  7. * @param valueパーティションする または ヌル 
  8. * @param valueBytesパーティション分割するシリアル化された値 または ヌル 
  9. * @param cluster現在のクラスタメタデータ
  10. */
  11. 公共  intパーティション(文字列トピック、オブジェクトキー、byte[] keyBytes、オブジェクト値、byte[] valueBytes、クラスタークラスター);
  12.  
  13. /**
  14. *パーティショナー閉じられたときに呼び出されます
  15. */
  16. パブリックvoidクローズ();

ここで、topic、key、keyBytes、value、valueBytes はすべてメッセージ データであり、cluster はクラスター情報 (現在の Kafka クラスター内にあるトピックの数やブローカーの数など) です。

Kafka は、メッセージを分割し、どのパーティションに送信するかを計算できるように、多くの情報を提供します。

独自の実装クラスでパーティション メソッドを定義し、partitioner.class パラメータを独自の実装クラスの完全修飾名に設定している限り、プロデューサー プログラムはコード ロジックに従ってメッセージをパーティション分割します。

結論

今日は、Kafkaプロデューサーのメッセージ分割メカニズムといくつかの一般的な分割戦略について学びました。

パーティショニングは、負荷分散と高スループットを実現するための鍵です。したがって、プロデューサー側は、メッセージ データの偏りが発生し、特定のパーティションがパフォーマンスのボトルネックになり、下流のデータ消費のパフォーマンスの低下につながるのを防ぐために、適切なパーティション分割戦略を慎重に検討する必要があります。

<<:  OpenStack ネットワークデプロイメントの実装方法

>>:  強力なテクノロジ密度を構築し、デジタル変革を加速するために、マイクロソフト オンライン テクノロジ サミットが本日開催されます。

推薦する

Kafka から Hadoop にデータを素早くインポートするにはどうすればよいでしょうか?

Kafka は、強力な分散機能とパフォーマンス機能により、データ パイプラインの重要な部分として急速...

ntup: ウクライナのデータセンター、1Gbps の帯域幅、無制限のトラフィック、VPS は年間 12 ドルのみ、専用サーバーは月額 26.25 ドル

今から今月末まで、ウクライナのマーチャント ntup は VPS の半額セールと専用サーバーの 25...

共同購入業界の繁栄は終わり、生死は一つの考えにかかっている

天国から地獄までの道のりはどれくらい長いのでしょうか? 共同購入業界は 1 年でこの旅を終えました。...

ウェブページの掲載は多ければ多いほど良いというわけではない

SEO 業界には、含まれるサイトが多ければ多いほど良いという伝統的な概念があります。また、サイトの品...

SEO最適化戦略: 自然体で、自然のように行動する

現在、多くの SEO 最適化の専門家が、自然な最適化、つまりウェブサイトの本質を維持し、自然に戻ると...

2021年のクラウドコンピューティングのトップ10トレンドから、IT運用と保守におけるRPAの開発機会がわかります

2021年のクラウドコンピューティングのトップ10トレンドから、IT運用と保守におけるRPAの開発機...

電子商取引 Web サイトを開発する際には、どのような設計原則を適用する必要がありますか?

2018年最もホットなプロジェクト:テレマーケティングロボットがあなたの参加を待っています現在の電子...

モバイルインターネットアプリプロモーションの最高峰

モバイルインターネットアプリプロモーションの最高峰私はかつてプロモーションの仕事に就いていましたが、...

APPを効率的に宣伝するには? 2大チャネルを賢く活用!

APPのプロモーションでは、選択したプロモーションチャネルによって、主なユーザーのソースとユーザーの...

ロングテールキーワードの価値を3つの側面から判断する

ウェブサイトの最適化において、ロングテールキーワードはさらなるメリットをもたらす秘密兵器です。特に販...

Higress は現在最高のクラウドネイティブ ゲートウェイでしょうか?

Higress は、Alibaba の社内 Envoy Gateway プラクティスに基づいて構築さ...

クラウドレジリエンスへのアプローチ - システムおよびカオステスト

【51CTO.com クイック翻訳】 今日のデジタル テクノロジー時代では、ダウンタイムはダウンタイ...

Google Walletにユーザー識別コードを解読できる脆弱性が発見される

2月11日のロイターの報道によると、セキュリティ研究者がGoogle Walletの脆弱性を発見した...

SEO診断: ランキングに載らないウェブサイトのキーワードにさよなら

どのようなタイプのビジネスでも、独自のウェブサイトを構築し、それを最適化するために専門家を雇った場合...

曽華氏がハッピーライフテクノロジーホールディングスグループのCEOに就任

最近、KaiXinLife Technology Holding Groupは、Zeng Hua氏が...