LogbrokerYandexでの倧量のデヌタの収集ず配信

こんにちは 私の名前はアレックス・オれリツキヌです。 Yandexでは、テクノロゞヌずむンフラストラクチャの開発に取り組んでいたす。 䜕癟䞇人もの人々が䜿甚するサヌビスだけでなく、非垞に倧量のデヌタを障害なく操䜜できるこずが重芁です。 圓瀟の䞻芁な内郚ツヌルの1぀はYです。統蚈は、Yandexの埓業員専甚であり、さらに䌁業秘密です。 統蚈は、Yandexサヌビスから情報䞻にログを収集、保存、凊理したす。 圌女ずの仕事の結果は、さらなる分析ず補品の意思決定のための統蚈蚈算です。



統蚈の重芁なコンポヌネントの1぀は、分散型のマルチセンタヌデヌタ収集および配信゜リュヌションであるLogbrokerです。 システムの䞻芁な機胜は、デヌタセンタヌの切断に耐える機胜、メッセヌゞ配信のセマンティクスの1回のサポヌト、リアルタむムストリヌム゜ヌスでのむベントの発生からレシヌバヌでの受信たでの遅延の秒のサポヌトです。



システムの䞭栞はApache Kafkaです。 LogbrokerはAPIを䜿甚しお、未加工のApache Kafkaストリヌムからナヌザヌを分離し、灜害埩旧プロセス1回限りのセマンティクスを含むおよびサヌビスプロセスセンタヌ間レプリケヌション、蚈算クラスタヌぞのデヌタの配信YT、YaMR ...を実装したす。



物語



最初、Ya.StatistikiはOracleを䜿甚しおレポヌトを蚈算したした。 デヌタはサヌバヌからダりンロヌドされ、Oracleに曞き蟌たれたした。 1日1回、SQLク゚リを䜿甚しお、デヌタに関するレポヌトが䜜成されたした。



デヌタ量は毎幎2.5倍に増加したため、2010幎たでにそのようなスキヌムは倱敗し始めたした。 デヌタベヌスは負荷に察凊するのをやめ、レポヌトの蚈算は遅くなりたした。 デヌタベヌスからのレポヌトの蚈算はYaMRに転送され、ログの長期保存ずしお、各自のデヌタが個別のファむルずしお機胜する分散ストレヌゞである自己蚘述゜リュヌションの䜿甚が開始されたした。 ゜リュヌションは、単にアヌカむブず呌ばれおいたした。



アヌカむブには、珟圚のLogbrokerの倚くの機胜がありたした。 特に、圌はデヌタを受信し、デヌタをさたざたなYaMRクラスタヌず倖郚コンシュヌマヌに配垃できたした。 アヌカむブはメタデヌタも保存し、さたざたなパラメヌタヌ時間、ファむル名、サヌバヌ名、ログタむプなどで遞択を取埗できるようにしたした。 YaMRでデヌタの障害たたは損倱が発生した堎合、アヌカむブから任意のデヌタを埩元するこずができたした。



サヌバヌをバむパスし、デヌタをダりンロヌドしおアヌカむブに保存したした。 2011幎初頭、このアプロヌチは滑り始めたした。 明らかなセキュリティ問題統蚈サヌバヌはすべおのYandexサヌバヌにアクセスできるに加えお、圌はスケヌラビリティずパフォヌマンスの問題を抱えおいたした。 その結果、サヌバヌにむンストヌルされ、ログを盎接アヌカむブにアップロヌドするクラむアントが䜜成されたした。 クラむアント内郚補品名push-clientは、倖郚の䟝存関係を䜿甚せず、Linux、FreeBSD、さらにはWindowsのさたざたなバヌゞョンをサポヌトする軜量のCプログラムです。 このプロセスでは、クラむアントはデヌタファむルログの曎新を監芖し、httpsプロトコルを䜿甚しお新しいデヌタを送信したす。



アヌカむブにはいく぀かの欠点がありたした。 圌はデヌタセンタヌの切断に぀いお心配したせんでした。なぜなら、圌は拡匵性に制限のあるファむル線成であり、基本的にリアルタむムでのデヌタの送受信をサポヌトしおいなかったからです。 アヌカむブにデヌタを送信する前に、消費者が䞭叀配達の遅延を望んでいた間に、少なくずも1分間隔でバッファヌを蓄積する必芁がありたした。



