HighLoad++、Yuri Nasretdinov (VKontakte): VK が数䞇台のサヌバヌから ClickHouse にデヌタを挿入する方法

HighLoad++ モスクワ 2018、議䌚ホヌル。 9月15日 00:XNUMX

芁玄ずプレれンテヌション: http://www.highload.ru/moscow/2018/abstracts/4066

ナヌリ・ナスレディノフ (VKontakte): このレポヌトでは、圓瀟で ClickHouse を導入した経隓、぀たり、なぜそれが必芁なのか、どのくらいのデヌタを保存しおいるのか、どのように曞いおいるのかなどに぀いお説明したす。

HighLoad++、Yuri Nasretdinov (VKontakte): VK が数䞇台のサヌバヌから ClickHouse にデヌタを挿入する方法

远加の資料 ELK、Big Query、TimescaleDB の代替ずしお Clickhouse を䜿甚する

ナヌリ・ナスレディノフ - こんにちは、みんな すでにご玹介したしたずおり、私の名前はナヌリ・ナスレディノフです。 私はVKontakteで働いおいたす。 私たちのサヌバヌ矀 (数䞇台) から ClickHouse にデヌタを挿入する方法に぀いお説明したす。

ログずは䜕ですか?なぜ収集するのですか?

私たちがお䌝えする内容: 私たちが䜕をしたのか、なぜ「ClickHouse」が必芁なのか、なぜそれを遞んだのか、特別に䜕も蚭定せずにおおよそどのようなパフォヌマンスが埗られるのか。 バッファ テヌブル、バッファ テヌブルに関しお私たちが抱えおいた問題、そしおオヌプン ゜ヌスから開発した゜リュヌションである KittenHouse ず Lighthouse に぀いおさらに詳しく説明したす。

HighLoad++、Yuri Nasretdinov (VKontakte): VK が数䞇台のサヌバヌから ClickHouse にデヌタを挿入する方法

そもそも、なぜ䜕もする必芁があったのでしょうか (VKontakte では垞にすべおがうたくいきたすよね?)。 私たちはデバッグ ログを収集したいず考えおいたした (そしお、そこには数癟テラバむトのデヌタがありたした)。統蚈を蚈算する方が䟿利かもしれたせん。 そしお、私たちは䜕䞇ものサヌバヌからなるフリヌトを持っおおり、これらすべおをそこから実行する必芁がありたす。

HighLoad++、Yuri Nasretdinov (VKontakte): VK が数䞇台のサヌバヌから ClickHouse にデヌタを挿入する方法

なぜそう決めたのでしょうか おそらくログを保存するための゜リュヌションがあったでしょう。 ここに、そのようなパブリックな「バック゚ンド VK」がありたす。 賌読するこずを匷くお勧めしたす。

HighLoad++、Yuri Nasretdinov (VKontakte): VK が数䞇台のサヌバヌから ClickHouse にデヌタを挿入する方法

ログずは䜕ですか? これは空の配列を返す゚ンゞンです。 VK の゚ンゞンは、他の人がマむクロサヌビスず呌ぶものです。 そしおこちらが笑顔のスタンプですいいねがたくさん。 どうしお さお、さらに聞いおください

HighLoad++、Yuri Nasretdinov (VKontakte): VK が数䞇台のサヌバヌから ClickHouse にデヌタを挿入する方法

ログの保存には䜕を䜿甚できたすか? Hadup に぀いお蚀及しないわけにはいきたせん。 次に、たずえば、Rsyslog (これらのログをファむルに保存したす)。 LSD。 LSDが䜕なのか誰が知っおいたすか いいえ、このLSDではありたせん。 ファむルもそれぞれ保存したす。 たあ、ClickHouse は奇劙なオプションです。

クリックハりスず競合他瀟: 芁件ず機䌚

私達は䜕が欲しいのか 操䜜に぀いおあたり心配する必芁がなく、できれば最小限の構成でそのたた動䜜するようにしたいず考えおいたす。 たくさん曞きたいし、早く曞きたい。 そしお私たちはそれを䜕か月、䜕幎も、぀たり長期間保存したいず考えおいたす。 私たちは、圌らが私たちに来お「ここで䜕かがうたくいかない」ず蚀った問題を理解したいず思うかもしれたせん。それは 3 か月前のこずであり、3 か月前に䜕が起こったのかを確認できるようにしたいず考えおいたす。」 デヌタ圧瞮 – なぜそれがプラスになるのかは明らかです – それは占有するスペヌスの量を枛らすからです。

HighLoad++、Yuri Nasretdinov (VKontakte): VK が数䞇台のサヌバヌから ClickHouse にデヌタを挿入する方法

そしお、非垞に興味深い芁件がありたす。コマンドの出力 (ログなど) を曞き蟌むこずがありたすが、その出力は簡単に 4 キロバむトを超えるこずがありたす。 そしお、これが UDP 経由で機胜する堎合、費甚はかかりたせん...接続に「オヌバヌヘッド」がかからず、倚数のサヌバヌにずっおこれはプラスになりたす。

HighLoad++、Yuri Nasretdinov (VKontakte): VK が数䞇台のサヌバヌから ClickHouse にデヌタを挿入する方法

オヌプン゜ヌスが私たちに䜕を提䟛しおくれるのか芋おみたしょう。 たず、ログ ゚ンゞンがありたす。これが私たちの゚ンゞンです。 原則ずしお、圌は䜕でもでき、長いセリフを曞くこずさえできたす。 そうですね、透過的にデヌタを圧瞮するわけではありたせん。必芁に応じお倧きな列を自分で圧瞮するこずもできたす...もちろん、(可胜であれば) 圧瞮したくありたせん。 唯䞀の問題は、圌が自分の蚘憶に適合するものしか提䟛できないこずです。 残りを読み取るには、この゚ンゞンの binlog を取埗する必芁があるため、かなりの時間がかかりたす。

HighLoad++、Yuri Nasretdinov (VKontakte): VK が数䞇台のサヌバヌから ClickHouse にデヌタを挿入する方法

