カフカの謎を解き明かす(5):カフカの優雅な応用

I.はじめに

この記事では、主にKafkaのオフセットストレージの進化、Kafkaの永続性、Kafkaクラスターのトピックとパーティション番号の設定、およびKafkaの視覚的な監視について紹介します。

第二に、Kafkaのオフセットストレージの進化

Kafkaバージョンの進化中に、コンシューマーオフセットの保存場所が変更されました。

0.9未満のkafkaバージョンの場合、コンシューマーオフセットはzookeeperに保存されます。デフォルトのディレクトリはです/consumers/[group_id]/offsets/[topic]/[broker_id-partition_id] -> offset_counter_value。表示する場合は、zkTools、ZooKeeper Assistant、およびその他の視覚化ツールを使用してローカルで表示できます。

現在、kafkaの最新バージョンは2.8.0に達しており、基本的にオフセットはzookeeperに保存されないため、このように理解できます。

0.9より大きいkafkaバージョンの場合、消費者オフセットはこの時点でkafkaに保存され、最初の消費を行う必要があります。Kafkaは内部で__comsumer_offsetのトピックを維持します。このトピックは、最初の消費のためにkafkaによって自動的に作成されます。コンシューマオフセット(デフォルトは50パーティション)を格納するために使用され、各パーティションはコピーを保存します。では、オフセットがどのパーティションに格納されているかを判断するにはどうすればよいでしょうか。答えはUtils.abs(grupId.hashCode) % numPattitions、計算を使用することです。オフセットストレージの場所は、グループのハッシュ値によって異なります。デフォルトのnumPattitionsの数は50で、offsets.topic.num.partiontsパラメーターで指定できます。

kafkaは下位互換性があるように設計されているため、クライアントAPIの上位バージョンは下位バージョンに適合されます。

__comsumer_offsetとプログラマーが手動で作成したトピックは、「kafka decompression directory / conf / server.properties」で指定されたディレクトリに配置されますが、2つのトピックは互いに独立しています。

概要:新しいバージョンでは、メッセージとオフセットの両方がkafkaに保存されます。古いバージョンでは、メッセージはkafkaに保存され、offsetはzookeeperに保存されます。実際、新しいバージョンでは、オフセットをzookeeperに格納して、操作の書き込み/メッセージの生成時にzookeeperが指定されるようにすると同時に、操作の読み取り/メッセージの消費時にzookeeperを指定することで、オフセットをzookeeperに格納できます。

三、kafka的持久化

3.1Kafkaの読み取りおよび書き込み操作

Kafkaはファイルの読み取りと書き込みを非常に高速に実行でき、高い同時実行性に適したシナリオを完了することができます。

書き込み:ファイルの追加を使用して書き込みを行い、ランダム書き込みをシーケンシャル書き込みに変更し、ランダムIOをシーケンシャルIOに変更し、アドレス指定時間を短縮し、安価なメカニカルハードディスクの書き込み速度をソリッドステートハードディスクに近づけます。

読み取り:コンシューマーオフセットのため、前回読み取った位置をkafkaに通知し、ファイルから直接読み取ります。これは順次読み取りでもあります。

kafkaでは、メッセージエンティティとオフセットは最終的にkafkaのトピックパーティションに保存されます。ただし、メッセージは自分で作成したトピックに保存され、コンシューマーオフセットは最初の消費によって自動的に作成された__consumer_offset_に保存されます。2つのトピックはInですが同じディレクトリですが、互いに独立しています。

3.2kafkaのセグメントセグメント

次の図に示すように、kafkaでは、インデックス+複数のログファイルがセグメントを構成し、インデックスファイルに位置が格納され、ログファイルにメッセージが格納されます。
ここに画像の説明を挿入

上記のように、インデックスファイルにはオフセット、パーティションが格納され、ログファイルには位置とメッセージ間のマッピング関係が格納されます。メッセージを見つける必要がある場合は、最初にオフセットを指定します。たとえば、497を見つけるには、
最初のステップでインデックスファイルを探し、オフセットに従って物理オフセットアドレス位置497を見つけます
。2番目のステップでログファイルを探し、位置に従ってメッセージを見つけます。そしてあなたは497を見つけることができます。

クエリの順序はですoffset -> position -> message位置。ここで、offset -> positionバイナリ検索をposition -> message位置使用し、線形検索を使用します。つまり、最初にセグメントを見つけてからファイルを見つけます。インデックスファイルがあるため、メッセージが最初にある場所を大まかに見つけて、もう一度正確に検索できます。したがって、インデックスファイルが存在すると、検索速度が速くなります。 。

このメッセージに格納されているオフセットは、コンシューマーオフセットとは関係がないことに注意してください。

質問:2つのトピックを区別しますか?
回答:自分で作成testしたトピックは、kafkaが消費したときに自動的に作成されたトピックと__consumer_offset_は関係ありません。自分で作成したトピックはtest、完全なkafkaセグメント、つまりindex + log + timestampで構成されるメッセージを格納し、kafkaが消費するときに自動的に作成されるトピック__consumer_offset_は、コンシューマーの消費メッセージ(kafkaに格納される)のオフセットを格納します。

質問:2つのトピックでオフセットを区別しますか?
回答:テストのオフセットはトピックのオフセットであり、コンシューマーのオフセットではありません。コンシューマーのオフセットは__consumer_offset_上にあります。これは2つのまったく異なる概念です。2つの異なるトピックでは、test0のオフセットはkafkaを高速化することです。読み取りと書き込みの速度__consumer_offset_は、消費者の消費位置を保存することです。2つのトピックは互いに独立しており、互いに関係がありません。

