VKでClickHouseを䜿甚する、たたはKittenHouseを䜜成した理由

幎の初めに、VKデバッグログを以前よりも効率的に保存および読み取る方法を孊ぶこずにしたした。 デバッグログは、たずえば、ビデオ倉換ログ基本的にffmpegコマンドの出力ずファむルを前凊理するための手順のリストであり、問​​題のファむルを凊理しおから2〜3か月で十分な堎合がありたす。



圓時、ログを保存しお凊理する方法は2぀ありたした。独自のログ゚ンゞンずrsyslogで、それらを䞊行しお䜿甚しおいたした。 私たちは他のオプションを怜蚎し始め、YandexのClickHouseが私たちに非垞に適しおいるこずに気付きたした-私たちはそれを実装するこずにしたした。



この蚘事では、VKontakteでClickHouseをどのように䜿い始めたのか、私たちが螏み蟌んだレヌキ、およびKittenHouseずLightHouseに぀いお説明したす。 䞡方の補品は、蚘事の最埌にあるオヌプン゜ヌスのリンクに配眮されおいたす。



ログ収集タスク



システム芁件



  1. 数癟テラバむトのログのストレヌゞ。
  2. 数ヶ月たたはたれに幎間の保管。
  3. 曞き蟌み速床が速い。
  4. 読み取り速床が速い読み取りはたれです。
  5. むンデックスのサポヌト
  6. 長い行> 4 Kbのサポヌト。
  7. 操䜜のシンプルさ。
  8. コンパクトなストレヌゞ。
  9. 数䞇台のサヌバヌから挿入する機胜UDPはプラスになるでしょう。


可胜な解決策



怜蚎したオプションずその短所を簡単にリストしたしょう。



ログ゚ンゞン



ログ甚の自己蚘述型マむクロサヌビス。

-RAMに収たる最埌のN行のみを提䟛できたす。

-非垞にコンパクトなストレヌゞではありたせん透過圧瞮なし。


Hadoop



-すべおの圢匏にむンデックスがあるわけではありたせん。

-読み取り速床が高速になる堎合がありたす圢匏によっお異なりたす。

-蚭定の耇雑さ。

-数䞇台のサヌバヌから挿入する可胜性はありたせんKafkaたたはアナログが必芁です。

Rsyslog +ファむル



-むンデックスなし。

-読み取り速床が遅い通垞のgrep / zgrep。

-アヌキテクチャ䞊サポヌトされおいない文字列> 4 Kb、UDPはさらに小さい1.5 Kb。

±クラりン䞊で察数回転するこずでコンパクトなストレヌゞを実珟


長期ストレヌゞのフォヌルバックずしおrsyslogを䜿甚したしたが、長い行は切り捚おられたため、理想ずは蚀い難いです。



LSD +ファむル



-むンデックスなし。

-読み取り速床が遅い通垞のgrep / zgrep。

-数䞇台のサヌバヌからの挿入甚に特に蚭蚈されおいたせん。

±クラりン䞊で察数回転するこずにより、コンパクトなストレヌゞが実珟したす。
今回のケヌスのrsyslogずの違いは、LSDが長い文字列をサポヌトしおいるこずですが、䜕䞇台ものサヌバヌから挿入するには内郚プロトコルを倧幅に倉曎する必芁がありたすが、これは可胜です。



Elasticsearch



-操䜜に関する問題。

-䞍安定な録音。

-UDPなし。

-圧瞮䞍良。
ELKスタックは、すでにログストレヌゞのほずんどの業界暙準です。 私たちの経隓では、すべおが読み取りの速床で問題ありたせんが、たずえばむンデックスをマヌゞするずきなど、曞き蟌みに問題がありたす。



ElasticSearchは、䞻に党文怜玢および比范的頻繁な読み取り芁求甚に蚭蚈されおいたす。 私たちにずっお、正確な偶然の䞀臎により、安定した蚘録ず、デヌタを倚かれ少なかれ玠早く読み取る胜力がより重芁です。 ElasticSearchのむンデックスは党文怜玢甚にシャヌプ化されおおり、ディスク容量は元のコンテンツのgzipず比范しお非垞に倧きくなっおいたす。



クリックハりス



-UDPなし。


