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

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

推薦する

ウェブサイトのデータ分析に関するいくつかの問題(I):データではなく分析に重点が置かれている

私は長い間、データ ウェアハウスとデータ分析関連の業務に従事してきました。実際、多くの問題が頭から離...

企業ウェブサイトの最適化で注意すべき点について簡単に説明します。

業界に入ったばかりのSEO担当者の場合、ほとんどの人が会社の公式サイトの最適化を担当していますが、あ...

質問回答サイトQuoraは、評価額4億ドルで5000万ドルを調達する予定であると報じられている。

Quoraは現在従業員が30人しかいないが、評価額は4億ドルに達している。新浪科技報、北京時間4月2...

buyvm-VPS 簡単な紹介

Buyvm は 2010 年 4 月に設立されたカナダの企業ですが、そのサーバーはすべて米国にあり、...

上場と同時に株価が下落。ミスフレッシュに何が起こったのか?

疫病の影響を受け、長い間冷え込んでいた生鮮食品トラックは再び資本の支持を得ており、アリババやJD.c...

中小企業は自社の企業ウェブサイトをどのように宣伝しているのでしょうか?

中小企業のマーケティングモデルは数多くありますが、その中でもウェブサイトの活用はますます増えています...

SEO のためにやってはいけないことは何ですか?

インターネットの急速な発展に伴い、中国のインターネットユーザーもますます増えています。インターネット...

Kubernetes を 5 つのステップで監視する方法

DevOps の最前線にいる場合、Kubernetes は急速に実稼働クラウド環境に不可欠な要素にな...

米国ロサンゼルスの QN データセンターにある gfrack の VPS の簡単なレビュー

gfrack の米国 VPS サーバーは、QN のロサンゼルス データ センターでホストされています...

衝撃を受けた:田舎娘のSEOに対する理解

ウェブサイトの構造は SEO の基礎です。ウェブサイト内の最適化は、大きく分けて 2 つの部分に分け...

アプリのプロモーションにiOSチャネルを活用する方法

質問1:iOSチャネルをどこで利用すればよいかわかりません。Androidユーザーは5か月間オンライ...

Meilishuoの助けを借りてTaobaoの顧客サイトのトラフィックを増やす方法についての簡単な説明

一部のウェブマスターは、最近はタオバオで収益を上げることがますます難しくなり、プロモーション チャネ...

SEO最適化: 最適化するキーワードの選び方

SEO 最適化検索エンジン最適化は SEO とも呼ばれます。SEO 最適化のプロセスでは、適切なキー...

flipperhost - $5.5/4g メモリ/4 コア/100g ハードディスク/15T トラフィック/クアドラネット/4 コンピュータ ルーム

flipperhost が Hostcat にプロモーションとして最後に登場したのは 2017 年 ...