GCEのスナップショットバックアップ機能詳細とお得な使い方!

  • このエントリーをはてなブックマークに追加

Google Compute Engine(GCE)では標準のバックアップツールとしてスナップショット機能が提供されています。
今回はそのGCEにおけるデフォルトのバックアップ機能と言えるスナップショット機能の基本的な特徴や性能・価格などの詳細と、少し類似した機能にも見えるイメージとの違いやお得な使い方などをご紹介します。
GCEを運用するには必須となってくる機能であるスナップショットについて、是非ここで理解しておいてください。

GCEのスナップショットの主な特徴

GCEのスナップショット機能の特徴は以下になります。

  • 高速に取得可能
    取得にあたっては、通常のファイルコピーでは無く、非常に高速に取得可能です。
  • 差分取得
    また、差分で取得されるため、大量データであったとしても取得時間・コストは最小限で済みます。
  • 世代管理可能
    差分であることからも世代管理が自動的にされ、必要な世代を選んでリストアすることも可能です。
  • グローバルで利用可能(ディザスタリカバリ対応可能)
    取得したスナップショットはリージョンをまたいで複数箇所に保存され、どこのリージョンからでも利用(リストア)可能です。これを利用した高速なファイル転送も可能です。ですので、スナップショットを取得することで実質的にはリージョンごと壊滅するような事態においてもデータ損失無く安全に保管出来ます。

もちろん、他機能と同様、管理コンソールからWebUIで簡易に取得・リストアすることも出来ますし、コマンドやAPIによる自動化も可能です。

GCEのスナップショット機能の公式の詳細機能説明については以下を参照ください。
https://cloud.google.com/compute/docs/disks/create-snapshots?hl=ja

スナップショットとイメージの比較

想定される用途としてそもそも違うのですが、GCEには同じような用途にも使えそうなイメージ機能がありますが、そのイメージ機能との比較をしてみます。
イメージ機能はイメージテンプレートなどとして容易に起動しやすいようなベースのイメージを定義する機能として存在し、オートスケールする際のベースのイメージとして利用するためのものです。ディスクのイメージをバックアップ(取得する)と言う意味ではかなり似た機能になります。
ただ、以下のように比較してみるとやはり普通のバックアップ用途としては金額的にも普通はスナップショットを利用するべきですね。

  スナップショット イメージ コメント
取得対象 ディスク単位 ディスク単位 いずれも対象はディスク単位なので、複数ディスクを厳密な同期を取って取得は困難。
インスタンス起動 可能 可能 特段大きな差が無いかと思います。
価格 $0.034/GB/月 $0.111/GB/月 イメージの方が相当高額、またイメージは割当たディスク分まるまる必要だが、スナップショットは利用している領域分のみ。
ちなみに通常のディスク(東京リージョン)は$0.052、SSDは$0.221ですのでディスクにコピーするよりスナップショットは安いです。
差分 差分で取得可能(世代管理され、差分データについてのみ課金) 不可(常にフルのイメージしか取れない) スナップショットについては実利用分のみの差分についてのみ課金対象
リージョン間共有 リージョン間で共有される リージョン間で共有される どちらも取得後どこのリージョンからでも利用可能になる
プロジェクト間の共有 不可 可(権限があれば指定して別プロジェクトに起動可能) スナップショットは完全にプロジェクト内に閉じた利用しか出来ない。イメージは指定しての起動やGCSへの出力も可能
マウント時の取得 可(VSS※あり) どちらも一応可能だが、論理整合性は自分で取得する必要あり。スナップショットにはWindowsの場合VSSに対応してます。
テンプレート化 不可 インスタンステンプレートとして指定可能なのはイメージのみ

※VSS(ボリュームシャドーコピー)はWindowsの機能で論理的整合性を保つことでバックアップデータからの起動を保証出来るものです。

スナップショット機能のお得な使い方!

実はスナップショットは単純に大容量データのコピー機能として非常に優秀です。GCEのリージョン間をコピーするケースについて速度・費用面で大きなメリットがあります。
以下に実際、東京リージョンから米国東リージョンにコピーを試した際の結果を示します

※rsyncによるコピーにおいて、200GB、300GBの秒数は想定です。