フォヌルトトレラントストレヌゞで利甚可胜なNoSQL゜リュヌションの1぀を基本ずしお、新しいアヌカむブを䜜成するこずが決定されたした。



HBase 、 Cassandra 、 Ellipticsを確認したした 。 HBaseは、クロスセンタヌレプリケヌションの問題のため適合したせんでした。 CassandraずEllipticsは、デヌタベヌスの最適化䞭およびクラスタヌに新しいマシンを远加する際のパフォヌマンスが倧幅に䜎䞋したため適合したせんでした。 原則ずしお、これはたれな操䜜であるため、新しいマシンの远加の制限は䟝然ずしお克服できたすが、デフラグの制限は重芁であるこずが刀明したした毎日のデヌタセットはアヌカむブに毎日曞き蟌たれ、叀いデヌタはN日前に削陀されたす、぀たりデフラグ継続的に実行する必芁がありたす。



最終的に、配信アヌキテクチャを確認するこずにしたした。 長期保存の代わりに-メタデヌタのフルセットずあらゆる皮類のスラむスを構築する機胜を備えたアヌカむブでは、サンプルを構築するための最小限の機胜を備えた簡単で迅速な短期保存を䜜成するこずにしたした。



実装はApache Kafkaに基づいおいたした。



技術的な詳现



Kafkaは氞続メッセヌゞキュヌを実装しおいたす。 氞続性ずは、Kafkaに送信されたデヌタがプロセスたたはマシンを再起動した埌も存圚し続けるこずを意味したす。 Kafkaの同じタむプのメッセヌゞの各ストリヌムは、 トピックず呌ばれる゚ンティティによっお衚されたす 。 トピックはパヌティションに分割されたす 。これにより、トピックの䞊列曞き蟌みず読み取りが保蚌されたす。 Kafkaは非垞に簡単にスケヌリングできたす。フロヌの量が増えるず、トピックパヌティションの数ずそれらを提䟛するマシンの数を増やすこずができたす。



パヌティションは耇数のレプリカに存圚し、さたざたなノヌドKafkaの甚語ではブロヌカヌ によっお提䟛されたす。 レプリカには、リヌダヌずフォロワヌの2皮類がありたす。 リヌダヌレプリカはデヌタの曞き蟌みず読み取りのすべおの芁求を受け入れ、フォロワヌレプリカはリヌダヌレプリカからのストリヌムを受け入れお保存したす。 Kafkaは、すべおのレプリカのバむト単䜍のアむデンティティを保蚌したす。 ブロヌカヌの1぀が䜿甚できなくなった堎合、すべおの䞻芁レプリカは自動的に他のブロヌカヌに移動し、パヌティションの曞き蟌みず読み取りは匕き続き可胜です。 ブロヌカヌが発生するず、圌がサヌビスを提䟛したすべおのレプリカが自動的にフォロワヌになり、レプリカリヌダヌから蓄積されたバックログに远い぀きたす。 時々、Kafkaはリヌダヌのバランスをずるプロセスを開始する可胜性があるため、通垞の状況では、䞀郚のブロヌカヌがリク゚ストで過負荷になり、䞀郚のブロヌカヌが過負荷になる状況はありたせん。



画像



Kafkaクラスタヌぞの曞き蟌みはProducerずいう゚ンティティによっお行われ、読み取りはコンシュヌマによっお行われたす。



トピックは、同じタむプのメッセヌゞのキュヌです。 たずえば、KafkaでWebサヌバヌのアクセスログを䜜成する堎合、nginxログ゚ントリを1぀のトピックに配眮し、apacheログを別のトピックに配眮できたす。 Kafkaはトピックごずに、次のようなパヌティション化されたログを保存したす。



画像





各パヌティションはメッセヌゞの順序付けられたシヌケンスであり、芁玠の順序は倉曎されたせん。 新しいメッセヌゞが到着するず、最埌に远加されたす。 キュヌ内の各メッセヌゞには䞀意の識別子がありたすKafkaに関しおオフセット。 メッセヌゞには順番に番号が付けられたす1、2、3、...。



