Blob Storage'da Snapshot Kullanımı (SDK2.5)

0 dakikada yazıldı

27741 defa okundu

Düzenle

Blobların en sevdiğim özelliklerinden biri blob başına snapshot alabiliyor olmamız :) Sınır yok, istediğiniz kadar snapshot alabilirsiniz :) (yeter ki parasını ödeyin) Şaka bir yana SnapShot almanın kolaylığı ve "yedekleme" amaçlı olarak süper faydalı olması geliştireceğiniz uygulamalarda eminim ki ciddi katma değer sağlayacaktır.

[C#]

CloudStorageAccount account = CloudStorageAccount.DevelopmentStorageAccount;
CloudBlobClient blobClient = account.CreateCloudBlobClient();
CloudBlobContainer container = blobClient.GetContainerReference("dosyalar");
container.CreateIfNotExists();

CloudBlockBlob blob = container.GetBlockBlobReference("istanbul_azure_logo.png");
var snapshotBlob = blob.CreateSnapshot();

Response.Write(snapshotBlob.SnapshotQualifiedUri);

Yukarıdaki kod içerisinde basit bir blob bulduktan sonra hemen üzerinden CreateSnapshot metodunu çağırıyoruz. Metodu çağırdığımız anda aslında artık blobun snapshot'ı yani bir kopyası tarihin tozlu raflarında yerini almış oluyor :) Blobun snapshot'ına direk ulaşmak isterseniz ancak SnapshotTime üzerinden snapshot'ın alındığı tarihi kullanarak ilerleyebiliyorsunuz. Local testte aldığımız URL aşağıdaki gibi oluyor.

http://127.0.0.1:10000/devstoreaccount1/dosyalar/istanbulazurelogo.png?snapshot=2014-12-2T11:33:32.5370000Z

Güzel, bir snapshot yarattık ve belli ki ona ulaşabiliyoruz. Fakat ya bir blob'un birden çok snapshot'u alınmışsa? Onlara nasıl ulaşırız? İşte bu noktada klasik blob listeleme senaryosunda geri dönüyoruz. Normal blobları listelermiş gibi ilerlerken ek olarak SnapShot'ların da listelenmesi için bir parametre göndermemiz yeterli oluyor.

[C#]

CloudStorageAccount account = CloudStorageAccount.DevelopmentStorageAccount;
CloudBlobClient blobClient = account.CreateCloudBlobClient();
CloudBlobContainer container = blobClient.GetContainerReference("dosyalar");
container.CreateIfNotExists();

CloudBlockBlob blob = container.GetBlockBlobReference("istanbul_azure_logo.png");

var snapshots = container.ListBlobs(blob.Name, true, BlobListingDetails.Snapshots);
foreach (CloudBlockBlob snap in snapshots)
{
    if(snap.IsSnapshot )
    {
        Response.Write(snap.SnapshotQualifiedUri);
    }                
}

Yukarıdaki kod içerisinde ListBlobs'a verdiğimiz BlobListingDetails işimizi görecektir. Ayrıca söz konusu metoda verdiğimiz ilk parametrede de eldeki blobun adını vererek sadece o bloba ait kayıtların dönmesini sağlamış oluyoruz. Ama burada ufak bir uyarıda da bulunmam gerek. ListBlobs'un ilk parametresi bir Prefix aslında. Yani one2one match olarak ismine göre Blob aramaz. O nedenle eğer prefix ile tutturabileceğinizden emin değilseniz içeride ayrıca BlobName kontrol yapmakta fayda var. Elimize gelen listede dolaşırken orijinal blobu dışarıdan bırakmak için IsSnapShot kontrolü yapıyor, sonrasında da SnapshotQualifiedUri'yi alıyoruz.

Doğal olarak bu noktadan sonra artık SnapShot'lar da birer blob oldukları için SnapShot silme işlemini de normal bir blob siler gibi yapabiliyoruz ama ufak bir sorun var :) O da normal şartlarda SnapShot'ı olan bir ana blobun SnapShot'ların hepsi silinmeden silinemiyor olması. Bunun için SnapShot listesi alıp for'la gezip tek tek SnapShot silmeye gerek yok ;)

[C#]

blob.Delete(DeleteSnapshotsOption.IncludeSnapshots);

Yukarıdaki gibi silme işlemine de DeleteSnapshotsOption verebilirsiniz. Burada IncludeSnapshots veya DeleteSnapshotsOnly diyebiliyorsunuz.

[C#]

birBlob.StartCopyFromBlob(snapshotBlob);

Eğer ki bir SnapShot Blob'unu alıp bir başka bloba kopyalamak isterseniz yukarıdaki kod yardımcı olabilir. Unutmayın ana blobları kopyalarken SnapShot'lar taşınmaz ve kopyalanmaz. Snapshot her zaman ilk yaratılığı bloba bağlıdır. StartCopyFromBlob metodunu bir snapshotı restore etmek için de kullanmanız gerekecek. SnapShot'tan orijinal blobun üzerine kopyalama yapmak yeterli olacaktır.

Birkaç detay...

SnapShotların çalışma şeklini bilmek ne için ne kadar para ödeyeceğinizi bilmek adına da önemli. Bir SnapShot aldığınızda eğer SnapShot yapıldıktan sonra Blob'da değişiklik olmadıysa ek bir ücret ödemiyorsunuz. Özetle aslında sadece değişen Block veya Page için SnapShot'larda para ödersiniz. Fakat ufak bir uyarı :) eğer SnapShot'lar sizin için çok önemliyse ve çok kullanacaksanız StorageClient ile beraber gelen UploadFile, UploadText, UploadStream veya UploadByteArray gibi metodları kullanmayın. Bu metodlar upload esnasından tamamen sıfırdan upload yaptıkları için tüm page'ler veya block'lar değişiyor ve bu da sıfırdan bir snapshot almış olmak anlamına geliyor. Nitekim bu şekilde de ilerlenebilir ama bilerek ilerlemekte fayda var :) Bahsettiğimiz metodların kullanımları kolay ama SnapShot'ta da ufak bir dezavantajları var. Eğer böyle kullanacaksanız tavsiyem SnapShot'larınızı doğru yönetin ki gereksiz yere binlerce SnapShot durmasın kenarlarda.

SnapShot'ları çok yoğun kullanacaksanız ideal yöntem bir alt seviyeye inip kaynaklarınızı doğrudan Page veya Block seviyesinde yönetmek. StorageClient içerisinde PutBlock ve PutBlockList gibi işinize yarayabilecek metodlar mevcut ;)

Kolay gelsin.