ClickHouse ぞの移行: 3 幎埌

XNUMX幎前、Yandexのノィクトル・タルナフスキヌずアレクセむ・ミロノィドフがステヌゞに登堎 HighLoad ++ 蚀った、ClickHouseがどれほど優れおいるか、そしおそれがどれほど遅くならないか。 そしお次のステヌゞには、 アレクサンダヌ・ツァむトセフ с 報告 ぞの匕っ越しに぀いお クリックハりス 別の分析 DBMS から埗られた結論は、 クリックハりス、もちろん良いですが、あたり䟿利ではありたせん。 2016 幎の時点で、同瀟は LifeStreetアレクサンダヌが圓時働いおいた堎所では、マルチペタバむトの分析システムを クリックハりスそれは、未知の危険に満ちた魅惑の“黄色いレンガ道”だった――。 クリックハりス 圓時は地雷原のように芋えたした。

XNUMX幎埌 クリックハりス はるかに良くなりたした - この間にアレクサンダヌは、人々の移動を支揎するだけでなく、Altinity ずいう䌚瀟を蚭立したした。 クリックハりス 数十のプロゞェクトに取り組んでいたすが、Yandex の同僚ず協力しお補品自䜓も改善しおいたす。 今 クリックハりス ただ気たたな散歩ではありたせんが、もはや地雷原ではありたせん。

Alexander は 2003 幎から分散システムに取り組んでおり、次のような倧芏暡なプロゞェクトを開発しおいたす。 MySQL、Oracle О Vertica。 最埌に HighLoad ++ 2019 アレクサンダヌ、䜿甚の先駆者の XNUMX 人 クリックハりス、この DBMS が珟圚どのようなものであるかを説明したした。 䞻な機胜に぀いお孊びたす クリックハりス: 他のシステムずどう違うのか、どのような堎合に䜿甚するずより効果的になるのか。 䟋を䜿甚しお、以䞋に基づいおシステムを構築するための、プロゞェクトでテストされた最近の実践方法を芋おいきたす。 クリックハりス.


振り返り3幎前に䜕が起こったのか

XNUMX幎前に䌚瀟を譲枡したした LifeStreet Ма クリックハりス 別の分析デヌタベヌスからの広告ネットワヌク分析の移行は次のようになりたす。

  • 2016 幎 XNUMX 月。 オヌプン゜ヌス 登堎 クリックハりス そしお私たちのプロゞェクトが始たりたした。
  • 8月。 コンセプトの蚌明: 倧芏暡な広告ネットワヌク、むンフラストラクチャ、および 200  300 テラバむトのデヌタ。
  • XNUMX月。 最初の本番デヌタ。
  • 10月。 補品の党負荷は 50 日あたり XNUMX  XNUMX 億のむベントです。
  • 2017 幎 XNUMX 月。ナヌザヌの移行に成功。 クリックハりス, 2,5 台のサヌバヌからなるクラスタヌ䞊の 60 ペタバむトのデヌタ。

移行プロセス䞭に、次のような理解が深たりたした。 クリックハりス は快適に䜜業できる優れたシステムですが、これは Yandex の内郚プロゞェクトです。 したがっお、埮劙な違いがありたす。Yandex は最初に自瀟の内郚顧客に察応し、その埌でコミュニティず倖郚ナヌザヌのニヌズに察応したすが、ClickHouse は倚くの機胜分野で゚ンタヌプラむズ レベルに達しおいたせんでした。 だからこそ、私たちは 2017 幎 XNUMX 月に Altinity を蚭立したした。 クリックハりス Yandex だけでなく、他のナヌザヌにずっおもさらに高速か぀䟿利になりたす。 そしお今、私たちは:

  • 私たちはトレヌニングを行い、以䞋に基づいた゜リュヌションの構築を支揎したす。 クリックハりス 顧客がトラブルに巻き蟌たれないように、そしお゜リュヌションが最終的に機胜するように。
  • 24時間7日サポヌトを提䟛したす クリックハりス- 蚭眮;
  • 私たちは独自の゚コシステム プロゞェクトを開発しおいたす。
  • 私たちは自分自身に積極的にコミットしたす クリックハりス、特定の機胜を確認したいナヌザヌからのリク゚ストに応えたす。

もちろん匕っ越しもお手䌝いしたす クリックハりス с MySQL, Vertica, オラクル, グリヌンプラム, レッドシフト およびその他のシステム。 私たちはさたざたな取り組みに参加しおおり、それらはすべお成功しおいたす。

ClickHouse ぞの移行: 3 幎埌

に移動する理由 クリックハりス

速床が萜ちない これが䞻な理由です。 クリックハりス - さたざたなシナリオに察応する非垞に高速なデヌタベヌス:

ClickHouse ぞの移行: 3 幎埌

長い間人々ず協力しおきた人々からのランダムな匕甚 クリックハりス.

スケヌラビリティ。 他のデヌタベヌスでは、XNUMX ぀のハヌドりェアで良奜なパフォヌマンスを達成できたすが、 クリックハりス サヌバヌを远加するだけで、垂盎方向だけでなく氎平方向にも拡匵できたす。 すべおが期埅どおりにスムヌズに機胜するわけではありたせんが、うたくいきたす。 ビゞネスの成長に合わせおシステムを拡匵できたす。 重芁なのは、珟圚の゜リュヌションに制限されず、垞に開発の可胜性があるこずです。

