Lưu trữ Cloud đã trở nên càng ngày phổ biến và cái tên Azure đã không còn xa lạ gì với anh em lập trình. Hôm nay mình sẽ giới thiệu đến các bạn về Azure Blob Storage, một dịch vụ lưu trữ dữ liệu của Microsoft.

Khái niệm

Azure Blob Storage là một dịch vụ hay đơn giản là một công cụ cho phép lưu trữ dữ liệu không cấu trúc trên cloud. Mỗi dữ liệu đưa lên để lưu trữ thì ta coi đó như một object, có thể là text, dữ liệu nhị phân, các document hay media file, hoặc là các file cài đặt … Blob storage hay còn được gọi là Object storage. Azure Blog Storage là NON-SQL Database.

Cách thức lưu trữ của Azure Blob Storage

blob1[1].png

Azure Blob Storage lưu trữ các file của chúng ta giống y chang kiểu lưu trữ dạng thư mục- file. Mỗi object ta lưu trữ trên Azure Blob Storage còn được gọi là 1 blob. Mỗi blob sẽ nằm trong 1 container giống như 1 file nằm trong 1 thư mục (được gọi là Storage container). Và các thư mục này có thể nằm trong các thư mục cha khác. Và tất cả chúng thì nằm trong Storage Account.

  • Storage Account: vì Azure Storage có rất nhiều người dùng nên để lấy được các blob của chúng ta thì ta thông qua Storage Account để xác định phạm vi mà resources của chúng ta được lưu trữ.
  • Container: container nằm dưới storage account và chứa các blobs. Tất cả blob phải ở trong 1 container nào đó. 1 Storage account có thể chứa không giới hạn các container. Container có thể chứa không giới hạn các blob. Khi tạo container thì lưu ý tên container phải là tất cả chữ thường.
  • Blob: là 1 file (có thể bất cứ loại file gì) Azure Storage chia blob thành 3 loại: block blobs, page blobs và append blobs
    • Block blob: dùng để lưu trữ text hoặc file có sẵn (tức là đã xác định độ lớn). 1 single block blob có thể chứa đến 50000 blocks và mỗi block có thể lên đến 100Mb, nên tổng dung lượng của 1 single block blob có thể lên đên 4.75 TB (100Mb x 50000)
    • Append blob: cũng giống như block blob (được tạo ra từ các block) nhưng được tối ưu hóa cho việc thêm dữ liệu vào blob liên tục, nên nó thường được sử dụng để lưu các file logging. 1 single append blob có thể chứa đến 50000 blocks và mỗi block có thể lên đến 4Mb, nên tổng dung lượng của 1 single append blob có thể lên đến 195GB (4Mb x 50000)
    • Page blob: dung lượng có thể lên đến 1 TB, sử dụng hiệu quả cho cơ chế đọc/viết. Azure Virtual Machines sử dụng page blob cho OS và data disks.

Code Example

Để hiểu hơn về khái niệm Blob Storage và cách triển khai để lưu dữ liệu trên Azure Blob Storage. Sau đây chúng ta sẽ cùng nhau tìm hiểu các câu lệnh để biết cách thức chúng ta có thể get và handle dữ liệu trên Azure Storage như thế nào nhé.

Để có thể bắt đầu project thì bạn cần chuẩn bị 1 tài khoản Azure storage, bạn có thể xem tại đây

  • Bắt đầu bằng việc tạo một empty Project MVC
create_project.png
  • Sau đó dùng Nuget để install WindowsAzure.Storage và Azure Configuration Manage
windowsazurepackage.png
windowsazure_configuration_package.png
  • Để connect đến server portal azure thì bạn cần tạo connectionString.

Connection string sẽ như sau:

<add key="StorageConnectionString" value="DefaultEndpointsProtocol=https;AccountName=storagesample;AccountKey=nYV0gln6fT7mvY+rxu2iWAEyzPKITGkhM88J8HUoyofvK7C6fHcZc2kRZp6cKgYRUM74lHI84L50Iau1+9hPjB==" />

