
2026/11/03 1:02
DuckDB から倉庫システムを移行します
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
PostHog は最近、データ基盤を大幅に刷新し、まず ClickHouse から DuckDB(DuckLake 拡張機能経由)への移行を行って、モデリングクエリのレイテンシーとコストベースの最適化不足の問題に対処しました。しかし、ワークロードがペタバイト規模へと拡大するにつれて、シングルノードの制約が重要な課題となりました:予測不可能なリソース使用、カタログ統計の完全再読み込みによるスローな書き込み速度、エンジン固有の最適化を阻止するスキーマ互換性の制限、多数の直接 Postgres 接続の管理によるパフォーマンス問題などです。これらのボトルネックを解消するために、アップストリームの修正やコミュニティからの貢献を待つことなく、PostHog は DuckDB をフォークして HogLake という独自のテーブル形式を持つカスタム Trino ベースのシステムを作成しました。このプロプライエタリな設定により、予測可能なコスト、複雑なデータモデリングにおけるクエレイテンシーの高速化、そして大規模におけるパフォーマンスチューニングに対する完全なコントロールが実現されています。現在、ペタバイト規模で厳格な内部テストが行われており、設計パートナーによる検証を経て一般生産展開が行われる予定ですが、これはオープンソースプロジェクトをフォークすることが、大規模において必要な特定のパフォーマンスとコントロールを実現するために必要となることが示された事例です。
本文
PostHog のデータウェアハウス再構築:DuckDB から Trino と HogLake へ
5 ヶ月前、PostHog は ClickHouse を代替する倉庫として DuckDB を採用しました。しかし、運用の複雑化に伴い方針を転換し、現在は**Trino の独自版と独自の表形式「HogLake」**に移行しています。
移行の背景:なぜ DuckDB から撤退したか
当初は ClickHouse クラスターのコスト最適化やモデリングクエリの高速化のために DuckDB を選定しましたが、以下の課題が発生しました。
- スケーラビリティとコストの矛盾
- 共有クラスターでは長時間実行されるクエリが処理できず、個別インスタンス割り当てへの移行が必要になりました。
- ローカル環境で優秀な機能をクラウドでも再現しようとした結果、複雑なクエリに巨大なインスタンス追加が求められ、ディスクスワップによるパフォーマンス低下が発生しました。
- リソース予測の難しさ
- クエリの到達前にワーカーサイズを設定する必要があり、CPU やメモリの需要を正確に予測することが困難でした。
- ユーザーはリソース心配から解放されるべきであり、その負荷処理と予測可能性をプラットフォーム側が担う必要があります。
- DuckLake のボトルネック
- S3 から非同期 Fetching を利用できず、大量データ取得に時間がかかりました。
- デフォルトでインストールしていた DuckLake は、カタログ統計情報の再読み込みにより単一テーブルへの書き込みが 3 分以上かかるなどの遅延が発生しました。
- 既存スキーマとの 100% 互換性維持のため、必要なチューニング(インデックスなど)が制限されました。
- メタデータ接続数の問題
- DuckLake は多数の統計情報行を管理しており、それらの約99% が存在しないテーブルに属する行が含まれていました。
- これらの不要な行をクリーンアップすることで書き込み速度は 30〜50 倍向上しましたが、再び増加してしまう循環が発生しました。
- メタデータ DB への接続数が増加し、共有 PostgreSQL インスタンスにおいて各接続に実質的なコストがかかる状況となりました。
- コミュニティ支援の限界(Dogfooding の失敗)
- PostHog は自社の 2 ピタバイト規模データを DuckLake に移行して Dogfooding(社内テスト)を試行しましたが、システムは頻繁に壊れました。
- 必要な速度で修正を適用できず、フォーク版でのパッチ維持に追い込まれました。これにより「コミュニティ」という最大の利点を損なう結果となりました。
PostgreSQL ネイティブ接続の課題
DuckDB では PostgreSQL を経由して接続を提供しましたが、以下の理由からHTTP 越しの接続の方が有利でした。
- スケーリングの困難さ
- ポート 5432 での直接接続は、再接続欠落や TTL(生存期間)管理、アイドル接続制御が難しく、長時間接続のコストが高くなりました。
- 負荷分散ツールの不足
- pgwire の負荷分散ツール類は HTTP に比べて極めて乏しく、AWS NLB/ALB と比較すると操作性に劣ります。
- クライアント互換性の維持コスト
- PostgreSQL クライアントの種類は無限に近く、それぞれ固有の挙動を要求します。
- 顧客からのカスタムクライアント・ライブラリ修正要望に対応するための時間を消費し、カバー率は十分ではなかったため、倉庫構築の本質的な価値創造に時間を割くべきと考えました。
新しいアーキテクチャ:Trino と HogLake
重要なのは技術そのものではなく、ユーザーにどのような体験を提供できるかです。そこで以下の新ソリューションを構築しました。
- Trino の独自版の採用
- すべてを再構築し、分散処理能力を活用しています。
- HogLake(独自のオープンな表形式)の開発
- データ永続化のために新しい表形式を開発し、DuckLake における互換性の問題を回避しました。
- 堅牢性の検証
- 設計パートナーに渡す前に、PostHog の自社のピタバイト規模データをテストし、安定性を確保しました。
まとめと展望
現在の倉庫が低速または高価であればお問い合わせください。特に大量データのクエリが必要なケースで強くお勧めします。私たちは常に最適な設計パートナーをお探しのところです。