定期的に、Kafka自䜓が叀いメッセヌゞを削陀したす。 ディスク䞊のパヌティションは物理的にファむルセグメントのセットで衚されるため、これは非垞に安䟡な操䜜です。 各セグメントには、シヌケンスの連続郚分が含たれたす。 たずえば、識別子が1、2、3、4、5、6のメッセヌゞがあるセグメントがありたすが、識別子が1、3、4、2、5、6のメッセヌゞがあるセグメントはありたせん。叀いメッセヌゞを削陀するず、単に削陀されたす最も叀いファむルセグメント。



メッセヌゞ配信にはさたざたなセマンティクスがありたす。最倧で1回-耇数のメッセヌゞが配信されず、少なくずも1回-少なくずも1぀のメッセヌゞが配信され、1回だけ-正確に1぀のメッセヌゞが配信されたす。 Kafkaは、配信のために少なくずも1回はセマンティクスを提䟛したす。 メッセヌゞの耇補は、曞き蟌み䞭ず読み取り䞭の䞡方で発生する可胜性がありたす。 問題応答を受信する前の切断、送信のタむムアりトなどが発生した堎合の暙準のKafkaプロデュヌサヌは、メッセヌゞを再送信したす。倚くの堎合、重耇が発生したす。 メッセヌゞの読み取り時に、デヌタ凊理埌にメッセヌゞIDの修正が行われ、2぀のむベント間で゚ラヌが発生した堎合、重耇する可胜性がありたす。 しかし、読み取りの堎合、リヌダヌはプロセスを完党に制埡し、デヌタ凊理ず識別子の完了を同時に蚘録できるため、状況はより単玔ですたずえば、デヌタベヌスに曞き蟌たれた堎合に1぀のトランザクションでこれを行う。



LogbrokerずKafkaのリンク



ログブロヌカヌ



圓初、Logbrokerサヌビスは叀いアヌカむブず完党にAPI互換であったため、移動しおも顧客は違いに気付きたせんでした。



叀いAPIには、次の蚘述方法がありたした。



このAPIは、ほが1回限りのデヌタ配信のセマンティクスを提䟛したす。 カフカの偎面でどのように芋えるか。



/ storeリク゚ストでは、䞀時ストレヌゞのロヌカルファむルにデヌタを保存したす。 / commit_requestリク゚ストに察しお、このファむルをKafkaに曞き蟌みたす。ファむルにはtransaction_idが割り圓おられたす。 / commitリク゚ストに察しお、特定のtransaction_idを持぀ファむルが曞き蟌たれたこずを䌝える特別な小さなコミットメッセヌゞをKafkaに曞き蟌みたす。



消費者は60秒のりィンドりでこのストリヌムをKafkaから読み取りたす。 特別なコミットメッセヌゞが芋぀かったtransaction_idのすべおのメッセヌゞは、ナヌザヌに提䟛し、残りはスキップしたす。



クラむアントの蚘録のタむムアりトは30秒であるため、クラむアントがコミットメッセヌゞを曞き蟌んで送信したが、コンシュヌマがこのメッセヌゞを芋逃した確率はれロです。 コミットメッセヌゞは小さいため、そのレコヌドがハングする可胜性はほがれロです。







ロヌンチが成功した埌、厳密な1回限りのセマンティクスでリアルタむムのストリヌミング配信を実珟したいず考えたした。



新しいrtプロトコルの甚語



クラむアントは、sourceIdごずにLogbrokerずの接続を1回確立し、小さなチャンクでデヌタを送信したす。 Logbrokerは、Kafka sourceIdおよびseqnoのメッセヌゞを曞き蟌みたす。 さらに、各sourceIdは垞に同じKafkaパヌティションに曞き蟌たれるこずが保蚌されおいたす。



䜕らかの理由で接続が切断された堎合、クラむアントはおそらく別のホストで接続を再床䜜成したすが、LogbrokerはこのsourceIdに関連するパヌティションを読み取り、最埌に蚘録されたseqnoを刀別したす。 クラむアントからのチャンクにseqno <=が蚘録されおいる堎合、それらはスキップされたす。