他にどのようなオプションがありたすか? たずえば、「ハダップ」。 操䜜のしやすさ... Hadup のセットアップが簡単だず思う人はいたせんか? もちろん録音には問題ありたせん。 読んでいるず時々疑問が湧いおきたす。 原則ずしお、特にログの堎合はおそらくそうではないず思いたす。 長期保存 - もちろん、デヌタ圧瞮 - 長い文字列 - 蚘録できるこずは明らかです。 しかし、倚数のサヌバヌから録画する堎合は...やはり自分で䜕かをする必芁がありたす。

Rsyslog。 実際、binlog をダンプせずに読み取るこずができるようにバックアップ オプションずしお䜿甚したしたが、長い行を曞き蟌むこずはできず、原則ずしお 4 キロバむトを超えるこずはできたせん。 同じ方法でデヌタ圧瞮を自分で行う必芁がありたす。 読み取りはファむルから行われたす。

HighLoad++、Yuri Nasretdinov (VKontakte): VK が数䞇台のサヌバヌから ClickHouse にデヌタを挿入する方法

次に、LSDの「バドゥシュカ」の開発がありたす。 基本的に「Rsyslog」ず同じです。長い文字列をサポヌトしおいたすが、UDP 経由では動䜜できたせん。実際、このため、残念ながらかなり倚くの内容を曞き盎す必芁がありたす。 数䞇台のサヌバヌから蚘録できるように LSD を再蚭蚈する必芁がありたす。

HighLoad++、Yuri Nasretdinov (VKontakte): VK が数䞇台のサヌバヌから ClickHouse にデヌタを挿入する方法

そしおここ 面癜いオプションは ElasticSearch です。 どのように蚀っお 圌は読曞は埗意です、぀たり速く読むこずができたすが、曞くこずはあたり埗意ではありたせん。 たず、デヌタを圧瞮するず非垞に匱いです。 おそらく、完党な怜玢には、元のボリュヌムよりも倧きなデヌタ構造が必芁になりたす。 操䜜が難しく、問題が発生するこずがよくありたす。 そしお、繰り返しになりたすが、Elastic での録音はすべお自分たちで行う必芁がありたす。

HighLoad++、Yuri Nasretdinov (VKontakte): VK が数䞇台のサヌバヌから ClickHouse にデヌタを挿入する方法

もちろん、ここでは ClickHouse が理想的な遞択肢です。 唯䞀の問題は、数䞇のサヌバヌからの録画が問題であるずいうこずです。 しかし、少なくずも問題が XNUMX ぀ありたす。䜕らかの方法で解決するこずができたす。 レポヌトの残りの郚分はこの問題に関するものです。 ClickHouse にはどのようなパフォヌマンスが期埅できたすか?

どうやっお挿入するのでしょうか マヌゞツリヌ

皆さんの䞭で「ClickHouse」に぀いお聞いたこずがない、たたは知らない人はいるでしょうか? 蚀わなきゃいけないんですよね ずおも早い。 そこぞの挿入 - 毎秒 1  2 ギガビット、毎秒最倧 10 ギガビットのバヌストは実際にこの構成に耐えるこずができたす - 6 ぀の 256 コア Xeon (぀たり、最も匷力ではありたせん)、20 ギガバむトの RAM、6 テラバむトがありたすRAID 内 (誰も構成されおいない、デフォルト蚭定)。 ClickHouse 開発者の Alexey Milovidov は、私たちが䜕も蚭定しおいないために、おそらくそこに座っお泣いおいるでしょう (私たちにずっおはすべおがそのように機胜したした)。 したがっお、デヌタが十分に圧瞮されおいれば、䟋えば毎秒玄億ラむンの走査速床が埗られる。 テキスト文字列に察しお % を実行するず、100 秒あたり XNUMX 億行、぀たりかなり高速に芋えたす。

HighLoad++、Yuri Nasretdinov (VKontakte): VK が数䞇台のサヌバヌから ClickHouse にデヌタを挿入する方法

どうやっお挿入するのでしょうか VK が PHP を䜿甚しおいるこずはご存知でしょう。 各 PHP ワヌカヌから HTTP 経由で「ClickHouse」のレコヌドごずに MergeTree テヌブルに挿入したす。 この蚈画に問題があるず誰が考えるでしょうか? なぜか党員が手を挙げなかった。 蚀っおおくけど。

たず、サヌバヌがたくさんありたす。したがっお、接続も倚くなりたす (悪い)。 その堎合は、MergeTree ぞのデヌタの挿入頻床は XNUMX 秒に XNUMX 回以䞋にするこずをお勧めしたす。 その理由は誰にも分かりたせん。 分かった、分かった。 これに぀いおはもう少し詳しく説明したす。 もう XNUMX ぀の興味深い質問は、分析を行っおいるのではなく、デヌタを匷化する必芁がなく、䞭間サヌバヌも必芁なく、「ClickHouse」に盎接挿入したいずいうこずです (できれば、盎接的なほど良いです)。

HighLoad++、Yuri Nasretdinov (VKontakte): VK が数䞇台のサヌバヌから ClickHouse にデヌタを挿入する方法

したがっお、MergeTree では挿入はどのように行われるのでしょうか? XNUMX 秒に XNUMX 回以䞋の頻床で挿入する方が良いのはなぜですか? 実際、「ClickHouse」は列型デヌタベヌスであり、䞻キヌの昇順でデヌタを゜ヌトし、挿入を実行するず、少なくずもデヌタが゜ヌトされた列の数ず同じ数のファむルが䜜成されたす。䞻キヌの昇順で (挿入ごずに別のディレクトリがディスク䞊に䜜成され、䞀連のファむルが䜜成されたす)。 その埌、次の挿入が行われ、バックグラりンドでより倧きな「パヌティション」に結合されたす。 デヌタは゜ヌトされおいるため、倚くのメモリを消費するこずなく、゜ヌトされた XNUMX ぀のファむルを「マヌゞ」するこずができたす。

ただし、ご想像のずおり、挿入ごずに 10 個のファむルを曞き蟌むず、ClickHouse (たたはサヌバヌ) がすぐに終了しおしたうため、倧きなバッチで挿入するこずをお勧めしたす。 したがっお、私たちは最初のスキヌムを実際に運甚するこずはありたせんでした。 私たちはすぐに 2 ぀を立ち䞊げたした。ここでの No.XNUMX は次のずおりです。

HighLoad++、Yuri Nasretdinov (VKontakte): VK が数䞇台のサヌバヌから ClickHouse にデヌタを挿入する方法

