注目キーワード
  1. 技術
  2. 広告
  3. IDFA
  4. PHP
  5. WordPress

【2020年版】ClickHouseのメリットデメリットまとめ

ClickHouseとは

ClickHouseは、オープンソースの列指向のデータベース管理システム / DBMS(database management system)です。 ロシアのIT企業Yandex社(Yandex社はロシア最大の検索エンジンを構築する企業です)によって、開発が進められています。ClickHouseは、主に集計などに最適化されたカラム指向型データベースで、容量削減と高速化が期待できるシステムになっています。

・ライセンス: Apache License 2.0
・使用言語: C++
・安定版(2020.08.17現在): v20.3.15.133 / 2020年7月27日
・オペレーティング システム: Linux, FreeBSD, macOS
・デベロッパー: Yandex
・リリース: 2016年6月15日

上記に記載をしましたが、4年前にリリースされ、この数年で採用する企業が増えています。ビックデータの集計、分析におけるパフォーマンスの高さが特徴的なデータベースと言えるでしょう。OSSなので、ソースはこちらにあがっています。
https://github.com/ClickHouse/ClickHouse

ClickHouseの特徴

いくつかピックアップすると、このあたりが特徴にあがります。

<メリット>
・大量のデータを高速に処理できる
・豊富なテーブルエンジンがある
・データの圧縮性能が高い
・学習コストが少ない
・運用時はマルチマスターにすると良い
・データ型はひと通り揃っているので移行しやすい

<デメリット>
・トランザクションを使う処理は不得意
・データの更新削除が気軽にできない
・個別登録が若干遅いので、実装に注意
・joinができない
・ドキュメントは英語のものを見るべし

具体的に1つ1つ特徴を見てみたいと思います。

ClickHouseのメリット

大量のデータを高速に処理できる

大量のデータの読み込み、集計する処理については、最適化されたデータベースになっているので、爆速です。例えば、MySQLで数分かかっていたクエリも3秒になりました。

ClickHouseは、SELECT(データ検索)、GROUP BY(データ集計)、INSERT(大量データの一括登録)を得意としてますので、大量のデータを集計するなら、MySQLと比較すると、ClickHouseの方が圧倒的に速いです。

公式ページにMySQL、VerticaやInfoBrightなどのカラム指向型DB・Hiveとのベンチマークを掲載しておりますが、ほとんどのケースで優れており、高速に処理できることが分かると思います。
https://clickhouse.yandex/benchmark.html

さらに、レポート集計でよく使うSUM関数、AVG関数やGROUPBY句でのパフォーマンスも良く、集計することに特化しているので、試してみるべきです。

国内の他社事例だと、ジーニーの広告配信プラットフォームで導入されており、配信レポート用のデータ処理に活用したところ速度が1000倍に向上した事例があるようです。
https://geniee.co.jp/blog/2017/07/20/1825/

このような高速処理の裏側には、スキャンする性能が高いことが理由の1つに挙げられます。環境によって差はあると思いますが、SummingMergeTreeエンジンを使用した場合、スキャン性能が3億行/s、9GB/sのパフォーマンスが出ました。
他にも、ベンチマークやパフォーマンスについて、取り上げた記事がありますので、記載しておきます。
https://altinity.com/benchmarks/
https://clickhouse.tech/docs/en/introduction/performance/

このように、ClickHouseは大規模データに特化して、すごく処理が速いことで有名なので、選択肢の1つとして考えてみるべきでしょう。

豊富なテーブルエンジンがある

豊富なテーブルエンジンがあることもClickHouseの特徴の1つです。いくつかピックアップしてみたいと思います。

  • MergeTree
  • ReplacingMergeTree
  • SummingMergeTree
  • AggregatingMergeTree
  • CollapsingMergeTree
  • VersionedCollapsingMergeTree
  • GraphiteMergeTree

パフォーマンスにおいても、用途に合わせて、様々なテーブルがあります。20種類のテーブルエンジンがあり、CREATE TABLE時に最適なエンジンを選んで、テーブルを作成します。

INSERTするときに、SUM関数やAVG関数などをその時に計算してくれるテーブル(Aggregatingmergetree)もありますので、

https://clickhouse.tech/docs/en/engines/table-engines/mergetree-family/aggregatingmergetree/

利用シーンに合わせたテーブルを選ぶようにしましょう。

データの圧縮性能が高い

データサイズがかなり小さく抑えられます。カラム指向型データベースなので圧縮率が高いのですが、カラムごとで列でデータを保存するので、同じデータ、似たデータ、空データが重複してるとデータを圧縮してくれます。一方で、ランダムな文字列が連続するデータだと、あまり圧縮されません。検証で試したときには、MySQLに比べて、ストレージ使用量が10分の1になりました。圧縮率については、テーブルがまとまってると、原理上圧縮されやすくなりますが、分散してテーブルを作る運用方法が一般的なので、他のサイトだと、13分の1になったという記事もあったので、圧縮率は運用の仕方で変わってきます。ちなみに、検証時は、Mergeテーブルを使って、1つのテーブルを100テーブルに分散して確認をしました。