Account name và Account Key được lấy từ tài khoản Azure Storage. Vào Azure Storage Account -> Settings -> Access keys

get_key.png
  • Get container

1 Azure Storage Account chứa các container, và các container này chứa các blob storage, nên để có thể lấy các blob thì trước tiên ta sẽ lấy về container trước. Đoạn code dưới đây tạo ra một class có hàm GetCloundBlobContainer() trả về 1 container tên là “mypublicimages”

public class BlobStorageService
    {
        public CloudBlobContainer GetCloudBlogContainer()
        {
            CloudStorageAccount storageAccount = CloudStorageAccount.Parse(
                CloudConfigurationManager.GetSetting("StorageConnectionString"));

            CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();

            // Retrieve a reference to a container.
            CloudBlobContainer container = blobClient.GetContainerReference("mypublicimages");

            container.CreateIfNotExists();

            return container;
        }
    }

Ở đoạn code trên mình đã tạo ra 1 container tên là “myplicimages”, nếu container đã tồn tại thì service trả về container đó, nếu không thì service sẽ tạo 1 container mới có tên là “myplicimages”

Thao tác với blob

  • Để upload 1 file lên container thì chúng ta chỉ cần tạo ra 1 block blob ở container đó và upload file from Stream
 CloudBlobContainer container = _service.GetCloudBlogContainer();

 // Retrieve reference to a blob named by user.
 CloudBlockBlob blockBlob = container.GetBlockBlobReference(model.FileName);

// Create or overwrite the "myblob" blob with contents from a local file.
blockBlob.UploadFromStream(model.FileAttachment.InputStream);
  • Để download 1 file từ container thì chúng ta chỉ cần chỉ đúng tên của file đó trong container và OpenRead để download file. Đoạn code dưới download file về stream
CloudBlobContainer container = _service.GetCloudBlogContainer();

// Retrieve reference to a blob named "photo1.jpg".
CloudBlockBlob blockBlob = container.GetBlockBlobReference(blobName);

Stream blobStream = blockBlob.OpenRead();
  • Để delete 1 file thì chúng ta chỉ cần chỉ đến file đó trong container và gọi câu lệnh Delete
CloudBlobContainer container = _service.GetCloudBlogContainer();

// Retrieve reference to a blob named "myblob.txt".
CloudBlockBlob blockBlob = container.GetBlockBlobReference(blobName);

// Delete the blob.
blockBlob.Delete();

  • Để lấy tất cả các item trong container, ta có thể dùng ListBlobs methods để get ra tất cả các blob và directory trong container
CloudBlobContainer container = _service.GetCloudBlogContainer();

// Loop over items within the container and output the length and URI.
foreach (IListBlobItem item in container.ListBlobs(null, false))
{
   if (item.GetType() == typeof(CloudBlockBlob))
    {
        CloudBlockBlob blob = (CloudBlockBlob)item;
        items.Add(new BlobItemViewModel { Length = blob.Properties.Length, Uri = blob.Uri.ToString(), Type = Models.BlobType.BlobBlock });
    }
    else if (item.GetType() == typeof(CloudPageBlob))
    {
        CloudPageBlob pageBlob = (CloudPageBlob)item;
        items.Add(new BlobItemViewModel { Length = pageBlob.Properties.Length, Uri = pageBlob.Uri.ToString(), Type = Models.BlobType.BlobPage });
    }
    else if (item.GetType() == typeof(CloudBlobDirectory))
    {
        CloudBlobDirectory directory = (CloudBlobDirectory)item;
        items.Add(new BlobItemViewModel { Length = 0, Uri = directory.Uri.ToString(), Type = Models.BlobType.BlobDirectory });
    }
}

Trên đây là bài viết của mình về các thao tác khi bắt đầu với Azure Blob Storage. Hy vọng bài viết có ích cho các bạn mới tìm hiểu về Azure. Source code các bạn có thể xem tại đây