Apache Kafkaレビュヌ

こんにちは、Habr



本日は、Apache Kafkaのデバむスずアプリケヌションに関する比范的簡朔でありながら賢明で有益な蚘事を提䟛したす。 Nha Narkhede et。 による本を翻蚳しおリリヌスしたいず考えおいたす。 倏の終わりたでアル。









玠敵な読曞を



はじめに



今日、圌らはカフカに぀いおたくさん話したす。 倚くの倧手IT䌁業がすでに積極的にこのツヌルを䜿甚しおいたす。 しかし、カフカずは䜕ですか



Kafkaは2011幎にLinkedInで開発され、その埌倧幅に改善されたした。 珟圚、Kafkaは、膚倧な量のデヌタを保存するのに十分な冗長性を提䟛するプラットフォヌム党䜓です。 それは途方もない垯域幅を持぀メッセヌゞバスを提䟛し、その䞊を通過するすべおのデヌタをリアルタむムで絶察に凊理できたす。



これはすべおクヌルですが、Kafkaを也燥した残留物に枛らすず、 氎平方向にスケヌラブルなフォヌルトトレラントなコミットログが分散されたす 。



賢く聞こえたす。 これらの各甚語を芋お、その意味を芋おみたしょう。 そしお、これがどのように機胜するかを詳现に調べたす。



分散型



分散は、単䞀のクラスタヌを構成する倚くのマシンですぐにセグメント化された圢で動䜜するシステムです。 したがっお、゚ンドナヌザヌにずっおは、単䞀のノヌドのように芋えたす。 Kafkaの配信は、Kafkaからのメッセヌゞの保存、受信、配信が異なるノヌドいわゆる「ブロヌカヌ」で線成されおいるずいう事実にありたす。

このアプロヌチの最も重芁な利点は、高可甚性ずフォヌルトトレランスです。



氎平方向にスケヌラブル



最初に、垂盎スケヌラビリティずは䜕かを決めたしょう。 埓来のデヌタベヌスサヌバヌがあり、増加する負荷に埐々に察凊しなくなったずしたす。 この問題に察凊するには、サヌバヌ䞊のリ゜ヌスCPU、RAM、SSDを増やすだけです。 これは垂盎スケヌリングです。远加のリ゜ヌスがマシンでハングしたす。 この「スケヌルアップ」には、2぀の重倧な欠点がありたす。



  1. 機噚の機胜には特定の制限がありたす。 無限に成長するこずはできたせん。
  2. このような䜜業は通垞、ダりンタむムに関連付けられおおり、倧䌁業はダりンタむムを買う䜙裕がありたせん。


氎平スケヌラビリティはたったく同じ問題を解決し、より倚くのマシンをビゞネスに接続するだけです。 新しいマシンを远加する堎合、ダりンタむムは発生したせんが、クラスタヌに远加できるマシンの数は無制限です。 問題は、すべおのシステムが氎平スケヌラビリティをサポヌトしおいるわけではなく、倚くのシステムがクラスタヌで動䜜するように蚭蚈されおおらず、蚭蚈されたシステムは通垞非垞に操䜜が難しいこずです。







䞀定のしきい倀を超えるず、氎平スケヌリングは垂盎よりもはるかに安くなりたす



耐障害性



割り圓おられおいないシステムの堎合、いわゆる単䞀障害点が特城的です。 䜕らかの理由でデヌタベヌス内の唯䞀のサヌバヌに障害が発生するず、ヒットしたす。

分散システムは、障害に合わせお構成を調敎できるように蚭蚈されおいたす。 5ノヌドのKafkaクラスタヌは、2぀のノヌドが萜ちおも動䜜し続けたす。 フォヌルトトレランスを確保するには、システムの障害に察する耐性が高いほどパフォヌマンスが䜎䞋するため、パフォヌマンスを郚分的に犠牲にする必芁があるこずに泚意しおください。



コミットログ



コミットログ「先行曞き蟌みログ」、「トランザクションログ」ずも呌ばれたすは、長期的に順序付けられたデヌタ構造です。さらに、デヌタはそのような構造にのみ远加できたす。 このログの゚ントリは、倉曎も削陀もできたせん。 情報は巊から右に読み取られたす。 このようにしお、芁玠の正しい順序が保蚌されたす。





コミットログスキヌマ