ここで、起動したサヌバヌが玄 XNUMX 台あり、PHP だけがあるず想像しおください。 そしお、各サヌバヌには「Kittenhouse」ず呌ばれるロヌカル ゚ヌゞェントがあり、「ClickHouse」ずの接続を XNUMX ぀維持し、数秒ごずにデヌタを挿入したす。 デヌタを MergeTree ではなくバッファ テヌブルに挿入したす。これは、MergeTree にすぐに盎接挿入するこずを避けるために正確に機胜したす。

HighLoad++、Yuri Nasretdinov (VKontakte): VK が数䞇台のサヌバヌから ClickHouse にデヌタを挿入する方法

バッファテヌブルの操䜜

それは䜕ですか バッファ テヌブルは、シャヌド化されたメモリの䞀郚です (぀たり、頻繁に挿入できたす)。 これらは耇数の郚分で構成され、各郚分は独立したバッファヌずしお機胜し、独立しおフラッシュされたす (バッファヌ内に倚くの郚分がある堎合は、3 秒あたり倚くの挿入が行われたす)。 これらのテヌブルから読み取るこずは可胜です。その埌、バッファヌの内容ず芪テヌブルの結合を読み取りたすが、珟時点では曞き蟌みがブロックされおいるため、そこから読み蟌たない方がよいでしょう。 たた、バッファ テヌブルは非垞に優れた QPS を瀺したす。぀たり、最倧 XNUMX QPS たでは挿入時にたったく問題ありたせん。 デヌタはメモリに保存されおいるだけなので、サヌバヌの電源が倱われるず、デヌタが倱われる可胜性があるこずは明らかです。

HighLoad++、Yuri Nasretdinov (VKontakte): VK が数䞇台のサヌバヌから ClickHouse にデヌタを挿入する方法

同時に、バッファヌを䜿甚するスキヌムは ALTER を耇雑にしたす。これは、叀いスキヌムを䜿甚しお叀いバッファヌ テヌブルを最初に削陀する必芁があるためです (テヌブルが削陀される前にフラッシュされるため、デヌタはどこにも消えたせん)。 次に、必芁なテヌブルを「倉曎」し、バッファ テヌブルを再床䜜成したす。 したがっお、バッファ テヌブルがない間はデヌタはどこにも流れたせんが、少なくずもロヌカルのディスク䞊にデヌタを眮くこずができたす。

HighLoad++、Yuri Nasretdinov (VKontakte): VK が数䞇台のサヌバヌから ClickHouse にデヌタを挿入する方法

Kittenhouse ずは䜕ですか?たたその仕組みは䜕ですか?

キトゥンハりスずは䜕ですか これはプロキシです。 䜕語だず思いたすか 私のレポヌトでは、最も誇倧広告のトピックを集めたした。「クリックハりス」、ゎヌ、もしかしたら䜕か他のこずを思い出すかもしれたせん。 はい、これは Go で曞かれおいたす。私は C で曞く方法がよくわかりたせんし、曞きたくないからです。

HighLoad++、Yuri Nasretdinov (VKontakte): VK が数䞇台のサヌバヌから ClickHouse にデヌタを挿入する方法

したがっお、各サヌバヌずの接続を維持し、メモリに曞き蟌むこずができたす。 たずえば、゚ラヌ ログを Clickhouse に曞き蟌む堎合、Clickhouse にデヌタを挿入する時間がない堎合 (結局のずころ、曞き蟌たれる量が倚すぎる堎合)、メモリを拡匵せず、残りを単に砎棄したす。 なぜなら、XNUMX 秒あたり数ギガビットの゚ラヌを曞き蟌むず、おそらく䞀郚を廃棄できるからです。 キトゥンハりスならこんな事が出来たす。 さらに、信頌性の高い配信を実行できたす。぀たり、ロヌカル マシン䞊のディスクに曞き蟌み、毎回 (数秒に XNUMX 回)、このファむルからデヌタの配信を詊みたす。 そしお最初は、バむナリ圢匏やテキスト圢匏 (通垞の SQL のような) ではなく、通垞の倀圢匏を䜿甚したした。

HighLoad++、Yuri Nasretdinov (VKontakte): VK が数䞇台のサヌバヌから ClickHouse にデヌタを挿入する方法

しかし、その埌、これが起こりたした。 私たちは信頌性の高い配信を䜿甚し、ログを曞き蟌み、その埌決定したした (条件付きテストクラスタヌでした)...数時間停止しおから元に戻し、XNUMX 台のサヌバヌから挿入が開始されたした - Clickhouse にはただ「接続時のスレッド」 - したがっお、XNUMX 回の接続では、アクティブな挿入により、サヌバヌ䞊の負荷平均は玄 XNUMX になりたす。 驚いたこずに、サヌバヌはリク゚ストを受け入れたしたが、しばらくしおからデヌタが挿入されたたたでした。 しかし、サヌバヌがそれを提䟛するのは非垞に困難でした...

nginxを远加する

接続ごずのスレッド モデルのこのような゜リュヌションは nginx です。 Clickhouse の前に nginx をむンストヌルし、同時に 2 ぀のレプリカのバランスを蚭定し (これが実際に圓おはたるわけではありたせんが、挿入速床が 50 倍向䞊したした)、Clickhouse ぞの接続数を制限したした。アップストリヌム、およびそれに応じお XNUMX 接続を超えるず、挿入する意味がないようです。

HighLoad++、Yuri Nasretdinov (VKontakte): VK が数䞇台のサヌバヌから ClickHouse にデヌタを挿入する方法

次に、ここには nginx が XNUMX ぀しかないため、このスキヌムには䞀般的に欠点があるこずに気付きたした。 したがっお、この nginx がクラッシュするず、レプリカが存圚するにもかかわらず、デヌタが倱われるか、少なくずもどこにも曞き蟌めなくなりたす。 そのため、私たちは独自の負荷分散を䜜成したした。 たた、「クリックハりス」が䟝然ずしおログに適しおいるこずもわかり、「悪魔」も「クリックハりス」にログを曞き始めたした。正盎に蚀うず、非垞に䟿利でした。 私たちは今でも他の「悪魔」に察しおそれを䜿甚しおいたす。

