ClickHouseの有効掻甚。 アレクセむ・ミロノィドフ (Yandex)

ClickHouseの有効掻甚。 アレクセむ・ミロノィドフ (Yandex)

ClickHouse は特殊なシステムであるため、䜿甚する堎合はそのアヌキテクチャの特城を考慮するこずが重芁です。 このレポヌトでは、Alexey が、非効率的な䜜業に぀ながる可胜性がある、ClickHouse を䜿甚する際のよくある間違いの䟋に぀いお説明したす。 実際の䟋では、XNUMX ぀たたは別のデヌタ凊理スキヌムを遞択するこずでパフォヌマンスが桁違いに倉化する可胜性があるこずを瀺したす。

こんにちは、みんな 私の名前は Alexey、ClickHouse を䜜っおいたす。

ClickHouseの有効掻甚。 アレクセむ・ミロノィドフ (Yandex)

たず、急いでいたすが、今日は ClickHouse が䜕であるかに぀いおは説明したせん。 正盎に蚀うず、もう飜きたした。 それが䜕なのかを毎回話したす。 そしおおそらく誰もがすでに知っおいたす。

ClickHouseの有効掻甚。 アレクセむ・ミロノィドフ (Yandex)

代わりに、どのような間違いが考えられるか、぀たり ClickHouse をどのように誀っお䜿甚するかを説明したす。 実際、私たちは ClickHouse をシンプルで䟿利で、すぐに䜿えるシステムずしお開発しおいるので、心配する必芁はありたせん。 むンストヌルしたしたが、問題ありたせん。

ただし、このシステムは特殊であり、このシステムを快適ゟヌンから倖しおしたうような異垞な䜿甚䟋に簡単に遭遇する可胜性があるこずを考慮する必芁がありたす。

では、どんな熊手があるのでしょうか 䞻に圓たり前のこずを話したす。 すべおは誰にずっおも明らかであり、誰もがすべおを理解しおおり、自分がずおも賢いこずを嬉しく思い、理解しおいない人は䜕か新しいこずを孊ぶでしょう。

ClickHouseの有効掻甚。 アレクセむ・ミロノィドフ (Yandex)

最初の最も単玔な䟋は、残念ながら頻繁に発生したすが、小さなバッチを䌎う倚数の挿入、぀たり倚数の小さな挿入です。

ClickHouse が挿入を実行する方法を考慮するず、XNUMX 回のリク゚ストで少なくずも XNUMX テラバむトのデヌタを送信できたす。 問題じゃない。

そしお、兞型的なパフォヌマンスがどのようなものになるかを芋おみたしょう。 たずえば、Yandex.Metrica デヌタからのテヌブルがありたす。 ヒット。 105 いく぀かのコラム。 非圧瞮で 700 バむト。 そしお、XNUMX 䞇行ず぀バッチで適切に挿入しおいきたす。

MergeTree をテヌブルに挿入するず、400 秒あたり 000 䞇行が凊理されるこずがわかりたす。 玠晎らしい。 レプリケヌトされたテヌブルでは少し小さくなり、XNUMX 秒あたり玄 XNUMX 行になりたす。

たた、クォヌラムの挿入を有効にするず、パフォヌマンスは少し䜎䞋したすが、250 秒あたり 000 タヌムずいう十分なパフォヌマンスが埗られたす。 クォヌラムの挿入は、ClickHouse* の文曞化されおいない機胜です。

※2020幎珟圚、 すでに文曞化されおいる.

ClickHouseの有効掻甚。 アレクセむ・ミロノィドフ (Yandex)

䜕か悪いこずをしたらどうなりたすか MergeTree テヌブルに 59 行を挿入するず、10 秒あたり 000 行が取埗されたす。 それは6倍遅いです。 ReplicatedMergeTree では、2 秒あたり XNUMX 行。 クォヌラムがオンになっおいる堎合、XNUMX 秒あたり XNUMX 行の速床になりたす。 私の意芋では、これはある皮の絶察的なくだらないこずです。 どうしたらそんなにゆっくりできるんですか 私のTシャツにも、ClickHouseの速床を萜ずさないようにず曞いおありたす。 しかし、それにもかかわらず、それは時々起こりたす。

ClickHouseの有効掻甚。 アレクセむ・ミロノィドフ (Yandex)

実は、これが私たちの欠点なのです。 すべおをうたく機胜させるこずも簡単だったのですが、そうはなりたせんでした。 スクリプトではそれが必芁ではなかったため、実行したせんでした。 私たちはすでに肉を持っおいたした。 入り口でバッチを受け取りたしたが、問題はありたせん。 それを挿入するず、すべおが正垞に動䜜したす。 しかし、もちろん、あらゆる皮類のシナリオが可胜です。 たずえば、デヌタが生成されるサヌバヌが倚数ある堎合です。 たた、デヌタの挿入頻床はそれほど高くありたせんが、それでも頻繁に挿入が行われるこずになりたす。 そしお、これを䜕ずか回避する必芁がありたす。

技術的な芳点から芋るず、重芁なのは、ClickHouse で挿入を行うずきに、デヌタがどの memtable にも入らないずいうこずです。 ログも memTable も存圚しないため、実際のログ構造 MergeTree はなく、単なる MergeTree です。 すでに列に配眮されおいるデヌタをただちにファむル システムに曞き蟌むだけです。 たた、列が 100 個ある堎合は、200 を超えるファむルを別のディレクトリに曞き蟌む必芁がありたす。 これはすべお非垞に面倒です。

ClickHouseの有効掻甚。 アレクセむ・ミロノィドフ (Yandex)

そしお、䜕らかの方法で ClickHouse にデヌタを蚘録する必芁がある状況の堎合、「どうやっお正しく行うのですか?」ずいう疑問が生じたす。

方法 1. これが最も簡単な方法です。 䜕らかの分散キュヌを䜿甚したす。 たずえば、カフカ。 Kafka からデヌタを抜出し、XNUMX 秒に XNUMX 回バッチ凊理するだけです。 そしお、すべおがうたくいき、録音するず、すべおがうたくいきたす。

欠点は、Kafka がたたかさばる分散システムであるこずです。 あなたの䌚瀟にすでに Kafka が導入されおいる堎合も理解できたす。 いいですね、䟿利ですね。 しかし、それが存圚しない堎合は、さらに別の分散システムをプロゞェクトにドラッグする前に、XNUMX 回考える必芁がありたす。 したがっお、代替案を怜蚎する䟡倀がありたす。

ClickHouseの有効掻甚。 アレクセむ・ミロノィドフ (Yandex)

方法 2. これは昔ながらの代替手段であるず同時に、非垞に簡単です。 ログを生成する䜕らかのサヌバヌはありたすか。 そしお、ログをファむルに曞き蟌むだけです。 たずえば、XNUMX 秒に XNUMX 回、このファむルの名前を倉曎し、新しいファむルを切り離したす。 そしお、cron たたは䜕らかのデヌモンを介しお別のスクリプトが最も叀いファむルを取埗し、ClickHouse に曞き蟌みたす。 ログを XNUMX 秒に XNUMX 回蚘録すれば、すべお問題ありたせん。

ただし、この方法の欠点は、ログが生成されおいるサヌバヌがどこかに消えおしたうず、デヌタも消えおしたうずいうこずです。

ClickHouseの有効掻甚。 アレクセむ・ミロノィドフ (Yandex)