画像



パヌティションを読み取るため、デヌタ蚘録のためのセッションは、目立った時間この堎合は最倧10秒を䜜成したす。 これはたれな操䜜であるため、配信の遅延には圱響したせん。 曞き蟌み/読み取り配信サむクルを枬定したした。䜜成から読み取りたでのチャンクの88が1秒で収たり、99が5秒で収たりたした。



クロスセンタヌミラヌリングの仕組み



Kafka配信のミラヌは䜿甚せず、独自に䜜成したした。 䞻な違い



物理的には、LogbrokerプロセスずKafkaプロセスは同じマシンで実行されたす。 ミラヌリングプロセスは、レプリカがこのマシンのリヌダヌであるパヌ​​ティションでのみ機胜したす。 マシンのリヌダヌが倉曎されるず、ミラヌリングプロセスがこれを自動的に決定し、他のパヌティションのミラヌリングを開始したす。



ミラヌリングする察象ず堎所を正確にどのように決定したすか



デヌタセンタヌにdc1ずdc2ずいう名前の2぀のKafkaクラスタヌがあるずしたす。 デヌタがdc1に分類されるず、dc1プレフィックスを付けおトピックに曞き蟌みたす。 たずえば、dc1.log1。 dc2のデヌタは、dc2プレフィックスが付いたトピックに曞き蟌たれたす。 プレフィックスによっお、どのトピックがこのデヌタセンタヌに最初に曞き蟌たれたかを刀断し、それらが別のデヌタセンタヌにミラヌリングされたす。



画像



ミラヌリングスキヌムには、ニュアンスが異なるオプションがある堎合がありたす。 たずえば、Logbrokerが耇数の倧芏暡な消費者のいるデヌタセンタヌにある堎合、すべおのデヌタセンタヌのすべおのトピックをここにミラヌリングするこずは理にかなっおいたす。 Logbrokerが倧芏暡なコンシュヌマのないデヌタセンタヌにある堎合、このデヌタセンタヌのロヌカルデヌタコレクタヌずしお機胜し、倧芏暡なLogbrokerむンストヌルにデヌタを送信できたす。







ミラヌリングに1回だけのセマンティクスを提䟛するにはどうすればよいですか



デヌタはパヌティションごずにミラヌリングされたす。 ミラヌリング䞭、各パヌティションに60秒ごずに2぀の数倀を保存したす。元のパヌティションのオフセット蚘録ずミラヌリングされたパヌティションのオフセット蚘録です。 蚘録䞭に障害が発生した堎合、元のパヌティションずミラヌリングされたパヌティションのレコヌドに保存されおいる状態ず実際のサむズを読み取り、これらの数倀から元のパヌティションの読み取り元を正確に決定したす。



クロスセンタヌデヌタ配信アヌキテクチャ









デヌタ゜ヌスはLogbrokerのむンストヌルトポロゞヌに぀いお䜕も知りたせん。 Logbroker自䜓が゜ヌスレコヌドを目的のノヌドに転送したす。 ゜ヌスがLogbrokerがむンストヌルされおいるデヌタセンタヌにある堎合、デヌタはそこに曞き蟌たれ、デヌタはミラヌリングを䜿甚しお他のデヌタセンタヌに転送されたす。



Logbrokerからデヌタを取埗するには、いく぀かのシナリオがありたす。 たず、配信の皮類プッシュたたはプルによっお区別されたす。 ぀たり、Logbrokerは消費者にデヌタを送信するプッシュ配信か、消費者がhttp-protocolを介しおデヌタを読み取るプル配信こずができたす。 どちらの堎合も、2぀のデヌタ取埗シナリオをサポヌトしおいたす。



消費者がLogbrokerクラスタヌのいずれかず同じデヌタセンタヌに完党にいる堎合、すべおのトピックを読みたす。



Logbrokerが衚されおいないデヌタセンタヌに顧客がいる堎合、たたは顧客が耇数のデヌタセンタヌに分散しおいる堎合、顧客は各デヌタセンタヌからデヌタセンタヌプレフィックスが付いたトピックのみを読み取りたす。 たずえば、dc1デヌタセンタヌのクラスタヌから読み取る堎合、dc1プレフィックスを持぀トピックのみを読み取りたす。



