ブログ@nnaka2992

データベースってなんだよ

Snowflakeの論文を読む

この記事の趣旨

前回と同様に CMU Advanced Databas Systems Spring2023のReading Assignmentとして出ている論文を 読み、感想と抄訳のようなものにまとめます。まとめていたのですが、 そもそも全体をまとめてしまっていいのか? 文量もふえてしまうので 論文紹介のやり方 / How to review で紹介されている方法を参考にやっていきます。ただし実装論文が対象なので手法の説明 は厚めにとりあげ、結果については省略します。

今回は近年DWHとして存在感を増しているSnowflakeがどのようなアーキテクチャを取っているか、そしてどのように 分散システムの上にデータベースシステムを構築しているかについての内容になります。

https://15721.courses.cs.cmu.edu/spring2023/papers/02-modern/vuppalapati-nsdi22.pdf

Building An Elastic Query Engine on Disaggregated Storage

研究全体の背景

Cloud技術をベースとしたデータウェアハウス(DWH)であるSnowflakeの運用経験に基づいた論文。 Snowflakeは計算リソースとストレージの柔軟性、マルチテナント、高いパフォーマンス を目的にデザインされている。この論文ではSnowflakeが設計と実装においてどのように Cloud技術を応用し目的を達成しているかについて書かれている。

問題意識

既存のクエリ実行エンジンやDWHではShared-nothing方式を採用することでデータをノード に分散させ、処理をスケールさせたり高いパフォーマンスを実現していた。 一方でワークロードによって要求のことなる各種コンピュータリソースを適切に分配する ことが難しい、Shared-nothingによる静的にパーティションされたデータでは要求によっ てノードを増減させることが難しいという問題があった。

論文の目的

SnowflakeがどのようなアーキテクチャによってShared-nothingが抱える問題を解決し、 またクエリプランニングと最適化、同時実行制御を行っているのかの実装をまとめ、紹介して いる。

手法の説明

  1. 設計の概要
    Snowflakeでは永続(persistent)データと中間(intermediate)データで扱かいを変えて いる。
    ClientからServerまでは四層構造になっており、Clientから近い順にサービスエンド ポイント、柔軟にスケールする計算ノード、柔軟にスケールするローカル一時データ そして永続ストレージからなる。

    Figure1: Snowflake (Virtual) Warehouse Architecture

  2. 一時ストレージの設計
    一時データはオブジェクトストレージからなる永続ストレージにくらべ、少 いレイテンシと高い処理能力が求められる。
    このストレージは計算リソースと密結合したメモリとSSDで構成されている。一時データは 可能な限りメモリに保存されメモリで保持しきれないデータはスワップ領域のようにSSD に保存される。さらにSSDの空き容量が枯渇した場合、一時的に永続ストレージに保存 される。

    一時ストレージは永続化が不要なデータの保管以外にも永続化データのキャッシュとしても 機能する。このキャッシュは日和見的(opportunistically)キャッシュと呼ばれており、その理由 は中間データを常に優先するからである。

  3. クエリスケジューリング ユーザーからのクエリはサービスエンドポイントでパース、実行計画の生成、最適化、 実行に必要タスクの生成が行なわれ、ここで生成されたread/writeを含むタスクは計 算リソースに割り振られ、計算リソースから必要に応じて一時、永続ストレージから のデータ取得が行なわれる。

    このときタスクの割り振りは一時ストレージが対象の永続データをキャッシュしてい るかも考慮される。またSnowflakeは Work stealingという他ノードに割り振られたタ スクをあるノードの方が速く処理できる場合、臨機応変にタスクを実行するしくみが ある。

  4. リソースの柔軟性 ストレージと計算リソースを分離することでSnowflakeはそれぞれを独立してスケール アウトさせている。ストレージの柔軟性はデータストアであるS3に委任している一方 で、計算リソースの柔軟性は事前に暖気運転されたノードプールによって実現してい る。

    Snowflakeでは永続データのキャッシュ時に保存されるノードが決っている一方で、対 象となるデータをキャッシュするノードがない場合、一時的にほかのノードにタスク を割り振り計算リソースがスケールし対象となるデータがキャッシュされた時に再度 タスクを割り当てるという機能が存在する。

まとめと考察

SnowflakeはS3を永続ストレージとして使用、VM全体を計算リソースとそのメモリ、スワッ プ領域とみなすことでスケーラビリティと高いパフォーマンスを実現した。とくに日和見 的キャッシュとタスクスケジューリングメカニズムはShared-nothing方式の抱えていた、 リバランスの問題を解決した。
マルチテナントを実現するには完全なサーバーレスで必要に応じて計算リソースをユーザーがプロビジョニングする 必要がある。一方BigQueryやRedshift ServerlessではSnowflakeが現在達成できていない マルチテナントや計算リソースの高いユーティリゼーションの実現方法としてあげている 手法をとっているため、今後の機能追加が競争力維持のために重要となる。