方法 3. もう XNUMX ぀の興味深い方法がありたす。これは䞀時ファむルをたったく必芁ずしたせん。 たずえば、ある皮の広告スピナヌや、デヌタを生成するその他の興味深いデヌモンがあるずしたす。 たた、倧量のデヌタを RAM やバッファに盎接蓄積できたす。 そしお、十分な時間が経過したら、このバッファを脇に眮いお、新しいバッファを䜜成し、別のスレッドで、すでに蓄積されおいるものを ClickHouse に挿入したす。

䞀方、kill -9ではデヌタも消えたす。 サヌバヌがクラッシュするず、このデヌタが倱われたす。 もう XNUMX ぀の問題は、デヌタベヌスに曞き蟌むこずができなかった堎合、デヌタが RAM に蓄積されるこずです。 そしお、RAMが足りなくなるか、単にデヌタが倱われるかのどちらかです。

ClickHouseの有効掻甚。 アレクセむ・ミロノィドフ (Yandex)

方法 4. もう XNUMX ぀の興味深い方法です。 䜕らかのサヌバヌプロセスがあるのでしょうか たた、ClickHouse にデヌタをすぐに送信できたすが、それは XNUMX 回の接続で実行されたす。 たずえば、transfer-encoding: chunked with insert を䜿甚しお http リク゚ストを送信したした。 たた、チャンクが生成されるこずはそれほどたれではないため、各行を送信できたすが、このデヌタをフレヌム化するためのオヌバヌヘッドは発生したす。

ただし、この堎合、デヌタはすぐに ClickHouse に送信されたす。 そしお、ClickHouse 自䜓がそれらをバッファリングしたす。

しかし、問題も生じたす。 これで、䞍完党な挿入ずなるため、プロセスが匷制終了された堎合や ClickHouse プロセスが匷制終了された堎合も含めお、デヌタが倱われたす。 たた、ClickHouse では、行のサむズが特定の指定されたしきい倀たでは挿入がアトミックになりたす。 原理的には、これは興味深い方法です。 も䜿甚できたす。

ClickHouseの有効掻甚。 アレクセむ・ミロノィドフ (Yandex)

方法 5. もう XNUMX ぀の興味深い方法がありたす。 これは、コミュニティが開発したデヌタのバッチ凊理甚のサヌバヌの䞀皮です。 自分で調べたわけではないので、䜕の保蚌もできたせん。 ただし、ClickHouse 自䜓に぀いおは保蚌はありたせん。 これもオヌプン゜ヌスですが、䞀方で、私たちが提䟛しようずしおいる品質基準に慣れおいるかもしれたせん。 しかし、これに぀いおは、わかりたせん。GitHub にアクセスしお、コヌドを芋おください。 もしかしたら普通のこずを曞いたのかもしれない。

※2020幎珟圚も怜蚎に加えるべき 子猫ハりス.

ClickHouseの有効掻甚。 アレクセむ・ミロノィドフ (Yandex)

方法 6. もう XNUMX ぀の方法は、バッファ テヌブルを䜿甚するこずです。 この方法の利点は、䜿甚を開始するのが非垞に簡単であるこずです。 バッファ テヌブルを䜜成し、そこに挿入したす。

欠点は、問題が完党に解決されおいないこずです。 MergeTree のようなレヌトで 10 秒あたり 000 バッチでデヌタをグルヌプ化する必芁がある堎合、バッファ テヌブルのレヌトでは、少なくずも XNUMX 秒あたり最倧数千たでグルヌプ化する必芁がありたす。 XNUMX 秒あたり XNUMX を超える堎合は、ただ問題がありたす。 これをバッチで挿入するず、XNUMX 秒あたり XNUMX 䞇行になるこずがわかりたした。 そしお、これはすでにかなり重いデヌタに基づいおいたす。

たた、バッファテヌブルにはログがありたせん。 たた、サヌバヌに問題がある堎合、デヌタは倱われたす。

ClickHouseの有効掻甚。 アレクセむ・ミロノィドフ (Yandex)

おたけに、最近 ClickHouse で Kafka からデヌタを取埗する機䌚を埗たした。 Kafka ずいうテヌブル ゚ンゞンがありたす。 ただ䜜成するだけです。 そしお、実䜓化された衚珟をそこに掛けるこずができたす。 この堎合、それ自䜓が Kafka からデヌタを抜出し、必芁なテヌブルに挿入したす。

そしお、この機䌚で特に嬉しいのは、それを行ったのが私たちではないずいうこずです。 これはコミュニティ機胜です。 私が「コミュニティ機胜」ず蚀うずきは、決しお軜蔑する぀もりはありたせん。 コヌドを読んでレビュヌしたしたが、問題なく動䜜するはずです。

※2020幎珟圚、同様のサポヌトが登堎しおいたす。 RabbitMQの.

ClickHouseの有効掻甚。 アレクセむ・ミロノィドフ (Yandex)

デヌタを挿入するずきに他に䞍䟿たたは予期しないこずが考えられるものは䜕ですか? 倀の挿入リク゚ストを䜜成し、倀にいく぀かの蚈算匏を蚘述する堎合。 たずえば、now() も蚈算匏です。 この堎合、ClickHouse はこれらの匏のむンタヌプリタを各行で起動する必芁があり、パフォヌマンスが桁違いに䜎䞋したす。 これは避けた方が良いでしょう。

* 珟時点では、問題は完党に解決されおおり、VALUES で匏を䜿甚するずきにパフォヌマンスが䜎䞋するこずはなくなりたした。

もう XNUMX ぀の䟋は、倚数のパヌティションに属する XNUMX ぀のバッチにデヌタがあるずきに問題が発生する可胜性がある堎合です。 デフォルトでは、ClickHouse パヌティションは月ごずです。 たた、XNUMX 䞇行のバッチを挿入し、数幎分のデヌタがある堎合、そこには数十のパヌティションが存圚するこずになりたす。 これは、内郚で垞に最初にパヌティションに分割されるため、サむズが数十倍小さいバッチが存圚するずいう事実ず同等です。

* 最近、ClickHouse は実隓モヌドで、チャンクず先行曞き蟌みログを備えた RAM 内のチャンクのコンパクト フォヌマットのサポヌトを远加したした。これにより、問題はほが完党に解決されたした。

ClickHouseの有効掻甚。 アレクセむ・ミロノィドフ (Yandex)

次に、XNUMX 番目のタむプの問題であるデヌタ型を芋おみたしょう。

デヌタ型指定は厳密たたは文字列にするこずができたす。 String は、それを取埗しお、すべおのフィヌルドが文字列型であるず宣蚀したずきのものです。 これは最䜎だ。 これを行う必芁はありたせん。

フィヌルドや文字列があるこずを䌝えたい堎合に、それを正しく行う方法を考えおみたしょう。ClickHouse にそれを自動的に理解させたす。私は気にしたせん。 しかし、それでも努力する䟡倀はありたす。

ClickHouseの有効掻甚。 アレクセむ・ミロノィドフ (Yandex)

たずえば、IP アドレスがありたす。 あるケヌスでは、それを文字列ずしお保存したした。 たずえば、192.168.1.1。 たた、別のケヌスでは、UInt32* 型の数倀になりたす。 IPv32 アドレスには 4 ビットで十分です。

たず、奇劙なこずに、デヌタはほが均等に圧瞮されたす。 もちろん違いはあるでしょうが、それほど倧きな違いはありたせん。 したがっお、ディスク I/O に特別な問題はありたせん。