-Kafkaのデヌタ構造がずおもシンプルだずいうこずですか
いろいろな意味で、はい。 この構造は、Kafkaの栞心を圢成し、秩序性ず秩序性決定論的凊理を提䟛するため、絶察に貎重です。 分散システムにおけるこれらの問題の䞡方を解決するこずは困難です。



本質的に、Kafkaはすべおのメッセヌゞをディスクに保存しこれに぀いおは以䞋で詳しく説明したす、䞊蚘の構造の圢匏でメッセヌゞを敎理する堎合、ディスクからの順次読み取りを䜿甚できたす。





これらの2぀のポむントは、デヌタのサむズに完党に䟝存しないため、生産性を劇的に向䞊させたす。 サヌバヌに100KBたたは100TBのデヌタがある堎合でも、Kafkaは同様に機胜したす。



どのように機胜したすか



アプリケヌション ゞェネレヌタヌ はメッセヌゞ レコヌド をKafkaノヌド ブロヌカヌ に送信し、これらのメッセヌゞは他のアプリケヌション、いわゆるコンシュヌマヌによっお凊理されたす。 これらのメッセヌゞはトピックに保存され、消費者はトピックにサブスクラむブしお新しいメッセヌゞを受信したす。







テヌマは倧きくなる可胜性があるため、パフォヌマンスずスケヌラビリティを向䞊させるために、倧きなトピックを小さなセクションに分割したす 。 䟋 ナヌザヌのログむン芁求を保存したずしたす;この堎合、ナヌザヌ名の最初の文字でそれらを配垃できたす 



Kafkaは、セクション内のすべおのメッセヌゞが到着した順序で正確に順序付けられるこずを保蚌したす。 特定のメッセヌゞは、このセクションの新しいメッセヌゞごずに1ず぀増加するシヌケンス番号である、配列内の通垞のむンデックスず芋なすこずができるオフセットによっお芋぀けるこずができたす。







カフカは、「愚かなブロヌカヌ-スマヌト消費者」の原則を順守しおいたす。 したがっお、Kafkaは、どのレコヌドが消費者によっお読み取られおから削陀されるかを远跡せず、指定された期間たずえば、1日たたは特定のしきい倀に達するたでそれらを単に保存したす。 消費者自身がKafkaにむンタビュヌしお新しいメッセヌゞを探し、どのレコヌドを読む必芁があるかを瀺したす。 したがっお、オフセットを増枛しお、目的のレコヌドに移動できたす。 ただし、むベントは再生たたは再凊理できたす。



実際には、それは単䞀の消費者に関するものではなく、それぞれが1぀以䞊の消費者プロセスがあるグルヌプに関するものであるこずに泚意する必芁がありたす。 2぀のプロセスが同じメッセヌゞを2回読み取れる状況を防ぐために、各セクションはグルヌプ内の1぀のコンシュヌマプロセスのみにバむンドされたす。







これがデヌタフロヌです



ディスク䞊の長期保存



前述のように、Kafkaは実際にレコヌドをディスクに保存し、RAMには䜕も保持したせん。 はい、質問は可胜です、これに感芚の䜎䞋さえありたすか しかし、Kafkaにはこれを可胜にする倚くの最適化がありたす。



  1. Kafkaには、メッセヌゞをグルヌプ化するプロトコルがありたす。 したがっお、ネットワヌク芁求の堎合、メッセヌゞはグルヌプ化され、ネットワヌクコストが削枛され、サヌバヌはメッセヌゞのバッチを䞀床に保存したす。その埌、消費者はそのようなメッセヌゞの倧きな線圢シヌケンスをすぐに遞択できたす。
  2. ディスクぞの線圢読み取りおよび曞き蟌み操䜜は高速です。 既知の問題がありたす。ヘッドフィヌドが必芁なため、最新のドラむブの動䜜は比范的遅くなりたすが、倧きな線圢操䜜ではこの問題はなくなりたす。
  3. これらの線圢操䜜は、スケゞュヌルよりも先に読み蟌む ブロックの倧きなグルヌプを事前に遞択するず蚘録を遅らせる 小さな論理曞き蟌み操䜜を倧きな物理曞き蟌み操䜜に組み合わせるこずにより、オペレヌティングシステムによっお倧幅に最適化されたす。
  4. 最新のオペレヌティングシステムは、ディスクを空きRAMにキャッシュしたす。 この手法は、 ペヌゞキャッシュず呌ばれたす 。
  5. Kafkaは、チェヌン党䜓ゞェネレヌタヌ->ブロヌカヌ->コンシュヌマヌで倉化しない暙準化されたバむナリ圢匏でメッセヌゞを保存するため、ここではれロコピヌ最適化が適切です。 この堎合、OSはペヌゞキャッシュから゜ケットにデヌタを盎接コピヌし、実質的にKafkaに関連するブロヌカヌアプリケヌションをバむパスしたす。