学習コストが少ない

MySQLとほぼ同じ構文なので、導入コストは低いです。SELECT句やGROUPBY句はもちろん、基本的な構文は同じなので、MySQLを触ったことのある人であれば、すぐに慣れると思います。私は普段、MySQLをメインで使用していますが、変な癖もないため、特に苦戦することなく使えています。

運用時はマルチマスターにすると良い

ClickHouseのレプリケーション構成ですが、マルチマスターで構築することができます。詳しい設定方法は、別の記事で紹介しますが、ClickHouseのレプリケーションの設定はテーブル単位で設定できます。Zookeeperという大規模分散システムでよく利用される設定情報の集中管理を行なうシステムがあるのですが、こちらを利用します。分散構成をするテーブルの情報を格納して、各サーバがZookeeperにクエリごとにキューを溜めており、該当のクエリがあれば、対象のサーバで実行する挙動をします。

ちなみに、レプリケーションをするには、レプリケーションテーブルエンジンでテーブルを作成する必要があり、ReplicatedMergeTreeを使う必要があります。このテーブルエンジンで作成することによって、レプリケーションを貼ることができます。

データ型はひと通り揃っているので移行しやすい

MySQLでよく使うデータ型は全て揃っているので、使いやすいと思います。詳しくは公式ドキュメントを参照してみてください。私は、扱っているデータの特性上、小数点は、float型ではなく、decimal型を使っているのですが、問題なく対応できていました。

https://clickhouse.tech/docs/en/sql-reference/data-types/

デメリット

トランザクションを使う処理は不得意

ClickHouseは、UPDATEなどの更新処理は得意としていないため、トランザクションを使う処理には向いていません。もし頻繁に更新のかかるケースがあるようでしたら、管理しにくい設計になることもありますので、ClickHouseを使わない選択肢もありだと思います。

データの更新削除が気軽にできない

ClickHouseは、データ更新(Update)ができません。また、個別のデータ削除(Delete)も得意としておらず、削除する場合は、データパーティションを削除のほうが良いです。ログ系データのデータベースとしての用途は適しているのですが、パーティションやテーブル設計をうまく考えないと、運用時に管理が大変になりますので、しっかりと考えておきましょう。レポートデータを扱うテーブルだと、dateでパーティションが作れるので削除が楽です。

ちなみに、UNIQUEキー制約による重複データを防ぐことはできないので、必要な場合は、データ挿入時に、ユニーク値にしてからデータを入れるなどの対応が必要です。

個別登録は遅いので、実装に注意

個別データ登録(Insert)が少し遅いので、データを挿入するときはまとめて登録したほうがいいです。

JOINができない

MySQLのように、JOINができません。複数のテーブルをJOINする場合はネストで対応しないといけません。

ドキュメントは英語のものを見るべし

オープンソースですが開発もかなり進んでおり、今後も注目されていくでしょう。ただ、日本語訳は機械翻訳したものが多くあり、十分に整っているとは言えないので、キャッチアップする際は、英語のドキュメントを見るようにした方が無難です。

性能を上げるにはどうすべきか。

スケールアップ

クエリの実行速度をあげたいときは、cpuコア数を増やすとよいです。複数コアで並列に実行できるようになるため、高速になります。同時のクエリ呼び出し数が増えてきたときは、比例してメモリを増やすとよいです。データキャッシュもされていくので、同じようなクエリが実行される環境ではメモリを増やすことが効果的です。

クエリの高速化

ClickHouseでは、ORDERBYがすごく重要な句になります。CREATE TABLE時にORDERBYを指定できるのですが、このORDERBYには、GROUPBYで使うカラムを指定すると、クエリが高速になります。こうすると、データ登録時に、指定したカラムで順にソートされて保存されるので、検索も早いです。

例を挙げると、

CREATE TABLE テーブル名 (
     id String,
     site_id String,
     name String,
     date Date
)
ENGINE = MergeTree()
ORDER BY (date, id, site_id); 

このようなテーブルを作成すると、「date, id, site_id」順でデータがソートされた状態でデータが保存されます。そのため、データを参照した場合のクエリがとても高速になります。

まとめ

開発がまだまだ進んでいるので、今後、機能追加や改善が進んでいくと思います。今回紹介したClickHouseは、集計などに最適化されたデータベースになので、MySQLでスタートしたけど集計が遅くなっていて、画面表示が劇重な環境には適していると思います。実際、数分かかっていた処理が3秒で終わったときは感動しました。用途次第だと思いますが、ぜひ選択肢の1つにしてみてください。