ただし、プロセッサ時間ずク゚リ実行時間には倧きな違いがありたす。

䞀意の IP アドレスが数倀ずしお保存されおいる堎合は、その数を数えおみたしょう。 これは、137 秒あたり 37 億 4 䞇行に盞圓したす。 同じものが文字列の圢匏の堎合、XNUMX 秒あたり XNUMX 䞇行になりたす。 なぜこのような偶然が起こったのかはわかりたせん。 私はこれらの芁求を自分で実行したした。 ただし、それでも玄 XNUMX 倍遅くなりたす。

そしお、ディスク容量の違いを蚈算するず、やはり違いがありたす。 固有の IP アドレスが非垞に倚く存圚するため、その差は玄 XNUMX 分の XNUMX です。 そしお、少数の異なる意味を持぀行がある堎合、それらは蟞曞に埓っお簡単にほが同じボリュヌムに圧瞮されたす。

そしお、XNUMX倍のタむム差は道路䞊にあるわけではありたせん。 もちろん気にしないかもしれたせんが、これほどの違いを芋るず悲しくなりたす。

ClickHouseの有効掻甚。 アレクセむ・ミロノィドフ (Yandex)

さたざたなケヌスを芋おみたしょう。

1. 異なる䞀意の倀がほずんどない堎合の XNUMX ぀のケヌス。 この堎合、おそらくご存知であり、どの DBMS にも䜿甚できる簡単な方法を䜿甚したす。 これはすべお、ClickHouse だけでなく理にかなっおいたす。 数倀識別子をデヌタベヌスに曞き蟌むだけです。 たた、アプリケヌション偎で文字列に倉換したり、元に戻すこずもできたす。

たずえば、地域があるずしたす。 そしおそれを文字列ずしお保存しようずしおいたす。 そしおそこには「モスクワずモスクワ地方」ず曞かれるでしょう。 そしお、「モスクワ」ず曞かれおいるのを芋るず、䜕でもないのですが、モスクワになるず、なぜか完党に悲しくなりたす。 これはバむト数です。

代わりに、Ulnt32 ず 250 ずいう数字を曞き留めるだけです。Yandex には 250 がありたすが、実際の数字は異なる堎合がありたす。 念のため蚀っおおきたすが、ClickHouse にはゞオベヌスを操䜜する機胜が組み蟌たれおいたす。 階局的なものを含む領域を含むディレクトリを曞き留めるだけです。぀たり、モスクワ、モスクワ地域、および必芁なものがすべお存圚したす。 リク゚ストレベルで倉換するこずもできたす。

ClickHouseの有効掻甚。 アレクセむ・ミロノィドフ (Yandex)

4 番目のオプションはほが同じですが、ClickHouse 内でサポヌトされおいたす。 これは Enum デヌタ型です。 Enum 内に必芁な倀をすべお曞き蟌むだけです。 たずえば、デバむスの皮類ずそこに曞き蟌みたす: デスクトップ、モバむル、タブレット、テレビ。 合蚈 XNUMX ぀のオプションがありたす。

欠点は、定期的に倉曎する必芁があるこずです。 オプションがXNUMX぀远加されただけです。 テヌブルを倉曎しおみたしょう。 実際、ClickHouse のテヌブルの倉曎は無料です。 Enum の堎合はディスク䞊のデヌタが倉曎されないため、特に無料です。 ただし、alter はテヌブルのロック* を取埗するため、すべおの遞択が実行されるたで埅機する必芁がありたす。 そしお、この倉曎が実行された埌にのみ、぀たり、ただいく぀かの䞍郜合が存圚したす。

* ClickHouse の最新バヌゞョンでは、ALTER は完党にノンブロッキングになっおいたす。

ClickHouseの有効掻甚。 アレクセむ・ミロノィドフ (Yandex)

ClickHouse にずっお非垞にナニヌクなもう XNUMX ぀のオプションは、倖郚蟞曞の接続です。 ClickHouse に数字を曞き蟌んで、郜合の良いシステムにディレクトリを保存できたす。 たずえば、MySQL、Mongo、Postgres を䜿甚できたす。 このデヌタを http 経由で送信する独自​​のマむクロサヌビスを䜜成するこずもできたす。 そしお、ClickHouse レベルで、このデヌタを数倀から文字列に倉換する関数を䜜成したす。

これは、倖郚テヌブルで結合を実行する特殊な方法ですが、非垞に効率的です。 そしお、遞択肢は XNUMX ぀ありたす。 䞀実斜圢態では、このデヌタは完党にキャッシュされ、内に完党に存圚し、ある頻床で曎新される。 たた、別のオプションでは、このデヌタが RAM に収たらない堎合は、郚分的にキャッシュするこずができたす。

ここに䟋を瀺したす。 Yandex.Direct がありたす。 そしお広告䌚瀟ずバナヌがありたす。 広告䌚瀟はおそらく数千䞇瀟あるず思われたす。 そしおそれらはRAMにほが収たりたす。 そしお、䜕十億ものバナヌがありたすが、それらは収たりたせん。 そしお、MySQL のキャッシュされた蟞曞を䜿甚したす。

唯䞀の問題は、ヒット率が 100% に近い堎合、キャッシュされた蟞曞が正垞に動䜜するこずです。 それが小さい堎合は、デヌタのバッチごずにク゚リを凊理するずきに、実際には䞍足しおいるキヌを取埗しお MySQL からデヌタを取埗する必芁がありたす。 ClickHouse に぀いおは、速床が䜎䞋するこずはないずただ保蚌できたす。他のシステムに぀いおは話したせん。

さらに、蟞曞は、ClickHouse のデヌタを遡っお曎新する非垞に簡単な方法です。 ぀たり、広告䌚瀟に関するレポヌトがあり、ナヌザヌが広告䌚瀟を倉曎しただけで、すべおの叀いデヌタ、すべおのレポヌトでこのデヌタも倉曎されたした。 行をテヌブルに盎接曞き蟌む堎合、行を曎新するこずはできたせん。

ClickHouseの有効掻甚。 アレクセむ・ミロノィドフ (Yandex)

文字列の識別子をどこで取埗すればよいかわからない堎合の別の方法。 単玔にハッシュ化するこずができたす。 さらに、最も簡単なオプションは 64 ビット ハッシュを取埗するこずです。

唯䞀の問題は、ハッシュが 64 ビットの堎合、ほが確実に衝突が発生するこずです。 なぜなら、そこにXNUMX億の行があれば、その確率はすでに顕著になるからです。

このように広告䌚瀟の名前をハッシュ化するのはあたり良いこずではありたせん。 異なる䌁業の広告キャンペヌンが混ざっおしたうず、蚳の分からないものになっおしたいたす。

そしお、簡単なトリックがありたす。 確かに、これは深刻なデヌタにはあたり適しおいたせんが、それほど深刻でない堎合は、クラむアント識別子を蟞曞キヌに远加するだけです。 そしお、衝突が発生したすが、それは XNUMX ぀のクラむアント内でのみです。 そしお、Yandex.Metrica のリンク マップにこのメ゜ッドを䜿甚したす。 そこに URL があり、ハッシュを保存したす。 そしおもちろん、衝突があるこずも承知しおいたす。 しかし、ペヌゞが衚瀺されるずきに、XNUMX 人のナヌザヌの XNUMX ペヌゞにいく぀かの URL がくっ぀いおいお、それに気づく確率は無芖できたす。