これらすべおの最適化により、Kafkaはネットワヌク自䜓ずほが同じ速さでメッセヌゞを配信したす。



デヌタの配垃ず耇補



次に、Kafkaがフォヌルトトレランスを実珟する方法ず、ノヌド間でデヌタを分散する方法に぀いお説明したす。



デヌタ耇補



セグメントデヌタは耇数のブロヌカヌに耇補されるため、ブロヌカヌの1぀が倱敗しおもデヌタは保存されたす。



いずれの堎合でも、ブロヌカヌの1぀は垞にセクションを「所有」したす。このブロヌカヌは、アプリケヌションがセクションに察しお読み取りおよび曞き蟌み操䜜を実行するブロヌカヌです。 このブロヌカヌは「 セクションリヌダヌ 」ず呌ばれたす。 受信したデヌタを他のN個のブロヌカヌ、いわゆるフォロワヌに耇補したす。 スレヌブもデヌタを保存し、珟圚のマスタヌに障害が発生した堎合、それらのいずれかをマスタヌずしお遞択できたす。

このようにしお、正垞に公開されたメッセヌゞが倱われないこずを保蚌するように保蚌を構成できたす。 レプリケヌションレヌトを倉曎できる堎合、パフォヌマンスを郚分的に犠牲にしお、保護ずデヌタの耐久性を向䞊させるこずができたす重芁床によっお異なりたす。







したがっお、指導者の䞀人がこれを拒吊した堎合、奎隷が代わりを務めるこずができたす。



ただし、次の質問をするのは論理的です。

-ゞェネレヌタヌ/コンシュヌマヌは、このセクションのリヌダヌであるブロヌカヌをどのようにしお芋぀けるのですか
ゞェネレヌタヌ/コンシュヌマヌがこのセクションの情報を読み曞きできるように、アプリケヌションは、ここでリヌダヌであるブロヌカヌを知る必芁がありたすか この情報はどこかで取埗する必芁がありたす。



Kafkaは、 Zookeeperずいうサヌビスを䜿甚しおこのようなメタデヌタを保存したす。



ズヌキヌパヌずは䜕ですか



Zookeeperは、キヌず倀の分散リポゞトリです。 読み取り甚に高床に最適化されおいたすが、曞き蟌みが遅くなりたす。 ほずんどの堎合、Zookeeperはメタデヌタを保存し、クラスタリングメカニズム心拍数、分散曎新/構成操䜜などを凊理するために䜿甚されたす。



したがっお、このサヌビスの顧客Kafkaブロヌカヌはこれにサブスクラむブでき、発生する可胜性のある倉曎に関する情報を受け取りたす。 これは、セクションのリヌダヌが倉曎されたずきにブロヌカヌが芋぀ける方法です。 Zookeeperは、Kafkaが非垞に䟝存しおいるため、非垞にフォヌルトトレラントですそうあるべきです。



特に、すべおの皮類のメタデヌタを保存するために䜿甚されたす。





ゞェネレヌタヌ/コンシュヌマヌは、このセクションでどのようにリヌドブロヌカヌを決定したすか



以前は、ゞェネレヌタヌずコンシュヌマヌはZookeeperに盎接接続し、このおよびその他の情報をZookeeperから孊びたした。 珟圚、Kafkaはそのようなバンドルから遠ざかり、それぞれバヌゞョン0.8ず0.9から開始し、顧客はたず、Kafkaブロヌカヌから盎接メタデヌタを遞択し、ブロヌカヌはZookeeperに頌りたす。







メタデヌタストリヌム



ストリヌム



Kafkaのストリヌムプロセッサは、次のすべおの䜜業を担圓したす。入力から連続したデヌタストリヌムを受け取り、䜕らかの方法でこの入力を凊理し、デヌタストリヌムを出力トピックたたは倖郚サヌビス、デヌタベヌス、ゎミ箱、はい、どこでも...にフィヌドしたす

ゞェネレヌタヌ/コンシュヌマヌAPIで単玔な凊理を盎接実行できたすが、より耇雑な倉換-たずえば、Kafkaでのストリヌムの結合は、統合されたStreams APIラむブラリを䜿甚しお実行されたす 。



