現在、あらゆる企業がインターネット システムで Kafka を使用しています。 Kafka は、分散を解決し、システムのスループットを向上させるための最良の疎結合ソリューションの 1 つであると思われます。 私は約 6 年前に Kafka を使い始めました。当時、私はAerohiveで働いていました。企業の WiFi デバイスによってもたらされる大量のログを処理するために、従来のメッセージング システム RabbitMQ と ActiveMQ では対応しきれなくなっています。 この時(2012年)、Kafka が誕生し、完璧なソリューションを提供しました。 重要なポイント:
メッセージングシステムとは何ですか? Kafka を理解する前に、Message Queue が何であるか分からない場合は、それを追加する必要があります。すでにご存知の場合は、次の段落に進んでください。 > モーデン分散システム 上図のように、メッセージキューは 2 つのシステム間でメッセージを送受信、保存するミドルウェアです。その外観には次のような利点があります。
同時に、最大の欠点は複雑さであり、利点はまったく無視できるほど小さいと思います。 Kafka はどのように機能しますか? Kafka の場合、スタンドアロンの観点から見ると、これらにはプロデューサー、コンシューマー、ブローカーが含まれます。
> Kafka コンポーネント 図に示すように、異なるプロデューサーは複数のトピックの複数のパーティションにメッセージを送信でき、コンシューマーもさまざまなトピックから消費できます。 生産者と消費者は完全に分離されています。 この設計では、分離、柔軟性、ピーク処理能力、順序保証、非同期通信が完全に実現されています。 Kafka は分散環境でどのように機能しますか? 1. クラスター 複数のプロキシとレプリカ。
Kafka はどのようにして冗長性、回復性、高可用性を確保するのでしょうか? レプリケーションにより、一部のノードに障害が発生した場合でも高可用性が実現します。
クォーラムベースのレプリケーションでは、Zookeeper、Google Spanner などの Raft や Paxos などのアルゴリズムを使用できます。2n + 1 ノードの場合、最大 n 個のノード障害を許容できます。 メッセージが正常に受信された後にのみ、プライマリ データベースに基づくレプリケーションと、他のプライマリ データベースおよびバックアップに対する書き込み操作が成功します。 n 個のノードの場合、Microsoft の PacifiaA のように、最大で n-1 個のノード障害を許容できます。 どちらの方法にも長所と短所があります。
Kafka は 2 番目のアプローチであるマスター スレーブ モードを採用しています。これは主にフォールト トレランスに基づいており、2 つのノードの場合でも高可用性を提供できます。 ノードが遅い場合はどうなりますか? まず、これは非常にまれにしか起こりません。このような状況が発生した場合は、タイムアウト パラメータを設定して状況に対処できます。 Kafka のレプリケーションはパーティションごとに機能します。 たとえば、上の図には、ブローカーが 4 つ、トピックが 1 つ、パーティションが 2 つあります。複製係数は 3 です。プロデューサーがメッセージを送信すると、topic1-part1 パーティションなどのパーティションが選択され、そのパーティションのリーダーにメッセージが送信されます。broker2、broker3 がメッセージをプルし、メッセージがプルされた後、スレーブがマスターに ack を送信します。今回はマスターはこのログのみをコミットします。 このプロセス中、プロデューサーには 2 つのオプションがあります。
最初の方法では、異常が発生した場合でもメッセージが失われないことが保証されますが、遅延は短縮されます。後者の待機時間は大幅に改善されましたが、異常な状況が発生すると、リーダーがハングする前にスレーブ サーバーは最新のメッセージを取得できなくなります。この場合、メッセージが失われる可能性があります。 2. 顧客基盤 コンシューマーは自身にコンシューマー グループ名を付け、トピックに公開された各レコードは、サブスクライブしている各コンシューマー グループの 1 つのコンシューマー インスタンスに配信されます。コンシューマー インスタンスは、別のプロセスまたは別のマシン上に存在できます。 すべてのコンシューマー インスタンスが同じコンシューマー グループを持つ場合、レコードはコンシューマー インスタンス間で効果的に分散されます。 すべてのコンシューマインスタンスが異なるコンシューマグループを持っている場合、各レコードはすべてのコンシューマプロセスにブロードキャストされ、正式なファイルが形成されます。 つまり、コンシューマー グループが Kafka エコシステムにおける実際のコンシューマーです。 3. コントローラー 上の写真は、2015 年の Kafka コントローラーの設計です。コントローラーと ZK は共同で Kafka の高レベル アーキテクチャを構築し、主に次のタスクを実行します。
Kafka はなぜこんなに速いのでしょうか? Kafka には、大量のネットワーク データがディスクに保存され (プロデューサーからブローカーへ)、ディスク ファイルがネットワーク経由で送信される (ブローカーからコンシューマーへ) プロセスがあります。 このプロセスのパフォーマンスは、Kafka の全体的なスループットに直接影響します。 1. ゼロコピー 上図の左側には、従来の 4 つのコピーと 4 つのコンテキスト スイッチが表示されています。
上の図の右側では、Kafka は Linux 2.4 以降のカーネル sendfile システム コールを使用してゼロ コピーを実装しています。
sendfile 呼び出しにより、ファイル読み取りネットワーク転送全体が完了するため、プロセス全体でコンテキスト スイッチは 2 回のみとなり、パフォーマンスが大幅に向上します。 正確に言うと、Kafka のデータ転送は TransportLayer を通じて完了し、そのサブクラス PlaintextTransportLayer は Java NIO の FileChannel の transferTo メソッドと transferFrom メソッドを通じてゼロ コピーを実装します。 2. シーケンシャルアクセス > 比較する 上記のグラフは、ディスクから順番に読み取る場合でも、メモリベースのランダム アクセスよりもシーケンシャル アクセスの方が大きな利点があることを示しています。 Kafka のすべてのメッセージは追加され、ディスクへの順次アクセスを確保するために、メッセージの途中からの書き込みや削除は行われません。 たとえシーケンシャルな読み書きであっても、小さな IO 操作が多すぎるとディスクのボトルネックが発生し、今度はランダムな読み書きになります。 Kafka の戦略は、メッセージを集約し、バッチで送信してディスク アクセスを最小限に抑えることです。したがって、Kafka トピックとパーティションの数は多すぎないようにする必要があります。 通常、トピック/パーティションが 64 を超えると、Kafka のパフォーマンスは大幅に低下します。 3. セグメントログ
このパーティション分割とインデックス設計により、データの読み取り効率が向上するだけでなく、データ操作の並列性も向上します。 4. 高性能ブローカー Broker における Kafka の設計も、Kafka が非常に高速である理由の 1 つです。 まず、クライアントから送信されたすべてのリクエストがアクセプタに送信されます。デフォルトでは、エージェントには 3 つのスレッドが存在します。これら 3 つのスレッドはプロセッサと呼ばれます。 受信者はクライアントのリクエストに対して何の処理も実行せず、リクエストを直接カプセル化します。これらのハンドラーに socketChannel を送信してキューを形成します。 送信方法はポーリングです。つまり、最初に最初のプロセッサに送信し、次に 2 番目、3 番目のプロセッサに送信し、最後に最初のプロセッサに戻ります。コンシューマー スレッドがこれらの socketChannels を使用すると、プル リクエストが取得され、これらのプル リクエストにデータが付随します。 デフォルトでは、スレッド プールには 8 つのスレッドがあります。これらのスレッドは、リクエストの処理と解析に使用されます。要求が書き込み要求の場合、ディスクに書き込まれます。読み取られた場合、結果が返されます。ハンドラーは応答から応答データを読み取り、それをクライアントに返します。 これは Kafka の 3 層ネットワーク アーキテクチャです。 したがって、Kafka を強化および調整する必要がある場合は、プロセッサを追加し、スレッド プール内の処理スレッドを増やすことで効果を得ることができます。プロセッサが要求を非常に速く生成し、それらをタイムリーに処理するのに十分なスレッドがない場合は、要求と応答は実質的にキャッシュ効果になります。 要約する この記事が、Kafka とそのコンポーネント、そしてなぜこれほど高いパフォーマンスを実現できるのかについて理解し、予備的な理解を深めるのに役立つことを願っています。 Kafka は、ストリーミングなど、現代の高並行性システム アーキテクチャにおいて重要な役割を果たしており、現在も急速に発展を続けています。 この記事では、概念と単純な設計原則の観点からのみ Kafka について説明します。ただ習得するだけでは十分ではありません。 より詳細な分析が必要な場合は、公式ドキュメントを参照してください。 読んでくれてありがとう! |
<<: クラウドロックインの懸念はあなたが思っているほど一般的ではない
>>: クラウド マスター データ管理 (MDM) がエンタープライズ IT の次の「爆発点」となるのはなぜでしょうか?
Turnkeyinternet は、1999 年からホスティング事業を運営しているアメリカの老舗ブラ...
クラウド コンピューティング関連の業界に携わっている場合、「クラウド コンピューティングとは何ですか...
小紅書 + KOL =パーフェクト日記?少なくとも美容界では、この大まかな公式はパーフェクトダイアリ...
ソフトコンテンツマーケティングは、最も一般的で効果的なマーケティング手法です。このマーケティング モ...
Wenku外部リンクは、外部リンクの非常に一般的な方法であり、非常に高品質の外部リンクです。なぜでし...
最適化を行っている友人は、Baidu プロモーションを行う際に外部リンクを投稿することで、ウェブサイ...
序文:百度ウェブマスタープラットフォームは10月23日に発表しました:ハイパーリンク不正のアルゴリズ...
分散リーダー選出分散システムでは、アプリケーション サービスは高可用性を確保するために複数のノード ...
[編集者注] Kubernetes の旅から得られた主な教訓。私たちは 2017 年にバージョン 1...
最近、検索業界で最も人気のあるニュースは、360 SearchとBaiduの間のいわゆる「3B」戦争...
この記事は、上記のまとめになります。前の3つの記事では、アンカーテキスト、URLリンク、ウェイトの関...
初心者ウェブマスターとして、ウェブサイト運営の初期段階では視野が限られているのは避けられません。結局...
[51CTO.comからのオリジナル記事] 5G時代が到来しました。 5G は、さまざまな垂直アプリ...
budgetnodeは、米国マイアミデータセンターにKVM仮想化をベースとしたVPSを新たに追加しま...
iResearch iUserTracker: ローカルウェブサイトはトラフィックと広告の両方で大き...