携垯性。 䞀぀のものに察する執着はありたせん。 たずえば、 Amazonレッドシフト どこかに移動するのは難しいです。 あ クリックハりス ラップトップやサヌバヌにむンストヌルしたり、クラりドに展開したりできたす。 Kubernetes — むンフラストラクチャの運甚に制限はありたせん。 これは誰にずっおも䟿利であり、他の倚くの同様のデヌタベヌスにはない倧きな利点です。

柔軟性. クリックハりス Yandex.Metrica など、XNUMX ぀のものにずどたらず、たすたす倚くの異なるプロゞェクトや業界で開発され、䜿甚されおいたす。 新しい問題を解決するために新しい機胜を远加するこずで拡匵できたす。 たずえば、ログをデヌタベヌスに保存するこずはマナヌ違反であるず考えられおいるため、次のようなこずが考えられたした。 Elasticsearch。 でも柔軟性のおかげで クリックハりス、ログを保存するこずもでき、倚くの堎合、これは よりもさらに優れおいたす。 Elasticsearch - で クリックハりス これには必芁な鉄の量が10分のXNUMXになりたす。

フリヌ オヌプン゜ヌス。 䜕も支払う必芁はありたせん。 ラップトップたたはサヌバヌにシステムをむンストヌルするための蚱可を亀枉する必芁はありたせん。 隠れた手数料はありたせん。 同時に、他のオヌプン゜ヌス デヌタベヌス テクノロゞは速床においお競合できたせん。 クリックハりス. MySQL、MariaDB、Greenplum - それらはすべおはるかに遅いです。

コミュニティ、ドラむブ、 楜しいです。 で クリックハりス 玠晎らしいコミュニティ亀流䌚、チャット、そしお゚ネルギヌず楜芳䞻矩で私たち党員を充電しおくれるアレクセむ・ミロノィドフ。

クリックハりスぞの移行

に行くには クリックハりス 䜕らかの理由で、必芁なのは次の XNUMX ぀だけです。

  • 限界を理解する クリックハりス そしおそれが適さないもの。
  • 利甚する テクノロゞヌずその最倧の匷み。
  • 実隓。 仕組みを理解しおいおも クリックハりス、い぀早くなるか、い぀遅くなるか、い぀良くなるか、い぀悪くなるかを垞に予枬できるわけではありたせん。 それで詊しおみおください。

匕っ越し問題

「でも」は XNUMX ぀だけです。 クリックハりス 他の䜕かが原因で、通垞は䜕か問題が発生したす。 私たちは、お気に入りのデヌタベヌスで機胜するいく぀かのプラクティスや物事に慣れおいたす。 たずえば、䞀緒に働いおいる人は誰でも、 SQL デヌタベヌスでは、次の䞀連の関数が必須であるず芋なされたす。

  • 取匕;
  • 制玄。
  • 䞀貫性;
  • むンデックス
  • 曎新/削陀;
  • NULL;
  • ミリ秒。
  • 自動型キャスト。
  • 耇数の結合。
  • 任意のパヌティション。
  • クラスタヌ管理ツヌル。

募集は必須ですが、XNUMX幎前に クリックハりス これらの機胜はどれも利甚できたせんでした。 珟圚、トランザクション、制玄、䞀貫性、ミリ秒、型キャストなど、実装されおいないものは半分未満が残っおいたす。

そしお重芁なこずは、 クリックハりス 䞀郚の暙準的なプラクティスやアプロヌチは機胜しなかったり、これたでず異なる方法で機胜したりしたす。 に登堎するものすべお クリックハりス、 に察応 "クリックハりスのやり方"、぀たり他のデヌタベヌスずは機胜が異なりたす。 䟋えば

  • むンデックスは遞択されたせんが、スキップされたす。
  • 曎新/削陀 同期ではなく、非同期です。
  • 耇数の結合がありたすが、ク゚リ プランナヌはありたせん。 䞀般に、それらがどのように実行されるかは、デヌタベヌスの䞖界の人々にずっおはあたり明確ではありたせん。

クリックハりススクリプト

1960幎、ハンガリヌ出身のアメリカの数孊者 りィグナヌ EP 蚘事を曞きたした」自然科孊における数孊の䞍合理な有効性」「自然科孊における数孊の理解できない有効性」、私たちの呚りの䞖界は䜕らかの理由で数孊的法則によっおよく説明されおいるずいうこずです。 数孊は抜象的な科孊であり、数孊的な圢匏で衚珟された物理法則は自明ではありたせん。 りィグナヌ EP これは非垞に奇劙であるず匷調した。

私の芖点から、 クリックハりス -同じ奇劙さ。 りィグナヌの蚀葉を蚀い換えるず、次のように蚀えたす。「考えられないほどの効率は驚くべきものです」 クリックハりス さたざたな分析甚途に䜿甚できたす。

ClickHouse ぞの移行: 3 幎埌

たずえば、 リアルタむム デヌタ りェアハりス、デヌタはほが継続的にロヌドされたす。 XNUMX 秒遅れでリク゚ストを受け取りたいず考えおいたす。 お願いしたす - 䜿っおください クリックハりス、これが蚭蚈されたシナリオだからです。 クリックハりス これはたさに、Web だけでなく、マヌケティングや財務分析でも䜿甚される方法です。 アドテックh、同様に 䞍正行為の怜出n. で リアルタむム デヌタ りェアハりス 「スタヌ」や「スノヌフレヌク」のような耇雑な構造のスキヌムが䜿甚され、倚くのテヌブルが 登録 (堎合によっおは耇数)、デヌタは通垞、䞀郚のシステムに保存され、倉曎されたす。

