まず、どのように百万書き込み速度を確保するために:
ディレクトリ
1、ページキャッシュ+ディスクのシーケンシャルな書き込み
2、ゼロコピー
3、最後の概要
これはインターネット企業の技術的なインタビュー非常に高い周波数のテストサイトでカフカの建築設計原理のいくつかについて話をする」の記事。
カフカは、高スループット、低レイテンシ、高並行性、高パフォーマンスのメッセージングミドルウェアで、ビッグデータの分野で非常に広く使用されているがあります。グッドカフカのクラスタ構成では、毎秒数千人、超高同時書き込みの数百万人の何百もを行うことができます。
だから、最終的にはカフカはそれのような高いスループットとパフォーマンスを実現する方法ですか?この記事で、私たちは少しについて話しています。
1、ページキャッシュ+ディスクのシーケンシャルな書き込み
まず、各受信したデータのためのカフカは、図2に示すように、ディスクへの書き込みになります。
そこでここでは、ディスクベースのストレージへのデータは、頻繁にディスクファイルにデータを書き込む場合、我々は、質問を助けるが持つことができない、このパフォーマンスが低下することがないのだろうか?私はあなたがすべてのディスク書き込みのパフォーマンスが非常に悪いと感じると確信しています。
はい、その数字以上で本当にシンプルな場合は、確かにこのパフォーマンスは比較的貧弱です。
しかし、実際にはカフカがここにあり非常に良好であり、優れたデザインは、あるデータの書き込みパフォーマンスは、カフカが書かれたファイルを達成するために、まずオペレーティングシステムベースのページキャッシュであることを確認することです。
ページキャッシュと呼ばれるキャッシュの層で、オペレーティング・システム自体は、メモリにキャッシュされている、我々はまた、オペレーティングシステムのキャッシュが管理を所有していることを意味し、キャッシュをOS呼び出すことができます。
あなたは、ディスクファイルに書き込むときは、次のOSに対して、オペレーティング・システム自体によって、ディスク・ファイルに実際のブラシでデータをキャッシュすると判定された場合にのみ、メモリに書き込まれる内部のOSのキャッシュに直接書き込むことができます。
これが唯一のステップである、それは実際には、このディスクを書いていない、我々は図を参照してください、メモリを書くのと同等であるため、ディスクのファイル書き込み性能の多くは、改善することができます。
その後、他の回の1は、カフカの書き込みデータ、非常に重要なポイントである、彼は書くために、ディスクのシーケンシャル書き込み方法です。言い換えれば、単にファイルではなく、データを変更するために、ファイル内のランダムな位置の末尾にデータを追加。
従来の機械式ディスクだけデータを書き込むためのファイルの場所を見つけ、であるあなたは、ランダムな書き込みしたい場合は、実際にパフォーマンスの低下、。
あなたは、ファイルの末尾にある場合でも、データを書き込むための連続的な様式を追加し、その後、このディスクのシーケンシャル書き込み性能は基本的には、それ自体が同じである、パフォーマンスとメモリを書くことができます。
本質的に、データ、高いパフォーマンスを、書くためにOSレベルのページキャッシュに基づいて、一方でデータを書き込むときに、我々は、イトゥリの上に、カフカを知って、メモリを書くことは何もありません。
もう一つは、彼がブラシにデータディスクは、パフォーマンスが非常に高いときにも、シーケンシャルなディスク書き込み方法を使用することですが、また、メモリライトとほぼ同じです。
上記二点に基づいて、超高速書き込みデータの実現にカフカ。
1ミリ秒の時間がかかるとそのカフカの書き込みデータが、それは毎秒はあなたが1000のデータを書き込むことができるということですではないのであれば、私たちは、と思いますか?
しかし、カフカ、高性能であれば、データを書き込むだけでは0.01ミリ秒かかりますか?だから、毎秒100 000番号を書き込むことがないのですか?
だから、スループットを向上させ、単位時間当たりのデータ量をより多く書き込むことができるようにも第2の書き込み数十またはデータの数十万当たりのコアポイントは、それは、データの各部分の性能を向上させることができる最大範囲が書き込まれることを保証するために。
2、ゼロコピー
書かれた作品を持って、この消費について話しています。
我々は、すべて私たちは、多くの場合、消費データへの消費が実際にディスクファイルを読み込むカフカからだったてきた後、以下に示すように、下りデータの消費者に送られたカフカから、知っている必要があります。
これは頻繁にディスクからデータを読み、それでパフォーマンスのボトルネック消費者への場合
何の最適化を行うと仮定カフカない場合には、非常に単純なディスクは、消費者へのダウンストリームからデータを読み込み、送信することで、次のように、プロセスは、おそらく次のとおりです。
データを読み込んだ後、ディスクからOSのキャッシュファイルに、その後に、不在のOSのキャッシュに読み込まれるデータを見てみましょう、そうでない場合。
そして、その後、ソケットキャッシュからデータを最後抽出した後、カードに送信されたオペレーティングシステムレベルのソケットキャッシュ、キャッシュアプリケーションプロセスからデータをコピーし、最終的には、アプリケーションプロセスをキャッシュするために、OSのキャッシュ・オペレーティング・システムのデータからコピー下流の消費に送出します。
全体のプロセスは、以下に示すとおり
私たちは空想の図、あなたがそれの2つのコピーを持ってする必要が見ることができないことは明らかです!
一つは、オペレーティング・システムのアプリケーション・プロセスをキャッシュするためにキャッシュからコピーされ、アプリケーションキャッシュ、その後から、オペレーティングシステムのソケットキャッシュにコピーバックされました。
アプリケーションが実行中のオペレーティングシステムのコンテキストスイッチを実行することながら、これらの2つのコピーを実行するために、いくつかの中間さらにコンテキストスイッチが発生します。
したがって、このような方法でデータを読み取るためには、より多くの消費性能です。
カフカはこの問題を解決するために、読み取られたデータは、ゼロコピー技術が導入されています。
つまり、データキャッシュから直接オペレーティング・システムは、下流の中間段階のデータの2つのコピーをスキップし、消費者への送信のカードに送信され、ソケットは、過去にキャッシュ記述子のコピーされます、データをコピーしませんキャッシュへのソケット。
私たちはフィギュア、プロセスの絶妙な味を参照してください。
ゼロコピー技術によって、そこにキャッシュソケットにアプリケーションバッファからアプリケーションにキャッシュ内のOSのキャッシュデータをコピーし、コピーする必要は、2つのコピーが、省略されていないので、ゼロコピーと呼ばれます。
データのソケットキャッシュコピーは、過去に単に記述する場合、パフォーマンス・ファイル・データを読み、そのデータはこのプロセスが大幅にデータの消費量を改善し、カードのアップにOSのキャッシュから直接送信されます。
そして、あなたは気づくでしょう、ディスクからデータを読み込む際に、最初にそこにあれば、OSのキャッシュメモリが表示され、そう、実際には、読めばデータを直接メモリに読み込まれます。
よく調整されたのカフカクラスタの場合は、大量のデータが直接、OSのキャッシュを書き込まれ、読み取り時に、データは、OSのキャッシュから読まれるでしょう。
等価は、単にメモリの読み書き提供されたデータに基づいているので、全体的なパフォーマンスは非常に高いカフカとなります。
彼は、私たちがElasticsearch有機アーキテクチャの原則についてお話します余談、次回は、実際には、ESが多数カフカ原理は似ていると、データの膨大な量の高性能検索を達成するための基盤となるOSのキャッシュに基づいていると言います。
3、最後の概要
何の下で撮影されたときに、この記事カフカの使用ページキャッシュ技術の下、ディスクのシーケンシャル書き込みアイデア、ゼロコピー技術を使用することにより、我々は、各マシンがデータを読み書きするカフカを理解する必要があります彼のパフォーマンスは、非常に高いことができる理由のアイデア何百秒のスループットあたり何千ものように。
我々は通常、独自のミドルウェア・アーキテクチャを設計するもののこのデザインのアイデア。
二つは、カフカが消費を繰り返さないためにどのように失われることはありません
ビジネス要件は、メッセージが失われないことを保証しなければならないので、多くの企業がありますが、そのようなドローンは空港エリアに侵入した際に、リアルタイムで、UAVシステムの監視など重複リーチが、我々はすぐに、アラーム、メッセージの損失は許されませんされている必要があります。
そして、ドローンのフライゾーンを出た後、私たちはすぐに解放報告する必要があります。メッセージは、それを繰り返している場合、我々はそれを自分自身を対処するためのメッセージの複雑なロジックの重複を必要とする、私はこのような状況は、扱いが非常に複雑かつ困難であることを恐れています。しかし、我々は、メッセージが正確に一度、その後、すべてがはるかに簡単であることを保証することができます。
のは、簡単に見メッセージングセマンティクスを見てみましょう、とメッセージパッシングメカニズムカフカ。
まず、そのメッセージ配信セマンティックを理解する必要があります メッセージパッシングの意味です。
これは、一般的な概念で、メッセージの配信保証のすなわち、メッセージ送信処理です。
三種類に分け:
高々度(AT MOST回):メッセージが失われる可能性がありますまたは処理することができるが、それは一度だけ処理されます。
繰り返さないで失われることがあります
少なくとも一度は(少なくとも一度):メッセージが失われていないが、複数回処理することができます。
あなたは失われていない繰り返してもよいです
正確な転送時間(一度だけ):メッセージが処理され、一度だけ処理されます。
一度それを繰り返さないで失うことはありません
そして実際に、2つのカフカメッセージングがあり、プロデューサーが一度ニュースを消費する消費者をカフカ、カフカにメッセージを送信します。
二つのパスは、最終結果に影響を与えます、
二人は一度だけ、最終結果が正確である1です。
一度メッセージに二度失った、または繰り返しを持って、最終的な結果は失われたり、重複する可能性があります。
、プロデュース終了メッセージング
これは、生産側のコードです。
プロパティプロパティ= 新しいプロパティ(); properties.put(" bootstrap.servers "、" kafka01:9092、kafka02:9092 " )。 properties.put(" アック"、" すべて" )。 properties.put(" 再試行"、0 ); properties.put(" batch.size "、16384 ); properties.put(" linger.ms "、1 );" buffer.memory "、33554432 )。 properties.put(" key.serializer "、" org.apache.kafka.common.serialization.StringSerializer " ); properties.put(" value.serializer "、" org.apache.kafka.common.serialization.StringSerializer " ); KafkaProducer <文字列、文字列> kafkaProducer = 新しい KafkaProducer <文字列、文字列> (プロパティ)。 以下のために(int型 i = 1 ; iは= < 600。){ kafkaProducer.send(新しい ProducerRecord <文字列、文字列>(" z_test_20190430 "、" testkafka0613 " + I))。 システム。アウト .println(" testkafka " + I)。 } kafkaProducer.close()。
1つの引数のACKが有することができる3つの値が選択します:
0:完全にかかわらず、ブローカーのプロデューサーコールバック結果を扱うそこには使用しないであろうと、メッセージが正常に送信されたことを保証することはできませんが、最大スループット
-1または全て:リーダーすべての書き込み後にメッセージやISRの応答を書くまで、ブローカが待機します、のコピーは限りISRは確かに失われることはありませんよう生き残ったが、最低のスループット。
1:デフォルト値のリーダーブローカーの後、自分の書かれた応答は、ISRの書き込みの他のコピーを待たずに、限りリーダーブローカーの生存が失われることはありませんように、それはそれが失われることはありませんが、また、スループットを確保するために確保するために、です。
それが0に設定されている場合は、高々度を達成するために、そして限り、クラスタの安定は、0に設定されていないように、ケースを見てから、メッセージが失われることはありません。
しかし、メッセージが正常に書き込まれている場合が、ネットワークの問題プロデューサが書かれた応答の成功を受けていないと、プロデューサーは、ネットワークが復旧するまでの操作を再試行開きます。これにより時間がある、メッセージが複数回送信されます。それは、少なくとも一度です。
1のカフカプロデューサ値のデフォルトパラメータのACKので、デフォルトは、少なくとも一度生産レベルです。ない正確に一度だけ。
二、消費者エンドメッセージング
消費者は、保証メッセージ配信によって相殺されます。
コード以下の消費支出:
プロパティの小道具= 新しいプロパティ(); props.put(" bootstrap.servers "、" kafka01:9092、kafka02:9092 " )。 props.put(" group.id "、" テスト" ); props.put(" enable.auto.commit "、" 真" ); props.put(" auto.commit.interval.ms "、" 1000年" ); props.put(" キーを押します。" org.apache.kafka.common.serialization.StringDeserializer " ); props.put(" value.deserializer "、" org.apache.kafka.common.serialization.StringDeserializer " ); props.put(" auto.offset.reset "、" 早いです" ); KafkaConsumer <文字列、文字列>消費者= 新しい KafkaConsumer <> (小道具)。 consumer.subscribe(は、Arrays.asList(" FOO "、" バー" )); { 一方(真){ ConsumerRecords <文字列、文字列>レコード= consumer.poll(1000年)。 用(ConsumerRecord <文字列、文字列> {:レコードの記録) システム。アウト .printf(" =%dを、キー=%sは、値=%S%nをオフセット" 、record.offset()、record.key()、record.value())。 } } } 最後に{ consumer.close()。 }
パラメータがありますenable.auto.commit
消費前に提出する真の消費者のシフトに設定した場合、最も一度に実現されています
消費が実現された後に提出された場合、少なくとも一度これがデフォルトの設定です。
カフカの消費者のデフォルトパラメータのenable.auto.commitは真であるので、デフォルトの消費者レベルは、少なくとも一度です。また、ではない正確に一度だけ。
図の消費者グループ
第三に、正確な時間
生産終了と消費者側の設定理解することによって、我々は、両端にカフカのデフォルト設定を見つけカフカメッセージが失われたり複製されますように少なくとも一度、設定によって繰り返されることに喜んで、それは、一度だけ実行することはできませんが、あります正確に一度の操作を行うための方法はないですか?
実際にエンドプロデューサーカフカ0.11.0.0バージョンの前に実際に可能である、しかしカフカ0.11.0.0バージョンの後、カフカが正式に冪等の生産を開始しました。
それは冪等プロデューサーとしてだけでなく、トランザクションのサポートです。
冪等プロデューサー
カフカ0.11.0.0バージョン冪等プロデューサーメカニズムを導入し、同じメッセージがこの機構プロデューサー内で複数回送信することができるが、ブローカーの最後に一度だけ書かれている、彼は各メッセージ番号の重量に行ってきましたが、コストのカフカにほとんど影響を与えません。
それを開いて設定する方法?私たちは、新しいパラメータenable.idempotentプロデューサー側が真である設定する必要があります。
マルチパーティションの状況は、我々は、アトミック性は、複数のパーティション、すべて成功するか、すべてロールバックのいずれかの複数のパーティションに書き込まれたメッセージを書くようにする必要があります。
私たちは、トランザクションを使用する必要がある。この時間は、生産者側で指定した文字列にtranscational.id設定しました。
それは複数のパーティションに書き込まれたメッセージの整合性を確保することはできません。このような冪等のプロデューサーは、単一のパーティションには重複したメッセージがあることを確認します。
図総務
このような生産終了は、正確に一度の後、消費者側を実現しましたか?
最終消費者の取引は、すべてのメッセージを消費しないこと、およびトランザクションが正確に一度消費者側の問題を解決していませんので、メッセージは、削除される場合がありますので、我々はまだこの点で、独自のロジックに対処する必要があるかもしれません。例えば、自分の管理には、提出をオフセット自動的に提出していないが、また、一度だけで達成することができます。
別のオプションは、カフカのストリームであるカフカ独自のストリーム処理エンジンを使用することです、
processing.guarantee = exactly_onceを設定し、簡単に正確に一度達成することができます。
カフカは何ですか? カフカの監視ツールの概要 カフカクイックスタート カフカのコア消費者 カフカのコアプロデューサー
よりリアルタイム計算、FLINK、カフカやその他の関連技術ボーエン、リアルタイムのストリーミングを計算するために歓迎の注意