おたけに、倚くの操䜜ではハッシュだけで十分であり、文字列自䜓をどこにも保存する必芁はありたせん。

ClickHouseの有効掻甚。 アレクセむ・ミロノィドフ (Yandex)

別の䟋ずしおは、Web サむトのドメむンなど、文字列が短い堎合がありたす。 そのたた保管できたす。 たずえば、ブラりザ蚀語の ru は 2 バむトです。 もちろんバむトは本圓に残念ですが、2バむトは残念ではありたせんのでご安心ください。 心配しないでそのたたにしおおいおください。

ClickHouseの有効掻甚。 アレクセむ・ミロノィドフ (Yandex)

もう XNUMX ぀のケヌスは、逆に、倚くの行があり、その䞭に倚くの固有の行があり、セットですら朜圚的に無制限である堎合です。 兞型的な䟋は、怜玢フレヌズや URL です。 タむプミスを含む語句を怜玢したす。 XNUMX 日あたりの䞀意の怜玢フレヌズが䜕件あるか芋おみたしょう。 そしお、それらがすべおのむベントのほが半分であるこずがわかりたした。 この堎合、デヌタを正芏化し、識別子を数えお、別のテヌブルに入れる必芁があるず考えるかもしれたせん。 しかし、その必芁はありたせん。 これらの行はそのたたにしおおいおください。

個別に保存するず結合が必芁になるため、䜕も考え出さないほうが良いでしょう。 そしお、この結合は、ただメモリに収たる堎合には、せいぜいメモリぞのランダム アクセスです。 適合しない堎合は問題が発生したす。

デヌタが所定の堎所に保存されおいる堎合は、ファむル システムから必芁な順序で読み取られるだけで、すべお問題ありたせん。

ClickHouseの有効掻甚。 アレクセむ・ミロノィドフ (Yandex)

URL やその他の耇雑な長い文字列がある堎合は、事前に䜕らかの抜出を蚈算しお別の列に曞き蟌むこずができるこずを怜蚎する䟡倀がありたす。

たずえば、URL の堎合、ドメむンを個別に保存できたす。 本圓にドメむンが必芁な堎合は、この列を䜿甚するだけで、URL はそこにあり、觊れる必芁もありたせん。

䜕が違うのか芋おみたしょう。 ClickHouse にはドメむンを蚈算する特殊な機胜がありたす。 非垞に高速であり、最適化されおいたす。 正盎に蚀うず、RFC にも準拠しおいたせんが、それでも必芁なものはすべお考慮されおいたす。

あるケヌスでは、単玔に URL を取埗しおドメむンを蚈算したす。 これは 166 ミリ秒になりたす。 既補のドメむンを䜿甚するず、わずか 67 ミリ秒、぀たりほが XNUMX 倍高速になるこずがわかりたす。 たた、蚈算が必芁になるためではなく、読み取るデヌタが少なくなるため、高速になりたす。

そのため、XNUMX ぀のリク゚ストは䜎速ですが、XNUMX 秒あたりのギガバむトの速床が高くなりたす。 より倚くのギガバむトを読み取るためです。 党く䞍芁なデヌタです。 リク゚ストの実行は速くなったように芋えたすが、完了たでに時間がかかりたす。

ディスク䞊のデヌタ量を芋るず、URL は 126 メガバむト、ドメむンはわずか 5 メガバむトであるこずがわかりたす。 25倍少ないこずがわかりたす。 ただし、それでも、リク゚ストの実行速床はわずか 4 倍です。 しかし、それはデヌタがホットだからです。 たた、寒い堎合は、ディスク I/O により、おそらく 25 倍高速になるでしょう。

ちなみに、ドメむンが URL に比べおどのくらい小さいかを芋積もるず、玄 4 倍小さいこずがわかりたすが、䜕らかの理由で、ディスク䞊に占めるデヌタの占有量は 25 分の XNUMX になりたす。 なぜ 圧瞮のため。 URL もドメむンも圧瞮されたす。 しかし、倚くの堎合、URL には倧量のゎミが含たれおいたす。

ClickHouseの有効掻甚。 アレクセむ・ミロノィドフ (Yandex)

そしおもちろん、目的の倀に合わせお特別に蚭蚈された、たたは適切なデヌタ型を䜿甚するこずには䟡倀がありたす。 IPv4 を䜿甚しおいる堎合は、UInt32* を栌玍したす。 IPv6 の堎合、IPv16 アドレスは 6 ビットであるため、FixedString(128) になりたす。぀たり、バむナリ圢匏で盎接保存されたす。

しかし、IPv4 アドレスを䜿甚する堎合ず IPv6 を䜿甚する堎合がある堎合はどうなるでしょうか? はい、䞡方保管できたす。 4 ぀の列は IPv6 甚で、もう 4 ぀の列は IPv6 甚です。 もちろん、IPv4 を IPvXNUMX で衚瀺するオプションもありたす。 これでも機胜したすが、リク゚ストで IPvXNUMX アドレスが頻繁に必芁になる堎合は、別の列に入れるずよいでしょう。

* ClickHouse には、数倀ず同じくらい効率的にデヌタを保存しながら、文字列ず同じくらい簡単にデヌタを衚珟できる個別の IPv4、IPv6 デヌタ型が远加されたした。

ClickHouseの有効掻甚。 アレクセむ・ミロノィドフ (Yandex)

事前にデヌタを前凊理する䟡倀があるこずに泚意するこずも重芁です。 たずえば、生のログをいく぀か受け取ったずしたす。 そしお、すぐに ClickHouse に入れるべきではないかもしれたせんが、䜕もせずにすべおがうたくいくように誘惑されたす。 しかし、それでも可胜な蚈算を実行する䟡倀はありたす。

たずえば、ブラりザのバヌゞョン。 指を指したくない近くの郚門では、ブラりザのバヌゞョンが次のように、぀たり文字列ずしお保存されおいたす: 12.3. 次に、レポヌトを䜜成するために、この文字列を配列に分割し、さらに配列の最初の芁玠に分割したす。 圓然のこずながら、すべおが遅くなりたす。 なぜそんなこずをするのかず尋ねたした。 圌らは時期尚早な最適化が奜きではないず私に蚀いたした。 そしお私は時期尚早に悲芳するのが奜きではありたせん。

したがっお、この堎合は 4 ぀の列に分割する方が正確です。 ここは ClickHouse なので、心配しないでください。 ClickHouse は列型デヌタベヌスです。 そしお、小さな列がきちんずしおいればいるほど良いのです。 5 ぀のブラりザバヌゞョンがあり、5 ぀の列を䜜成したす。 これで倧䞈倫です。

ClickHouseの有効掻甚。 アレクセむ・ミロノィドフ (Yandex)

ここで、非垞に長い文字列や非垞に長い配列が倚数ある堎合にどうすればよいかを芋おみたしょう。 ClickHouse に保存する必芁はたったくありたせん。 代わりに、ClickHouse には識別子のみを保存できたす。 そしお、これらの長い行を他のシステムに入れおください。

たずえば、圓瀟の分析サヌビスの 512 ぀は、いく぀かのむベント パラメヌタヌを持っおいたす。 むベントのパラメヌタヌが倚数ある堎合は、最初に芋぀かった 512 を保存したす。XNUMX は残念ではないからです。

ClickHouseの有効掻甚。 アレクセむ・ミロノィドフ (Yandex)

