## Memo ## Memo with LLM ## ClickHouseのアーキテクチャ:ストレージ層とクエリ処理層 ClickHouseは、ペタバイト規模のデータセットに対する高速な分析クエリ処理に特化した、オープンソースの列指向OLAPデータベースです。そのアーキテクチャは、高速なデータ取り込みとクエリ処理を実現するために最適化されており、特にストレージ層とクエリ処理層のデザイン目標と利点は以下の通りです。 ### ストレージ層 #### 設計目標 ClickHouseのストレージ層は、**巨大なデータセットと高いデータ取り込み率**、**多様なデータストア、ストレージロケーション、フォーマット**への対応、そして**業界レベルの堅牢性と多様な展開**を目標に設計されています。 #### 利点と特徴 * **MergeTree* エンジンファミリー:** ClickHouseの主要な永続フォーマットは、LSMツリーの概念に基づいたMergeTree* エンジンファミリーです。データは水平方向にソートされた不変のパーティションに分割され、バックグラウンドプロセスによって継続的にマージされます。この構造により、効率的なインデックス作成と圧縮が可能になり、巨大なデータセットを効率的に管理できます。 * **データプルーニング:** ClickHouseは、検索時に大部分の行をスキップできるようにする3つのデータプルーニング技術をサポートしています。プライマリキーインデックス、テーブルプロジェクション、スキッピングインデックスにより、クエリ処理の大幅な高速化を実現します。 * **マージ時のデータ変換:** ClickHouseは、既存のデータを継続的に変換する様々なマージ戦略を提供しています。集計マージ、置換マージ、TTLマージにより、履歴データのボリューム削減、最新データの保持、データの有効期限管理などを効率的に行えます。 * **更新と削除:** ClickHouseは、主に追記型のワークロードに最適化されていますが、ミューテーションや軽量削除という2つの方法で既存データの変更に対応しています。ミューテーションはテーブル全体を書き換える方法で、軽量削除は削除された行を示すビットマップ列を更新する方法です。 * **冪等性のある挿入:** ClickHouseは、ハッシュベースの重複排除メカニズムを採用することで、クライアントが接続タイムアウト後にデータを再送しても重複挿入を回避できる冪等性のある挿入をサポートしています。 * **データレプリケーション:** ClickHouseは、高可用性を実現するために、[[Raft]]コンセンサスに基づくマルチマスタ調整スキームを使用して、テーブルのシャーディングとレプリケーションをサポートしています。 * **ACID準拠:** ClickHouseは、同時実行性とパフォーマンスを最大化するために、クエリの実行時にすべてのテーブルのすべてのパーティションのスナップショットを使用します。これにより、同時実行されるINSERTやマージの影響を受けずにクエリを実行できます。ただし、ClickHouseの書き込み集中型のユースケースでは、新しいデータの損失のリスクが許容されることが多く、ClickHouseはデフォルトで新しいパーティションのディスクへのコミットを強制しないことで、原子性を犠牲にしてカーネルによる書き込みのバッチ処理を可能にしています。 ### クエリ処理層 #### 設計目標 ClickHouseのクエリ処理層は、**低レイテンシ**、**多くの同時実行クエリ**、**パフォーマンスのイントロスペクションをサポートする便利なクエリ言語**を目標に設計されています。 #### 利点と特徴 * **ベクトル化実行モデル:** ClickHouseは、MonetDB/X100と同様のベクトル化実行モデルを採用し、仮想関数呼び出しのオーバーヘッドを最小限に抑えるために、演算子間で複数の行(データチャンク)を生成、受け渡し、消費します。 * **マルチコア並列処理:** ClickHouseは、SQLクエリを物理プラン演算子の有向グラフに変換し、設定可能なワーカースレッド数(デフォルトではコア数)とソーステーブルサイズに基づいて、独立した実行レーンに展開します。レーンは、並列演算子によって処理されるデータを重複しない範囲に分割します。 * **マルチノード並列処理:** クエリのソーステーブルがシャーディングされている場合、クエリを受信したノード(イニシエータノード)のクエリオプティマイザは、可能な限り多くの作業を他のノードで実行しようとします。他のノードからの結果は、クエリプランのさまざまなポイントに統合できます。 * **全体的なパフォーマンス最適化:** ClickHouseは、クエリの各段階で様々なパフォーマンス最適化技術を採用しています。クエリの最適化、クエリのコンパイル、プライマリキーインデックスの評価、データスキップ、ハッシュテーブル、結合などの技術により、クエリの実行速度を大幅に向上させています。 * **ワークロード分離:** ClickHouseは、同時実行制御、メモリ使用量制限、I/Oスケジューリングを提供し、ユーザーがクエリをワークロードクラスに分離できるようにします。特定のワークロードクラスの共有リソース(CPUコア、DRAM、ディスク、ネットワークI/O)に制限を設定することで、これらのクエリが他の重要なビジネスクエリに影響を与えないようにします。 ### 統合層 #### 設計目標 ClickHouseの統合層は、**多様なデータストア、ストレージロケーション、フォーマット**への対応を目標に設計されています。 #### 利点と特徴 * **外部接続:** ClickHouseは、外部システムやストレージロケーションとの接続のために、50以上の統合テーブル関数とエンジンを提供しています。ODBC, [[MySQL]], [[PostgreSQL]], SQLite, [[Kafka]], Hive, [[MongoDB]], [[Redis]], [[S3]]/GCP/Azureオブジェクトストア、様々なデータレイクなど、幅広いシステムに対応しています。 * **データフォーマット:** ClickHouseは、ネイティブフォーマットに加えて、CSV、JSON、Parquet、Avro、ORC、Arrow、Protobufなど、90以上のフォーマットをサポートしています。各フォーマットは、ClickHouseが読み取ることができる入力フォーマット、ClickHouseがエクスポートできる出力フォーマット、またはその両方にすることができます。 * **互換性インターフェース:** ClickHouseは、ネイティブバイナリワイヤプロトコルとHTTPに加えて、MySQLまたはPostgreSQLワイヤプロトコル互換インターフェースを介してクライアントと対話できます。 ### まとめ ClickHouseは、ストレージ層とクエリ処理層の設計目標と利点によって、ペタバイト規模のデータセットに対する高速な分析処理を実現しています。そのアーキテクチャは、高可用性、スケーラビリティ、パフォーマンス、そして外部システムとの統合に重点を置いて設計されており、現代のデータ分析ニーズに対応する強力なツールとなっています。 ## Abstract 過去数十年にわたり、保存および分析されるデータの量は指数関数的に増加しています。あらゆる業界の企業が、製品改善、パフォーマンス評価、ビジネス上重要な意思決定を行うために、このデータに依存するようになってきました。しかし、データ量がインターネット規模にまで増加するにつれ、企業は、多数の同時クエリを使用して分析を行い、リアルタイムの待ち時間(ユースケースによっては1秒未満)を想定しながら、コスト効率が良く拡張性のある方法で、履歴データと新規データを管理する必要が出てきました。 本稿では、ペタバイト規模のデータセットを高速に取り込み、高性能な分析を行うことを目的として設計された人気の高いオープンソースの OLAP データベースである ClickHouse の概要を紹介します。 そのストレージ層は、従来のログ構造マージ([[LSM-tree]])に基づくデータ形式と、バックグラウンドで履歴データを継続的に変換(集約、アーカイブなど)するための新しい技術を組み合わせています。クエリは便利なSQL方言で記述され、オプションでコードのコンパイルが可能な最先端のベクトル化クエリ実行エンジンで処理されます。ClickHouseは、クエリで無関係なデータの評価を回避するために、枝刈り技術を積極的に利用しています。他のデータ管理システムは、テーブル機能、テーブルエンジン、またはデータベースエンジンレベルで統合することができます。現実のベンチマークでは、ClickHouseが市場で最も高速な分析データベースのひとつであることが実証されています。