[51CTO.com からのオリジナル記事] この記事では主に、Kafka とは何か、ワークフローやストレージ メカニズムを含む Kafka のアーキテクチャ、プロデューサーとコンシューマーについて説明します。
画像はPexelsより 最終的には、ブローカー、プロデューサー、コンシューマー、コンシューマー グループ、トピック、パーティション、レプリカ、リーダー、フォロワーといった、Kafka の最も重要な概念を全員が習得することになります。これは、Kafka を学習して理解するための基礎であり、必要なコンテンツです。 意味 Kafka は、パブリッシュ/サブスクライブ モデルに基づく分散メッセージ キューであり、主にビッグ データのリアルタイム処理の分野で使用されます。 メッセージキュー Kafka は本質的に MQ (メッセージ キュー) です。メッセージ キューを使用する利点は何ですか? (インタビューの質問)
パブリッシュ/サブスクライブパターン 1 対多: プロデューサーがトピックにメッセージを公開し、複数のコンシューマーがトピックをサブスクライブします。トピックに公開されたメッセージはすべてのサブスクライバーによって消費され、消費されたデータはトピックからすぐにはクリアされません。 建築 Kafka は、プロデューサーと呼ばれる任意の数のプロセスからのメッセージを保存します。したがって、データは異なるトピックの下にある異なるパーティションに公開できます。 パーティション内では、これらのメッセージはインデックス化され、タイムスタンプとともに保存されます。コンシューマーと呼ばれる他のプロセスは、パーティションからのメッセージをサブスクライブできます。 Kafka は 1 つ以上のサーバーのクラスター上で実行され、パーティションはクラスター ノード全体に分散できます。 以下は、Kafka の全体的な理解と認識を深めるための、Kafka の重要な概念の一部です。各概念の役割とそのより深い原則については、後で詳しく分析します。
ワークフロー Kafka クラスターは、レコード ストリームをトピックと呼ばれるカテゴリに保存します。各レコードは、キー、値、タイムスタンプで構成されます。 Kafka は分散ストリーミング プラットフォームです。それはどういう意味ですか?
Kafka 内のメッセージはトピックによって分類されます。プロデューサーはメッセージを生成し、コンシューマーはメッセージを消費します。すべて同じトピックを対象とします。 トピックは論理的な概念ですが、パーティションは物理的な概念です。各パーティションは、プロデューサーによって生成されたデータを保存するログ ファイルに対応します。 プロデューサーによって生成されたデータはログ ファイルの末尾に継続的に追加され、各データには独自のオフセットがあります。 コンシューマー グループ内の各コンシューマーは、消費したオフセットをリアルタイムで記録します。これにより、エラーが発生して回復が行われたときに、最後の位置から消費を続行できます。 保管メカニズム プロデューサーによって生成されたメッセージはログ ファイルの末尾に継続的に追加されるため、Kafka は、ログ ファイルが大きくなりすぎてデータの配置が非効率になるのを防ぐために、シャーディングとインデックス作成のメカニズムを採用しています。 各パーティションは複数のセグメントに分割され、各セグメントは「.index」インデックス ファイルと「.log」データ ファイルの 2 つのファイルに対応します。 これらのファイルは同じフォルダーに配置されており、フォルダーの命名規則はトピック名-パーティション番号です。たとえば、トピック first には 3 つのパーティションがあり、対応するフォルダーは first-0、first-1、first-2 です。
インデックス ファイルとログ ファイルの名前は、現在のセグメントの最初のメッセージのオフセットに基づいて付けられます。次の図は、インデックス ファイルとログ ファイルの構造を示しています。 「.index」ファイルには大量のインデックス情報が保存され、「.log」ファイルには大量のデータが保存されます。インデックス ファイル内のメタデータは、対応するデータ ファイル内のメッセージの物理オフセットを指します。 プロデューサー パーティショニング戦略 パーティションの理由:
パーティショニングの原則: プロデューサーから送信されたデータを ProducerRecord オブジェクトにカプセル化する必要があります。 このオブジェクトにはいくつかのパラメータを指定する必要があります:
① パーティションが指定された場合、指定された値はそのままパーティションの値として使用されます。 ②パーティションが指定されていないがキーが存在する場合、パーティション値はキーのハッシュ値とパーティション数の係数を取ることによって取得されます。 ③ パーティションもキーも存在しない場合、最初の呼び出しでランダムな整数が生成され(その後の呼び出しごとに整数が増加します)、この値と使用可能なパーティションの数の係数を取ることでパーティション値が得られます。これは一般にラウンドロビンポーリングアルゴリズムとして知られています。 データの信頼性保証 プロデューサーによって送信されたデータが指定されたトピックに確実に送信されるようにするには、トピックの各パーティションがプロデューサーによって送信されたデータを受信した後、プロデューサーに ACK (ACKnowledge 確認) を送信する必要があります。 プロデューサーが ACK を受信した場合は次のラウンドを送信し、それ以外の場合はデータを再送信します。 ①コピーデータ同期戦略 ACK をいつ送信しますか?リーダーが ACK を送信する前に、フォロワーとリーダーの同期が完了していることを確認してください。これにより、リーダーが電話を切った後でも、データを失うことなくフォロワーから新しいリーダーを選出できるようになります。 同期が完了した後、何人のフォロワーが ACK を送信する必要がありますか?同期が完了したら、すべてのフォロワーが ACK を送信する必要があります。 ②ISR 2 番目のソリューションでは、プロデューサーはすべてのフォロワーが同期を完了した後にのみデータを送信し続けることができます。何らかの理由でフォロワーが失敗した場合、リーダーは同期が完了するまで待機する必要があります。 この問題を解決するにはどうすればいいでしょうか?リーダーは、リーダーと同期されているフォロワーのセットである動的な同期レプリカ セット (ISR) を維持します。 ISR セット内のフォロワーがデータ同期を完了すると、リーダーはフォロワーに ACK を送信します。 フォロワーがリーダーと長時間データの同期に失敗した場合、フォロワーは ISR セットから除外されます。時間のしきい値は、replica.lag.time.max.ms パラメータによって設定されます。リーダーが失敗すると、ISR から新しいリーダーが選出されます。 ③ACK応答メカニズム 重要度の低いデータの場合、信頼性の要件はそれほど高くなく、少量のデータ損失は許容されるため、ISR 内のすべてのフォロワーが正常にデータを受け入れるまで待つ必要はありません。 したがって、Kafka はユーザーに 3 つの信頼性レベルを提供します。ユーザーは、信頼性とレイテンシの要件のトレードオフに基づいて、次の構成を選択できます。 Ackパラメータ設定:
④ トラブルシューティングの詳細 LEO: 各レプリカの最大オフセット。 HW: コンシューマーが確認できる最大オフセット、ISR キュー内の最小 LEO。 フォロワーの障害: フォロワーが失敗すると、一時的に ISR セットから除外されます。フォロワーが回復すると、ローカル ディスクに記録された最後の HW を読み取り、ログ ファイルの HW より高い部分を切り取り、HW からリーダーとのデータ操作の同期を開始します。 フォロワーの LEO がパーティションの HW 以上の場合、つまりフォロワーがリーダーに追いつくと、ISR に再参加できます。 リーダーの障害: リーダーが失敗すると、ISR から新しいリーダーが選択されます。その後、複数のレプリカ間でデータの一貫性を確保するために、残りのフォロワーはまず HW より高いログ ファイルの部分を切り取り、次に新しいリーダーからのデータを同期します。 注: これにより、レプリカ間のデータの一貫性が確保されるだけで、データが失われたり重複したりしないことが保証されるわけではありません。 正確に 1 回だけのセマンティクス サーバーの ACK レベルを -1 に設定すると、プロデューサーとサーバーの間でデータが失われないことが保証されます (つまり、「少なくとも 1 回」のセマンティクス)。 対照的に、サーバーの ACK レベルを 0 に設定すると、プロデューサーからの各メッセージが 1 回だけ送信されるようになります (つまり、「At Most Once」セマンティクス)。 「少なくとも 1 回」では、データが失われないことは保証されますが、データが重複しないことは保証されません。逆に、「At Most Once」ではデータが重複しないことは保証できますが、データが失われないことは保証できません。 ただし、トランザクション データなどの非常に重要な情報については、下流のデータ コンシューマーは、データが重複したり失われたりしないこと、つまり Exactly Once セマンティクスを要求します。 Kafka バージョン 0.11 では、べき等性が導入されました。プロデューサーがサーバーにどれだけ重複データを送信しても、サーバーは 1 つのコピーのみを保持します。 今すぐ:
べき等性を有効にするには、プロデューサー パラメータで enable.idompotence を true に設定するだけです。 冪等性が有効なプロデューサーには初期化中に PID が割り当てられ、同じパーティションに送信されるメッセージにはシーケンス番号が付加されます。 ボルカー側は ただし、再起動後に PID が変更され、パーティションごとに主キーが異なるため、パーティション間のセッションでは冪等性によって Exactly Once を保証することはできません。 消費者 摂取方法 コンシューマーはプル モードを使用してブローカーからデータを読み取ります。 消費者はプッシュモードを採用します。ブローカーがコンシューマーにメッセージをプッシュするレートはブローカーによって決定されるため、消費レートが異なるコンシューマーに適応することが困難になります。 その目的は、できるだけ早くメッセージを配信することですが、これにより、コンシューマーがメッセージを処理する時間が十分になくなる可能性が高まり、通常はサービス拒否やネットワークの輻輳が発生します。 プル モードでは、コンシューマーの消費容量に基づいて適切な速度でメッセージを消費できます。 Pull モードの欠点は、Kafka にデータがない場合、コンシューマーがループに陥り、空のデータを返し続ける可能性があることです。 コンシューマーはブローカーから積極的にデータを取得するため、長いポーリングを維持する必要があります。この問題に対処するために、Kafka コンシューマーはデータを消費するときにタイムアウト パラメータを渡します。 消費可能なデータがない場合、コンシューマーは一定期間待機してから戻ります。この期間をタイムアウトと呼びます。 パーティション割り当て戦略 コンシューマー グループには複数のコンシューマーが存在し、トピックには複数のパーティションがあるため、どのパーティションがどのコンシューマーによって消費されるかを決定するパーティション割り当て問題が必然的に発生します。 Kafka には 2 つの割り当て戦略があり、1 つは RoundRobin で、もう 1 つは Range です。デフォルトは範囲です。コンシューマー グループ内のコンシューマーが変更されると、パーティション割り当て戦略 (メソッド再割り当て) がトリガーされます。 ①ラウンドロビン RoundRobin ポーリング方式では、すべてのパーティション全体に対してハッシュ ソートを実行します。コンシューマー グループ内に割り当てられるパーティション数の最大差は 1 です。グループごとに分割されるため、複数のコンシューマーの消費データの不均衡の問題を解決できます。 ただし、グループ内の消費者が異なるトピックを購読している場合、消費の混乱が発生する可能性があります。次の図に示すように、Consumer0 はトピック A をサブスクライブし、Consumer1 はトピック B をサブスクライブします。 トピック A と B のパーティションをソートした後、コンシューマー グループに割り当てられます。 TopicB パーティション内のデータは Consumer0 に割り当てられる場合があります。 ②範囲 Range 方式はトピックごとに分割されており、ポーリング方式の消費混乱の問題は発生しません。 ただし、次の図に示すように、Consumer0 と Consumer1 はトピック A と B を同時にサブスクライブするため、メッセージの配信が不均等になる可能性があります。コンシューマー グループでサブスクライブされるトピックの数が増えるほど、パーティションの分散が不均衡になる可能性があります。 オフセットメンテナンス コンシューマーは消費プロセス中に停電やその他の障害を経験する可能性があるため、コンシューマーが回復した後は、障害前の状態から消費を継続する必要があります。 したがって、コンシューマーは、障害が回復した後も消費を継続できるように、消費したオフセットをリアルタイムで記録する必要があります。 Kafka バージョン 0.9 より前では、コンシューマーはデフォルトでオフセットを Zookeeper に保存していました。バージョン 0.9 以降では、コンシューマーはデフォルトでオフセットを Kafka の組み込みトピック (__consumer_offsets) に保存します。 要約する 上記では、Kafka のアーキテクチャについて詳しく説明しましたが、特に Kafka を習得するために必要な理論と基礎に重点を置いています。今後は、API、トランザクション、インターセプター、モニタリングなど、Kafka の高度な記事をコードや例の形で更新し、誰もが Kafka を徹底的に理解して使えるようにしていきます。 著者: Zang Yuanhui 簡単な自己紹介: 中国科学技術星図有限公司(北京)のR&D部門のバックエンド技術グループに勤務。私は Python/Java 開発が得意で、フロントエンドの基礎を理解しています。私は MySQL と MongoDB に精通しており、Redis を理解しています。私は Linux 開発環境に精通しており、シェルプログラミングを習得しており、Git ソースコード管理の習慣も持っています。私は Nginx、Flask、Swagger 開発フレームワークに精通しています。 Docker+Kubernetes クラウド サービス開発の経験があります。人工知能とクラウドネイティブテクノロジーに大きな関心を持っています。 [51CTO オリジナル記事、パートナーサイトに転載する場合は、元の著者とソースを 51CTO.com として明記してください] |
<<: 同意しますか?コンピューティングの未来は分散化です!
ウェブサイトの構築は一度で完了できないことはよく知られています。初期段階が完璧に行われていても、後の...
Prohostingserver は、仮想ホスティング、リセラー、VPS、サーバーレンタルを統合した...
すべての検索エンジンは、リンクを最も重要なランキング要素の 1 つと見なします。簡単に言えば、Web...
私はSEOに2年以上携わっています。この業界には常に不満な点がたくさんあります。また、何が正しくて何...
cloud.net は、ONAPP クラウド アーキテクチャに基づくまったく新しいクラウド ホスティ...
クラウドコンピューティング技術が今後さらに影響力を増すにつれ、サーバーレスの開発は継続されます。 2...
Hiformance は、電子メールによるプロモーション情報をリリースしました。ロサンゼルスの QN...
ドメイン名ニュース: 一部のネットユーザーは、Qihoo 360 が独自のオープン ゲーム プラット...
低価格の .com および .net ドメイン名を登録したい方へ: EIG グループ傘下の doma...
A5ウェブマスターネットワークは4月13日、本日の新華網のトップニュースで、インターネット上のわいせ...
組織は、エッジまで拡張しながら複数のクラウドにワークロードを分散し、アプリケーションとサービスをユー...
2018年最もホットなプロジェクト:テレマーケティングロボットがあなたの参加を待っていますウェブサイ...
[51CTO.com クイック翻訳] Web スケールのアプリケーションでは、優れたユーザー エクス...
ウェブサイト診断のヒント2012年1月18日午前10時46分投稿者: Google 中国語検索品質チ...
ブログ業界が寒い冬を迎え、発展のボトルネックに直面しているなら、ライトブログはこうした環境における変...