コマンドのスクリーンショット:

(1)インデックスファイルのみを表示します。
./bin/kafka-run-class.sh kafka.tools.DumpLogSegments --files /tmp/kafka-logs/test2-0/00000000000000000000.log --verify-index-only

(2)インデックスファイルとログファイルを表示します。
./bin/kafka-run-class.sh kafka.tools.DumpLogSegments --files /tmp/kafka-logs/test2-0/00000000000000000000.log --print-data-log

ここに画像の説明を挿入
保存されるメッセージ本文は、次のようにペイロードです。
ここに画像の説明を挿入

kafkaでは、ログを表示する場合は、ダンプファイルであり、direct catコマンドでは表示できないため、上記のようにする必要があります。

第4に、kafkaクラスターのトピックとパーティション番号の設定

質問:kafkaで作成できるトピックはいくつですか?
回答:kafkaクラスターでは、トピックの数は実際のビジネスユニットによって決定され、理論上のトピックの数は2000を超えません。この数を超えると、パフォーマンスの問題が発生します。

質問:トピックを保存するために、トピックごとにいくつのパーティションが作成されますか?
回答:パーティションはkafkaのデータストレージの最小単位です。データの読み取りと書き込みはパーティションを操作することによって行われます。パーティションが多いほど良いです。ブローカーの最大数はブローカーの数です。理論上の上限はこれ以上ありません。 30,000を超え、すべてがダウンしています。これは失われます(ブローカーがダウンすると、マシンのパーティションが使用できなくなります)が、この場合、ディスクとネットワークの同期のコストが大幅に増加します。パーティションの数が多いほど、より多くのディスクストレージスペースが必要になり、ネットワーク同期コストがより重要になります。どのトピックにも1つのマスターパーティションと(N-1)スレーブパーティションがあり、クライアントはトピックに対してメッセージを読み書きします。 。マスターパーティションを操作するには、スレーブパーティションがマスターパーティションのデータを継続的に同期する必要があります。

kafkaの公式Webサイトでは、パーティションの数を計算する式が示されています。つまりpartition数 = max(t/p,t/c)、pは生産スループット、cは消費スループット、tはシステムが必要とする最大スループットを表します。これらの3つの数値を使用すると、最適なパーティションになります。計算することができます。たとえば、目標は1000のスループットを必要とし、1つのマシンブローカーを使用し、トピックは1つだけであり、レプリカの数も1(プロデューサートピックとコンシューマートピック)です。これは、プロデューサーとコンシューマーが少ないためです。この1台のマシン上にある必要があります1000パーティションのみが1000スループットを満たすことができます。

ファイブ、カフカビジュアルモニタリング

kafkaの視覚的監視、マスター1、YahooのCMAKの紹介です。http://github.com/yahoo/CMAK/releasesに直接アクセスしてダウンロードしてください。ダウンロードする最新バージョンを選択できます。ダウンロードには注意が必要です。ソースコードではなく、圧縮されたパッケージ
ここに画像の説明を挿入

CentOSにアップロードし、次のように解凍します。

ここに画像の説明を挿入

注:cmakを実行するにはjdk11が必要です。

application.confファイルを次のように変更します。
ここに画像の説明を挿入

cmak解凍ディレクトリに移動し、このコマンドを実行します

./bin/cmak -Dconfig.file=conf/application.conf -java-home /root/jdk11

cmkの最新バージョンは3.0.0.5であり、実行するにはjdk11をインストールする必要があります。そうしないと、エラーが報告されます。java.lang.UnsupportedClassVersionError
:コントローラー/ルートが最新バージョンのJavaランタイム(クラスファイルバージョン55.0)、このバージョンのJavaランタイムは、52.0までのクラスファイルバージョンのみを認識します。

起動後、ps -ef|grep cmakクエリまたはnetstat -aplt | grep 9000クエリを使用できます。

ここに画像の説明を挿入

起動したばかりのとき、cmakには次のようなノードがありませんでし
ここに画像の説明を挿入
た。新しいノードを作成するか、zookeeperのip:portを追加するか、次のようにコンマで区切ったzookeeperクラスターを追加します。
ここに画像の説明を挿入
ノードを使用すると、情報を表示できます。ノードのこの動物園の飼育係はkafkaに関連付けられており、次のようにkafkaのトピックの情報を直接表示できます。
ここに画像の説明を挿入
クリックを続けると、次のように各トピックの詳細を表示できます。
ここに画像の説明を挿入
特に、segment_typesは変更できます。次のように:
ここに画像の説明を挿入

上の画像にはトピックを削除するための青いボタンがあります。実際、トピックはページ上でデフォルトで削除できません。kafkaのconf/server.propertiesファイルを構成する必要があります。

# 删除topic
delete.topic.enable=true

ここに画像の説明を挿入

ここに画像の説明を挿入

注:Kafkaはメッセージの生成時にトピックを自動的に作成しないため、トピックが存在しない場合はエラーが報告されます。server.propertiesファイルで構成することをお勧めします。

# 自动创建不存在的topic
auto.create.topics.enable=true

6.エピローグ

この記事では、主にKafkaのオフセットストレージの進化、Kafkaの永続性、Kafkaクラスターのトピックとパーティション番号の設定、およびKafkaの視覚的な監視について紹介します。

毎日コーディングし、毎日進歩させましょう!

おすすめ

転載: blog.csdn.net/qq_36963950/article/details/123447854