次の記事で推奨プロセスカフカを学ぶことの基礎を習得することができます。強くお勧めします!
カフカ分散メッセージング・システムは、プロデューサ、バッファ、消費者のモデルを提供します
- ブローカー:中間カフカクラスタ、メッセージが格納されているが、サーバの複数のクラスタで構成されています
- トピック:提供されたメッセージにカフカ分類。別のトピックのデータを格納するためのメッセージ・ブローカー
- プロデューサー:生産データのトピックを仲介します
- 消費者:トピックでブローカーにデータを取得します
デザインのアイデア
メッセージのあるトピック
カフカすべてのメッセージが格納されている話題の複数に編成され、順番に各トピックは、パーティションを複数に分割することができ、各パーティションは、一つにより構成されたメッセージを有しています。それぞれがパーティションに格納されたそれらの受信順序、および順次の代わりにインクリメントメッセージ・シーケンス番号によって識別されます。
このように、一方通行のメッセージIDは、整理します。
- プロデューサーは、パーティションの最後まで話題、ニュース制作、流通戦略のアペンドメッセージを選択してください
- 消費者は、トピックを選択し、idがメッセージを消費を開始する場所を指定しました。消費者の滞留IDの完了後、次回はあなたが他の場所からの支出を開始することができ、この位置から開始消費し続けることができます
カフカのidは、オフセットと呼ばれています
この組織と処理戦略は、次のような利点を提供します。
- 消費者は、柔軟な指定されたオフセットの消費を要求することができます
- そのメッセージの不変性を確保するために、同時消費のためのスレッドセーフな保証を提供します。各消費者には、スレッドの安全性の問題が存在しない、互いに干渉しない、独自のオフセットを保持します
- 効率的な並列アクセスメッセージ。各トピックのメッセージを均一クラスタ内のサーバに分散パーティション、パーティションの複数に編成されます。ニュースの生産と消費は、競争を減らす、指定されたパーティションにルーティングされます、プログラムの並列性を高めます
- システムメッセージのスケーラビリティを増やします。メッセージ保持の各トピックは非常に大きくなることが、メッセージは複数のサブメッセージに隔壁を切断し、別のサーバーにパーティションを割り当てることによって戦略のバランスをとるための責任です。マシンの負荷がいっぱいになったときしたがって、メッセージは、均一な分布によって再膨張することができます
- メッセージの信頼性を確認してください。メッセージの完了が消費を削除しませんした後、再リセットによる消費は、メッセージが失われないことを保証するために、オフセット
- 柔軟な永続化戦略。メッセージには、収納スペースブローカーを節約するために、指定された期間(例えば、最新の1日)で保存することができます
メッセージユニットは、パーティション・サーバーの複数の割り当て、およびバックアップユニットを分割します。バックアップ戦略:リーダーとNの信者、リーダーが読み取りおよび書き込み要求を受け入れ、フォロワーパッシブ複製のリーダー。リーダーとフォロワーは、高可用性のパーティションを確保するために、クラスタに別れるだろう
プロデューサー
メッセージプロデューサの生産は、以下のパラメータが必要です。
- トピック:ニュース制作にトピック
- パーティション:ニュースのパーティションに生産
- キー:別のパーティションのパーティションに応じてキーメッセージ
- メッセージ:メッセージ
係るカフカ源、異なるパラメータに基づいて生産及び分割戦略を調整するための柔軟性
iftopic isNonethrowErrorp = NoneifpartitionNotNoneifpartition < 0Orpartition> = numPartitions throwErrorp = partitionelifキー NotNonep =ハッシュ(キー)%numPartitionselsep =ラウンドロビン()%のnumPartitionssendメッセージに partitionp
上記は、ハッシュがmurmurhashを使用して、単純なラウンドロビンポーリングしている擬似コード、私の翻訳です
消費者
伝統的なメッセージ・システムは、2つのモードがあります。
- キュー
- パブリッシュおよびサブスクライブ
単一の二つのモードにより、カフカのコンシューマ・グループ
各消費者は、自身の消費者グループ名をマークするコンシューマ・グループ・システムは、名前によってグループ化された後に、メッセージは、各だけ消費者がメッセージを消費することができ、すべてのパケットにコピーされ、配布されます。
だから、2極端な例を推論:
- すべての消費者と消費者のグループは同時に、システムはモードキューになると
- 各消費者の消費者グループが同じでない場合、システムは、パブリッシュおよびサブスクライブとなり
同時多消費者向けニュースの消費量は、簡単に順序が狂ったメッセージにつながります
消費者の同期を制限することにより、あなたはメッセージと秩序の点を確認することができますが、それは大いにプログラムの並行性を低減します。
パーティションの概念によるカフカは、上記の問題を緩和、パーティションその中の秩序のメッセージを確認します。すべてのパケットに分散パーティションコピーのメッセージは、各消費者だけがメッセージを消費することができます。これは、パーティションのメッセージパケットの消費量のセマンティクスは、同期が同時ではなくであることを保証します。トピックは、唯一つのパーティション、秩序あるこのトピックの同時摂取、または単に1つのパーティションと秩序ある場合。
一般ニュースメッセージシステム、消費者の消費量は2つのモデルがあります。
- プッシュ:リアルタイム高のメッセージ利点。欠点は、簡単に生産圧倒の消費者を導くことができ、消費者の購買力と彩度とはみなされないということです
- プル:速度の利点は、消費者が飽和されない保証するために、消費と消費を制御することができます。欠点は、データがない場合、空のポーリング、CPUの消費量があるだろうということです
カフカプル使用、および設定可能なパラメータを使用することは、データとするときのデータ量のみを消費者エンドプル動作のため、一定量に達すると、または状態のブロックになっているがあることを確認します
kakfa整数消費者の消費状態単一のパーティションを記録する位置を用いて、単一のパーティションが少ないオーバーヘッドを維持するために、単純な消費者グループの消費者の消費、内の単一のメッセージとすることができます。完全な消費者、ブローカの通知を受信するには、オフセット消費の次のポイントを置きます。メッセージは、消費、位置更新の完了後に削除されていないので、消費者はまだオフセットに再消費メッセージの履歴をリセットすることができます
メッセージの意味
プロデューサーの視点
- せいぜいメッセージ一旦プロデューサー非同期メッセージまたは同期メッセージが、ゼロに再試行回数を送信します
- メッセージは、少なくとも一回送信されます:プロデューサー同期メッセージの送信が失敗し、タイムアウトを再試行します
- 一つだけを送信する送信されたメッセージ:以降のサポート
消費者の視点
- 消費者が最初にその位置を確認後、ニュースを読んで、そして、メッセージの最終処分:ニュース消費まで
- 消費者のニュースは、少なくとも一回:消費者は、最初のメッセージを読み、その後、メッセージ、最後に確認した位置を処理します
- 一度だけ消費者ニュースの消費と:
- メッセージ処理の出力(例えば、DB)更新メッセージの冪等性を保証することができる場合、消費者は、正確に意味論一度その複数を確保することができ
- 出力端子は、2フェーズ・コミット・プロトコルをサポートできる場合同時に故障または成功しながら、位置保証と処理出力メッセージを確認することができます
- メモリ更新処理のメッセージの出力後の位置、及び保証するために、その原子の位置確認処理の出力メッセージ(単純な、一般的な)
カフカ、全ての通常の状況下でノード内で同期でノード状態、非同期状態が、それは全体のシステムの問題、フォールトトレランスを実行する必要があることを意味
同期は表しています。
- ノードは、飼育係と通信することができます。
- ノードは、フォロワである場合には、消費者の位置およびリーダーは、大きなギャップ(設定との間の差)にすることはできません
パーティション同期コレクションからなるノードの、ISRのつまりパーティション
2フォールトトレラントによるカフカ:
- データのバックアップ:バックアップパーティション単位、部数を設定することができます。コピー数がNである場合には、指導者に代わって、N-信者は、フォロワーがリーダーメッセージを引っ張って、消費者のリーダーとみなすことができ、システムに自分自身を追加します
- フェイルオーバー:
- ときのリーダー非同期信者からの新しいリーダーの選挙では、システム
- するとフォロワ状態非同期時にこのフォロワー再開し、再びISRに入った後、完全なデータ同期このフォロワのリーダーは、ISRを排除するだろうというとき、
また、カフカ保証はあり:プロデューサーは、メッセージがすべてのISRを認めている場合にのみ、メッセージを生成するとき、それはメッセージが正常に送信されることを示しています。消費者に消費される成功メッセージをのみを提出
要約すると:Nのコピーが存在する場合には、N個のコピーは、ISRであり、N-1のコピーが異常であると、システムはまだサービスを提供することができます
してみましょうトレーラーのN個のコピーは、ノードの復旧後にデータを同期するプロセスに直面するだろう、ISRは、この期間中にどのノードではありません、サービスが利用できないパーティションにつながります。この対策として知られ、参照としてそのデータにサービスを提供するために、リーダーノードとして回復の選挙:カフカはに対処するためのダウングレードの措置を採用ダーティリーダー選挙。
リーダーはカフカブローカーのリーダーが均等にリスクを共有するために別のサーバー上に複数のパーティションを共有し、サービスの主要プロバイダであるので
あなたは、各プライマリパーティション内の選挙プロセスを実行している場合、それぞれが、paritionのリーダーを持って、その後の選挙は非常に大規模なメインプロセスになります。kakfaは軽量な方法を使用して:コントローラに選出され、コントローラのモニタがプライマリパーティションを選択したバッチ上記のように、ブローカーのブローカークラスタからハング
一貫性
上記溶液は、高可用性は、しばしば一貫性の費用に反映され、データの可用性を保証します。あなたは強い一貫性を実現したい場合は、以下の措置をとることができます。
- 無効汚いリーダー選挙を ISRがどのノードでないとき、ノードではなく、完全に同期していないしていないサービスを提供していません
- メッセージの少なくとも1つのノードがmin_isrを送信するために確認されることを保証するために、ISRのmin_isrの最小数を設定します
事実に基づいて、以下の点、メッセージを格納するディスクではなくメモリに大きく依存してカフカ
- 安いハードドライブ、あなたの記憶
- +シーケンシャル読み出し動作を先読み、キャッシュヒット率を向上させることができます
- (先読み)+ライトバックを事前に読んでページキャッシュとして余剰のオペレーティング・システム・メモリーの使用は、(ライトバック)技術、データがキャッシュから読み込まれ、キャッシュは、ユーザー・プロセスの応答速度を向上させるために戻って(バックフラッシュオペレーティングシステム)、書き込み
- メッセージの高いコストは、メモリに格納されているように、所望の大きさよりも大きい実際のサイズをオブジェクトのJava
- ヒープメモリ使用量が増加しているときに、大きな揺れをGC
- 順序でファイルを読み書きするためにデザインのアイデアに基づいて、単純にコードを書きます
永続的なデータ構造の選択、カフカキューではなくBツリーを使用して
- オフセットカフカ単純な読み出し及び追加動作、動作時間の複雑さに基づいて、キューはO(1)、BツリーO基づく動作の時間複雑度(logN個)
- ファイルの数が多いの読み取りおよび書き込みすると、読んで対処する1つのディスクだけのニーズに基づいてキューを追加しますが、Bツリーは、複数回に関与します。アドレッシングプロセスが大幅にディスクの読み取りおよび書き込みパフォーマンスが低下します
カフカ最適化された以下の4点で:
- 小さなIO IOの多くは、いくつかの大規模に変身します
- sendfileを使用してデータのコピーを削減
- てきぱき、GZIPをサポートし、LZ4 3つのアルゴリズムは、バルクメッセージを圧縮、ネットワーク伝送の消費量を削減
- ネットワークモデル、及びスレッドの1つのアクセプタスレッド+リアクターモデルNプロセッサスレッドを使用してNIO
小さなリードの多数の量とメッセージを読み書きするデータの量を増加させる、重合メッセージによって、読み取りおよび書き込み時間は(ランダムなIOを減らすために)低減することができ、パフォーマンスの低下をもたらし、単一の書き込み(順IOを増加させます)
通常の状況下では、ネットワークへのディスクからのデータは、以下のステップを経ます:
- ディスク - >カーネルのページキャッシュ
- カーネルのページcache->ユーザーバッファ
- 用户buffer->ソケットバッファ
- ソケットbuffer-> NICバッファ(NIC:ネットワークインターフェイス)
sendfileシステムコールを使用して、に簡素化することができます。
- ディスク - >カーネルのページキャッシュ
- カーネルページcache-> NICバッファ
還元工程の2つのコピー。データ転送操作の多くは、パフォーマンスを大幅に改善するとき
ファイルの数が多いの読み取りおよび書き込みすると、読んで対処する1つのディスクだけのニーズに基づいてキューを追加しますが、Bツリーは、複数回に関与します。アドレッシングプロセスが大幅にディスクの読み取りおよび書き込みパフォーマンスが低下します
同じネットワーク、スレッドモデルを使用して、カフカのサーバー側。TCPアクセプターを使用して、サーバ側NIOベースは、スレッド接続を受け入れ、接続をN proccessorスレッド、特定IO proccessor書き込みロジック処理動作の実行のスレッドに割り当てられます。(注:このモデルに比べて、Nボス+ Nワーカーより柔軟なモデルの網状)
外部依存関係
飼育係
一意のID(整数)を使用してブローカーノードは、飼育係を識別します
/ブローカー/ IDS / [N] - >ホスト:ポート瞬時ノード
- [N]はパーティションの数を表します。
ストレージポートIPのこののznodeブローカーノード
/ブローカー/トピック/ [トピック] /パーティション/ [N] /状態 - >リーダー、ISR瞬間ノード
- トピック名の代わりに[トピック]
- [N]はパーティションの数を表します。
この記憶されたリーダーのznode ISR IDリストと(IDにより構成される)パーティション
/消費者/ [GROUP_ID] / IDS / [CUSTOMER_ID] - > { "topic1":#streams、...、 "topicN":#streams}瞬時ノード
- [GROUP_ID]消費者が所有するグループID
- [CUSTOMER_ID]消費者ID、構造は、ホスト+ UUIDであります
- トピック名を購読topicN
- 消費者スレッドの数を#streams
これのznodeは、個人消費のトピックで使用されるスレッドの数を指定して保存します
/消費者/ [GROUP_ID] /オフセット/ [トピック] / [N] - >オフセット永続ノード
- [GROUP_ID]消費者が所有するグループID
- [トピック]トピック名を購読
- [N]パーティションの数
消費者は次の3つの方法でオフセットを管理することができます。
- マニュアル管理。コンシューマAPIの低レベルの使用、柔軟で、より多くのトラブル
- 飼育係の管理に。高レベルの消費者向けAPI、設定offsets.storage =飼育係、便利、あまりパフォーマンスの使用。0.8.2デフォルトの設定
- カフカ管理します。offsets.storage =カフカ、便利、元の優れた性能を提供される高レベルのコンシューマAPIの使用。原理は、オフセットマネージャーとしてブローカー・カフカを選択__consumer_offsetsは、このトピックで相殺するというトピックを作成することです、ストレージをお勧めします
最新の消費者に指定された消費者の話題に保存されているこれのznodeオフセット
/消費者/ [GROUP_ID] /オーナー/ [トピック] / [N] - > consumer_id瞬時ノード
パーティションが唯一の指定されたパーティションの下に存在し、その後、パーティションが、これが唯一の消費者支出することができていることを確認することができるようになりますconsumer_idにより、一度にすべてのコンシューマ・グループの1個人消費することができ指定します。