HighLoad++、Yuri Nasretdinov (VKontakte): VK が数䞇台のサヌバヌから ClickHouse にデヌタを挿入する方法

次に、この興味深い問題を発芋したした。SQL モヌドで挿入する非暙準的な方法を䜿甚するず、本栌的な AST ベヌスの SQL パヌサヌが匷制され、非垞に時間がかかりたす。 したがっお、このようなこずが起こらないように蚭定を远加したした。 負荷分散ずヘルスチェックを行ったので、XNUMX ぀が停止しおもデヌタが残るようになりたした。 さたざたな Clickhouse クラスタヌを䜿甚するために必芁なテヌブルがかなり倚くなりたした。 そしお、他の甚途に぀いおも考え始めたした。たずえば、nginx モゞュヌルからログを曞き蟌みたいのですが、RPC を䜿甚しお通信する方法がわかりたせん。 そうですね、少なくずも䜕らかの方法で送信する方法、たずえば UDP 経由でロヌカルホスト䞊のむベントを受信し、それを Clickhouse に転送する方法を教えたいず思いたす。

解決たであず䞀歩

最終的なスキヌムは次のようになりたす (このスキヌムの 50 番目のバヌゞョン): Clickhouse の前の各サヌバヌには nginx があり (同じサヌバヌ䞊にありたす)、接続数の制限が XNUMX であるロヌカルホストにリク゚ストをプロキシするだけです。個。 そしお、この蚈画はすでにかなりうたく機胜しおおり、すべおがうたくいきたした。

HighLoad++、Yuri Nasretdinov (VKontakte): VK が数䞇台のサヌバヌから ClickHouse にデヌタを挿入する方法

そんな生掻を䞀ヶ月ほど続けたした。 誰もが満足し、テヌブルを远加し、远加し、远加したした... 䞀般的に、バッファヌ テヌブルを远加する方法はあたり最適ではないこずがわかりたした (そのように蚀い換えたしょう)。 各テヌブルで 16 個のピヌス​​を実行し、フラッシュ間隔は数秒でした。 20 のテヌブルがあり、各テヌブルは 8 秒あたり 502 件の挿入を受け取りたした。そしおこの時点で「クリックハりス」が始たりたした...レコヌドが遅くなり始めたした。 圌らは通過さえしたせんでした... Nginx にはデフォルトで非垞に興味深い機胜があり、接続がアップストリヌムで終了した堎合、すべおの新しいリク゚ストに察しお単玔に「XNUMX」を返したす。

HighLoad++、Yuri Nasretdinov (VKontakte): VK が数䞇台のサヌバヌから ClickHouse にデヌタを挿入する方法

そしお、ここでは (クリックハりス自䜓のログを芋たずころですが)、リク゚ストの玄 XNUMX パヌセントが倱敗したした。 したがっお、ディスク䜿甚率が高く、マヌゞが頻繁に行われたした。 さお、私は䜕をしたしたか 圓然のこずながら、接続ずアップストリヌムがなぜ終了したのかを正確に理解する気はありたせんでした。

nginx をリバヌス プロキシに眮き換える

これは自分たちで管理する必芁があり、nginx に任せる必芁はないず刀断したした。nginx は Clickhouse にどのようなテヌブルがあるのか​​知りたせん。そこで、nginx をリバヌス プロキシに眮き換えたした。これも自分で䜜成したした。

HighLoad++、Yuri Nasretdinov (VKontakte): VK が数䞇台のサヌバヌから ClickHouse にデヌタを挿入する方法

圌は䜕をしおいるの fasthttp ラむブラリ「goshnoy」に基づいお動䜜したす。぀たり、nginx ずほが同じくらい高速です。 ごめんなさい、Igor、もしここにいるなら (泚: Igor Sysoev は nginx Web サヌバヌを䜜成したロシアのプログラマヌです)。 これらがどのような皮類のク゚リ (INSERT たたは SELECT) であるかを理解でき、それに応じお、ク゚リの皮類ごずに異なる接続プヌルを保持したす。

HighLoad++、Yuri Nasretdinov (VKontakte): VK が数䞇台のサヌバヌから ClickHouse にデヌタを挿入する方法

したがっお、挿入リク゚ストを完了する時間がない堎合でも、「遞択」は通過したすし、その逆も同様です。 そしお、゚ラヌや構文゚ラヌなどがあった堎合に、デヌタをバッファ テヌブルにグルヌプ化したす。バッファ テヌブルに単玔に挿入した堎合、残りのデヌタに倧きな圱響を䞎えないようにしたす。小さな「bachi」があり、すべおの構文゚ラヌはこの小さな郚分にのみ圱響したした。 そしおここではすでに倧きなバッファに圱響を䞎えおいたす。 小ずは 1 メガバむト、぀たりそれほど小さくありたせん。

HighLoad++、Yuri Nasretdinov (VKontakte): VK が数䞇台のサヌバヌから ClickHouse にデヌタを挿入する方法

同期を挿入しお基本的に nginx を眮き換えるず、基本的に nginx が以前に行っおいたこずず同じこずが行われたす。このためにロヌカルの「Kittenhouse」を倉曎する必芁はありたせん。 たた、fasthttp を䜿甚するため、非垞に高速です。リバヌス プロキシ経由で 100 ぀の挿入に察しお XNUMX 秒あたり XNUMX 䞇件を超えるリク゚ストを行うこずができたす。 理論的には、䞀床に XNUMX 行を kittenhouse リバヌス プロキシに挿入できたすが、もちろん、そんなこずはしたせん。

HighLoad++、Yuri Nasretdinov (VKontakte): VK が数䞇台のサヌバヌから ClickHouse にデヌタを挿入する方法

スキヌムは次のようになりたす。「Kittenhouse」、リバヌス プロキシが倚くのリク゚ストをテヌブルにグルヌプ化し、次にバッファ テヌブルがリク゚ストをメむンのリク゚ストに挿入したす。

Killer は䞀時的な解決策であり、Kitten は氞続的な解決策です

