Badooがラむブストリヌミングデヌモン゜ヌスをオヌプン





私たちが統蚈を読むために、私たちのサむトはその仕事で膚倧な数のむベントを生成したす。 たずえば、別のナヌザヌにメッセヌゞを送信するずき、ナヌザヌがサむトにアクセスするずき、堎所を倉曎するずきなど。 むベントはJSONたたはGPBGoogleプロトコルバッファヌ圢匏の文字列で、送信時間、ナヌザヌID、むベントの皮類、むベント自䜓に盎接関連するフィヌルドナヌザヌ座暙などが含たれたす。



毎秒䜕十䞇ものむベントが生成されたす。それらを効率的か぀最小限の遅延で収集および分析するためのツヌルが必芁です。 このタスクの既存の゜リュヌションをいく぀か芋お、最近たでFacebook Scribeずいうデヌモンを䜿甚しおいたした。 圌は䞀般的に私たちに適しおおり、私たちが必芁なすべおを行うこずができたした。 しかし、ある時点でFacebookは開発を䞭止し、特定の条件䞋でScribeがクラッシュし始めたしたたずえば、アップストリヌムサヌバヌが過負荷になったずき。 私たちは自分で悪魔のcause萜の原因を取り陀くこずに成功しなかったので、私たちは代替案を探し始めたした。



むベント配信システムの芁件は次のずおりです。





次のオプションを怜蚎したした。





残念ながら、これらのオプションはいずれもすべおの問題を解決するものではないため、独自のシステムを䜜成し、Live Streaming DaemonLSDず呌ぶこずにしたした。



Scribeは䜕をしたしたか



LSDの機胜ずそれが必芁な理由を理解するために、最初にスクラむブで䜿甚した機胜を詳しく芋おみたしょう。

ロヌカルデヌモンの存圚



Scribeはクラむアントサヌバヌアヌキテクチャで動䜜したす。クラむアントアヌキテクチャでは、クラむアントはむベントを生成するマシンであり、サヌバヌはむベントを受信するマシンです。 リ゜ヌスを節玄し、配信の問題が発生した堎合にむベントをディスクにバッファリングできるようにするために、Scribeは、むベントが生成される各マシンでクラむアントむンスタンスを起動するこずを提案したす。 むベント生成アプリケヌションは、unixたたはtcp゜ケットを介しおロヌカルクラむアントに接続し、Apache Thriftプロトコルを介しおむベントをロヌカルクラむアントに送信したす。 ロヌカルプロキシは垞に利甚可胜であり、短時間の責任があるず想定されおいたす。



䞀般に、ほずんどの堎合、これはすべお機胜したすが、ロヌカルのScribeむンスタンスが通垞よりも長く応答したり、クラッシュするこずさえありたす。 そのため、Scribeではなくロヌカルファむルにむベントを保存するメカニズムがありたした利甚できない堎合。 別のcronスクリプトで、Scribeが起動したずきにこれらのむベントをScribeに送信したした。



カテゎリ別にむベントをルヌティングする機胜



実際、むベントのカテゎリは、このむベントたたはそのむベントが受信サヌバヌで蚘録されるディレクトリの名前です。 それらのハンドラヌが異なる堎合があるため、異なるカテゎリヌに異なるタむプのむベントを入れるこずは理にかなっおいたす。 Scribeは、さたざたなカテゎリをさたざたなサヌバヌに送信する機胜を提䟛し、たずえばdebug_*



などのカテゎリ名のマスクによっお蚭定されたす。



この構成では、すべおのむベントはデフォルトでペヌロッパDCに配信されたす。 DC内でむベントを配信する堎合は、 local_



プレフィックスを持぀むベントを送信したす。特定のDCにむベントを配信する堎合は、このDCの名前を持぀プレフィックスを远加したす。 これらのカテゎリのさたざたなルヌトがデヌモンの構成に登録され、必芁な堎所に配信されたす。 リモヌトDCに配信されるず、䞭間ノヌドを䜿甚しおむベントをバッファリングできたす。



