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 ネットワークデプロイメントの実装方法

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

推薦する

オフライン反撃の謎:タオバオブランドの紆余曲折の「独立戦争」

タオバオブランドの方向性は数か月以内に何度も変化しました。 まず、電子商取引とタオバオブランドの間で...

2018年テンセントクラウド+フューチャーサミットが広州で開催され、クラウドを通じてインテリジェントな未来を活性化

5月23日、広東省人民政府の指導の下、広東省経済情報化委員会とテンセントの主催により、2018年テン...

評価期間におけるSEO最適化のポイント記事コンテンツ構築

皆さんご存知のとおり、新しいウェブサイトを立ち上げるときは、ウェブサイト構造の最適化、コラムの設定、...

オンサイト SEO とウェブサイトのコンテンツではどちらがより重要ですか?

外国貿易情報についてもっと学んでいますか? 質の高いサプライヤーを探していますか? より多くの人にあ...

インターネット上のトラフィックの40%以上が偽物

2週間前、国内マーケティング業界で大きな出来事が起こりました。甲社がWeiboのトップトラフィックエ...

リンクの人気度とウェブサイトのトラフィックを増やす方法

1. 友好的なリンクを確立するウェブサイトのコンテンツに関連する他のウェブサイトへのリンクを確立しま...

ウェブサイト SEO 最適化の専門性に関する Baidu の内部評価原則

私は再び SEO に関する記事を書き始めましたが、SEO は以前と同じくらいシンプルであることがわか...

SEO ルールが頻繁に更新されるウェブマスターにとって、将来の希望は何でしょうか?

SEO ルールが頻繁に更新されるウェブマスターにとって、将来の希望は何でしょうか?今年5月に百度がル...

3年間ウェブサイトを構築してきましたが、何も達成できず、A5の壁に直面しています。

時が経つのは早いものです。A5 に関する記事を最後に書いたのは 1 年前だったと記憶しています。それ...

教育におけるクラウドコンピューティングの重要性

過去 10 年間で、クラウド コンピューティングに代表される新興テクノロジーは、教育と学習方法に劇的...

インターネット マーケティング: 企業はどのようにして検索エンジンの障壁を突破できるでしょうか?

現在、検索エンジン市場は百度が独占しているが、ウェブマスターが百度に奪われたため、ウェブサイトは他の...

SEOにおけるウェブサイトのホーム画面デザインの5つの重要な側面に関する実用的な情報を共有します

ウェブサイトのユーザー エクスペリエンスは、アート、デザイン、プログラミング、戦略、フィードバックを...

マイクロソフトはAIの助けを借りてWindows全体をクラウドに移行する

Microsoft は、Windows 365 を通じて、ますます多くの Windows 機能とコン...

目を覚ましてください!検索エンジンの不正行為防止の時代が到来しました

XiayipaiのSEO担当者Lian Zichao氏は、5月23日以降、Baiduの検索エンジンで...

ハイブリッドクラウドを迅速かつ効果的に管理するための5つのステップ

クラウドコンピューティングという用語が登場して以来、それは科学技術分野で常にホットな話題となってきま...