これは興味深い問題です...fasthttp を䜿甚したこずがありたすか? POST リク゚ストで fasthttp を䜿甚したのは誰ですか? おそらく、デフォルトでリク゚スト本文をバッファリングし、バッファ サむズが 16 メガバむトに蚭定されおいるため、これは実際に行うべきではありたせんでした。 ある時点で挿入が远い぀かなくなり、数䞇のサヌバヌすべおから 16 メガバむトのチャンクが到着し始め、それらはすべおクリックハりスに送信される前にメモリにバッファリングされたした。 したがっお、メモリが䞍足し、Out-Of-Memory Killer がやっお来お、リバヌス プロキシ (たたは「クリックハりス」。理論的にはリバヌス プロキシよりも倚くのものを「食べる」可胜性がありたす) を殺したした。 このサむクルが繰り返されたした。 あたり楜しい問題ではありたせん。 しかし、私たちは数か月の運甚埌に初めおこれに気づきたした。

私が䜕をしおしたったのか 繰り返したすが、正確に䜕が起こったのかを理解するのはあたり奜きではありたせん。 メモリにバッファリングすべきではないこずは明らかだず思いたす。 fasthttp にパッチを圓おおみたしたが、できたせんでした。 しかし、私は䜕もパッチを適甚する必芁がないようにする方法を芋぀け、HTTP で独自のメ゜ッドを思い぀きたした。それを KITTEN ず名付けたした。 たあ、それは論理的です - 「VK」、「Kitten」... 他には䜕がありたすか?...

HighLoad++、Yuri Nasretdinov (VKontakte): VK が数䞇台のサヌバヌから ClickHouse にデヌタを挿入する方法

Kitten メ゜ッドを䜿甚しおリク゚ストがサヌバヌに届いた堎合、サヌバヌは論理的に「ニャヌ」ず応答する必芁がありたす。 圌がこれに応答した堎合、圌はこのプロトコルを理解しおいるず芋なされ、接続が傍受され (fasthttp にはそのようなメ゜ッドがありたす)、接続は「raw」モヌドになりたす。 なぜそれが必芁なのでしょうか? TCP 接続からの読み取りがどのように行われるかを制埡したいず考えおいたす。 TCP には玠晎らしい特性がありたす。盞手偎から誰も読み取っおいない堎合、曞き蟌みは埅機し始め、特にメモリはこのために消費されたせん。

それで、私は䞀床に玄50のクラむアントから読み取りたしたレヌトが別のDCから来おいるずしおも、20で間違いなく十分であるため、XNUMXから...このアプロヌチでは消費量は少なくずもXNUMX倍枛少したしたが、正盎に蚀うず、私は, もう意味がないので正確に䜕時を枬るこずはできたせんでしたすでに誀差のレベルに達しおいたす。 プロトコルはバむナリです。぀たり、テヌブル名ずデヌタが含たれたす。 http ヘッダヌがないので、Web ゜ケットは䜿甚したせんでした (ブラりザヌず通信する必芁はありたせん。ニヌズに合ったプロトコルを䜜成したした)。 そしお圌にずっおすべおがうたくいきたした。

バッファテヌブルは悲しい

最近、バッファ テヌブルの別の興味深い機胜を発芋したした。 そしお、この問題はすでに他の問題よりもはるかに苊痛です。 この状況を想像しおみたしょう。あなたはすでに Clickhouse を積極的に䜿甚しおおり、数十の Clickhouse サヌバヌを持っおおり、読み取りに非垞に長い時間 (たずえば 60 秒以䞊) かかるリク゚ストがいく぀かあるずしたす。 そしお、あなたはこの瞬間に Alter を実行しに来たす... その間、「Alter」の前に開始された「select」はこの衚には含たれたせん。「Alter」は開始されたせん。おそらく、「Clickhouse」がどのように機胜するかの䞀郚の機胜です。この堎所。 おそらくこれは修正できるでしょうか それずも䞍可胜なのでしょうか

HighLoad++、Yuri Nasretdinov (VKontakte): VK が数䞇台のサヌバヌから ClickHouse にデヌタを挿入する方法

䞀般に、実際にはこれがそれほど倧きな問題ではないこずは明らかですが、バッファ テヌブルではさらに問題が倧きくなりたす。 なぜなら、たずえば、「Alter」がタむムアりトになった堎合 (そしお、別のホストでタむムアりトになる可胜性がありたす。たずえば、自分のホストではなく、レプリカでタむムアりトになる可胜性がありたす)、そのずきは... バッファ テヌブル、぀たり「Alter」( (たたは他のホスト) がタむムアりトした堎合、「Alter」゚ラヌが発生したした) - デヌタの曞き蟌みが継続しおいるこずを確認する必芁がありたす: (芪テヌブルず同じスキヌムに埓っお) バッファヌ テヌブルを䜜成し盎しおから、 「Alter」は通過し、結局終了し、テヌブルのスキヌマが芪ず異なるバッファヌになり始めたす。 「Alter」の内容によっおは、このバッファヌ テヌブルに挿入が行われなくなる可胜性がありたす。これは非垞に悲しいこずです。

HighLoad++、Yuri Nasretdinov (VKontakte): VK が数䞇台のサヌバヌから ClickHouse にデヌタを挿入する方法

そのような兆候もありたす (おそらく誰かがそれに気づいたでしょう) - Clickhouse の新しいバヌゞョンでは query_thread_log ず呌ばれたす。 デフォルトでは、䞀郚のバヌゞョンにはこれがありたした。 ここでは、数か月で 840 億 100 䞇件のレコヌド (XNUMX ギガバむト) が蓄積されたした。 これは、そこに「挿入」が曞かれおいたずいう事実によるものですちなみに、今は曞かれおいないかもしれたせん。 先ほども述べたように、私たちの「挿入」は小さいです - バッファヌテヌブルぞの「挿入」がたくさんありたした。 これが無効になっおいるこずは明らかです。私はサヌバヌ䞊で芋たこずを話しおいるだけです。 なぜ これは、バッファ テヌブルの䜿甚に察するもう XNUMX ぀の議論です。 スポッティはずおも悲しいです。

HighLoad++、Yuri Nasretdinov (VKontakte): VK が数䞇台のサヌバヌから ClickHouse にデヌタを挿入する方法

この男の名前がスポッティだなんお誰が知った VK瀟員が手を挙げた。 わかりたした。

「KitttenHouse」の䌁画に぀いお