デヌタ タむプを決定できない堎合は、ClickHouse にデヌタを蚘録するこずもできたすが、䞀時デヌタ専甚のログ タむプの䞀時テヌブルにデヌタを蚘録するこずもできたす。 その埌、そこにどのような倀の分垃があるのか​​、䞀般的に䜕が存圚するのかを分析し、正しいタむプを䜜成できたす。

*ClickHouse にデヌタ型が远加されたした 䜎カヌディナリティ これにより、少ない劎力で効率的に文字列を保存できたす。

ClickHouseの有効掻甚。 アレクセむ・ミロノィドフ (Yandex)

次に、別の興味深い事䟋を芋おみたしょう。 時々物事が人々にずっお奇劙に機胜するこずがありたす。 入っおきおこれを芋たす。 そしお、これは MySQL バヌゞョン 3.23 のセットアップに豊富な経隓を持぀、非垞に経隓豊富で聡明な管理者によっお行われたものであるこずがすぐにわかりたした。

ここには XNUMX のテヌブルがあり、それぞれのテヌブルには誰が䜕を知っおいるかを XNUMX で割った䜙りが蚘録されおいたす。

私は原則ずしお、他の人の経隓を尊重したす。これには、その経隓を通じお埗られる苊しみの理解も含たれたす。

ClickHouseの有効掻甚。 アレクセむ・ミロノィドフ (Yandex)

そしおその理由は倚かれ少なかれ明らかです。 これらは、他のシステムを䜿甚しおいる間に蓄積された可胜性のある叀い固定芳念です。 たずえば、MyISAM テヌブルにはクラスタヌ化された䞻キヌがありたせん。 そしお、このデヌタの分割方法は、同じ機胜を実珟するための必死の詊みである可胜性がありたす。

もう XNUMX ぀の理由は、倧きなテヌブルに察しお倉曎操䜜を実行するのが難しいこずです。 すべおがブロックされおしたいたす。 ただし、最新バヌゞョンの MySQL では、この問題はそれほど深刻ではなくなりたした。

たたは、たずえばマむクロシャヌディングですが、これに぀いおは埌で詳しく説明したす。

ClickHouseの有効掻甚。 アレクセむ・ミロノィドフ (Yandex)

ClickHouse ではこれを行う必芁はありたせん。たず、䞻キヌがクラスタヌ化され、デヌタが䞻キヌによっお順序付けされるためです。

たた、時々、「ClickHouse の範囲ク゚リのパフォヌマンスは、テヌブル サむズに応じおどのように倉化したすか?」ず尋ねられるこずがありたす。 党く倉わらないず蚀いたす。 たずえば、XNUMX 億行のテヌブルがあり、XNUMX 䞇行の範囲を読み取るずしたす。 すべお順調。 テヌブルに XNUMX 兆行あり、XNUMX 䞇行を読み取る堎合、それはほが同じになりたす。

そしお第 XNUMX に、手動パヌティションなどのあらゆる䜜業が必芁ありたせん。 ファむル システム䞊にあるものを調べおみるず、テヌブルが非垞に重芁であるこずがわかりたす。 そしお䞭には仕切りのようなものがありたす。 ぀たり、ClickHouse がすべおを行っおくれるので、苊しむ必芁はありたせん。

ClickHouseの有効掻甚。 アレクセむ・ミロノィドフ (Yandex)

ClickHouse での倉曎は、列の远加/ドロップを倉曎する堎合は無料です。

たた、テヌブルに 10 行たたは 10 行がある堎合は、たったく問題ないため、小さなテヌブルを䜜成しないでください。 ClickHouse はレむテンシヌではなくスルヌプットを最適化するシステムであるため、000 行を凊理するのは意味がありたせん。

ClickHouseの有効掻甚。 アレクセむ・ミロノィドフ (Yandex)

倧きなテヌブルを XNUMX ぀䜿甚するのが正しいです。 叀い固定芳念を取り陀きたしょう。すべおがうたくいきたす。

さらに、最新バヌゞョンでは、個々のパヌティションに察しおあらゆる皮類のメンテナンス操䜜を実行するために、任意のパヌティション キヌを䜜成できるようになりたした。

たずえば、䞭間デヌタを凊理する必芁がある堎合、チャンクを受け取り、最終テヌブルに曞き蟌む前にそれらのチャンクに察しお倉換を実行する必芁がある堎合など、倚数の小さなテヌブルが必芁です。 このケヌスには、StripeLog ずいう玠晎らしいテヌブル ゚ンゞンがありたす。 これは TinyLog に䌌おいたすが、それより優れおいるだけです。

* 珟圚、ClickHouse にもありたす テヌブル関数の入力.

ClickHouseの有効掻甚。 アレクセむ・ミロノィドフ (Yandex)

もう 5 ぀のアンチパタヌンはマむクロシャヌディングです。 たずえば、デヌタをシャヌディングする必芁があり、サヌバヌが 6 台あり、明日にはサヌバヌが 5 台になるずしたす。 そしお、このデヌタをリバランスする方法を考えたす。 その代わりに、1 ぀のシャヌドではなく 000 のシャヌドに分割したす。 次に、これらの各マむクロシャヌドを別のサヌバヌにマッピングしたす。 たずえば、200 ぀のサヌバヌ䞊で XNUMX の ClickHouse を取埗できたす。 個別のポヌトたたは個別のデヌタベヌス䞊の個別のむンスタンス。

ClickHouseの有効掻甚。 アレクセむ・ミロノィドフ (Yandex)

しかし、これはClickHouseではあたり良くありたせん。 56 ぀の ClickHouse むンスタンスでも、56 ぀のリク゚ストを凊理するために利甚可胜なすべおのサヌバヌ リ゜ヌスを䜿甚しようずするためです。 ぀たり、ある皮のサヌバヌがあり、たずえば 200 個のプロセッサ コアが搭茉されおいるずしたす。 10 秒かかるク゚リを実行するず、000 コアが䜿甚されたす。 そしお、XNUMX ぀のサヌバヌ䞊に XNUMX の ClickHouse を配眮するず、XNUMX のスレッドが開始されるこずがわかりたす。 䞀般に、すべおが非垞に悪くなりたす。

もう XNUMX ぀の理由は、これらのむンスタンス間での䜜業の分散が䞍均䞀になるこずです。 早く終わる人もいれば、遅く終わる人もいたす。 これらすべおが XNUMX ぀のむンスタンスで発生した堎合、ClickHouse 自䜓がスレッド間でデヌタを正しく分散する方法を芋぀け出すでしょう。

もう XNUMX ぀の理由は、TCP 経由でプロセッサ間通信を行うこずです。 デヌタはシリアル化、逆シリアル化する必芁があり、これは膚倧な数のマむクロシャヌドになりたす。 それは単に効果的に機胜したせん。

ClickHouseの有効掻甚。 アレクセむ・ミロノィドフ (Yandex)

これもアンチパタヌンずは蚀えたせんが、アンチパタヌンです。 これは倧量の事前集蚈です。

䞀般に、事前集蚈は適切です。 1 億行があり、それを集蚈するず 000 行になり、ク゚リが即座に実行されるようになりたした。 すべおが玠晎らしいです。 あなたはこれを行うこずができたす。 このため、ClickHouse にも AggregatingMergeTree ずいう特別なテヌブル タむプがあり、デヌタが挿入されるず増分集蚈を実行したす。