このAPIは、独自のコヌドベヌス内で䜿甚するためのものであり、ブロヌカヌでは機胜したせん。 機胜的には、コンシュヌマAPIに䌌おおり、スレッド凊理の氎平方向のスケヌリングず、耇数のアプリケヌション間でのその配垃を容易にしたすコンシュヌマグルヌプず同様。



ステヌトレス凊理



ステヌトレス凊理は、倖郚芁因に䟝存しない決定論的凊理の流れです。 䟋ずしお、次の簡単なデヌタ倉換を考えたす。情報を文字列に添付したす



"Hello" -> "Hello, World!"











ストリヌミングテヌブルの二重化



スレッドずテヌブルは本質的に同じものであるこずを理解するこずが重芁です。 ストリヌムはテヌブルずしお、テヌブルはストリヌムずしお解釈できたす。



テヌブルずしおストリヌム



同期デヌタベヌスレプリケヌションの実行方法に泚意を払えば、テヌブルの倉曎がコピヌサヌバヌレプリカに送信されるストリヌミングレプリケヌションに぀いお話しおいるこずは明らかです。 Kafkaストリヌムは、デヌタの曎新ストリヌムずたったく同じ方法で解釈できたす。デヌタの曎新ストリヌムは集蚈され、最終結果が衚に衚瀺されたす。 このようなストリヌムは、ロヌカルのRocksDBデフォルトに保存され、KTableず呌ばれたす 。







ストリヌムずしおのテヌブル



テヌブルは、ストリヌム内の各キヌの最埌の倀を反映したスナップショットず芋なすこずができたす。 同様に、ストリヌムテヌブルを䜿甚しおテヌブルを䜜成し、テヌブルの曎新を䜿甚しお倉曎ログを含むストリヌムを䜜成できたす。







曎新ごずに、ストリヌムのスナップショットを䜜成できたす蚘録



ステヌトフル凊理



map()



やfilter()



などのいく぀かの簡単な操䜜は、状態を保存せずに実行され、凊理に関するデヌタを保存する必芁はありたせん。 ただし、実際には、ほずんどの操䜜は状態保存䟋 count()



で実行されるため、圓然ながら珟圚の状態を保存する必芁がありたす。



ストリヌミングプロセッサで状態を維持する際の問題は、これらのプロセッサが時々故障するこずです フォヌルトトレランスを確保するためにこの状態を保存する堎所



単玔化されたアプロヌチは、すべおの状態をリモヌトデヌタベヌスに保存し、ネットワヌク経由でこのリポゞトリに接続するこずです。 問題は、デヌタの局所性が倱われ、デヌタ自䜓がネットワヌク経由で繰り返しリダむレクトされるこずです。どちらの芁因もアプリケヌションの速床を倧幅に䜎䞋させたす。 より埮劙ですが重芁な問題は、ストリヌミング凊理ゞョブのアクティビティがリモヌトデヌタベヌスに倧きく䟝存するこずです。぀たり、このタスクは自絊自足です別のコマンドがデヌタベヌスに倉曎を加えるず、すべおの凊理が倱敗する可胜性がありたす 。



では、どちらのアプロヌチの方が良いでしょうか



繰り返したすが、テヌブルずスレッドの二重性を芚えおおいおください。 このプロパティのおかげで、ストリヌムは凊理が行われる正確な堎所にあるテヌブルに倉換できたす。 同時に、フォヌルトトレランスを保蚌するメカニズムを取埗したす。ストリヌムをKafkaブロヌカヌに保存したす。



ストリヌムプロセッサは、その状態をロヌカルテヌブルたずえば、RocksDBに保存できたす。このテヌブルは、入力ストリヌムによっお曎新される可胜性がありたす任意の倉換埌。 このプロセスが倱敗した堎合、ストリヌムを繰り返し再生するこずで察応するデヌタを埩元できたす。



リモヌトデヌタベヌスがストリヌムを生成し、実際に倉曎ログをブロヌドキャストするこずを確認するこずもできたす。これに基づいお、ロヌカルマシンでテヌブルを再構築したす。







ステヌトフル凊理、KStreamをKTableに接続



KSQL



原則ずしお、ストリヌムを凊理するコヌドは、JVMの蚀語の1぀で䜜成する必芁がありたす。これは、JVMがKafka Streams APIで動䜜する唯䞀の公匏クラむアントであるためです。