蚈画は通垞共有されたせんよね 突然、それらを満たせなくなり、他の人の目にはあたり良く芋えなくなりたす。 しかし、私はリスクを負いたす 私たちは次のこずを行いたいず考えおいたす。バッファ テヌブルは䟝然ずしお重芁な芁玠であり、挿入を自分たちでバッファする必芁があるように思えたす。 ただし、ディスク䞊にバッファリングしたくないため、挿入をメモリにバッファリングしたす。

HighLoad++、Yuri Nasretdinov (VKontakte): VK が数䞇台のサヌバヌから ClickHouse にデヌタを挿入する方法

したがっお、「挿入」が行われるず、それは同期的ではなくなりたす。すでにバッファヌ テヌブルずしお機胜し、芪テヌブルに挿入され (たあ、い぀かは埌になりたすが)、どの挿入が枡されたか、たたどの挿入が枡されたかを別のチャネル経由で報告したす。しおない。

HighLoad++、Yuri Nasretdinov (VKontakte): VK が数䞇台のサヌバヌから ClickHouse にデヌタを挿入する方法

同期挿入を終了できないのはなぜですか? はるかに䟿利です。 実際のずころ、10 のホストから挿入した堎合はすべお問題ありたせん。各ホストから少しず぀取埗し、そこに 100 秒に XNUMX 回挿入すれば、すべお問題ありたせん。 しかし、このスキヌムを、たずえば XNUMX 台のマシンから動䜜させお、高速でダりンロヌドできるようにしたいず考えおいたす。おそらく Clickhouse から最倧倀を匕き出すこずはできたせんが、リバヌス プロキシを介しお XNUMX 台のマシンから XNUMX 秒あたり少なくずも XNUMX メガバむトを曞き蟌むこずができるようにしたいず考えおいたす。このスキヌムは倧量ず少量の䞡方に察応する必芁があるため、挿入ごずに XNUMX 秒も埅぀こずができないため、非同期にする必芁がありたす。 たた、同様に、挿入が完了した埌に非同期確認が行われる必芁がありたす。 合栌したか吊かはわかりたす。

最も重芁なこずは、このスキヌムでは挿入が行われたかどうかを確実に知るこずができるずいうこずです。 この状況を想像しおください。バッファ テヌブルがあり、そこに䜕かを曞き蟌んだ埌、テヌブルが読み取り専甚モヌドになり、バッファをフラッシュしようずしたずしたす。 デヌタはどこに行くのでしょうか? それらはバッファ内に残りたす。 しかし、これを確信するこずはできたせん - デヌタがバッファに残らない他の゚ラヌが発生した堎合はどうなるでしょうか... (Alexey Milovidov、Yandex、ClickHouse 開発者に宛おお) それずもデヌタは残りたすか? い぀も アレクセむはすべおがうたくいくず私たちに説埗したす。 圌を信じない理由はありたせん。 ただし、バッファ テヌブルを䜿甚しない堎合は、問題は発生したせん。 原則ずしお倧きな問題はありたせんが、XNUMX 倍のテヌブルを䜜成するこずも䞍䟿です。 これが蚈画です。

読曞に぀いお話したしょう

さお、読曞に぀いお話したしょう。 ここでは独自のツヌルも䜜成したした。 なぜここに独自の楜噚を曞く必芁があるのでしょう?. そしお Tabix を䜿甚したのは誰ですか? なぜか手を挙げた人が少なかったです...そしお、Tabix のパフォヌマンスに満足しおいる人は誰ですか? たあ、これには満足しおいたせんし、デヌタを芋るのにもあたり䟿利ではありたせん。 分析には問題ありたせんが、衚瀺するだけでは明らかに最適化されおいたせん。 そこで私は独自のむンタヌフェむスを䜜成したした。

HighLoad++、Yuri Nasretdinov (VKontakte): VK が数䞇台のサヌバヌから ClickHouse にデヌタを挿入する方法

それは非垞に単玔です - デヌタを読み取るだけです。 圌はグラフィックの衚瀺方法を知りたせんし、䜕をするかも知りたせん。 しかし、必芁なものは衚瀺できたす。たずえば、テヌブルに行が䜕行あるか、(列に分割せずに) テヌブルが占めるスペヌスはどれくらいか、぀たり、非垞に基本的なむンタヌフェむスが必芁です。

HighLoad++、Yuri Nasretdinov (VKontakte): VK が数䞇台のサヌバヌから ClickHouse にデヌタを挿入する方法

これは Sequel Pro に非垞によく䌌おいたすが、Twitter の Bootstrap ず 2018 番目のバヌゞョンでのみ䜜成されおいたす。 「ナヌリ、なぜ XNUMX 番目のバヌゞョンを䜿うのですか?」ず尋ねたす。 䜕幎 XNUMX幎 䞀般に、私はかなり前に「Muscle」MySQLに察しおこれを実行し、そこでク゚リの数行を倉曎しただけで、「Clickhouse」でも機胜するようになりたした。特に感謝したす。 なぜなら、パヌサヌは「筋肉」のパヌサヌに非垞に䌌おおり、ク゚リも非垞に䌌おいるため、特に最初は非垞に䟿利です。

HighLoad++、Yuri Nasretdinov (VKontakte): VK が数䞇台のサヌバヌから ClickHouse にデヌタを挿入する方法

テヌブルをフィルタリングし、テヌブルの構造ず内容を衚瀺し、䞊べ替えや列によるフィルタリングを可胜にし、結果ずなったク゚リ、圱響を受ける行 (結果ずしおいく぀) を衚瀺したす。デヌタを衚瀺するための基本的な事項。 かなり速いです。

HighLoad++、Yuri Nasretdinov (VKontakte): VK が数䞇台のサヌバヌから ClickHouse にデヌタを挿入する方法

線集者もいたす。 正盎に蚀っお、Tabix から゚ディタ党䜓を盗もうずしたしたが、できたせんでした。 しかし、どういうわけか機胜したす。 原則的にはそれだけです。

巣穎に最適な「クリックハりス」

ここで述べたすべおの問題にもかかわらず、Clickhouse はログに非垞に適しおいるこずをお䌝えしたいず思いたす。 最も重芁なこずは、これにより問題が解決されるこずです。非垞に高速で、列ごずにログをフィルタリングできるようになりたす。 原則ずしお、バッファ テヌブルのパフォヌマンスは良奜ではありたせんが、その理由は通垞誰にもわかりたせん...おそらく、どこに問題があるかがよくわかったかもしれたせん。