しかし、「このようにデヌタを集蚈し、このようにデヌタを集蚈する」ず考えるこずがありたす。 たた、隣の郚門では、どこずは蚀いたせんが、SummingMergeTree テヌブルを䜿甚しお䞻キヌで集蚈しおおり、玄 20 列が䞻キヌずしお䜿甚されおいたす。 念のため、機密保持のためにいく぀かの列の名前を倉曎したしたが、ほがそれだけです。

ClickHouseの有効掻甚。 アレクセむ・ミロノィドフ (Yandex)

そしお、このような問題が生じたす。 たず、デヌタ量があたり枛りたせん。 䟋えばXNUMX倍に枛りたす。 デヌタが集玄されおいない堎合に生じる無制限の分析機胜を利甚するには、XNUMX 倍が劥圓な䟡栌です。 デヌタが集玄されおいる堎合、分析の代わりに埗られるのは悲惚な統蚈だけです。

そしお、それの䜕がそんなに特別なのでしょうか 実際、隣の郚門の担圓者が、䞻キヌに別の列を远加するように䟝頌しに行くこずがありたす。 ぀たり、このようにデヌタを集蚈したしたが、もう少し倚くのデヌタが必芁になりたす。 ただし、ClickHouse には倉曎䞻キヌがありたせん。 したがっお、いく぀かのスクリプトを C++ で蚘述する必芁がありたす。 そしお、たずえそれが C++ であっおも、私はスクリプトが奜きではありたせん。

ClickHouse が䜕のために䜜られたのかを芋るず、非集蚈デヌタはたさにそれが生たれたシナリオです。 非集蚈デヌタに ClickHouse を䜿甚しおいる堎合、それは正しく行われおいたす。 集蚈すれば、これは蚱容できる堎合もありたす。

ClickHouseの有効掻甚。 アレクセむ・ミロノィドフ (Yandex)

もう XNUMX ぀の興味深いケヌスは、無限ルヌプ内のク゚リです。 時々、私は実皌働サヌバヌに行き、そこで show processlist を確認したす。 そしおそのたびに、䜕か恐ろしいこずが起こっおいるこずに気づきたす。

たずえば、このように。 XNUMX 回のリク゚ストですべおを実行できるこずがすぐにわかりたす。 URLずリストをそこに曞き蟌むだけです。

ClickHouseの有効掻甚。 アレクセむ・ミロノィドフ (Yandex)

無限ルヌプにあるこのようなク゚リの倚くが問題ずなるのはなぜでしょうか? むンデックスが䜿甚されおいない堎合は、同じデヌタに察しお䜕床もパスするこずになりたす。 しかし、むンデックスが䜿甚されおいる堎合、たずえば ru の䞻キヌがあり、そこに url = 䜕かを曞き蟌みたす。 そしお、テヌブルから URL が XNUMX ぀だけ読み取られれば、すべお問題ないず考えたす。 しかし、実際には違いたす。 ClickHouse はすべおをバッチで実行するためです。

ClickHouse のむンデックスがたばらであるため、特定の範囲のデヌタを読み取る必芁がある堎合は、もう少し倚く読み取りたす。 このむンデックスを䜿甚するず、テヌブル内の XNUMX ぀の個別の行を怜玢するこずはできず、ある皮の範囲のみを怜玢できたす。 そしお、デヌタはブロック単䜍で圧瞮されたす。 XNUMX 行を読み取るには、ブロック党䜓を取り出し、ブロックを解く必芁がありたす。 たた、倧量のク゚リを実行しおいる堎合は、重耇する郚分が倚くなり、䜕床も繰り返し実行する必芁がある䜜業が倚くなりたす。

ClickHouseの有効掻甚。 アレクセむ・ミロノィドフ (Yandex)

おたけに、ClickHouse では、たずえメガバむトや数癟メガバむトであっおも、IN セクションに転送するこずを恐れる必芁はないこずに泚意しおください。 私たちの実践から思い出したのですが、MySQL で倧量の倀を IN セクションに転送するず、たずえばそこに 100 メガバむトの数倀を転送するず、MySQL は 10 ギガバむトのメモリを消費し、他には䜕も起こりたせん。動䜜が悪い。

XNUMX ぀目は、ClickHouse では、ク゚リでむンデックスが䜿甚されおいる堎合、垞にフル スキャンよりも遅くないこずです。぀たり、テヌブルのほが党䜓を読み取る必芁がある堎合、シヌケンシャルに実行しおテヌブル党䜓を読み取りたす。 䞀般的に、圌は自分でそれを理解したす。

しかし、それでもいく぀かの困難がありたす。 たずえば、サブク゚リを䜿甚した IN はむンデックスを䜿甚しないこずです。 しかし、これは私たちの問題であり、解決する必芁がありたす。 ここには基本的なものは䜕もありたせん。 修正させおいただきたす*。

もう 100 ぀の興味深い点は、非垞に長いリク゚ストがあり、分散リク゚スト凊理が進行䞭の堎合、この非垞に長いリク゚ストは圧瞮されずに各サヌバヌに送信されるこずです。 たずえば、500 メガバむトず 50 サヌバヌなどです。 したがっお、ネットワヌク䞊で XNUMX ギガバむトが転送されるこずになりたす。 それが送信され、すべおが正垞に完了したす。

* すでに䜿甚しおいたす; すべおが玄束どおりに修正されたした。

ClickHouseの有効掻甚。 アレクセむ・ミロノィドフ (Yandex)

そしお、かなり䞀般的なケヌスは、リク゚ストが API から送信される堎合です。 たずえば、独自のサヌビスを䜜成したずしたす。 そしお、誰かがあなたのサヌビスを必芁ずしおいる堎合、API を開くず、文字通り XNUMX 日埌に理解できないこずが起こっおいるこずに気づきたす。 すべおが過負荷になり、決しお起こるべきではなかったひどいリク゚ストがいく぀か入っおきたす。

そしお、解決策は XNUMX ぀だけです。 API を公開しおいる堎合は、それを切断する必芁がありたす。 たずえば、ある皮のノルマを導入したす。 他に通垞のオプションはありたせん。 そうしないず、すぐにスクリプトが䜜成され、問題が発生したす。

そしお、ClickHouse にはクォヌタ蚈算ずいう特別な機胜がありたす。 さらに、クォヌタ キヌを転送するこずもできたす。 これは、たずえば内郚ナヌザヌ ID です。 そしお、クォヌタはそれぞれに察しお個別に蚈算されたす。

ClickHouseの有効掻甚。 アレクセむ・ミロノィドフ (Yandex)

さお、もう䞀぀興味深いこずがありたす。 これは手動レプリケヌションです。

ClickHouse にはレプリケヌション サポヌトが組み蟌たれおいるにもかかわらず、ClickHouse を手動でレプリケヌトしおいるケヌスを私は倚く知っおいたす。

原理は䜕ですか? デヌタ凊理パむプラむンがありたす。 たた、たずえば、異なるデヌタセンタヌでも独立しお動䜜したす。 ClickHouse では同じデヌタを同じ方法で曞き蟌みたす。 確かに、実際にやっおみるず、コヌド内のいく぀かの機胜によっおデヌタが䟝然ずしお分岐するこずがわかりたす。 それがあなたの䞭にあるこずを願っおいたす。

たた、堎合によっおは手動で同期する必芁がありたす。 たずえば、管理者は月に XNUMX 回 rsync を実行したす。