実行環境としては、コピー元・先ともにDebianでn1-standard4の1000GバイトのSSDを追加で割り当てて計測してます。
1000Gバイトのディスクをスナップショットを取って、US側のサーバ側にディスクとして追加する、という手順でコピーすると、300Gバイトの実データをコピーするのに586秒で済んでしまいます。これは秒あたり約1950メガバイトという相当な転送速度に相当します。単純なrsyncでも100メガバイト/秒でUS迄転送できてるのですからそれでも相当なものですが、
さ、さらに、ここがポイントです。実はrsyncによりリージョン間のコピーを行うと、データ転送量がかかるのです。これはインターネット経由と同じ課金になるので1Gバイトあたり0.12ドルかかります。ので、100Gの転送を行うと1200円かかってしまうのです!しかし、スナップショットを利用するとこれがタダ!
驚きですが、これが事実なんです。厳密にはコピーしている間のスナップショット等の保存料が必要ですが、コピーしている間だけとかだとほとんどかかりません。圧倒的に安いです。
実際は、例えばGoogle Driveを経由するとかすると同じ効果(大陸間跨ぎの費用がかからない)があるのですが。まさに、早いの安いの、です。
また更に言うと、rsyncと比べると取得元先いずれのサーバのCPUリソースも消費しないという点です。バックアップ取得する際に通常はrsyncコマンドだとCPU負荷はそれなりに上がりますが、スナップショット取得においてはほとんど負荷となりません。
繰り返しますが、スナップショットコピーは普通のrsyncと比べて、速度は5倍(300GBのケース)!費用はタダ!です。
使わない手は無いでしょう。

ちなみに、私が作成したコピーツールのソースも以下に公開しておきます。エラーハンドリングは引数以外考慮してないので、実務に使うにはご自分で工夫してください。
使い方は簡単で、引数に、コピー元のディスクとコピー先のインスタンス名(ディスクとインスタンス名であることに注意)を指定するだけです。そうするとスナップショット取得、コピー先でディスク作成、コピー先のインスタンスにマウント、というところ迄自動的に行います。
一覧からゾーンを探して動作します。クラウドシェルからの実行を想定してますが、そうでない場合はプロジェクトなどはデフォルトを設定しておく必要がありますのでご注意ください。

#!/bin/bash

SECONDS=0

CMDNAME=`basename $0`
if [ $# -ne 2 ]; then
  echo "The number of arguments are $#. "
  echo "Usage: $CMDNAME cop_from_disk instance_to_copy_data "
  exit 1
fi

COPY_FROM=$1
COPY_TO_INSTANCE=$2

DISK_LIST=/tmp/$$.disklist
INSTANCES_LIST=/tmp/$$.instanceslist
TMP_SNAP_SHOT=tmp-snap$$
COPIED_DISK=snapshot-copied$$

gcloud compute disks list > $DISK_LIST
gcloud compute instances list >  $INSTANCES_LIST

COPY_FROM_ZONE=`cat $DISK_LIST | awk -v copy_from="$COPY_FROM" '$1 == copy_from {print $2}'`
DISK_SIZE=`cat $DISK_LIST | awk -v copy_from="$COPY_FROM" '$1 == copy_from {print $3}'`
COPY_TO_ZONE=`cat $DISK_LIST | awk -v copy_from="$COPY_TO_INSTANCE" '$1 == copy_from {print $2}'`

rm $INSTANCES_LIST
rm $DISK_LIST

if [ "$DISK_SIZE" = "" ] || [ "$COPY_TO_ZONE" = "" ]; then
    echo "!!! Warning: No Disk found or No target instance found! check the argument!!!!  "
    echo "Nothing done by this script! "
    exit 1
fi

TIME_TO_PREPARE=$SECONDS
SECONDS=0

#Execute gcloud commands to copy. Take Snapshot, Disk Make, Disk attach to the instance.
time gcloud compute disks snapshot $COPY_FROM --zone $COPY_FROM_ZONE  --snapshot-names=$TMP_SNAP_SHOT
TIME_TO_SNAP=$SECONDS
SECONDS=0
time gcloud compute disks create $COPIED_DISK --zone $COPY_TO_ZONE --size=$DISK_SIZE --source-snapshot=$TMP_SNAP_SHOT
TIME_TO_DISKCREATE=$SECONDS
SECONDS=0
gcloud compute instances attach-disk $COPY_TO_INSTANCE --zone $COPY_TO_ZONE --disk=$COPIED_DISK
gcloud compute snapshots delete $TMP_SNAP_SHOT -q &

echo "TakeSanp: $TIME_TO_SNAP"
echo "MakeDisk: $TIME_TO_DISKCREATE"

exit 0

以上、GCEにおける基本中の基本であるスナップショットバックアップについて詳細とおいしい使い方について整理させてもらいました。是非皆様もGCPをご活用ください。
使い方が分からない、不安だ、効率的な使い方は?などの不明点がありましたら、日本唯一のプレミアパートナー(2017年6月時点)であるクラウドエースにお問い合わせください。

  • このエントリーをはてなブックマークに追加

Google のクラウドサービスについてもっと詳しく知りたい、直接話が聞いてみたいという方のために、クラウドエースでは無料相談会を実施しております。お申し込みは下記ボタンより承っておりますので、この機会にぜひ弊社をご利用いただければと思います。

無料相談会のお申込みはこちら