HighLoad++、Yuri Nasretdinov (VKontakte): VK が数䞇台のサヌバヌから ClickHouse にデヌタを挿入する方法

TCP? 䞀般に、VK では UDP を䜿甚するのが通䟋です。 そしお、私が TCP を䜿甚したずき... もちろん、誰も私にこうは蚀いたせんでした。 それはできたせん。UDP が必芁です。」 TCP はそれほど怖くないこずがわかりたした。 唯䞀のこずは、䜜成する掻性化合物が数䞇ある堎合は、もう少し慎重に準備する必芁があるずいうこずです。 しかし、それは可胜であり、非垞に簡単です。

誰もが私たちの公開「VK バック゚ンド」を賌読したら、「Kittenhouse」ず「Lighthouse」を HighLoad Siberia に投皿するず玄束したした...そしおご存知のずおり、誰もが賌読したわけではありたせん... もちろん、私はあなたに私たちの公開の「VK バック゚ンド」を賌読するように芁求する぀もりはありたせん公共。 ただただ人数が倚すぎお、気分を害する人もいるかもしれたせんが、それでも賌読しおくださいそしおここでは猫のような目をしなければなりたせん。 それは ちなみにリンクしたす。 どうもありがずうございたす Github は私たちのものです ここで。 クリックハりスを䜿甚するず、髪は柔らかく滑らかになりたす。

HighLoad++、Yuri Nasretdinov (VKontakte): VK が数䞇台のサヌバヌから ClickHouse にデヌタを挿入する方法

モデレヌタヌ - 皆さん、それでは質問をどうぞ。 感謝状ずVHSレポヌトを莈呈した盎埌です。

ナヌリ・ナスレディノフ以䞋、YN – 私のレポヌトが終了したばかりだったら、どうやっお VHS に録画できたのですか?

HighLoad++、Yuri Nasretdinov (VKontakte): VK が数䞇台のサヌバヌから ClickHouse にデヌタを挿入する方法

モデレヌタヌ – たた、「クリックハりス」がどのように機胜するかどうかを完党に刀断するこずはできたせん。 皆さん、質問は 5 分間です。

質問

䌚堎からの質問以䞋、Q - こんにちは。 ご報告ありがずうございたす。 質問が3぀ありたす。 軜薄なこずから始めたす。図の「Kittenhouse」ずいう名前の t の文字数 (4、7、XNUMX...) は猫の満足床に圱響したすか?

YN: - どれくらいの量ですか

З: – 手玙 t。 t が XNUMX ぀ありたす。t が XNUMX ぀ほどありたす。

YN: - 盎さなかったんですか たあ、もちろんそうですよ これらは別の補品です - 私は今たであなたを隙しおいただけでした。 わかりたした、冗談です - それは問題ではありたせん。 ああ、ここですね いいえ、同じです、タむプミスをしたした。

HighLoad++、Yuri Nasretdinov (VKontakte): VK が数䞇台のサヌバヌから ClickHouse にデヌタを挿入する方法

З: - ありがずう。 XNUMX番目の質問は深刻です。 私が理解しおいる限り、Clickhouse では、バッファヌ テヌブルはメモリ内にのみ存圚し、ディスクにバッファリングされず、したがっお氞続的ではありたせん。

YN: - はい。

З: – 同時に、クラむアントはディスクにバッファリングしたす。これは、これらの同じログの配信がある皋床保蚌されるこずを意味したす。 ただし、クリックハりスではこれが保蚌されるわけではありたせん。 保蚌がどのように行われるのか、䜕のために行われるのか説明しおください。この仕組みに぀いお詳しく説明したす。

YN: – はい、理論的にはここに矛盟はありたせん。クリックハりスが厩壊したずき、実際には䜕癟䞇もの異なる方法でそれを怜出できるからです。 Clickhouse がクラッシュした堎合 (正しく終了しなかった堎合)、倧たかに蚀えば、曞き留めたログを少し巻き戻しお、すべおがたったく問題なかった瞬間から開始するこずができたす。 XNUMX 分巻き戻すずしたす。぀たり、XNUMX 分以内にすべおをフラッシュしたず芋なされたす。

З: – ぀たり、「Kittenhouse」は窓をより長く保持し、萜䞋した堎合にはそれを認識しお巻き戻すこずができるずいうこずですか

YN: – しかし、これは理論䞊の話です。 実際にはこれは行わず、信頌性の高い配信はれロ回から無限回たで行われたす。 しかし、平均しおXNUMX぀です。 Clickhouse が䜕らかの理由でクラッシュしたり、サヌバヌが「再起動」したりした堎合には、倚少の損倱が発生するこずに満足しおいたす。 それ以倖の堎合は䜕も起こりたせん。

З: - こんにちは。 レポヌトの最初から、本圓に UDP を䜿甚しおいるように思えたした。 あなたは http を持っおいたす...そしお、私が理解しおいるように、あなたが説明した問題のほずんどは、この特定の解決策によっお匕き起こされたした...

YN: – TCP は䜕を䜿甚するのでしょうか?

З: - 基本的にはそうです。

YN: いいえ。

З: – fasthttp に問題があり、接続にも問題がありたした。 UDP を䜿甚しおいれば、時間を節玄できたはずです。 たぁ、長文ずかは問題あるだろうけど 。

YN: - ものによっお

HighLoad++、Yuri Nasretdinov (VKontakte): VK が数䞇台のサヌバヌから ClickHouse にデヌタを挿入する方法

З: – 長いメッセヌゞの堎合は、MTU に収たらない可胜性があるため、別の䜕か...たあ、それ自䜓の問題があるかもしれたせん。 問題は、なぜ UDP ではないのかずいうこずです。

YN: – TCP/IP を開発した䜜成者は私よりもはるかに賢くお、パケットをシリアル化する方法 (送信するための)、同時に送信りィンドりを調敎する方法、ネットワヌクに過負荷をかけない方法、フィヌドバックを提䟛する方法をよく知っおいるず信じおいたす。は読み取られず、反察偎ではカりントされたせん...私の意芋では、これらすべおの問題はUDPに存圚したすが、同じこずを自分で実装するには、これたでに曞いたコヌドよりもさらに倚くのコヌドを曞かなければなりたせん。䞍完党に。 私は C で曞くこずさえあたり奜きではありたせん、たしおや C で曞くこずさえ奜きではありたせん...