実際、ClickHouse に組み蟌たれおいるレプリケヌションを䜿甚する方がはるかに簡単です。 ただし、ZooKeeper を䜿甚する必芁があるため、いく぀かの犁忌がある可胜性がありたす。 ZooKeeper に぀いお悪いこずは蚀いたせん。原則ずしお、システムは機胜したすが、Java 恐怖症のせいで ZooKeeper を䜿甚しない人もいたす。ClickHouse は C++ で曞かれた非垞に優れたシステムであり、自由に䜿甚できたす。すべおうたくいきたす。 ZooKeeper は Java にありたす。 どういうわけか、芋たくない堎合でも、手動レプリケヌションを䜿甚できたす。

ClickHouseの有効掻甚。 アレクセむ・ミロノィドフ (Yandex)

ClickHouse は実甚的なシステムです。 圌女はあなたのニヌズを考慮に入れおくれたす。 手動レプリケヌションがある堎合は、手動レプリカを参照しおそれらの間でフェむルオヌバヌを実行する分散テヌブルを䜜成できたす。 たた、ラむンが系統的に分岐しおいる堎合でもフロップを回避できる特別なオプションもありたす。

ClickHouseの有効掻甚。 アレクセむ・ミロノィドフ (Yandex)

プリミティブ テヌブル ゚ンゞンを䜿甚するず、さらに問題が発生する可胜性がありたす。 ClickHouse は、さたざたなテヌブル ゚ンゞンを倚数備えたコンストラクタヌです。 ドキュメントに蚘茉されおいるように、すべおの深刻な堎合には、MergeTree ファミリのテヌブルを䜿甚しおください。 そしお残りのすべお - これは、個々のケヌスたたはテストの堎合に圓おはたりたす。

MergeTree テヌブルでは、日付ず時刻は必芁ありたせん。 ただお䜿いいただけたす。 日付ず時刻がない堎合は、デフォルトが 2000 であるこずを曞き蟌みたす。 これは機胜し、リ゜ヌスは必芁ありたせん。

たた、サヌバヌの新しいバヌゞョンでは、パヌティション キヌを䜿甚せずにカスタム パヌティション化を指定するこずもできたす。 それも同じだろう。

ClickHouseの有効掻甚。 アレクセむ・ミロノィドフ (Yandex)

䞀方、プリミティブなテヌブル ゚ンゞンを䜿甚するこずもできたす。 たずえば、デヌタを䞀床入力しお、芋お、ひねり、削陀したす。 ログを䜿甚できたす。

あるいは、䞭間凊理甚に少量を保存するには、StripeLog たたは TinyLog を䜿甚したす。

デヌタ量が少なく、RAM 内で䜕かをいじるだけで枈む堎合は、メモリを䜿甚できたす。

ClickHouseの有効掻甚。 アレクセむ・ミロノィドフ (Yandex)

ClickHouse は再正芏化されたデヌタをあたり奜みたせん。

兞型的な䟋を次に瀺したす。 これは膚倧な数の URL です。 それらを次のテヌブルに眮きたす。 そしお、JOIN を実行するこずにしたしたが、ClickHouse は Hash JOIN のみをサポヌトしおいるため、これは原則ずしお機胜したせん。 接続する必芁がある倧量のデヌタを凊理できる十分な RAM がない堎合、JOIN は機胜したせん*。

デヌタのカヌディナリティが高い堎合は、心配する必芁はありたせん。非正芏化圢匏で保存しおください。URL はメむン テヌブルに盎接配眮されたす。

* そしお珟圚、ClickHouse にはマヌゞ結合もあり、䞭間デヌタが RAM に収たらない状況でも機胜したす。 しかし、これは効果がなく、勧告は匕き続き有効です。

ClickHouseの有効掻甚。 アレクセむ・ミロノィドフ (Yandex)

他にもいく぀か䟋がありたすが、それらがアンチパタヌンであるかどうかはすでに疑問です。

ClickHouse には既知の欠陥が XNUMX ぀ありたす。 アップデヌト方法がわかりたせん*。 ある意味では、これは良いこずです。 䌚蚈などの重芁なデヌタがある堎合、曎新がないため、誰もそれを送信できたせん。

* バッチ モヌドでの曎新ず削陀のサポヌトはかなり前に远加されたした。

ただし、バックグラりンドであるかのように曎新できる特別な方法がいく぀かありたす。 たずえば、ReplaceMergeTree のようなテヌブルです。 バックグラりンドのマヌゞ䞭に曎新が行われたす。 テヌブルの最適化を䜿甚しおこれを匷制できたす。 ただし、パヌティションを完党に䞊曞きしおしたうため、これを頻繁に実行しないでください。

ClickHouse の分散 JOIN も、ク゚リ プランナヌでは適切に凊理されたせん。

悪いけど、たたにはOK。

select* を䜿甚しおデヌタを読み取る堎合にのみ ClickHouse を䜿甚したす。

面倒な蚈算に ClickHouse を䜿甚するこずはお勧めしたせん。 しかし、私たちはすでにこの掚奚事項から離れ぀぀あるため、これは完党に真実ではありたせん。 そしお最近、ClickHouse - Catboost に機械孊習モデルを適甚する機胜を远加したした。 そしお、「䜕ずいう恐ろしいこずだろう」ず思うので、それは私を悩たせたす。 これは、XNUMX バむトあたりのサむクル数です。 私はバむトにクロックを無駄にするのが本圓に嫌いです。

ClickHouseの有効掻甚。 アレクセむ・ミロノィドフ (Yandex)

でも、心配しないで、ClickHouse をむンストヌルすれば、すべおうたくいきたす。 どちらかずいうず、私たちにはコミュニティがありたす。 ちなみに、コミュニティずはあなた自身のこずです。 䜕か問題がある堎合は、少なくずも私たちのチャットにアクセスしおください。助けおくれるこずを願っおいたす。

質問

ご報告ありがずうございたす ClickHouse のクラッシュに぀いおどこに苊情を申し立おればよいですか?

今すぐ私に個人的に苊情を蚀っおもいいでしょう。

最近クリックハりスを䜿い始めたした。 私はすぐに cli むンタヌフェヌスを削陀したした。

あなたはラッキヌです。

少し埌、小さな遞択でサヌバヌをクラッシュさせたした。

あなたには才胜がありたす。

GitHub のバグをオヌプンしたしたが、無芖されたした。

芋るでしょう。

アレクセむは私をだたしお報告曞に参加させ、内郚のデヌタにどのようにアクセスするかを教えるず玄束したした。

非垞にシンプル。

昚日そのこずに気づきたした。 さらに詳しく。

そこには恐ろしいトリックはありたせん。 あるのはブロックごずの圧瞮だけです。 デフォルトは LZ4 ですが、ZSTD* を有効にするこずができたす。 64 キロバむトから 1 メガバむトたでのブロック。

* 他のアルゎリズムずチェヌンで䜿甚できる特殊な圧瞮コヌデックのサポヌトもありたす。

ブロックは単なる生デヌタですか?

完党に生ではありたせん。 配列がありたす。 数倀列がある堎合、行内の数倀が配列に配眮されたす。

明らかです。

Alexey、IP 経由の uniqExact の䟋、぀たり、uniqExact は数倀よりも行で蚈算する方が時間がかかるずいう事実など。 校正時に耳でフェむントをかけおキャストしおみたらどうでしょうか ぀たり、私たちのディスクではそれほど違いはないずおっしゃったようですね。 ディスクから行を読み取っおキャストするず、集蚈は速くなりたすか? それずも、ここでもただわずかに利益を埗るでしょうか これをテストしたようですが、䜕らかの理由でベンチマヌクに瀺されたせんでした。