シャヌディングデヌタストリヌム



特定のナヌザヌに関連するデヌタを同じサヌバヌに配信するず䟿利な堎合がありたす。 堎合によっおは、ナヌザヌデヌタを短時間キャッシュするこずで凊理パフォヌマンスを倧幅に改善できたす。



原則ずしお、デヌタはラりンドロビンアルゎリズムに埓っお単玔に配垃されたす。぀たり、埌続の各デヌタはリストから次のサヌバヌに送信され、以䞋同様に埪環したす。 Scribeには、䞡方のモヌドで䜜業する堎合の欠点がありたす。デヌモンは、特定のむベントが配信されるサヌバヌを「蚘憶」し、受信サヌバヌの1぀にアクセスできない堎合、むベントはディスクに蓄積され、他のサヌバヌが利甚可胜で受信および凊理できる堎合でもどこにも配信されたせんむベントのストリヌム党䜓。



受信偎のファむルぞのむベントの蚘録



受信偎぀たりサヌバヌ偎では、すべおのむベントは<_>/<_>-<>_<>



ずいう圢匏のファむルに<_>/<_>_current



れ、最埌のファむルぞの<_>/<_>_current



ずいう圢匏のシンボリックリンクが䜜成されたすカテゎリヌ内。 ファむルは、経過時間60秒などたたはボリュヌム10 MBなどのいずれか早い方に基づいおロヌテヌションされたす。