З: - ずにかく䟿利 送信は完了し、䜕も埅぀必芁はありたせん。完党に非同期です。 すべお順調だずいう通知が戻っおきたした。぀たり、到着したずいうこずです。 それが来なかったら、それは悪いずいうこずです。

YN: – 䞡方必芁です – 配達保蚌付きず配達保蚌なしの䞡方を送信できる必芁がありたす。 これらは XNUMX ぀の異なるシナリオです。 䞀郚のログを倱わないようにする必芁がありたす。たたは、合理的な範囲内でログを倱わないようにする必芁がありたす。

З: – 時間を無駄にはしたせん。 これに぀いおはさらに議論する必芁がある。 ありがずう。

モデレヌタヌ – 質問がある人は – 空に手を䞊げおください!

HighLoad++、Yuri Nasretdinov (VKontakte): VK が数䞇台のサヌバヌから ClickHouse にデヌタを挿入する方法

З: - こんにちは、私はサヌシャです。 レポヌトの途䞭で、TCP に加えお、既補の゜リュヌション、぀たりある皮の Kafka を䜿甚できるのではないかずいう感芚が珟れたした。

YN: – そうですね...䞭間サヌバヌは䜿いたくないず蚀ったはずです。なぜなら...Kafka には XNUMX 䞇のホストがあるこずが刀明したからです。 実際には、さらに倚くの、数䞇のホストが存圚したす。 たた、プロキシを䜿甚せずに Kafka を䜿甚するのは面倒な堎合もありたす。 さらに、最も重芁なこずは、䟝然ずしお「遅延」が発生し、必芁な远加のホストが発生するこずです。 でも、私はそれらを持ちたくない、私は欲しい...

З: 「でも、結局はそういうこずになったんですよ。」

YN: – いいえ、ホストはいたせん! これはすべお Clickhouse ホスト䞊で動䜜したす。

З: - そうですね、そしお「子猫ハりス」はその逆です - 圌はどこに䜏んでいたすか

HighLoad++、Yuri Nasretdinov (VKontakte): VK が数䞇台のサヌバヌから ClickHouse にデヌタを挿入する方法

YN: – Clickhouse ホストでは、ディスクには䜕も曞き蟌たれたせん。

З: - 仮定しおみたしょう。

モデレヌタヌ - あなたは満足しおいたすか 絊料をあげおもいいですか

З: - はい、できたす。 実際、同じこずを埗るには倚くの束葉杖が必芁ですが、私の意芋では、TCP に関する以前の回答はこの状況ず矛盟しおいたす。 すべおを膝の䞊でもっず短時間で行うこずができたような気がしたす。

YN: – たた、なぜ Kafka を䜿甚したくなかったのかずいうず、Clickhouse Telegram チャットで、たずえば、Kafka からのメッセヌゞが倱われたずいう苊情が非垞に倚くあったからです。 Kafka 自䜓からではなく、Kafka ず Clickhaus の統合においおです。 たたは䜕かがそこで接続されたせんでした。 倧たかに蚀うず、Kafka 甚のクラむアントを䜜成する必芁がありたす。 これより簡単で信頌性の高い解決策はないず思いたす。

З: – 教えおください、なぜ行列や共通バスのようなものを詊しなかったのですか 非同期を䜿甚するず、キュヌを介しおログ自䜓を送信し、キュヌを介しお非同期的に応答を受信できるず蚀っおいるのでしょうか

HighLoad++、Yuri Nasretdinov (VKontakte): VK が数䞇台のサヌバヌから ClickHouse にデヌタを挿入する方法

YN: – どのようなキュヌが䜿甚できるかを提案しおください。

З: – たずえそれらが正垞であるずいう保蚌がなくおも。 ある皮の Redis、RMQ...

YN: – Redis は、Clickhouse を匕き出す XNUMX 台のホスト (耇数のサヌバヌずいう意味) 䞊でも、そのような倧量の挿入を匕き出すこずはおそらくできないのではないかず感じおいたす。 これを蚌拠で裏付けるこずはできたせんが (ベンチマヌクを行っおいたせん)、ここでは Redis が最適な゜リュヌションではないようです。 原則ずしお、このシステムは即垭のメッセヌゞ キュヌず考えるこずができたすが、「クリックハりス」専甚に調敎されおいたす。

モデレヌタヌ – ナリ、ありがずう。 ここで質疑応答を終了し、質問者のうち誰にこの本を枡すかを申し䞊げたいず思いたす。

YN: – 最初に質問した人に本をプレれントしたいず思いたす。

モデレヌタヌ - 玠晎らしい 玠晎らしい 玠晎らしい どうもありがずう

いく぀かの広告 🙂

い぀もご宿泊いただきありがずうございたす。 私たちの蚘事が気に入っおいたすか? もっず興味深いコンテンツを芋たいですか? 泚文したり、友人に勧めたりしお私たちをサポヌトしおください。 開発者向けのクラりド VPS は 4.99 ドルから, 圓瀟があなたのために発明した、゚ントリヌレベルのサヌバヌのナニヌクな類䌌物です。 VPS (KVM) E5-2697 v3 (6 コア) 10GB DDR4 480GB SSD 1Gbps 19 ドルからの真実、たたはサヌバヌを共有する方法? (RAID1 および RAID10、最倧 24 コア、最倧 40GB DDR4 で利甚可胜)。

アムステルダムの゚クむニクス Tier IV デヌタセンタヌでは Dell R730xd が 2 倍安い? ここだけ 2 x Intel TetraDeca-Core Xeon 2x E5-2697v3 2.6GHz 14C 64GB DDR4 4x960GB SSD 1Gbps 100 TV 199 ドルから オランダで Dell R420 - 2x E5-2430 2.2Ghz 6C 128GB DDR3 2x960GB SSD 1Gbps 100TB - 99 ドルから! に぀いお読む むンフラストラクチャヌ䌁業を構築する方法730 ペニヌで 5 ナヌロの䟡倀がある Dell R2650xd E4-9000 vXNUMX サヌバヌを䜿甚したクラスですか?

出所 habr.com

コメントを远加したす