䞀芋するず、1぀のデヌタセンタヌからすべおのトピックを読むこずができ、無効になっおいる堎合は、別のデヌタセンタヌで同じトピックを読むように切り替えるこずができたす。 これは実際にはそうではありたせん。 事実、異なるデヌタセンタヌ内の異なるKafkaクラスタヌ䞊の同じ名前のパヌティション内のメッセヌゞは、異なるオフセットを持぀こずになりたす。 これは、クラスタヌが異なる時間に起動され、ミラヌリングが異なる時間に開始されたずいう事実によるものです。 ミラヌは、メッセヌゞの䞍倉の順序のみを保蚌したす。 Logbrokerのリヌダヌはパヌティションのオフセットを操䜜したす。別のデヌタセンタヌではパヌティションが異なるため、リヌダヌを切り替えるず、重耇を受信するか、デヌタを受信したせん。



実際、倚くの堎合、このような読み取りスむッチは圹に立ちたせん。 たずえば、dc1デヌタセンタヌで、dc1プレフィックスが付いたトピックを読みたす。 突然、dc1デヌタセンタヌが厩壊したした。dc2に切り替えお、dc1プレフィックスの付いたトピックを読み続けたいず思いたす。 ただし、dc1デヌタセンタヌが萜ちたため、このプレフィックスが付いたトピックは曞き蟌たれず、dc2デヌタセンタヌには新しいデヌタはありたせん。



Logbrokerのような゚ンティティが必芁なのはなぜですか ゜ヌスからすべおの消費者にすぐにデヌタを送信できないのはなぜですか



Logbrokerは、デヌタ配信スキヌムを倧幅に簡玠化したす。 圌が䞍圚の堎合、圌は䞀床に耇数の堎所にデヌタを送信できる耇雑なクラむアントを䜜成する必芁がありたした。 バグを修正し、新しい消費者のサポヌトを远加するには、耇雑なクラむアントを絶えず曎新する必芁がありたす。 これで、Cで曞かれた非垞にシンプルなラむトクラむアントができたした。このクラむアントはめったに曎新されたせん。 たずえば、䞀郚の゜ヌスには、2012幎の叀いビルドがただありたす。これは、以前はアヌカむブで動䜜し、珟圚はLogbrokerで動䜜したす。



䞭倮集䞭型配信は、センタヌ間のトラフィックも倧幅に節玄したす。







受信クラスタヌで障害が発生した堎合、䞍足しおいるLogbrokerデヌタを迅速か぀効率的に分配できたす。 ゜ヌス自䜓で同じ操䜜を行うのははるかに困難です。



珟圚、YandexではLogbrokerはどこで䜿甚されおいたすか



珟圚、Logbrokerはサヌバヌからログを提䟛するために䜿甚されおいたす。 着信トラフィックの合蚈量は、1日あたり平均60テラバむトです。 発信-3〜4倍特定のデヌタセンタヌによっお異なりたす。 ログコンシュヌマは、䞻に統蚈クラスタず怜玢クラスタです。 たた、必芁なログのみの小さなストリヌムを受信する倚くの小芏暡な消費者もいたす。



珟圚、Logbrokerを瀟内のトランスポヌトバスずしお導入し、ログだけでなくバむナリデヌタも送り出すように取り組んでいたす。



開発プロセス䞭に、䞻にカフカの氎分に関連する困難に遭遇したした。 特に、クラむアントコヌドは非垞に粗雑であるこずが刀明したした。 デヌタの曞き蟌みおよび読み取り甚の高レベルのラむブラリは、しばらく固執し、プロセスをブロックする可胜性がありたす。 最初はこのコヌドから始めたしたが、開発プロセスではKafkaの非同期クラむアントを䜜成したした。 珟圚、このクラむアントをオヌプン゜ヌスラむブラリずしお蚭蚈するこずを怜蚎しおいたす。



クラむアントずは異なり、Kafkaのサヌバヌ偎は非垞に高品質で蚘述されおおり、実際に倉曎なしで䜿甚されおいたす。 私たちは時々開発者に送ろうずする小さなパッチを䜿甚したす。



All Articles