
2026/06/16 5:51
オープンソース版ClickHouseの10年
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
ClickHouse は、世界で最も人気のあるオープンソース分析データベースとして確立されており、初期のプロトタイプから市場リーダーへと進化を遂げてきました。Postgres などの既存システムの上に構築されるのではなく、すべてゼロから独自に設計されたアーキテクチャにより、毎日数百十億件のレコードを高パフォーマンスで保存・処理することが可能となっています。本システムは 2008 年にウェブ分析タスク向けの MySQL と同時に開始され、OLAPServer および Metrage というプロトタイプを経て、2012 年 3 月 9 日付でのサーバーリリースといった主要なマイルストーンを順に達成し発展しました。その成長を支える技術革新には、インメモリ列、進化した LZ4 圧縮(QuickLZ から発展したものであり)、そして増分ソートおよびバックグラウンドマージを導入した MergeTree エンジンが含まれます。分散コンセンサスは、2012 年に加入した社員第 2 号であるマイケル・コロパエフが導入しました。2014 年から始まった内部利用を経て数年が経過した後、リーダーシップは 2016 年 6 月 15 日にソースコードを正式に公開する決断を行いました。これは潜在的なリスクと利点を慎重に評価し、かつ成功したプライベート利用実績を確認した上でなされた戦略的選択であり、業界全体での採用拡大を促進しながらも、そのカスタムエンジニアリングによって特徴づけられていた専門的なパフォーマンス最適化を維持することを可能にしました。
本文
ClickHouse 開発史:オープンソース化とプロジェクトの進化
ClickHouse は 2016 年 6 月 15 日に公開され、すでに歴史のあるプロジェクトです。現在では 2,000 名を超えるコントリビューターによって支えられ、最も人気のあるオープンソース分析データベースとして成長しています。
オープンソースの「レベル」と ClickHouse の目標
オープンソースプロジェクトには、貢献の受け入れ方や透明性の面で異なる成熟段階(レベル)が存在します。ClickHouse は以下の「最大のレベル」を目指して開発されています:
- レベル 0: コード公開のみ。アーカイブや博物館的な状態(例:Doom、MS-DOS)。
- レベル 1: リポジトリへのコミットはあるが、コントリビューターの提案を受け入れない場合がある(例:SQLite、Ladybird)。
- レベル 2: 貢献は受け付けるが、開発プロセスの透明性が低い状態。現在活発なプロジェクトの多くがここにある。
- レベル 3(目指すべき最上級):
- 公開されたコントリビューションガイドライン
- タスク追跡システムとコードレビュー体制
- 開発ロードマップ、テスト・CI システム、リリースサイクル
- ユーザーサポートおよび包括的なドキュメント
ClickHouse は以下の点において、この「最高のモデル」を示すことを目指しています:
- 素晴らしいデータベースの構築方法:
- モジュール化され、正交性が高く、丁寧なドキュメントが付けられたコードを心がけています。
- 複雑な概念もコメントで丁寧に説明し、外部リソース(教科書や AI など)に頼らず理解できるようにします。
- C++ 開発を学ぶのに適した場所:
- C++23 などの最先端技術だけでなく、ビルドシステムや CI テストなど「地味だが重要な部分」も学べます。
- データ構造やパフォーマンス最適化のための実験の場:
- プルリクエストを通じた実験的な提案(新しいメモリ管理、圧縮ライブラリ、アルゴリズム等)を受け付けています。
- ロードマップにも実験的なアイデアや荒唐無稽な案を含めるなど、創造性をサポートしています。
- あなたの成果に誇りを抱ける場所:
- 変更ログや
テーブルで全てのコントリビューターにクレジットを与えます。system.contributors - コントリビュータの初期実装を共同で完成させ、必要であれば前向きに再設計も支援します。
- 最初の著者へのクレジットは必ず付与し、あなたのユースケースと意図を大切にしています。
- 変更ログや
プロトタイプから ClickHouse への進化
起点:パフォーマンス課題からの出発
- 最初のコミット(2009 年 5 月 29 日):
、localtime
、mktime
などの低速なライブラリ関数を代替する最適化のために行われました。gmtime
- 背景:
- Google Analytics に似たウェブ分析システムのデータ処理を担当していました。
- MySQL で事前集計レポートを格納し、C++ カスタムデータ構造でリアルタイム計算を行っていました。
- 「ログが増え続ける中での遅延防止」が最大の課題でした。
技術的探索とプロトタイプの開発
データの増加に対応するため、数多くの解決策を検討しました:
- TokuDB や LMDB などの既存ストレージの検討
- Hadoop やデータ圧縮アルゴリズム(LZO, QuickLZ)の研究
- HyperLogLog の MySQL BLOB 内での利用実験
さらに、ユーザーアクションの詳細な追跡機能も追加:
- クリックヒートマップやクリックマップの実装(Flash アネオグリフカラー使用)。
- 任意のレポート構築が可能にする自由さを提供。
カラム指向データベースへの転換
未集計だが構造化されたログデータを即時に処理する必要性から、カラム指向データベースの調査を開始:
- 複数の MySQL エンハンメント(Infobright, InfiniDB)や独立系分析 DBMS(Vertica, MonetDB など)を試験。
- 課題: 1 日間に 1000 億レコード以上、500 コラムを持つデータのロードにおいて既存システムは失敗したため、カスタムデータ構造のプロトタイプを実装。
- データを単一のバイナリファイルに格納(XFS ファイルシステム使用)。
- XML で記述されたクエリによる集計・フィルタ・ソート機能の実現。
- 非集計化された履歴データからの整合性確保(同僚の Evgenii Gatov が解決)。
プロトタイプ 1: OLAPServer (2008.12)
- フロントエンドとデザインも自らが担当。
- グローバルなインターネットデータ分析への対応に成功。
- 既存システム(MapReduce など)より瞬時回答を提供し、統計部門から採用されるに至る。
プロトタイプ 2: Metrage (2009.01)
- 事前集計レポートの置換とリアルタイム更新を目指し開発。
- 課題: MySQL の非圧縮データと順序不一致により読み込みが遅かったため、LevelDB / TokuDB 調査。
- 解決: 増分集計のためのカスタムデータ構造を実装。
- レコード定義には独自の C++ Struct(CRDT 表現)を使用。
、add
、update
、merge
/serialize
メソッドを持つ。deserialize- 読込時におけるマージによる最終データの生成。
ClickHouse の誕生:
- カラム指向による集計高速化と、リアルタイム更新のためのマージツリーを結合。
- より一般化された真のクエリ言語とデータ型を受け入れることで、ゼロから完全に実装された新しい DBMS が生まれました。
ClickHouse コードベースの初期実装詳細
最初のコミットはモノリポジトリ内での最適化でしたが、オープンソース化時に分割されながら歴史が保存されています。主要な実装ステップは以下の通りです:
- メモリへの列の実装:
やIColumn
クラスの導入。Field- 当時 Apache Arrow が無かったため、独自のメモリアン表現を実装。
- 集計関数の導入:
- ClickHouse の最重要部分の一つとして現在も機能しています。
- テーブルエンジンの導入:
- 初期名は「primary key」(数日ほど)。
- ディスクへの列読み書きを可能にし、TinyLog に似たエンジンを実装。
- 圧縮機能の追加:
- QuickLZ から LZ4 へ迅速に切り替え(Yann Collet のブログの影響)。
- ブロックストリームの導入:
- 現在「Processors」へ置き換えられていますが、列チャンクのストリーミング処理を可能にしました。
- テスト用テーブルの作成:
が現在のStorageSystemNumbers
テーブルとして存続しています。system.numbers
言語と演算子の進化
- 最初の関係演算子:
からスタート。LIMIT - SQL パーサーの実装:
- 最初は Boost.Spirit の使用を試みましたが失敗し、後ほど再帰降下パースャを実装しました。
- 初期アイデアの変遷:
- 可変長符号化は性能低下のため廃止されました。
- 独自の列独立圧縮コーデックスや
型(後のバージョンで改良し復活)、固定サイズ配列なども一度削除され、現在は「不要なコードの削除(Trash Remove)」こそが最も重要であると位置づけられています。Variant
最初のデータ構造とクエリ処理
- hits テーブル: ClickBench で現在も参照される初の実際のテーブル構造。
- IO 最適化: C++ iostreams の遅さを改善し、
、WriteBuffer
を導入(今日まで使用)。ReadBuffer - SELECT クエリインタプリタの実装:
- 算術演算子および初期 SQL 関数。
- 集計関数や標準関数の迅速な実装を促しました。
プロダクション環境への展開と高可用性の実装
サーバーとエンジンの追加(2012 年)
- ClickHouse サーバー:2012 年 3 月 9 日導入。
- クライアントツール:同年 3 月 25 日追加。
- 初期プロダクション用途: 「SQL クエリが載った永続的なログキュー」としての定位(Log, TinyLog, Merge, Distributed エンジン利用)。
MergeTree とデータの増分ソート
- 背景でのデータ部分のマージと時間順ソートを実現。
- OLAPServer と Metrage の両方を置き換え、プロダクションへのデプロイを可能にしました。
高可用性(HA)と分散合意の実装
チーム拡大に伴い(Michael Kolupaev 社員採用)、地域データセンター間での DRILLS(ダウンタイム演習)を実施:
- 課題: バックフィルによる単純な二重書き込みでは 100% の一貫性や自動修復が達成困難。
- 解決策: Java エンジニアとの協力により、ZooKeeper を協調システムとして導入。
- 実装: Michael が ZooKeeper メタデータ層を利用する
を実装。ReplicatedMergeTree - 2014 年、ユーザー向けクエリ用のプロダクション展開が可能に。
クリックハウスのオープンソース化と広まり
プロダクションでの成功(2014 年)
- 毎日数百十億レコードの格納とリアルタイムクエリ回答。
- データサイエンティストによるトレンド計算への活用。
- 部門間移行: MapReduce や MySQL、Postgres から ClickHouse へ移行が進む(広告、EC、インフラなど)。
- CERN の LHCb 実験でも採用。
オープンソース化の決断
- コミュニティからの関心の高まりに対し、「空白のニッチを満たすために公開するべき」と判断。
- 社内承認プロセス: 利益とリスクの評価リストを作成し、説得力を持って承認獲得。
- リリース活動(2016 年):
- ロゴ制作、ウェブサイト作成、ブログ投稿準備。
- Debian リポジトリの作成。
- 2016 年 6 月 15 日:グローバル公開。
エンジニアへのメッセージと今後の展望
- オープンソース化への勧め:
- 最悪の場合でも成果は出ず、世代に影響を与える可能性があります。
- 過去のコードを見ても恥じる必要はありません(15 年前のコードにも価値があります)。
- 現在の地位:
- ClickHouse は現在、世界中の主要企業で最も人気のある分析データベースとして採用されています。
クリックハウスクラウドへの招待
クリックハウスクラウドを開始して $300 のクレジットを獲得してください。
- 30 日間のトライアル期間を終了後、pay-as-you-go プランへ移行するか、ボリュームベースの割引についてさらに詳しく知るにはお問い合わせください。
- 詳細については料金ページをご覧ください。