この記事はWeChatの公開アカウント「sowhat1412」から転載したもので、著者はsowhat0125です。この記事を転載する場合は、sowhat1412 公開アカウントにご連絡ください。 1 Kafka の紹介 1.1 Kafka の概要 Kafka アーキテクチャ Kafka は、パブリッシュ/サブスクライブ モデルに基づく分散メッセージ キューです。 Kafka は強力なスループットを活かして、主にビッグデータのリアルタイム処理の分野で使用されています。データの収集、転送、保存のプロセスにおいて重要な役割を果たします。
1.2 Kafkaの利点
1.3 Kafka の欠点
1.4 Kafka アーキテクチャ
1.5 ZooKeeper 機能 ZooKeeper は Kafka で重要な役割を果たし、一般的に次の機能を提供します。 1.5.1 ブローカー登録 ブローカーは分散してデプロイされ、互いに独立していますが、クラスター全体でブローカーを管理するには、ZooKeeper などの登録システムが必要です。 1.5.2 トピックの登録 Kafka では、同じトピックのメッセージは複数のパーティションに分割され、複数のブローカーに分散されます。これらのパーティションの情報とブローカーとの対応する関係も Zookeeper によって管理され、専用ノードによって記録されます。 1.5.3 プロデューサー負荷分散 同じトピック メッセージは複数のブローカーに分割されて配布されるため、プロデューサーはこれらの分散ブローカーにメッセージを合理的に送信する必要があります。 従来の 4 層負荷分散では、IP アドレスとポートに基づいてプロデューサーに関連付けられたブローカーが決定されます。通常、プロデューサーは単一のブローカーにのみ対応しますが、実際のシステムでは、各プロデューサーによって生成されるメッセージの量と各ブローカーによって保存されるメッセージの量は異なります。 負荷分散には Zookeeper を使用します。各ブローカーは起動時にブローカー登録プロセスを完了するため、プロデューサーはノード内の変更を通じてブローカー サーバー リストの変更を動的に認識し、動的な負荷分散メカニズムを実現します。 1.5.4 コンシューマー負荷分散 複数のコンシューマーが対応するブローカー サーバーからメッセージを適切に受信できるようにするには、Kafka のコンシューマーも負荷分散される必要があります。各コンシューマー グループには複数のコンシューマーが含まれており、各メッセージはグループ内の 1 つのコンシューマーにのみ送信されます。さまざまなコンシューマー グループは、互いに干渉することなく、独自の特定のトピックでメッセージを消費します。 1.5.5 パーティションとコンシューマーの関係 Kafka は各コンシューマー グループにグローバルに一意のグループ ID を割り当て、グループ内のコンシューマーはその ID を共有します。 Kafka では、各パーティション情報は同じグループ内の 1 つの Consumer のみが使用できると規定されており、パーティションと Consumer の関係は Zk に記録されます。各コンシューマーがメッセージ パーティションの消費権限を決定したら、Zookeeper 内の対応するメッセージ パーティションの一時ノードにそのコンシューマー ID を書き込む必要があります。 1.5.6 メッセージ消費進捗オフセット記録 コンシューマーが指定されたメッセージ パーティションを消費する場合、コンシューマーが再起動された後、または他のコンシューマーがメッセージ パーティションのメッセージ消費を再び引き継いだ後でも、前回の進行状況からメッセージを消費し続けることができるように、パーティション メッセージの消費進行状況のオフセットを Zookeeper に定期的に記録する必要があります。 1.5 7 消費者登録 同じトピックの下にある異なるパーティションからのメッセージが複数のコンシューマーによって可能な限り均等に消費されるように、コンシューマーとメッセージ パーティションを割り当てるプロセス。 コンシューマーが起動すると、ZK の下にノードが作成され、各コンシューマーはコンシューマー グループ内のコンシューマーの変更を登録してリッスンし、コンシューマーの負荷分散を保証します。 コンシューマーはブローカー リストを監視し、変更があった場合はコンシューマーの負荷分散を実行します。 2 Kafka 生成プロセス 2.1 書き方 プロデューサーはプッシュ モードを使用してブローカーにメッセージを公開します。各メッセージはパターンに追加され、ディスクへの順次書き込みとなります。シーケンシャル書き込みはランダム書き込みよりも少なくとも 3 桁高速です。 2.2 パーティション 2.2.1 パーティションの概要 メッセージが送信されると、基本的にはディレクトリであるトピックに送信されます。トピックはいくつかのパーティション ログで構成されます。組織構造は次の図のようになります。 分割が起こる 各パーティション内のメッセージは順序付けられ、生成されたメッセージはパーティション ログに継続的に追加され、各メッセージには一意のオフセット値が割り当てられていることがわかります。 消費者 パーティショニングにより、クラスターの拡張が容易になり、同時実行性が向上します。 画像理解: Kafka のデザインは、道路輸送と同じように、生活からインスピレーションを得ています。出発点と目的地が異なれば、必要な高速道路(トピック)も異なります。高速道路には複数の車線(区画)を設けることができます。交通量の多い高速道路(トピック)では、スムーズな交通を確保するためにより多くの車線(パーティション)が必要ですが、交通量の少ない高速道路では、無駄を避けるために車線を少なくする必要があります。料金所は消費者のようなものです。車が多い場合は、料金所を複数開設して一括して料金を徴収することで渋滞を回避することができます。車が少ない場合は、車の合流を可能にするために、いくつかの料金所を開設するだけで済みます。 2.2.2 パーティショニングの原則 プロデューサーから送信されたデータを ProducerRecord オブジェクトにカプセル化する必要があります。 データのカプセル化
2.3 Kafkaファイル保存メカニズム Kafka ストレージ構造
注: インデックス ファイルとログ ファイルの名前は、現在のセグメントの最初のメッセージのオフセットに基づいて付けられます。 データ検索プロセス 2.4 メッセージ実行順序を保証する方法 2.4.1 障害 Kafka にはトピック、パーティション、コンシューマーが 1 つずつありますが、コンシューマーは内部でマルチスレッド消費を実行するため、データの順序が乱れる可能性があります。 マルチスレッド消費 データは順番に異なるパーティションに書き込まれ、異なるコンシューマーによって消費されます。ただし、各コンシューマーの実行時間は固定ではありません。最初にメッセージを読み取ったコンシューマーが最初に操作を完了するという保証はありません。その結果、メッセージは順番に実行されず、データ順序エラーが発生します。 複数の消費者 2.4.2 解決策 同じメッセージが同じパーティション、1 つのトピック、1 つのパーティション、1 つのコンシューマー、および内部シングルスレッド消費に送信されるようにします。
単一スレッド消費 1 に基づいて、コンシューマーは情報 ID に応じて異なるキューにマッピングされ、消費が高速化されます。 メモリキュー 4 データの信頼性 4.1 メッセージパッシングセマンティクス メッセージ配信セマンティクスにより、Kafka はメッセージがプロデューサーとコンシューマー間で送信されることを保証します。配送保証には 3 つの種類があります。
理想的には、システムがメッセージを厳密に 1 回だけ配信することを望みますが、これを実現するのは困難です。次に、メッセージの伝達プロセスについて簡単に説明します。 4.2 生産者からブローカーへの情報 4.2.1 プロデューサー情報はブローカーに送信される 一般的な手順は次のとおりです。
リーダー応答 ACK の場合、Kafka はユーザーに 3 つの信頼性レベルを提供し、ユーザーは信頼性とレイテンシの要件に基づいてトレードオフを行うことができます。
プロデューサーはブローカーの ack を待たないので、レイテンシは最小限に抑えられます。ブローカーはデータをディスクに書き込む前に返します。ブローカーに障害が発生すると、データが失われる可能性があります。これは、「最大 1 回」モードに相当します。 ディスクが正常にアップロードされない場合、情報は失われ、通常は本番環境では使用されません。
これがデフォルト値です。プロデューサーはブローカーの ack を待ちます。パーティション リーダーは、データをディスクに正常にフラッシュした後、ack を返します。フォロワーの同期が成功する前にリーダーに障害が発生すると、データが失われます。リーダーが情報を返すと成功とみなされます。
プロデューサーはブローカーの ack を待機し、パーティションのリーダーとフォロワー (ISR 内) がすべてデータをディスクに正常にフラッシュした後にのみ ack を返します。 ただし、リーダーがメッセージを受信して OK を返し、フォロワーがメッセージを受信したもののリーダーが ack の送信に失敗した場合、プロデューサーはメッセージをフォロワーに再送信します。 「少なくとも 1 回」モードに対応します。 4.2.2 冪等性を保証する方法 ビジネスでデータが正確に 1 回だけであることが必要な場合、Kafka の初期バージョンでは、ダウンストリームでのみ重複排除できます。現在では、べき等性が導入されており、プロデューサーが重複メッセージをいくつ送信しても、サーバーは 1 つのデータのみを保持することになります。 少なくとも 1 回 + べき等性 = 正確に 1 回 べき等性を有効にし、プロデューサー パラメータで enable.idompotence = true を設定します。冪等性が有効なプロデューサーには、初期化中に PID が割り当てられます。同じパーティションに送信されたメッセージにはシーケンス番号が付加され、ブローカーはそれをキャッシュして一意性を判断します。ただし、PID を再起動すると変更されます。同時に、異なるパーティションには異なる主キーが存在します。冪等性は、パーティション間セッションに対して Exactly Once を保証することはできません。 4.3 Kafkaブローカー情報はディスクに保存される データ保存プロセス Kafka Broker が情報を受け取った後、それをディスクに書き込む方法は、通常 2 つの値を持つ producer.type によって設定されます。 デフォルト モードの sync では、データが最終的にディスクに書き込まれて初めて正常であるとみなされます。 非同期モードでは、データは OS のページ キャッシュに更新された後に返されます。このとき、突然マシンに問題が発生すると、情報が失われてしまいます。 4.4 コンシューマーはKafkaブローカーからデータを消費する 消費データ コンシューマーは、トピックを一緒に消費する 1 人以上のコンシューマーで構成されるコンシューマー グループの形式で機能します。各パーティションは、グループ内の 1 つのコンシューマーのみが一度に読み取ることができますが、複数のグループが同時にパーティションを消費することは可能です。コンシューマーに障害が発生した場合、他のグループ メンバーは、以前に障害が発生したコンシューマーによって読み取られたパーティションを自動的に読み取って負荷分散します。コンシューマー グループは、ブローカーからメッセージをプルして、次の 2 つの段階で消費します。 データを取得してオフセットを送信します。 データの処理を開始します。 最初にオフセットを送信してからデータを処理すると、データ処理中に例外が発生し、データが失われる可能性があります。最初にデータを処理してからオフセットを送信した場合、オフセットを送信しないと情報が重複して消費される可能性があります。 追伸: プル モードの欠点は、Kafka にデータがない場合、コンシューマーがループに陥り、空のデータを返し続ける可能性があることです。この問題に対処するために、Kafka コンシューマーはデータを消費するときに時間パラメータのタイムアウトを渡します。消費可能なデータがない場合、消費者は一定期間待機してから戻ります。この期間をタイムアウトと呼びます。 5 Kafka パーティション割り当て戦略 同じ group.id 内のコンシューマーの場合、トピック内の複数のパーティションでメッセージを消費するための特定のパーティション割り当て戦略があります。 Kafka には 2 つのパーティション割り当て戦略があり、partition.assignment.strategy を通じて設定されます。
5.1 RangeAssignor 範囲分割戦略 範囲分割戦略はトピックごとに行われます。まず、同じトピック内のパーティションをシリアル番号で並べ替え、コンシューマーをアルファベット順に並べ替えます。パーティションが 10 個あり、コンシューマーが 3 個ある場合、ソートされたパーティションは p0 ~ p9 になります。消費者がソートを終えると、C1-0、C2-0、C3-0 になります。パーティション/コンシューマーの数によって、各コンシューマーが消費するパーティションの数が決まります。数値を均等に分割できない場合は、最初の数人の消費者がさらに 1 つのパーティションを消費します。
範囲パーティション分割の欠点: 上記は 1 つのトピックのみを対象としています。 C1-0 コンシューマーがさらに 1 つのパーティションを消費することの影響は大きくありません。 N を超えるトピックがある場合、トピックごとに、コンシューマー C1-0 はさらに 1 つのパーティションを消費します。トピックの数が多いほど、他のコンシューマーよりも多くのパーティション C1-0 が消費することになります。これは、範囲パーティション分割の明らかな欠点です。 5.2 RoundRobinAssignor ポーリングパーティション戦略 RoundRobin ポーリング パーティショニング戦略では、すべてのパーティションとすべてのコンシューマーをリストし、それらを hascode で並べ替え、最後にポーリング アルゴリズムを通じて各コンシューマーにパーティションを割り当てます。ポーリング パーティションは次の 2 つのケースに分けられます。
5.2.1 消費者のサブスクリプション情報は消費者グループ内で同じです 同じコンシューマー グループ内のすべてのコンシューマーが同じメッセージをサブスクライブする場合、ラウンドロビン戦略のパーティション分散は均一になります。 たとえば、同じコンシューマー グループに 3 つのコンシューマー C0、C1、C2 があり、すべて 2 つのトピック t0 と t1 をサブスクライブしており、各トピックに 3 つのパーティション (p0、p1、p2) がある場合、サブスクライブされたパーティションは t0p0、t0p1、t0p2、t1p0、t1p1、t1p2 として識別できます。最終的なパーティション割り当て結果は次のとおりです。
5.2.1 消費者グループ内で消費者サブスクリプション情報が異なる 同じコンシューマー グループ内で、サブスクライブされたメッセージが異なるため、パーティション割り当ては完全なポーリング割り当てではなく、パーティション割り当てが不均一になる可能性があります。コンシューマーがコンシューマー グループ内のトピックをサブスクライブしない場合、パーティションを割り当てるときに、このコンシューマーにはこのトピックのどのパーティションも割り当てられません。 たとえば、同じコンシューマー グループに 3 つのコンシューマー C0、C1、C2 があるとします。 3 つのトピック t0、t1、t2 をサブスクライブします。これら 3 つのトピックには、それぞれ 1、2、3 つのパーティションがあります (つまり、t0 には 1 つのパーティション (p0)、t1 には 2 つのパーティション (p0、p1)、t2 には 3 つのパーティション (p0、p1、p2) があります)。つまり、コンシューマー全体によってサブスクライブされるすべてのパーティションは、t0p0、t1p0、t1p1、t2p0、t2p1、および t2p2 として識別できます。次に、コンシューマー C0 はトピック t0 をサブスクライブし、コンシューマー C1 はトピック t0 と t1 をサブスクライブし、コンシューマー C2 はトピック t0、t1、および t2 をサブスクライブします。最終的なパーティション割り当て結果は次のとおりです。
6 Kafka の効率的な読み取りと書き込み Kafka が数百万 TPS をサポートできるのは、次の機能によるものです。 6.1 シーケンシャルなデータの読み取りと書き込み 情報は、多数のプラッタで構成されるハードディスクに保存されます。顕微鏡でプラッターを観察すると、プラッターの表面が凹凸になっていることがわかります。隆起した部分は磁化されて数字の 1 を表し、凹んだ部分は磁化されていなくて数字の 0 を表します。したがって、ハードディスクはテキスト、画像、その他の情報をバイナリ形式で保存できます。 ディスクフロアプラン 上の写真はハードディスクの実際の写真です。内部構造が理解できない可能性があります。もっと鮮明な画像を見てみましょう。 ディスクの内部
セクター: ハードディスクの最小の読み取りおよび書き込み単位 ブロック/クラスター: オペレーティングシステムがハードディスクからデータを読み書きするために使用する最小単位 ページ: メモリとオペレーティング システム間の操作の最小単位です。 ディスク アクセスの読み取り/書き込み要求の完了プロセスは、次の 3 つのアクションで構成されます。
最も時間のかかる読み取りは最初の 2 つであることがわかります。順番に読み取る場合、シーク遅延と回転遅延は 1 回だけ使用する必要があります。ランダム読み取りの場合、シークと回転の遅延が複数回発生する可能性があり、その大きさは 3 桁近く異なります。 ディスクとメモリへのランダムおよびシーケンシャルな読み取りと書き込み 6.2 メモリマップファイル
メモリマップ 6.3 ゼロコピー 6.3.1 ダイレクトメモリアクセス (DMA) CPU は、読み取りおよび書き込み操作を実行するために IO を操作するための命令を発行します。ほとんどの場合、データをメモリに読み込んでメモリから IO に転送するだけなので、実際にデータが CPU を通過する必要はありません。 ダイレクト メモリ アクセスは、大量のデータの入出力を高速化するために開発されました。 DMA とは、外部デバイスが CPU を経由せずにシステム メモリと直接データを交換できるようにするインターフェイス テクノロジを指します。このように、データ転送速度はメモリや周辺機器の動作速度に依存します。 データ転送時に CPU がデータをコピーせずに DMA 転送のみを使用する場合、これをゼロ コピーと呼びます。 Zero Copy テクノロジーを使用すると、パフォーマンス コストを少なくとも半分に削減できます。 6.3.2 Kafka の読み取りと書き込みの比較 ゼロコピー 上記のブラック プロセスでは、ゼロ コピー テクノロジー プロセスは使用されません。
赤いプロセスはゼロ コピー テクノロジーのプロセスです。
6.4 バッチ取引 コンシューマーがデータを取得すると、Kafka はデータを 1 つずつ送信するのではなく、処理のためにバッチで送信します。これにより、ネットワーク転送を節約し、システムの TPS を向上させることができます。ただし、データがリアルタイムで処理されないという欠点もあります。実際のリアルタイムは依然として Flink に依存します。 7 参考文献 Kafka にパーティショニングが必要な理由: https://www.zhihu.com/question/28925721 ディスク読み取りについて: https://blog.csdn.net/holybin/article/details/21175781 Kafka 100 万 TPS: https://mp.weixin.qq.com/s/Fb1cW0oN7xYeb1oI2ixtgQ |
文/@董一志弁護士私のようなグルメな友人たちの辞書には、Fantong.com は間違いなく欠かせな...
検索エンジンが検索結果 (SERP) を表示するとき、候補結果に多くのランキング アルゴリズムを追加...
名前が示すように、アプリの製品データをブラッシングすることは、非常に短い期間でそれを増やして、望まし...
検索エンジンには、クロールとインデックス作成、そして関連性と重要度に応じて結果の回答をランク付けする...
「CubeCloud」の春節プロモーション:先行販売のVPSを除き、その他はすべて25%割引、永久に...
デジタル変革の時代において、企業が産業用インターネットに移行することは必須です。しかし、インダストリ...
今日の企業には、デジタル変革を推進するだけでなく、データから積極的にさらなる価値を引き出すために、デ...
最近、自主メディアパーソンのハオ・シャオリャン氏は、康盛マイクロコミュニティ(Discuz!チームが...
月収10万元の起業の夢を実現するミニプログラム起業支援プラン競争が激しいレッドオーシャンで生き残るの...
簡単な説明長い間何も書いていませんでした。今日は、検索エンジン最適化のためのオリジナルコンテンツの標...
ルペン氏の時代から、彼が扇動と情報発信に長けていることは公然の秘密だった。しかし今日では、ビッグデー...
浙江衛星テレビについて語るとき、「中国の声」の見事なパフォーマンス、「ランニングマン」の楽しさ、「エ...
今日、インターネットマーケティングは商品を販売するための重要な手段となっています。インターネットを通...
2017 年 9 月 4 日、EasyStor は新しい会議室で、エンタープライズ クラウドおよび仮...
私がこの業界に入ったとき、SEO の先輩たちがホワイト ハットとブラック ハットという 2 つの S...