キャストしないよりも遅くなるず思いたす。 この堎合、IP アドレスを文字列から解析する必芁がありたす。 もちろん、ClickHouse では、IP アドレス解析も最適化されおいたす。 私たちは䞀生懞呜努力したしたが、そこには䞀䞇分のの圢匏で数字が曞かれおいたす。 ずおも䞍快です。 䞀方、uniqExact 関数は文字列に察しおは動䜜が遅くなりたす。これは、文字列であるだけでなく、アルゎリズムの異なる特殊化が遞択されおいるためです。 文字列は単玔に異なる方法で凊理されたす。

もっず原始的なデヌタ型を採甚したらどうなるでしょうか? たずえば、ナヌザヌIDをメモしお、それを䞀行曞いおスクランブルしたほうが楜しいでしょうか、そうでないでしょうか。

私は疑う。 結局のずころ、数字の解析は深刻な問題なので、さらに悲しいこずになるず思いたす。 この同僚は、XNUMX䞇分のXNUMXの圢匏で数倀を解析するこずがいかに難しいかに぀いお報告さえしたように思えたすが、おそらくそうではありたせん。

アレクセむさん、ご報告ありがずうございたす そしおClickHouseを本圓にありがずう 蚈画に぀いお質問がありたす。 蟞曞を䞍完党に曎新する機胜の蚈画はありたすか?

぀たり、郚分的な再起動ですか?

はいはい。 そこに MySQL フィヌルドを蚭定する機胜ず同様です。぀たり、ディクショナリが非垞に倧きい堎合は、このデヌタのみがロヌドされるように埌で曎新したす。

非垞に興味深い機胜です。 そしお、チャットで誰かがそれを提案したず思いたす。 もしかしたらあなたもそうだったかもしれたせん。

私はそうは思わない。

なるほど、リク゚ストが XNUMX ぀あるこずがわかりたした。 そしお、ゆっくりずそれを始めるこずができたす。 ただし、この機胜の実装は非垞に簡単であるこずをすぐに譊告したいず思いたす。 ぀たり、理論的には、テヌブルにバヌゞョン番号を曞き蟌んでから、「バヌゞョン未満のバヌゞョン」ず蚘述するだけです。 これは、おそらくこれを愛奜家に提䟛するこずを意味したす。 あなたは愛奜家ですか

はい、しかし残念ながら C++ ではできたせん。

あなたの同僚は C++ での曞き方を知っおいたすか?

誰か芋぀けたす。

玠晎らしい*。

* この機胜はレポヌトの XNUMX か月埌に远加されたした。質問の䜜成者がそれを開発し、送信したした。 プル芁求.

ありがずうございたす

こんにちは ご報告ありがずうございたす ClickHouse は利甚可胜なリ゜ヌスをすべお消費するのが非垞に䞊手だずおっしゃいたした。 そしお、Luxoft の隣の講挔者は、Russian Post に察する゜リュヌションに぀いお話したした。 圌は、圌らは ClickHouse を非垞に気に入っおいたが、CPU をすべお䜿い果たしおいたため、䞻な競合他瀟の代わりにそれを䜿甚しなかったず述べたした。 そしお、それを自分たちのアヌキテクチャや Docker を䜿った ZooKeeper に組み蟌むこずもできたせんでした。 ClickHouse が利甚できるものをすべお消費しないように、䜕らかの方法で ClickHouse を制限するこずはできたすか?

はい、それは可胜であり、非垞に簡単です。 消費するコアを枛らしたい堎合は、次のように蚘述したす。 set max_threads = 1。 これで、リク゚ストが XNUMX ぀のコアで実行されたす。 さらに、ナヌザヌごずに異なる蚭定を指定できたす。 それで問題ありたせん。 そしお、Luxoft の同僚に、ドキュメントにこの蚭定が芋぀からなかったのは良くないず䌝えおください。

アレクセむ、こんにちは この点に぀いおお聞きしたいず思いたす。 倚くの人が ClickHouse をログのストレヌゞずしお䜿い始めおいるず聞いたのはこれが初めおではありたせん。 レポヌトでは、これを行わない、぀たり長い文字列を保存する必芁がないず蚀っおいたした。 あなたはそれに぀いおどう思いたすか

たず、ログは原則ずしお長い文字列ではありたせん。 もちろん䟋倖もありたす。 たずえば、Java で曞かれたサヌビスによっおは䟋倖がスロヌされ、ログに蚘録されたす。 などずいう無限ルヌプが繰り返され、ハヌドドラむブの容量が䞍足しおしたいたす。 解決策はずおも簡単です。 線が非垞に長い堎合は、カットしおください。 長いずはどういう意味ですか 数十キロバむトはダメです*。

* ClickHouse の最新バヌゞョンでは、「適応むンデックス粒床」が有効になっおおり、長い行を保存する問題はほずんど解決されおいたす。

キロバむトっお普通ですか

それは正垞です。

こんにちは ご報告ありがずうございたす この件に぀いおはチャットですでに質問したしたが、回答があったかどうか芚えおいたせん。 CTE のように WITH セクションを䜕らかの方法で拡匵する予定はありたすか?

ただ。 WITH セクションはやや軜薄です。 私たちにずっおはちょっずした機胜のようなものです。

わかりたした。 ありがずう

ご報告ありがずうございたす ずおも興味深い グロヌバルな質問。 おそらく䜕らかのスタブの圢で、デヌタの削陀を倉曎する蚈画はありたすか?

必然的に。 これはキュヌ内の最初のタスクです。 私たちは珟圚、すべおを正しく行う方法に぀いお積極的に考えおいたす。 そしおキヌボヌド*を抌し始める必芁がありたす。

* キヌボヌドのボタンを抌しおすべおを実行したした。

これはシステムのパフォヌマンスに䜕らかの圱響を䞎えるのでしょうか? 挿入は今ず同じくらい早くなりたすか

おそらく削陀自䜓ず曎新自䜓は非垞に重いものになるでしょうが、これは遞択のパフォヌマンスや挿入のパフォヌマンスには圱響したせん。

そしお、もう䞀぀小さな質問。 プレれンテヌションでは䞻キヌに぀いお話したした。 したがっお、デフォルトでは月単䜍のパヌティション分割が行われおいたすね。 そしお、月に収たる日付範囲を蚭定するず、このパヌティションのみが読み取られたす。

はい。

質問。 䞻キヌを遞択できない堎合、バックグラりンドでのこのデヌタの再配眮が少なくなり、より順序よく収たるように、特に「日付」フィヌルドに埓っお遞択するのは正しいでしょうか? 範囲ク゚リがなく、䞻キヌを遞択するこずさえできない堎合、䞻キヌに日付を入れる䟡倀はありたすか?

はい。

おそらく、このフィヌルドで䞊べ替える堎合にデヌタをより適切に圧瞮するフィヌルドを䞻キヌに配眮するこずが合理的である可胜性がありたす。 たずえば、ナヌザヌID。 たずえば、ナヌザヌは同じサむトにアクセスしたす。 この堎合、ナヌザヌ ID ず時刻を入力したす。 そうすれば、デヌタはより適切に圧瞮されたす。 日付に関しおは、日付に察する範囲ク゚リが実際に存圚せず、今埌も実行しない堎合は、䞻キヌに日付を入れる必芁はありたせん。

はい、ありがずうございたす

出所 habr.com

コメントを远加したす