normalian blog

Let's talk about Microsoft Azure, ASP.NET and Java!

ブロック ブロブを利用したSnapshot BlobとCopy Blobについて

前回のブログから時間が空いてしまったが、今日はブロブ・ストレージについてのTIPSを紹介したいと思う。前提知識としては以下が必要になる点にご注意いただきたい*1

  • ブロブ・ストレージには、ブロックブロブとページブロブが存在する
  • ドライブ(Windows Azureストレージ・サービスの一機能)は、ページブロブを利用して実現されている
  • ブロブ・ストレージには、「Lease Blob」「Snapshot Blob」「Copy Blob」と呼ばれる機能が存在する

ドライブについての疑問点

先述したとおり、ドライブはページブロブを利用して実現している。ドライブについて調べたところ、 http://www.microsoft.com/japan/windowsazure/whitepapers/ から入手可能な「Windows Azure ドライブ – NTFS クラウド アプリケーションのための永続的なドライブを利用する 」に以下の記述が存在した。

Windows Azure ページ ブロブでは、Windows Azure ドライブで利用する次の機能もサポートしています。
• Lease Blob – ブロブに対するリースの排他的な書き換えが可能になります。これにより、リース ID を知っているクライアントが、そのリース期間中にブロブを更新できる唯一のクライアントとなります。リースを更新する機能も提供されるため、長期リースも可能です。Lease Blob は、Windows Azure ドライブからマウントされた NTFS 形式のページ ブロブに対する排他的アクセスを保持するために使用されます。つまり、ページ ブロブは一度に 1 つの VM インスタンスによってのみマウント可能です。
• Snapshot Blob –読み取り専用バージョンのブロブを作成できます。この機能を利用して、ブロブのバックアップを作成したり、バージョン管理を行うことができます。スナップショットは読み取り専用であり、課金の対象となるのはユニーク ページのみです。スナップショット間で共有されるページや、ページの生成元のブロブについては、追加のストレージ料金は発生しません。
• Copy Blob – ストレージ アカウント内で 1 つのブロブ名から新しいブロブ名に、ブロブまたはスナップショットをコピーすることができます。新しいブロブにスナップショットをコピーする場合、そのブロブは読み取り/書き込みが可能です。

ページブロブ「では」…。上記の記述を見ると、ブロックブロブでは上記の三機能は実現されていないように見受けられる。

サンプルアプリケーションを利用して検証

以下のサンプルコードを利用してアプリケーションを実行したところ、Snapshot BlobとCopy Blobは問題なく実行できた。どうやらホワイトペーパーの記述の仕方が悪いだけだったらしい。

  • HomeController.Copy メソッド(HomeControllerc.sの抜粋)
public ActionResult Copy(string uri)
{
    try
    {
        //ブロブの参照を取得
        var cloudBlob = blobClient.GetBlobReference(uri);

        //コピー先ブロブの参照を取得
        var copyCloudBlob = blobClient.GetBlobReference(uri + "copy");

        //ブロブのコピーを作成
        copyCloudBlob.CopyFromBlob(cloudBlob, new BlobRequestOptions()
        {
            CopySourceAccessCondition = AccessCondition.None
        });

        TempData["message"] = "コピーの作成に成功しました";
    }
    catch (StorageException)
    {
        TempData["message"] = "コピーの作成に失敗しました";
    }

    //一覧ページに戻る
    return RedirectToAction("Index");
}
  • HomeController.SnapShot メソッド(HomeControllerc.sの抜粋)
public ActionResult SnapShot(string uri)
{
    try
    {
        //ブロブの参照を取得
        var cloudBlob = blobClient.GetBlobReference(uri);

        //ブロブのスナップショットを作成
        cloudBlob.CreateSnapshot(new BlobRequestOptions()
        {
            CopySourceAccessCondition = AccessCondition.None
        });

        TempData["message"] = "スナップショットの作成に成功しました";
    }
    catch (StorageException)
    {
        TempData["message"] = "スナップショットの作成に失敗しました";
    }

    //一覧ページに戻る
    return RedirectToAction("Index");
}

*1:ブロブ・ストレージについて学習するには http://www.microsoft.com/japan/windowsazure/whitepapers/ のホワイトペーパーを参照頂きたい