たずえば、error_logなどのカテゎリが呌び出された堎合、ファむルずディレクトリの階局は次のようになりたす。



 /var/scribe/error_log/ |-- error_log-2016-09-13_004742 |-- error_log-2016-09-13_004743 |-- error_log-2016-09-13_004744 `-- error_log_current -> error_log-2016-09-13_004744
      
      





蚘録は垞に最埌のファむルに察しお行われたす。 サヌバヌは以前のファむルに曞き蟌みを行いたせん;ファむルが完党に凊理された埌、それらは自由に読み取りおよび削陀できたす。



高遅延ネットワヌクでの通垞動䜜



Scribeクラむアントは、デヌタを小さなパケットで送信し、新しいパケットを送信する前に、盞手偎からの確認を埅ちたす。 これは、たずえば、デヌタ転送遅延が玄125ミリ秒である倧西掋でむベントを送信する堎合など、非垞にうたく機胜したせん。 たずえば、最倧パケットサむズが0.1 Mbの堎合、この方法で1秒以内に転送できるのは0.1 Mb / 0.125 s = 0.8 Mb / sだけです。 各パケットの確認を埅たずに、ストリヌミングモヌドでむベントを送信する堎合、この制限を回避できたす。



LSDは䜕を提䟛したすか



䞀般的に、Scribeに぀いおは䞻に2぀の苊情がありたした。



  1. デヌモンがクラッシュしたずきの䞍安定性ずデヌタ損倱。
  2. 受信サヌバヌがクラッシュした堎合、トラフィックは残りのサヌバヌ間で自動的に再分配されないため、手動による介入が必芁です。


LSDはこれら2぀の問題を解決し、最初に説明したむベントを配信するための芁件を満たしたす。



デヌモンがクラッシュしたずきのデヌタ損倱保護



゚ラヌのない゜フトりェアは存圚しないため、LSDを「砎壊䞍可胜」にしお垞に適切な時間を確保しようずする代わりに、クラむアントは垞にむベントをファむルに曞き蟌み、LSDクラむアントはこれらのファむルを読み取り、必芁な堎所に配信したす車。 この方法は、Thrift、Protocol Buffersなどのドラむバヌが䞍芁で、シェルスクリプトからでもむベントを送信できるため䟿利です。



むベントを送信するには、このむベントを含む行を<category> / <filename> .logの圢匏のファむルの最埌に曞き蟌む必芁がありたす。ここで、<category>はむベントのカテゎリの名前です。 珟圚の日付ず時刻に基づいお単調に増加する文字列は、<filename>ずしお機胜したす。 この圢匏は偶然に遞択されたものではなく、LSDたたはScribeを䜿甚しお配信されたむベントを他のサヌバヌに送信できたす。 <filename>ずしお、YYYYMMDDHHII圢匏の日付ず時刻を䜿甚するこずをお勧めしたすたずえば、201609131714。 この圢匏を遞択するず、ファむルは1分間に1回だけ䜜成され、その名前は単調に増加したす。



耇数のプロセスから4 KBを超えるむベント stackoverflow.com/questions/1154446/is-file-append-atomic-in-unix を送信する必芁がある堎合、行が混同しないようにファむルにむベントを曞き蟌む前にファむルロックを取埗する必芁がありたす。 サフィックス_bigをファむル名に远加しお、小さなむベントをロックしないように、倧きなむベントを別のファむルに曞き蟌むこずができたす。



<category> .log圢匏のプレヌン圢匏もサポヌトされおいたす。この堎合、サブディレクトリの䜜成は䞍芁です。 この圢匏は、シェルスクリプトからむベントを送信したり、ログを収集したりするずきに䟿利です。



むベントフロヌの自動再割り圓お



むベントが配信されるサヌバヌの1぀がクラッシュするず、残りのサヌバヌに自動的に再配垃されたす。 サヌバヌの1぀が他のサヌバヌよりも遅い堎合、この堎合、受信可胜なむベントのストリヌムを取埗したす。



これは、サヌバヌの可甚性がタむムアりトに基づいお決定されるため、1回限りの配信が保蚌されないこずも意味したす。 むベントがサヌバヌに正垞に配信される可胜性はありたすが、むベントの確認が届かないか、非垞に遅く到着する可胜性がありたす。 この堎合、LSDクラむアントはむベントパケットを再送信したすが、その確認はタむムアりトになりたせんでしたデフォルトでは30秒。



リアルタむムのむベント配信



Live Streaming Daemonずいう名前を遞択したため、䞀臎する必芁がありたす:)。 受信偎で十分なネットワヌク垯域幅ずサヌバヌパフォヌマンスがある堎合、むベント配信はリアルタむムで実行されたす-配信に人為的な遅延はありたせん。 これは、ログを配信したり、むベントを送信するための倚数の䞭間ノヌドを䜜成したりする堎合に䟿利です。 䞀方、リアルタむム配信では、むベントが数秒ごずに蓄積されお送信される堎合よりも倚くのリ゜ヌスが必芁ですこれらの蚭定でScribeを䜿甚したした。 したがっお、LSDのCPU消費は平均しおScribeのCPU消費よりもわずかに高くなりたすが、その差はそれほど倧きくありたせん。



性胜



残念ながら、スクラむブクラむアントが負荷に陥ったため、内郚UDS分析システムのむベントフロヌでScribeのパフォヌマンスを枬定できたせんでしたAlexander Krashennikovが最近UDS に぀いお話したした。



1぀のLSDサヌバヌは、数千のサヌバヌからの2ギガビット/秒400kむベント/秒のむベントストリヌムに簡単に察応したす。 したがっお、1秒間に100䞇のむベントのストリヌムを受信するには、3台のサヌバヌのみが必芁であり、各サヌバヌには2枚のギガビットネットワヌクカヌドが装備されおいる必芁がありたす。



オヌプン゜ヌス



LSD゜ヌスコヌドはGitHubにありたす むンストヌルするには、go get github.com/badoo/lsdず入力したす。 デヌモンはLinuxおよびmacOSで実行されたすが、産業甚にはLinuxが掚奚されたす。



LSDに加えお、オヌプン゜ヌスで公開されおいる他の倚くのプロゞェクトがありたす。これらのプロゞェクトは、テクニカルブログでご芧いただけたす。



Badoo、シニア開発者、Yuri Nasretdinov



All Articles