まず、Kafka のアーキテクチャ原則についていくつか質問してみましょう。1. Kafka のトピックとパーティションは内部的にどのように保存されますか?それぞれの特徴は何ですか? 2. 従来のメッセージング システムと比較した Kafka の消費モデルの利点は何ですか? 3. Kafka はどのようにして分散データ ストレージとデータ読み取りを実現するのでしょうか? 1. Kafka アーキテクチャ図1. Kafka用語の説明 Kafka アーキテクチャには、複数のプロデューサー、複数のブローカー、および複数のコンシューマーが存在します。各プロデューサーは複数のトピックに対応できますが、各コンシューマーは 1 つの ConsumerGroup にのみ対応できます。 Kafka アーキテクチャ全体は ZK クラスターに対応しており、クラスター構成の管理、リーダーの選出、コンシューマー グループの変更時の再バランス調整を行います。 名前 説明する ブローカ メッセージミドルウェア処理ノード、Kafkaノードはブローカーであり、1つ以上のブローカーがKafkaクラスターを形成できます。 トピック トピック: Kafka はトピックに従ってメッセージを分類します。 Kafka クラスターに公開される各メッセージでは、トピックを指定する必要があります。 プロデューサー メッセージプロデューサー、ブローカーにメッセージを送信するクライアント 消費者 メッセージコンシューマ、ブローカーからのメッセージを読み取るクライアント 消費者グループ 各コンシューマーは特定のコンシューマー グループに属します。メッセージは複数の異なるコンシューマー グループに送信できますが、メッセージを消費できるのはコンシューマー グループ内の 1 つのコンシューマーだけです。 パーティション 物理的には、トピックは複数のパーティションに分割され、各パーティションは順序付けられます。 2.トピックとパーティション Kafka のすべてのメッセージにはトピックがあります。一般的に、アプリケーションで生成されるデータの種類ごとに異なるテーマを設定できます。通常、トピックには複数のメッセージ サブスクライバーが存在します。プロデューサーがトピックにメッセージを公開すると、トピックをサブスクライブしているコンシューマーはプロデューサーによって書き込まれた新しいメッセージを受信できます。 Kafka はトピックごとに分散パーティション ログ ファイルを保持し、各パーティションは Kafka ストレージ レベルでの追加ログです。このパーティションに公開されたメッセージはすべて、ログ ファイルの末尾に追加されます。パーティション内の各メッセージには、時系列順に単調に増加するシーケンス番号が割り当てられ、これがオフセットになります。オフセットは長い数値です。このオフセットを使用して、パーティション下の一意のメッセージを決定できます。順序はパーティションでは保証されますが、トピックでは保証されません。 上の図では、プロデューサーが送信先のパーティションを決定します。
3. 消費モデル メッセージはプロデューサーから Kafka クラスターに送信された後、コンシューマーによって消費されます。一般的に言えば、消費モデルにはプッシュモデル(psuh)とプルモデル(pull)の2つがあります。 メッセージ ブローカーが消費ステータスを記録する、プッシュ モデルに基づくメッセージ システム。メッセージ ブローカーはメッセージをコンシューマーにプッシュした後、メッセージを消費済みとしてマークしますが、この方法では消費の処理セマンティクスを適切に保証できません。たとえば、コンシューマーにメッセージを送信した後、コンシューマー プロセスがハングアップしたり、ネットワーク上の理由によりメッセージが受信されなかったりします。コンシューマー エージェントで消費済みとしてマークすると、メッセージは失われます。プロデューサーがメッセージを受信した後に応答する方法を使用する場合、メッセージブローカーは消費ステータスを記録する必要があり、これは望ましくありません。プッシュが使用される場合、メッセージの消費速度はコンシューマー エージェントによって完全に制御されます。消費者がブロックされると、問題が発生します。 Kafka は、消費速度と進行状況を自ら制御するプル モデル (ポーリング) を採用しています。消費者は任意のオフセットに応じて消費することができます。たとえば、コンシューマーは、再処理のためにすでに消費されたメッセージを消費したり、最新のメッセージを消費したりすることができます。 4. ネットワークモデル 4.1 KafkaClient -- シングルスレッドセレクター シングルスレッド モードは、同時接続数が少なく、ロジックが単純で、データ量が少ない場合に適しています。 Kafka では、コンシューマーとプロデューサーの両方が上記のシングルスレッド モードを使用します。このモードは Kafka サーバーには適していません。サーバー上のリクエスト処理プロセスは比較的複雑であり、スレッドのブロックが発生します。後続のリクエストが発生すると、それらを処理することができなくなり、大量のリクエストがタイムアウトして雪崩が発生します。サーバーでは、実行ロジックを処理するためにマルチスレッドを最大限に活用する必要があります。 4.2 Kafka--server -- マルチスレッドセレクター Kafka サーバーはマルチスレッド セレクター モデルを使用します。アクセプターは別のスレッドで実行されます。読み取り操作用のスレッド プール内のすべてのスレッドは、セレクターに読み取りイベントを登録し、サーバーの読み取り要求のロジックを担当します。読み取りが成功すると、要求はメッセージ キューの共有キューに配置されます。次に、書き込みスレッド プールで、要求を取り出して論理処理を実行します。リクエスト スレッドがブロックされている場合でも、メッセージ キューからリクエストを取得して処理する後続の郡があります。書き込みスレッドで論理処理が完了したら、OP_WIRTE イベントが登録されるので、それに応答を送信する必要があります。 5.信頼性の高い分散ストレージモデル Kafka の高信頼性モデルはレプリケーション メカニズムに依存しています。レプリケーションメカニズムにより、マシンがクラッシュしてもデータが失われることはありません。 5.1 高性能ログストレージ Kafka トピックのすべてのメッセージは、パーティションの形式で複数のノードに分散して保存されます。同時に、Kafka マシンでは、各パーティションは実際にはログ ディレクトリに対応しており、ディレクトリの下には複数のログ セグメント (LogSegment) が存在します。 LogSegment ファイルは、「.index」ファイルと「.log」ファイルの 2 つの部分で構成され、それぞれセグメント インデックス ファイルとデータ ファイルを表します。これら 2 つのファイルのコマンド ルールは次のとおりです。パーティションの最初のセグメントは 0 から始まり、後続の各セグメント ファイル名は、前のセグメント ファイルの最後のメッセージのオフセット値になります。値のサイズは 64 ビット、長さは 20 桁で、数字がない場合はゼロで埋められます。以下に示すように、メッセージが 1000 個あり、各 LogSegment のサイズが 100 であると仮定すると、900 ~ 1000 のインデックスとログは次のようになります。 Kafka メッセージ データが大きすぎるため、すべてのインデックスを作成すると、スペースが占有され、時間が増加します。そのため、Kafka はスパース インデックスを選択し、インデックスをメモリに直接入力して部分クエリを高速化します。 データの読み取り方法について簡単に紹介します。 911 番目のデータを読み取る場合、最初のステップは、そのデータがどのセクションに属しているかを調べ、バイナリ検索を使用してそのデータが属するファイルを見つけることです。 0000900.index と 00000900.log を見つけたら、インデックスに移動して、インデックス (911-900) = 11 または 11 未満の最も近いインデックスを見つけます。ここでは、バイナリ検索により、インデックスが [10,1367] であることがわかります。次に、このインデックスの物理的な位置である 1367 を遡って、911 番目のデータを見つけます。 上記は、特定のオフセットを見つけるプロセスについて説明しています。ただし、ほとんどの場合、特定のオフセットを見つける必要はありません。順番に読むだけでいいのです。順次読み取りでは、オペレーティング システムはメモリとディスクの間にページ キャッシュを追加します。これは、通常行われる事前読み取り操作です。したがって、順次読み取り操作は非常に高速です。しかし、Kafka には問題があります。パーティションが多すぎると、ログ セグメントも多数存在します。書き込む際は、一括して書き込むため、実際にはランダムな書き込みになります。この時点でランダム I/O はパフォーマンスに大きな影響を与えます。したがって、一般的に言えば、Kafka にはパーティションが多すぎることはできません。この問題に対処するために、RocketMQ はすべてのログを 1 つのファイルに書き込み、順次書き込みに変換できます。特定の最適化により、読み取りを順次読み取りに近づけることもできます。
5.2 コピーメカニズム Kafka のレプリケーション メカニズムでは、複数のサーバー ノードが他のノードのトピック パーティションのログを複製します。クラスター内のノードに障害が発生すると、障害が発生したノードへのアクセス要求は他の正常なノードに転送されます (このプロセスは通常、リバランスと呼ばれます)。 Kafka の各トピックの各パーティションには、プライマリ コピーと 0 個以上のレプリカがあります。レプリカはプライマリ コピーとデータを同期させ、プライマリ コピーに障害が発生すると置き換えられます。 Kafka では、すべてのレプリカをプライマリ レプリカの置き換えに使用できるわけではないため、Kafka のリーダー ノードは ISR (In sync Replicas) セット (同期セットとも呼ばれます) を維持します。このセット内のレプリカは、次の 2 つの条件を満たす必要があります。
レプリカの完全なセットを識別するための AR (割り当てられたレプリカ) もあり、遅れているために削除されたレプリカのセットを示すために OSR が使用されるため、式は次のようになります。ISR = リーダー + それほど遅れていないレプリカ。 AR = OSR + ISR; ここでは、2 つの用語について説明する必要があります。HW (ハイ ウォーター マーク) は、コンシューマーが確認できるこのパーティションの位置であり、LEO は各パーティションのログ内の最後のメッセージの位置です。 HW は、リーダーが配置されているブローカーに障害が発生した場合でも、メッセージが失われることなく、新しく選出されたリーダーからメッセージを取得できることを保証できます。 プロデューサーがリーダーにデータを送信するとき、データの信頼性のレベルは request.required.acks パラメータを通じて設定できます。
|
<<: 第10回中国クラウドコンピューティングカンファレンスが成功裏に開催され、ZDNet編集長がサミット対話を主催した。
>>: サーバーレス コンピューティング: クラウドにおける次の大きな混乱に備える
Baidu Webmaster Platformのサイトクロール例外ツールが新たにリリースされ、新た...
検索エンジンのアルゴリズムが継続的に調整されているため、SEO担当者は、ページランキングの決定要因が...
1. Sina Weiboがソーシャルオンラインショッピング決済プラットフォームを模索しクラッシュ1...
[[204109]]昨年 11 月、Google と HTC Vive は共同で Google Ea...
一般的に、Windows VPS は Linux シリーズよりも高価であり、米国西海岸の Windo...
ウェブサイトのロングテール キーワードの最適化は、ウェブサイト全体の最適化にとって非常に重要です。多...
1. WeChat Payが市場を席巻するには時間がかかる過去数か月間、WeChatがWeChat ...
最適化担当者として、私たちが日々行っている最適化は、オンサイト最適化とオフサイト最適化に他なりません...
Raksmart は年末に日本のクラウドサーバー(従来とは異なる日本の VPS)を立ち上げましたが、...
今ではタオバオアフィリエイトになるのはますます難しくなっていると言わざるを得ません。市場全体の発展環...
「東樹西軒」は人気を博し、そのプロジェクトはあまりにも大規模で、一般の人々には何の関係もないようです...
最近、インターネットの高速化が話題になっています。もちろん、これは中国でウェブサイトを構築する人が増...
[[258795]] Java 仮想マシンは、他のプログラムを実行することを目的としたプログラムです...
Amazon Web Services (AWS) は本日、Amazon Elastic File ...
みなさんこんにちは。私は梁磊です。百度はここ数日、異常な動きを見せています。皆さんも慣れていると思い...