別のシナリオを考えおみたしょう - 時系列: デバむス、ネットワヌク、䜿甚統蚈、モノ​​のむンタヌネットの監芖。 ここでは、時間に埓っお順序付けられた非垞に単玔なむベントに遭遇したす。 クリックハりス はもずもずこのために開発されたものではありたせんでしたが、うたく機胜するこずがわかったので、倧䌁業は クリックハりス 監芖情報のリポゞトリずしお。 適切かどうかを怜蚎するため クリックハりス 時系列に぀いおは、アプロヌチず結果に基づいおベンチマヌクを䜜成したした 流入DB О タむムスケヌルDB - 専門化された 時系列 デヌタベヌス。 それは刀明したその クリックハりスは、そのようなタスクを最適化しなくおも、倖郚フィヌルドで勝利したす。

ClickHouse ぞの移行: 3 幎埌

В 時系列 通垞は、狭いテヌブル (いく぀かの小さな列) が䜿甚されたす。 モニタリングからは倧量のデヌタ (XNUMX 秒あたり数癟䞇レコヌド) が取埗される可胜性があり、それらは通垞、小さなバヌストで取埗されたす (ぞの ストリヌミング。 したがっお、別の挿入スクリプトが必芁であり、ク゚リ自䜓にも独自の詳现がありたす。

ログ管理。 ログをデヌタベヌスに収集するのは通垞は奜たしくありたせんが、 クリックハりス これは、䞊で説明したようにいく぀かのコメントを䜿甚しお行うこずができたす。 倚くの䌁業が利甚しおいる クリックハりス たさにこの目的のために。 この堎合、ログ党䜓を保存するフラットワむドテヌブルを䜿甚したすたずえば、次の圢匏 JSONの、たたは现かく切りたす。 通垞、デヌタは倧きなバッチ (ファむル) でロヌドされ、䜕らかのフィヌルドで怜玢したす。

通垞、これらの機胜ごずに専甚のデヌタベヌスが䜿甚されたす。 クリックハりス 人はそれをすべおこなすこずができ、それが圌らを䞊回るほど優れおいたす。 では、詳しく芋おみたしょう 時系列 シナリオず正しく「料理」する方法 クリックハりス このシナリオの堎合。

時系列

珟圚、これがメむンシナリオです。 クリックハりス 暙準的な解決策ず考えられたす。 時系列 時間の経過に䌎う䞀連のむベントであり、時間の経過に䌎う䜕らかのプロセスの倉化を衚したす。 たずえば、これは XNUMX 日あたりの心拍数やシステム内のプロセス数などです。 䜕らかの次元で時間を刻むものはすべお 時系列:

ClickHouse ぞの移行: 3 幎埌

この皮のむベントのほずんどは監芖によっお発生したす。 これは、Web を監芖するだけでなく、実際のデバむス (自動車、産業システム、 IoT、工堎や無人タクシヌ、Yandex がすでにトランクに積んでいる クリックハりス-サヌバ。

たずえば、船舶からデヌタを収集する䌚瀟がありたす。 コンテナ船のセンサヌは数秒ごずに、数癟もの異なる枬定倀を送信したす。 コンテナ船は䞀秒たりずもアむドル状態であっおはいけないため、゚ンゞニアはそれらを研究し、モデルを構築し、船がいかに効率的に䜿甚されおいるかを理解しようずしたす。 ダりンタむムは金銭の損倱に぀ながるため、停止が最小限に抑えられるようにルヌトを予枬するこずが重芁です。

珟圚では、 時系列。 珟堎で DB゚ンゞン さたざたなデヌタベヌスは䜕らかの圢でランク付けされおおり、タむプ別に衚瀺できたす。

ClickHouse ぞの移行: 3 幎埌

䞀番成長が早いタむプは、 時系列s. グラフデヌタベヌスも成長しおいたすが、 時系列ここ数幎で急速に成長しおいたす。 このファミリヌのデヌタベヌスの代衚的なものは次のずおりです。 流入DB, プロメテりス, KDB, タむムスケヌルDB (䞊に構築された PostgreSQL)、からの解決策 Amazon. クリックハりス ここでも䜿甚でき、䜿甚されおいたす。 いく぀かの公的な䟋を玹介したしょう。

先駆者のひず぀が同瀟です CloudFlareの (CDN-プロバむダヌ。 圌らは圌らを監芖しおいたす CDN スルヌ クリックハりス (DNS-リク゚スト、 HTTP-ク゚リ、膚倧な負荷 - 6 秒あたり XNUMX 䞇むベント。 すべおが通過したす カフカ、 に行く クリックハりス、システム内のむベントのダッシュボヌドをリアルタむムで衚瀺する機䌚を提䟛したす。

コムキャスト - 米囜の電気通信分野のリヌダヌの XNUMX ぀: むンタヌネット、デゞタル テレビ、電話。 圌らは同様の制埡システムを䜜成したした CDN 内に オヌプン゜ヌス プロゞェクト Apache トラフィック制埡 膚倧なデヌタを扱うために。 クリックハりス 分析のバック゚ンドずしお䜿甚されたす。

ペルコナ 組み蟌たれおいる クリックハりス あなたの䞭に PMMさたざたなモニタリングを保存する MySQL.

特定の芁件

時系列デヌタベヌスには独自の固有の芁件がありたす。

  • 倚くの゚ヌゞェントからの迅速な挿入。 倚くのストリヌムからのデヌタを非垞に迅速に挿入する必芁がありたす。 クリックハりス すべおの挿入がノンブロッキングであるため、これがうたく機胜したす。 どれでも insert はディスク䞊の新しいファむルであり、小さな挿入は䜕らかの方法でバッファリングできたす。 で クリックハりス デヌタを䞀床に XNUMX 行ず぀挿入するよりも、倧きなバッチに分けお挿入するこずをお勧めしたす。
  • 柔軟なスキヌム。 で 時系列 通垞、私たちはデヌタ構造を完党には知りたせん。 特定のアプリケヌション向けに監芖システムを構築するこずは可胜ですが、それを別のアプリケヌションに䜿甚するのは困難です。 これには、より柔軟なスキヌムが必芁です。 クリックハりスは、匷く型付けされたベヌスであっおも、これを行うこずができたす。
  • デヌタの効率的な保管ず忘れ。 通垞は 時系列 膚倧な量のデヌタがあるため、できるだけ効率的に保存する必芁がありたす。 たずえば、 流入DB 優れた圧瞮が䞻な特城です。 ただし、保存するだけでなく、叀いデヌタを「忘れお」、䜕らかの凊理を実行できる必芁もありたす。 ダりンサンプリング — 凝集䜓の自動カりント。
  • 集玄デヌタに察する高速ク゚リ。 過去 5 分間をミリ秒単䜍の粟床で芋るず興味深い堎合もありたすが、月次デヌタでは分や秒の粒床は必芁ない堎合がありたす。䞀般的な統蚈で十分です。 この皮のサポヌトは必芁です。そうでないず、3 か月のリク゚ストは完了するたでに非垞に長い時間がかかりたす。 クリックハりス.
  • 「」のようなリク゚スト最埌のポむント、珟圚»。 これらは兞型的なものです 時系列 ク゚リ: ある時点でのシステムの最埌の枬定倀たたは状態を確認したす。 t。 これらはデヌタベヌスにずっおあたり快適なク゚リではありたせんが、実行できる必芁もありたす。
  • 「接着」時系列. 時系列 時系列です。 XNUMX ぀の時系列がある堎合、倚くの堎合、それらを接続しお盞関させる必芁がありたす。 すべおのデヌタベヌス、特に䜍眮合わせされおいない時系列でこれを行うのは䟿利ではありたせん。以䞋にいく぀かの時点を瀺したすが、他の時点もありたす。 平均的ず考えるこずもできたすが、突然穎が開く可胜性があるため、明確ではありたせん。

これらの芁件がどのように満たされるかを芋おみたしょう クリックハりス.

スキヌム

В クリックハりス のためのスキヌム 時系列 デヌタの芏則性の皋床に応じお、さたざたな方法で実行できたす。 すべおの指暙が事前にわかっおいれば、通垞のデヌタに基づいおシステムを構築するこずが可胜です。 たずえば、私はこれをしたした CloudFlareの モニタリング付き CDN 十分に最適化されたシステムです。 むンフラ党䜓やさたざたなサヌビスを監芖する、より汎甚的なシステムを構築できたす。 䞍芏則なデヌタの堎合、䜕を監芖しおいるのかが事前にわかりたせん。これがおそらく最も䞀般的なケヌスです。

通垞のデヌタ。 コラム。 スキヌムはシンプルで、必芁なタむプの列が含たれおいたす。

CREATE TABLE cpu (
  created_date Date DEFAULT today(),  
  created_at DateTime DEFAULT now(),  
  time String,  
  tags_id UInt32,  /* join to dim_tag */
  usage_user Float64,  
  usage_system Float64,  
  usage_idle Float64,  
  usage_nice Float64,  
  usage_iowait Float64,  
  usage_irq Float64,  
  usage_softirq Float64,  
  usage_steal Float64,  
  usage_guest Float64,  
  usage_guest_nice Float64
) ENGINE = MergeTree(created_date, (tags_id, created_at), 8192);

これは、ある皮のシステム読み蟌みアクティビティを監芖する通垞のテヌブルです (user,  , アむドル, nice。 シンプルで䟿利ですが、柔軟性はありたせん。 より柔軟なスキヌムが必芁な堎合は、配列を䜿甚できたす。

䞍芏則なデヌタ。 配列:

CREATE TABLE cpu_alc (
  created_date Date,  
  created_at DateTime,  
  time String,  
  tags_id UInt32,  
  metrics Nested(
    name LowCardinality(String),  
    value Float64
  )
) ENGINE = MergeTree(created_date, (tags_id, created_at), 8192);

SELECT max(metrics.value[indexOf(metrics.name,'usage_user')]) FROM ...

構造 入れ子になった は XNUMX ぀の配列です: metrics.name О メトリクス.倀。 ここでは、このような任意の監芖デヌタを、むベントごずの名前の配列および枬定倀の配列ずしお保存できたす。 さらに最適化するには、そのような構造を XNUMX ぀ではなく、耇数䜜成できたす。 たずえば、XNUMX ぀は フロヌト-倀、別の - の int型-぀たり、なぜなら int型 もっず効率的に収玍したい。

しかし、そのような構造にアクセスするのはさらに困難です。 最初にむンデックス、次に配列の倀を匕き出すには、特別な関数を䜿甚しお特別な構造を䜿甚する必芁がありたす。

SELECT max(metrics.value[indexOf(metrics.name,'usage_user')]) FROM ...

しかし、それでも非垞に速く動䜜したす。 䞍芏則なデヌタを栌玍するもう XNUMX ぀の方法は、行ごずです。

䞍芏則なデヌタ。 文字列。 この埓来の方法では、配列を䜿甚せず、名前ず倀が同時に保存されたす。 5 ぀のデバむスから䞀床に 000 の枬定倀が取埗された堎合、デヌタベヌスには 5 行が生成されたす。

CREATE TABLE cpu_rlc (
  created_date Date,  
  created_at DateTime,  
  time String,  
  tags_id UInt32,  
  metric_name LowCardinality(String),  
  metric_value Float64
) ENGINE = MergeTree(created_date, (metric_name, tags_id, created_at), 8192);


SELECT 
    maxIf(metric_value, metric_name = 'usage_user'),
    ... 
FROM cpu_r
WHERE metric_name IN ('usage_user', ...)

クリックハりス これに察凊したす - 特別な拡匵機胜がありたす クリックハりス SQL。 䟋えば、 maxIf — 䜕らかの条件が満たされた堎合にメトリクスによっお最倧倀を蚈算する特別な関数。 XNUMX ぀のリク゚ストでこのような匏を耇数蚘述し、耇数のメトリクスの倀を即座に蚈算できたす。

XNUMX ぀のアプロヌチを比范しおみたしょう。

ClickHouse ぞの移行: 3 幎埌

现郚

ここでは、いく぀かのテスト デヌタ セットに「ディスク デヌタ サむズ」を远加したした。 列の堎合、デヌタ サむズは最小、぀たり最倧の圧瞮ず最倧のク゚リ速床を実珟できたすが、すべおを䞀床に蚘録する必芁があるため、代償が䌎いたす。

配列の堎合は、すべおが少し悪くなりたす。 デヌタは䟝然ずしお十分に圧瞮されおおり、䞍芏則なパタヌンを保存できたす。 しかし クリックハりス - 列型デヌタベヌス。すべおを配列に保存し始めるず、それが XNUMX 行目に倉わり、効率性ず柔軟性を察䟡ずしたす。 どのような操䜜でも、配列党䜓をメモリに読み蟌んでから、その䞭で目的の芁玠を芋぀ける必芁がありたす。配列が倧きくなるず、速床が䜎䞋したす。

このアプロヌチを採甚しおいる䌁業の XNUMX ぀ (たずえば、 ナヌバヌ)、配列は 128 個の芁玠に分割されたす。 200 日あたり 10 TB のデヌタ量を持぀数千のメトリックからのデヌタは、30 ぀のアレむではなく、特別なストレヌゞ ロゞックを備えた XNUMX たたは XNUMX のアレむに保存されたす。

最も簡単なアプロヌチは文字列を䜿甚するこずです。 しかし、デヌタの圧瞮が䞍十分でテヌブル サむズが倧きく、ク゚リが耇数のメトリクスに基づいおいる堎合でも、ClickHouse は最適に動䜜したせん。

ハむブリッド方匏

アレむ回路を遞択したず仮定したしょう。 ただし、ほずんどのダッシュボヌドにはナヌザヌずシステムのメトリクスのみが衚瀺されるこずがわかっおいる堎合は、次の方法でこれらのメトリクスをテヌブル レベルで配列から列に具䜓化するこずもできたす。

CREATE TABLE cpu_alc (
  created_date Date,  
  created_at DateTime,  
  time String,  
  tags_id UInt32,  
  metrics Nested(
    name LowCardinality(String),  
    value Float64
  ),
  usage_user Float64 
             MATERIALIZED metrics.value[indexOf(metrics.name,'usage_user')],
  usage_system Float64 
             MATERIALIZED metrics.value[indexOf(metrics.name,'usage_system')]
) ENGINE = MergeTree(created_date, (tags_id, created_at), 8192);

挿入時 クリックハりス 自動的にカりントされたす。 このようにしお、ビゞネスず喜びを組み合わせるこずができたす。スキヌムは柔軟で䞀般的ですが、最も頻繁に䜿甚される列を抜粋したした。 これにはむンサヌトを倉曎する必芁がないこずに泚意しおください。 ETLこれにより、テヌブルぞの配列の挿入が続行されたす。 やったばかりです 他の机、いく぀かのスピヌカヌを远加し、すぐに䜿い始めるこずができるハむブリッドで高速なスキヌムを入手したした。

コヌデックず圧瞮

のために 時系列 情報量は非垞に倧きくなる可胜性があるため、デヌタをどのように圧瞮するかが重芁です。 で クリックハりス 1:10、1:20、堎合によっおはそれ以䞊の圧瞮効果を実珟するツヌルのセットがありたす。 これは、ディスク䞊の 1 TB の解凍されたデヌタが 50  100 GB を占有するこずを意味したす。 サむズが小さいほど、デヌタの読み取りず凊理が高速になりたす。

高レベルの圧瞮を実珟するには、 クリックハりス は次のコヌデックをサポヌトしおいたす。

ClickHouse ぞの移行: 3 幎埌

テヌブルの䟋:

CREATE TABLE benchmark.cpu_codecs_lz4 (
    created_date Date DEFAULT today(), 
    created_at DateTime DEFAULT now() Codec(DoubleDelta, LZ4), 
    tags_id UInt32, 
    usage_user Float64 Codec(Gorilla, LZ4), 
    usage_system Float64 Codec(Gorilla, LZ4), 
    usage_idle Float64 Codec(Gorilla, LZ4), 
    usage_nice Float64 Codec(Gorilla, LZ4), 
    usage_iowait Float64 Codec(Gorilla, LZ4), 
    usage_irq Float64 Codec(Gorilla, LZ4), 
    usage_softirq Float64 Codec(Gorilla, LZ4), 
    usage_steal Float64 Codec(Gorilla, LZ4), 
    usage_guest Float64 Codec(Gorilla, LZ4), 
    usage_guest_nice Float64 Codec(Gorilla, LZ4), 
    additional_tags String DEFAULT ''
)
ENGINE = MergeTree(created_date, (tags_id, created_at), 8192);

ここでコヌデックを定矩したす ダブルデルタ ある堎合には、もう䞀぀の堎合には - ゎリラ、そしお私たちは間違いなくさらに远加したす LZ4 圧瞮。 その結果、ディスク䞊のデヌタのサむズが倧幅に枛少したす。

ClickHouse ぞの移行: 3 幎埌

これは、異なるコヌデックず圧瞮を䜿甚した堎合に、同じデヌタがどれだけのスペヌスを占めるかを瀺しおいたす。

  • ディスク䞊の GZIP ファむル内。
  • ClickHouse ではコヌデックは䜿甚せず、ZSTD 圧瞮を䜿甚したす。
  • ClickHouse ではコヌデックず圧瞮 LZ4 および ZSTD を䜿甚したす。

コヌデックを含むテヌブルの方が占有するスペヌスがはるかに少ないこずがわかりたす。

サむズの問題

それほど重芁ではない 遞択する 正しいデヌタ型:

ClickHouse ぞの移行: 3 幎埌

䞊蚘のすべおの䟋で䜿甚したのは、 フロヌト64。 でももし私たちが遞んだなら フロヌト32、それならさらに良いでしょう。 これは、䞊蚘のリンク先の蚘事で、Perkona のスタッフによっおよく実蚌されおいたす。 タスクに適した最もコンパクトなタむプを䜿甚するこずが重芁です。ク゚リ速床よりもディスク サむズが小さい堎合でも同様です。 クリックハりス これには非垞に敏感です。

ご利甚いただければ intxnumx 代わりに intxnumxそうするず、ほが XNUMX 倍のパフォヌマンスの向䞊が期埅できたす。 デヌタが占有するメモリが少なくなり、すべおの「挔算」がより高速に実行されたす。 クリックハりス 内郚的には非垞に厳密に型指定されたシステムであり、最新のシステムが提䟛するすべおの可胜性を最倧限に掻甚したす。

集蚈ず マテリアラむズドビュヌ

集蚈ビュヌずマテリアラむズド ビュヌを䜿甚するず、さたざたな堎合に集蚈を䜜成できたす。

ClickHouse ぞの移行: 3 幎埌

たずえば、非集蚈の゜ヌス デヌタがある堎合、特別な゚ンゞンによる自動集蚈を䜿甚しお、さたざたなマテリアラむズド ビュヌをそれらのデヌタにアタッチできたす。 サミングマヌゞツリヌ (SMT). SMT 集蚈を自動的に蚈算する特別な集蚈デヌタ構造です。 生デヌタがデヌタベヌスに挿入され、自動的に集玄され、その䞊でダッシュボヌドをすぐに䜿甚できるようになりたす。

TTL - 叀いデヌタを「忘れる」

䞍芁になったデヌタを「忘れる」にはどうすればよいでしょうか? クリックハりス これを行う方法を知っおいたす。 テヌブルを䜜成するずきに指定できるのは、 TTL 匏: たずえば、分単䜍のデヌタは 30 日分、日単䜍のデヌタは XNUMX 日間保存し、週単䜍たたは月単䜍のデヌタには䞀切觊れないようにしたす。

CREATE TABLE aggr_by_minute


TTL time + interval 1 day

CREATE TABLE aggr_by_day


TTL time + interval 30 day

CREATE TABLE aggr_by_week


/* no TTL */

倚局 - デヌタをディスク間で分割する

この考え方をさらに進めるず、デヌタは次のように保存できたす。 クリックハりス さたざたな堎所で。 先週のホット デヌタを非垞に高速なロヌカル サヌバヌに保存したいずしたす。 SSD、さらに過去のデヌタを別の堎所に眮きたす。 で クリックハりス これが可胜になりたした:

ClickHouse ぞの移行: 3 幎埌

ストレヌゞ ポリシヌを構成できたす (ストレヌゞポリシヌ それで クリックハりス 特定の条件に達するず、デヌタを別のストレヌゞに自動的に転送したす。

しかし、それだけではありたせん。 特定のテヌブルのレベルで、デヌタがい぀コヌルド ストレヌゞに保存されるかを正確に定矩できたす。 たずえば、デヌタは非垞に高速なディスクに 7 日間保存され、叀いものはすべお䜎速なディスクに転送されたす。 これは、コストを管理し、コヌルド デヌタにお金を無駄に費やさずに、システムを最倧のパフォヌマンスに維持できるため、優れおいたす。

CREATE TABLE 
... 
TTL date + INTERVAL 7 DAY TO VOLUME 'cold_volume', 
    date + INTERVAL 180 DAY DELETE

ナニヌクな機胜 クリックハりス

ほがすべおにおいお クリックハりス このような「ハむラむト」はありたすが、他のデヌタベヌスにはない独占性によっお盞殺されたす。 たずえば、次のようなナニヌクな機胜がありたす。 クリックハりス:

  • 配列。 で クリックハりス 配列に察する非垞に優れたサポヌトず、それらに察しお耇雑な蚈算を実行する機胜。
  • デヌタ構造の集玄。 これは「キラヌ機胜」の XNUMX ぀です。 クリックハりス。 Yandex の担圓者はデヌタを集玄したくないず蚀っおいたすが、すべおが集玄されおいたす。 クリックハりス、速くお䟿利だからです。
  • マテリアラむズドビュヌ。 デヌタ構造の集玄ず䜵せお、マテリアラむズド ビュヌを䜿甚するず、䟿利なデヌタ構造を実珟できたす。 ぞの 集玄。
  • クリックハりスSQL。 これは蚀語拡匵機胜です SQL でのみ利甚できるいく぀かの远加および独占機胜を備えおいたす。 クリックハりス。 以前は、䞀方では拡倧、他方では䞍利のような状況でした。 これたでず比べおほがすべおの欠点が解消されたした。 SQL 92 それを削陀したした。今は単なる拡匵機胜です。
  • ラムダ–匏。 それらはただデヌタベヌスにありたすか?
  • ML-サポヌト。 これはさたざたなデヌタベヌスで利甚できたすが、より優れたデヌタベヌスもあれば、より劣ったデヌタベヌスもありたす。
  • オヌプン゜ヌス。 拡匵できる クリックハりス 䞀緒に。 今 クリックハりス 寄皿者は玄 500 名で、この数は増え続けおいたす。

トリッキヌなク゚リ

В クリックハりス 同じこずを行うのにさたざたな方法がありたす。 たずえば、次の XNUMX ぀の異なる方法でテヌブルから最埌の倀を返すこずができたす。 CPU (XNUMX 番目もありたすが、さらに゚キゟチックです)。

最初のものは、それがいかに䟿利かを瀺しおいたす クリックハりス それを確認したいずきのク゚リ タプル サブク゚リに含たれたす。 これは私が個人的に他のデヌタベヌスでは本圓に芋逃しおいたものです。 䜕かをサブク゚リず比范したい堎合、他のデヌタベヌスではスカラヌのみを比范できたすが、いく぀かの列に぀いおは次のように蚘述する必芁がありたす。 登録。 で クリックハりス タプルを䜿甚できたす:

SELECT *
  FROM cpu 
 WHERE (tags_id, created_at) IN 
    (SELECT tags_id, max(created_at)
        FROM cpu 
        GROUP BY tags_id)

XNUMX 番目のメ゜ッドは同じこずを行いたすが、集蚈関数を䜿甚したす。 argMax:

SELECT 
    argMax(usage_user), created_at),
    argMax(usage_system), created_at),
...
 FROM cpu 

В クリックハりス 集蚈関数は数十あり、コンビネヌタを䜿甚するず、組み合わせの法則によれば、玄 XNUMX 個の集蚈関数が埗られたす。 ArgMax - 最倧倀を蚈算する関数の XNUMX ぀: リク゚ストは倀を返したす。 䜿甚状況_ナヌザヌ、最倧倀に達したす created_at:

SELECT now() as created_at,
       cpu.*
  FROM (SELECT DISTINCT tags_id from cpu) base 
  ASOF LEFT JOIN cpu USING (tags_id, created_at)

ア゜フ結合 — 異なる時間の行を「接着」したす。 これはデヌタベヌス固有の機胜であり、 kdb +。 時間が異なる XNUMX ぀の時系列がある堎合、 ア゜フ結合 XNUMX ぀のリク゚ストでそれらを移動およびマヌゞできたす。 䞀方の時系列の各倀に぀いお、もう䞀方の時系列で最も近い倀が怜玢され、それらが同じ行に返されたす。

ClickHouse ぞの移行: 3 幎埌

分析関数

暙準では SQL-2003 次のように曞くこずができたす:

SELECT origin,
       timestamp,
       timestamp -LAG(timestamp, 1) OVER (PARTITION BY origin ORDER BY timestamp) AS duration,
       timestamp -MIN(timestamp) OVER (PARTITION BY origin ORDER BY timestamp) AS startseq_duration,
       ROW_NUMBER() OVER (PARTITION BY origin ORDER BY timestamp) AS sequence,
       COUNT() OVER (PARTITION BY origin ORDER BY timestamp) AS nb
  FROM mytable
ORDER BY origin, timestamp;

В クリックハりス それはできたせん - 暙準をサポヌトしおいたせん SQL-2003 そしおおそらくそれは決しおしないだろう。 代わりに、 クリックハりス 次のように曞くのが䞀般的です。

ClickHouse ぞの移行: 3 幎埌

ラムダを玄束したした - ここにありたす!

これは、暙準の分析ク゚リに䌌おいたす。 SQL-2003: 圌は XNUMX ぀の違いを数えたす タむムスタンプ、期間、序数 - 私たちが通垞分析関数を考慮するすべおのもの。 で クリックハりス 配列を通じおそれらをカりントしたす。最初にデヌタを配列に折りたたみ、その埌配列に察しお必芁なこずをすべお実行し、それを展開しお戻したす。 あたり䟿利ではなく、少なくずも関数型プログラミングの知識が必芁ですが、非垞に柔軟です。

特別な機胜

さらに、 クリックハりス 倚くの特殊な機胜。 たずえば、同時に実行されおいるセッションの数を確認するにはどうすればよいでしょうか? 䞀般的な監芖タスクは、XNUMX ぀のリク゚ストでの最倧負荷を決定するこずです。 で クリックハりス この目的のために特別な関数がありたす。

ClickHouse ぞの移行: 3 幎埌

䞀般に、ClickHouse にはさたざたな目的のための特別な機胜がありたす。

  • runningDifference、runningAccumulate、neighbor;
  • sumMap(キヌ, 倀);
  • timeSeriesGroupSum(uid, タむムスタンプ, 倀);
  • timeSeriesGroupRateSum(uid, タむムスタンプ, 倀);
  • skewPop、skewSamp、kurtPop、kurtSamp;
  • 䞭綿入り/ネクタむ付き。
  • simpleLinearRegression、stochasticLinearRegression。

これは関数の完党なリストではなく、合蚈で 500  600 ありたす。 ヒント: のすべおの関数 クリックハりス システム テヌブルにありたす (すべおが文曞化されおいるわけではありたせんが、すべお興味深いものです)。

select * from system.functions order by name

クリックハりス それ自䜓に関する倚くの情報が保存されおいたす。 ログテヌブル, ク゚リログ、トレヌス ログ、デヌタ ブロックを䜿甚した操䜜のログ (パヌトログ)、メトリクス ログ、およびシステム ログ。通垞、これらはディスクに曞き蟌たれたす。 ログメトリクスは 時系列 в クリックハりス 実際には クリックハりス: デヌタベヌス自䜓が圹割を果たすこずができたす 時系列 デヌタベヌスを「食い荒らす」こずになりたす。

ClickHouse ぞの移行: 3 幎埌

これもナニヌクなこずです - 私たちは良い仕事をしおいるので、 時系列、なぜ私たちは必芁なものをすべお自分の䞭に保管できないのでしょうか 私たちは必芁ずしおいない プロメテりス、私たちはすべおを自分自身に保ちたす。 接続枈み グラファナ そしお私たちは自分自身を監芖したす。 ただし、 クリックハりス 萜ちおも理由が​​分からないので、通垞はそんなこずはしたせん。

倧きなクラスタヌたたは倚数の小さなクラスタヌ クリックハりス

XNUMX ぀の倧きなクラスタヌず倚数の小さな ClickHouse ではどちらが優れおいたすか? 埓来のアプロヌチ DWH 回路がアプリケヌションごずに割り圓おられる倧芏暡なクラスタヌです。 私たちはデヌタベヌス管理者に盞談し、図を芋せおもらいたした。するず、次の図をくれたした。

ClickHouse ぞの移行: 3 幎埌

В クリックハりス 別の方法で行うこずもできたす。 各アプリケヌションを独自に䜜成できたす クリックハりス:

ClickHouse ぞの移行: 3 幎埌

巚倧な怪物はもう必芁ありたせん DWH そしお手に負えない管理者。 各アプリケヌションに独自のものを䞎えるこずができたす クリックハりス開発者は自分でそれを行うこずができたす。 クリックハりス むンストヌルは非垞に簡単で、耇雑な管理は必芁ありたせん。

ClickHouse ぞの移行: 3 幎埌

でも、たくさん持っおいたら クリックハりス頻繁にむンストヌルする必芁がある堎合は、このプロセスを自動化したいず考えたす。 このために、たずえば、次のように䜿甚できたす。 Kubernetes О クリックハりス-オペレヌタヌ。 で Kubernetes クリックハりス 「オンクリック」ず蚀い換えるこずもできたす。ボタンをクリックしおマニフェストを実行するず、デヌタベヌスの準備が敎いたす。 すぐに図を䜜成し、そこにメトリクスのアップロヌドを開始するず、5 分でダッシュボヌドが完成したす。 グラファナ。 ずおも簡単です

その結果は

このように、 クリックハりス - これ

  • すばやく。 これは誰もが知っおいたす。
  • ただ。 少し議論の䜙地がありたすが、蚓緎では難しく、戊闘では簡単だず私は考えおいたす。 やり方がわかれば クリックハりス それが機胜すれば、すべおが非垞に簡単になりたす。
  • 普遍的に。 さたざたなシナリオに適しおいたす。 DWH、時系列、ログストレヌゞ。 そうではありたせん OLTP したがっお、そこで短い挿入や読み取りを実行しないでください。
  • おもしろいこずに。 おそらく䞀緒に働いおいる人でしょう クリックハりス、良い意味でも悪い意味でも面癜い瞬間をたくさん経隓させおいただきたした。 たずえば、新しいリリヌスがリリヌスされた埌、すべおが機胜しなくなっおしたいたした。 あるいは、あるタスクに XNUMX 日間苊劎しおいたしたが、Telegram チャットで質問した埌、そのタスクは XNUMX 分で解決したずきもありたす。 あるいは、レシャ・ミロノィドフ氏の報告䌚芋でのスクリヌンショットのように、 クリックハりス 攟送を䞭断した HighLoad ++。 このようなこずは垞に起こり、私たちの生掻を困難にしおいたす。 クリックハりス 明るくお面癜い

プレれンテヌションをご芧いただけたす ここで.

ClickHouse ぞの移行: 3 幎埌

埅望の高負荷システム開発者䌚議が開催されたした。 HighLoad ++ 9月10日ずXNUMX日にスコルコボで開催される。 最埌に、HighLoad++ の゚ネルギヌをオンラむンでパッケヌゞ化するこずはできないため、これはオフラむン カンファレンスになりたす (すべおの予防措眮を講じた䞊で)。

カンファレンスでは、テクノロゞヌの最倧の機胜に関する事䟋を芋぀けお玹介したす。HighLoad++ は、Facebook、Yandex、VKontakte、Google、Amazon がどのように機胜するかを XNUMX 日間で孊べる唯䞀の堎所です。

2007幎から継続的に開催しおおり、今幎で14回目ずなりたす。 この間、カンファレンスは 10 倍に成長し、昚幎の䞻芁な業界むベントには 3339 人の参加者、165 人の講挔者、レポヌトやミヌトアップが集たり、16 のトラックが同時に実行されたした。
昚幎はバスが20台、お茶ずコヌヒヌが5280リットル、フルヌツドリンクが1650リットル、氎が10200本あった。 さらに2640キログラムの食料、16枚の皿ず000個のカップ。 ちなみに、再生玙から集めたお金で、25本のオヌクの苗朚を怍えたした:)

チケットを賌入できたす ここで、カンファレンスに関するニュヌスを入手 - ここで、すべおの゜ヌシャル ネットワヌクで話したす。 Telegram, Facebook, Vkontakte О Twitter.

出所 habr.com

コメントを远加したす