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

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

推薦する

vmissはどうですか?香港CMIラインVPSの簡単な評価、実際のテストデータを共有

最近、Vmissは香港CN2+BGP回線をベースに香港CMI回線を備えたVPSを追加しました。基本帯...

Baiduに登録された日からウェブサイトのSEOを見てみましょう

Baidu の登録日に問題があると聞いていましたが、実際に見たことはありませんでした。このようなこと...

アントファイナンシャルセサミクレジットは人材を募集しています(ユーザー運営、ソーシャルPM、ブランドマーケティング企画、業界運営)

親愛なる友人の皆様、セサミクレジットでは人材を募集しております。ご興味のある方は、該当のメールアドレ...

ドリフトボトルプロモーションの秘密を明らかにし、第二の近くの人々は、誰もが騙されないように注意する必要があります

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

Hostodo: ロサンゼルス Zenlayer データセンターの格安 CN2 VPS レビュー、Windows システムをサポート

Hostodo のアジア最適化 VPS は、以前の QN データセンターの「アジア最適化」路線を踏襲...

2010 南アフリカワールドカップのスケジュールと 2010 南アフリカワールドカップのテレビライブスケジュール

2010 年ワールドカップがもうすぐ始まります。ファンの皆様が試合を観戦しやすいように、2010 年...

alpharacks-米国メモリアルデー/ロサンゼルス クアドラネット データセンター VPS セール

米国の戦没将兵追悼記念日を前に、Alpharacks はプロモーションを実施し、安価な VPS をい...

完全な JVM オフヒープ メモリ リークのトラブルシューティング記録

[[339593]]序文この記事では、「JVM メモリ割り当ての原則の分析」や「一般的な JVM ...

SEOの活力を維持するための最後の要点:独創性を尊重し保護する

「海賊版を拒否し、オリジナル性を守る」というのは、私たちが生活の中でよく耳にする言葉ですが、それを実...

クラウド技術特許出願ランキングが発表され、テンセント、アリババ、360がトップ3にランクイン!

1月10日、知的財産出版社i Think Tankは「中国インターネットクラウド技術特許分析レポート...

クラウド コンピューティング テクノロジーは企業のビジネスのやり方をどのように変えるのでしょうか?

[[336579]]調査会社の調査によると、クラウド コンピューティングがもたらす課題は昨年から全体...

A5最適化チーム:ウェブサイト外部リンクの健全性のSEO診断

ウェブサイトの最適化のプロセスにおいて、最も重要なリンクの1つは外部最適化であり、これはしばしば外部...

地域ポータルサイトのコンテンツ構築のボトルネックを打破し、強みを活かすことが鍵

現在、ローカルポータルの構築は、チームで運営する傾向が強まっています。一人で戦う時代はほぼ終わりまし...

中科紅旗の生と死

中科紅旗(正式名称:北京中科紅旗ソフトウェア技術有限公司)は、2000年6月に設立されました。中国科...

クラウド サービスはインターネットの次の大きなバブルです。この勢いはすでに明らかである

【クラウドコンピューティングはIT業界の第4次革命です。クラウドアプリケーションとクラウドサービスが...