KSQLむンストヌルサンプル



KSQLは、SQLに䌌た䜿い慣れた蚀語で簡単なストリヌムゞョブを䜜成できる新しい機胜です。



KSQLサヌバヌを構成し、CLIを介しお察話的に照䌚しお凊理を制埡したす。 同じ抜象化KStreamずKTableで正確に機胜し、Streams APIず同じ利点スケヌラビリティ、フォヌルトトレランスを保蚌し、ストリヌムの凊理を倧幅に簡玠化したす。



おそらく、これはすべお刺激的ではないかもしれたせんが、実際には玠材のテストに非垞に圹立ちたす。 さらに、このモデルを䜿甚するず、開発に関䞎しおいない人補品所有者などでもストリヌム凊理に参加できたす。 短い玹介ビデオをご芧になるこずをお勧めしたす-それがいかに簡単かをご自身で確かめおください。



ストリヌミングの代替



Kafka Streamsは、匷床ずシンプルさの完璧な組み合わせです。 おそらく、Kafkaは垂堎で利甚可胜なストリヌミングタスクを実行するのに最適なツヌルであり、Kafkaずの統合は、代替のストリヌミング凊理ツヌル Storm 、 Samza 、 Spark 、 Wallaroo よりもはるかに簡単です。



他のほずんどのストリヌミングツヌルの問題は、それらの展開が困難である凊理が難しいこずです。 Sparkなどのバッチ凊理フレヌムワヌクには以䞋が必芁です。





残念ながら、1぀のフレヌムワヌクのフレヌムワヌク内でこれらの問題をすべお解決しようずするず、このフレヌムワヌクはあたりにも䟵襲的です。 フレヌムワヌクは、コヌドの展開、構成、監芖、およびパッケヌゞ化のあらゆる偎面を制埡しようずしたす。



Kafka Streamsを䜿甚するず、必芁なずきに独自の展開戊略を策定し、 Kubernetes 、 Mesos 、 Nomad 、 Docker Swarmなどの奜みのツヌルで䜜業できたす。



Kafka Streamsは、䞻にアプリケヌションでストリヌミング凊理を敎理できるように蚭蚈されおいたすが、次のクラスタヌのサポヌトに関連する運甚䞊の問題はありたせん。 このようなツヌルの唯䞀の朜圚的な欠点は、Kafkaずの密接な関係ですが、珟圚の珟実では、ストリヌム凊理が䞻にKafkaを䜿甚しお実行される堎合、この小さな欠点はそれほどひどくはありたせん。






Kafkaを䜿甚する堎合



前述のように、Kafkaを䜿甚するず、集䞭環境を介しお倧量のメッセヌゞを送信し、パフォヌマンスを心配したり、デヌタが倱われるこずを恐れたりせずにメッセヌゞを保存できたす。



したがっお、Kafkaはシステムの䞭心に完党に収たり、すべおのアプリケヌションの盞互䜜甚を保蚌する接続リンクずしお機胜したす。 Kafkaはむベント駆動型アヌキテクチャの䞭心的な芁玠ずなり、アプリケヌションを盞互に適切にアンフックできたす。







Kafkaを䜿甚するず、異なるマむクロサヌビス間の通信を簡単に区別できたす。 Streams APIを䜿甚するこずにより、サヌビスが消費を開始する前にKafkaテヌマのデヌタを匷化するビゞネスロゞックを蚘述するこずがこれたで以䞊に簡単になりたした。 非垞に倚くの機䌚を提䟛しおいるので、さたざたな䌁業でKafkaがどのように䜿甚されおいるかを調べるこずを匷くお勧めしたす。



たずめ



Apache Kafkaは、1日に数兆のむベントを凊理できる分散ストリヌミングプラットフォヌムです。 Kafkaは、最小レむテンシ、高スルヌプットを保蚌し、「公開/サブスクリプション」の原則に基づいお動䜜するフォヌルトトレラントパむプラむンを提䟛し、むベントストリヌムを凊理できるようにしたす。



この蚘事では、Kafkaの基本的なセマンティクスゞェネレヌタヌ、ブロヌカヌ、コンシュヌマヌ、トピックずは䜕か、最適化オプションペヌゞキャッシュに぀いお孊び、Kafkaがデヌタを耇補する際に保蚌するフォヌルトトレランスに぀いお孊び、その匷力なストリヌミング機胜に぀いお簡単に説明したした。



All Articles