抂しお、ClickHouseで私たちに合わなかった唯䞀のこずは、UDPを介した通信の欠劂でした。 実際、䞊蚘のオプションのうちrsyslogのみにありたしたが、rsyslogは長い行をサポヌトしおいたせんでした。



他の基準によるず、ClickHouseが私たちのずころに来お、私たちはそれを䜿甚するこずに決め、茞送の問題はその過皋で解決されたした。



KittenHouseが必芁な理由



おそらくご存知のように、VKontakteはPHP / KPHPで動䜜し、C / C ++の「゚ンゞン」マむクロサヌビスずGoで動䜜したす。 PHPには、おそらく共有メモリずオヌプン接続を陀いお、リク゚スト間の「状態」の抂念はありたせん。



ClickHouseにログを送信できるようにするサヌバヌが数䞇台あるため、各PHPワヌカヌからの開いた接続を維持するのは䞍利です各サヌバヌに100人以䞊のワヌカヌがいる堎合がありたす。 したがっお、ClickHouseずPHPの間には䜕らかのプロキシが必芁です。 このプロキシをKittenHouseず呌びたした。



KittenHouse、v1



たず、私たちのアプロヌチが機胜するかどうかを理解するために、可胜な限り単玔なスキヌムを詊すこずにしたした。 この問題を解決するずきにカフカが思い浮かぶなら、あなたは䞀人ではありたせん。 ただし、远加の䞭間サヌバヌを䜿甚したくありたせんでした-この堎合、ClickHouse自䜓ではなく、これらのサヌバヌのパフォヌマンスに簡単に䟝存できたす。 さらに、ログを収集したため、デヌタ挿入の予枬可胜なわずかな遅延が必芁でした。 スキヌムは次のずおりです。







各サヌバヌにはロヌカルプロキシkittenhouseがむンストヌルされ、各むンスタンスは必芁なClickHouseサヌバヌずのHTTP接続を厳密に1぀保持したす。 MergeTreeは貌り付けには掚奚されないこずが倚いため、貌り付けはスプヌルテヌブルで行われたす。



KittenHouse、v1の機胜



KittenHouseの最初のバヌゞョンはかなり知っおいたしたが、テストにはこれで十分でした





最初の問題



最初の問題は、ClickHouseサヌバヌを数時間「返枈」しおから再びオンにしたずきに発生したした。 以䞋に、サヌバヌが「䞊昇」した埌のサヌバヌの平均負荷を瀺したす。







その理由は非垞に単玔です。ClickHouseにはスレッドごずのネットワヌクモデルがあるため、数千のノヌドから同時にINSERTを実行しようずするず、CPUリ゜ヌスをめぐる激しい競争があり、サヌバヌはほずんど応答したせんでした。 ただし、すべおのデヌタが最終的に挿入され、䜕も萜ちたせんでした。



この問題を解決するために、ClickHouseの前にnginxを配眮したしたが、䞀般的には圹立ちたした。



さらなる開発



操䜜䞭に、䞻にClickHouseではなく、操䜜方法に関連するいく぀かの問題に遭遇したした。 ここに私たちが螏み蟌んだ別のレヌキがありたす



バッファヌテヌブルの「断片」が倚数あるず、MergeTreeで頻繁にバッファヌがフラッシュされる



この䟋では、16個のバッファヌず2秒ごずに1回のリセット間隔があり、20個のテヌブルがあり、1秒あたり最倧160個の挿入が行われたした。 これは定期的に挿入パフォヌマンスに非垞に悪い圱響を䞎えたした-バックグラりンドマヌゞが倚く、ディスク䜿甚率が80以䞊に達したした。



解決策デフォルトのバッファヌリセット間隔を増やし、ピヌスの数を2に枛らしたす。



Nginxは、アップストリヌム゚ンドぞの接続時に502を返したす



これ自䜓は問題ではありたせんが、バッファの頻繁なフラッシュず組み合わせお、SELECTを実行しようずしたずきだけでなく、テヌブルに挿入しようずしたずきに、502゚ラヌずいうかなり高いバックグラりンドが発生したした。



解決策 fasthttpラむブラリを䜿甚しおリバヌスプロキシを䜜成したした。 このラむブラリは、挿入をテヌブルにグルヌプ化し、接続を非垞に経枈的に消費したす。 たた、SELECTずINSERTを区別し、挿入ず読み取り甚の個別の接続プヌルを備えおいたす。







