G-gen の杉村です。BigQuery にはスナップショットとクローンと呼ばれる機能があり、ストレージ料金を節約しつつテーブルを瞬時に複製することができます。これらの機能について解説します。
スナップショットとクローン
スナップショットとは / クローンとは
Google Cloud(旧称 GCP)のデータウェアハウスである BigQuery には、スナップショットとクローンと呼ばれる機能があります。いずれも、ストレージ料金を節約しつつ、テーブルを瞬時に複製する機能です。
スナップショットとクローンは似た性質を持っています。スナップショットは読み取り専用で、クローンは読み取りと書き込みの両方が可能です。「スナップショットの書き込み可能版がクローン」と言うこともできます。
- 参考 : テーブル スナップショットの概要
- 参考 : テーブル クローンの概要
共通の性質
スナップショットとクローンは、以下の性質が共通しています。これは、後述のコピーオンライトという実装方法によるものです。
- ベーステーブル(元となるテーブル)からのスナップショット / クローン作成は瞬時に完了する
- スナップショット / クローン作成直後は、ストレージ料金が発生しない
- ベーステーブルのデータに変更や削除が発生すると、その差分のストレージ料金が発生する(クローンでは追加した分のデータのストレージ料金も発生する)
- ベーステーブルへのデータが追加されても、スナップショット / クローンの料金は発生しない
コピーオンライト
スナップショットとクローンでは、ある瞬間のテーブルのデータをまるごと複製しているはずなのに、複製が瞬時に完了しますし、ベーステーブルに変更がなければストレージ料金が発生しません。不思議なように思われますが、これはコピーオンライト(Copy-on-Write)という実装手法のおかげです。
コピーオンライトでは、はじめにデータを複製するときに、実際にデータを複製するわけではなく、データを複製した「ふり」だけをします。複製した先のデータが誰かに参照されるときは、参照者が意識しないまま複製元のデータを参照させます。
しかしこれでは、複製元のデータに変更や削除があると、データは参照できなくなってしまいます。そのため複製元のデータが変更または削除されるタイミングで、実際にデータを複製します。実際の複製後は、参照者は複製先データを参照することになります。
BigQuery のスナップショットやクローンで、作成が一瞬で終わったり、削除・変更があったデータのみに料金が発生するのは、このコピーオンライト手法の性質によって説明できます。
このコピーオンライト手法は、仮想記憶方式の OS のメモリ管理で利用されているほか、一般的にストレージ製品のバックアップ(スナップショット)機能などでも用いられています。
ユースケース
スナップショット
スナップショットのユースケースは、以下のようなものです。
- 論理バックアップ目的や検証目的で、ストレージ費用を最小にしつつ、テーブルの現在の時点のデータを保存しておきたい
前述の性質上、特に既存データの変更が少ないテーブルで、ストレージ費用を抑える効果が顕著に現れます。またベーステーブルにデータ追加があってもスナップショット料金には影響はありませんので、データ追加はあるが変更は少ない、というテーブルでも効果が高いといえます。
なおテーブルのある時点のデータを取っておく機能としては他にタイムトラベル機能が存在していますが、タイムトラベルは7日間までしか保管されないため、それ以上の保持期間が必要な場合にはスナップショットを検討します。
論理バックアップの目的でスナップショットを作成する場合、データセットの誤削除などにも対応できるよう、スナップショットはベーステーブルと別のデータセットに作成することが推奨されます。
クローン
クローンのユースケースは、以下のようなものです。
- 開発やテスト目的で、ストレージ費用を最小にしつつ、本番テーブルのコピーを作成して読み書きしたい
こちらも、データ追加はあっても、既存データの変更が少ないテーブルで、ストレージ費用を抑える効果が顕著に現れます。
クローンはベーステーブルからは独立しているため、片方の反映がもう片方に影響を与えることはありません。
料金
前述の通り、スナップショットとクローンでは、作成直後には料金が発生しません。ベーステーブルに変更や削除があった場合に初めてストレージ料金が発生します。またクローンでは、クローンに追加したデータ分のストレージ料金も発生します。
ストレージは料金単価は、BigQuery の通常のストレージ料金単価と同様です。
ただし、以下のような性質に留意が必要です。
- BigQuery が列志向でデータを保持する性質上、べーステーブルへのわずかな変更により、実際に変更した分よりも大きなストレージ料金を発生させる可能性がある
- べーステーブルへのある程度の変更により、スナップショット(クローン)の全ストレージ分の料金が発生する場合がある。例として、ベーステーブルがクラスタリングテーブルであり、自動的な再クラスタリングによってベーステーブルのストレージブロック全体に書き換えが発生した場合などが挙げられる
- ベーステーブルがパーティションテーブルであれば、変更がパーティション内に閉じるため、ストレージ費用を抑えられる場合がある
クラスタリングやパーティションについては、以下の記事もご参照ください。
利用と運用
スナップショットやクローンの作成
スナップショットは、Web コンソール画面、SQL(DDL)、bq コマンド、または API 経由で作成することが可能です。クローンもほぼ同様の手段で作成できますが、2023年12月現在はコンソール画面では作成できません。
また、タイムトラベル機能を利用して、あるテーブルの過去の任意の時刻の状態のスナップショットやクローンを作成することもできます。
スナップショットは有効期限を設定でき、有効期限経過後は自動的に削除されます。
作成手順は以下の公式ドキュメントをご参照ください。
- 参考 : テーブル スナップショットの作成
- 参考 : テーブル クローンを作成する
スナップショットからの復元
スナップショットから、実テーブルを生成することができます。これを復元(Restore)と呼びます。
コンソールではスナップショットの詳細画面から、RESTORE ボタンを押下します。
SQL では、以下のような CREATE TABLE 文を実行します。
CREATE TABLE ${project_id}.${dataset_id}.${new_table_name} CLONE ${project_id}.${dataset_id}.${snaphost_name};
また bq コマンドや API 経由でも、リストアを実行できます。詳細は以下のドキュメントをご参照ください。
- 参考 : テーブル スナップショットを復元する
定期的なスナップショット取得
スケジュールドクエリ機能を使い、定期的にスナップショットを作成する DDL を実行することで、定期的なスナップショット取得が可能です。
詳細は以下の公式ドキュメントをご参照ください。
制限
スナップショットとクローンでは、以下のような制限があります。
- スナップショット / クローンはベーステーブルと同じ組織(Organization)下、同じリージョン内にしか作成できない
- ビューやマテリアライズドビューのスナップショット / クローンは作成できない
- 外部テーブルのスナップショット / クローンは作成できない
その他の制限は、公式ドキュメントをご確認ください。
- 参考 : テーブル スナップショットの概要 - 制限事項
- 参考 : テーブル クローンの概要 - 制限事項
杉村 勇馬 (記事一覧)
執行役員 CTO / クラウドソリューション部 部長
元警察官という経歴を持つ現 IT エンジニア。クラウド管理・運用やネットワークに知見。AWS 12資格、Google Cloud認定資格11資格。X (旧 Twitter) では Google Cloud や AWS のアップデート情報をつぶやいています。
Follow @y_sugi_it