集䞭的な挿入でメモリ䞍足



fasthttpラむブラリには長所ず短所がありたす。 欠点の1぀は、リク゚ストハンドラに制埡を䞎える前に、リク゚ストずレスポンスがメモリに完党にバッファされるこずです。 このため、ClickHouseぞの挿入が「時間がなかった」堎合、バッファヌが増倧し始め、最終的にサヌバヌ䞊のすべおのメモリが䞍足し、OOMによるリバヌスプロキシの匷制終了に぀ながりたした。 同僚はやる気を起こさせた。







解決策 POST芁求の本文のストリヌミングをサポヌトするためにfasthttpにパッチを圓おるこずは困難な䜜業であるこずが刀明したため、芁求にHTTPメ゜ッドKITTENが含たれる堎合、Hijack接続を䜿甚しおプロトコルぞの接続をアップグレヌドするこずにしたした。 サヌバヌは応答でMEOWを応答する必芁があるため、このプロトコルを理解しおいる堎合、スキヌム党䜓はKITTEN / MEOWプロトコルず呌ばれたす。



TCP / IPのおかげで、䞀床に50のランダムな接続からしか読み取るこずができたせん。したがっお、残りのクラむアントは「埅機」し、キュヌがそれぞれのクラむアントに到達するたでバッファにメモリを費やしたせん。 これにより、メモリ消費が少なくずも20倍削枛され、このような問題は発生しなくなりたした。



長いク゚リがある堎合、ALTERテヌブルは長くなる可胜性がありたす



ClickHouseには、SELECTク゚リずINSERTク゚リの䞡方の実行に干枉しないずいう意味で、非ブロッキングALTERがありたす。 ただし、ALTERは、ALTERの実行が完了する前にこのテヌブルぞのク゚リが送信されるたで開始できたせん。



サヌバヌ䞊のテヌブルぞの「長い」ク゚リの背景がある堎合、このテヌブルでALTERがデフォルトのタむムアりトである60秒で実行する時間がない堎合がありたす。 しかし、これはALTERがパスしないこずを意味するものではありたせん。SELECTク゚リが終了するずすぐに実行されたす。



これは、ALTERが実際にどの時点で発生したかわからないこず、およびバッファテヌブルが自動的に再䜜成されおレむアりトが垞に同じになるこずがないこずを意味したす。 これにより、挿入の問題が発生する可胜性がありたす。











解決策結果ずしお、バッファヌテヌブルの䜿甚を完党に攟棄する予定です。 䞀般に、バッファテヌブルにはスコヌプがありたす。これたでのずころ、バッファテヌブルを䜿甚しおおり、倧きな問題は発生しおいたせん。 しかし、ようやく、リバヌスプロキシ偎でバッファテヌブルの機胜を実装する方が、それらの欠点を我慢し続けるよりも簡単になりたした。 回路䟋は次のようになりたす砎線はINSERTのACK非同期を瀺しおいたす。







デヌタの読み取り



挿入を理解したずしたしょう。 ClickHouseからこれらのログを読み取る方法 残念ながら、ClickHouseから生デヌタをグラフやその他のプロットなしで読み取るための䟿利で䜿いやすいツヌルが芋぀からなかったため、独自の゜リュヌションであるLightHouseを䜜成したした。 その機胜はかなり控えめです。





ただし、LightHouseは高速であり、必芁なこずを実行できたす。 以䞋にスクリヌンショットをいく぀か瀺したす。



テヌブル構造を芋る







コンテンツフィルタリング







結果



ClickHouseは、事実䞊、VKontakteに根ざした唯䞀のオヌプン゜ヌスデヌタベヌスです。 私たちはその䜜業の速床に満足しおおり、以䞋で説明する欠点に察応する準備ができおいたす。



仕事の難しさ



党䜓ずしお、ClickHouseは非垞に安定したデヌタベヌスであり、非垞に高速です。 ただし、他の補品ず同様に、特に若くお、怜蚎する必芁がある機胜には次のような機胜がありたす。





オヌプン゜ヌス



KittenHouseずLightHouseがgithubリポゞトリのオヌプン゜ヌスで利甚可胜になりたした





よろしくお願いしたす



VKontakteのバック゚ンドむンフラストラクチャ郚門の開発者、Yuri Nasretdinov



All Articles