Microsoft Azure 储存体

Azure 储存服务 (Azure Storage) 是 Microsoft Azure 平台内实作的资料储存服务，目前为 Azure 平台服务的主要资料保存地。

Azure 储存服务提供了四种不同格式的储存体，用来提供给Azure上运行的应用程序储存资料使用。依据不同的储存格式会有不同的限制，因为这些储存服务都是以分散式巨量储存（Distributed Mass Storage）为核心概念所设计出来的，为了要达成快速在分散式储存空间中储存与管理资料（还包含高可用度的赘余储存管理），微软有在资料的储存上做一些限制。

不论是哪一种储存服务，Azure都有REST API，并符合Simple Cloud的标准。

Azure 储存服务提供 99.9% 的服务水准，而只读式备援的只读端 (备援端) 为 99.99%。

## Blob

Blob （大型二进制物件）资料是用来储存像是档案，图片，视讯档，可执行档，压缩档等二进制格式的档案，基本上它的储存单位就是档案，为了要让BLOB的功能应用更宽广，微软也在 Blob 服务上开发了内容传递网络（Content Delivery Network）的服务，让 Blob 可以作为大容量的档案或资料储存与供应的地方，以支持类似YouTube这样的大型Web应用程序的服务。

Blob 依照性质分为两种：

- Block Blob（区块型 Blob 储存体），这类的储存以4MB为一个区块单位 (可依需调整，范围为 16KB~4MB)，单一档案最大可以储存 200GB，且区块不会连续储存，可能会打散到不同的储存服务器中存放，当应用程序要求时，会依照档案的Key以及区块由储存区提取资料。另外，区块在储存时会经过一道认可程序，以让应用程序决定是否要重新传送。
- Page Blob（分页型 Blob 储存体），它会在储存区中划分一个连续的区域供应用程序存放资料，它本身可以视为一个大型的VHD（虚拟机器磁盘），在Page Blob 的资料写入会直接认可。而基于Page Blob 的特性，微软特别在Page Blob 上提供了一组将Page Blob 虚拟成磁盘的功能，称为Azure Drive（研发代号为XDrive），它能够支援NTFS API，也就是说应用程序可以利用现有的档案管理API（包含System.IO的类别）来存取Azure Drive中的资料夹与档案资料，并且这些资料会保存在Azure资料中心内。

Blob 服务由 Blob 本身以及其收纳容器（Container）构成，容器可视为一般本机上的资料夹。而容器和 Blob 都支援额外的Metadata设定，这些Metadata会附挂在HTTP Header中传输给用户端，每一个Metadata的大小限制为8KB。Blob 也支援权限管理的功能，透过Shared Access Signature可设定 Blob 或Container的存取权限与有效期限等。

```csharp
private void EnsureContainerExists(）
{
    var container = GetContainer();
    container.CreateIfNotExist();

    var permissions = container.GetPermissions();
    permissions.PublicAccess = BlobContainerPublicAccessType.Container;
    container.SetPermissions(permissions);
}

private CloudBlobContainer GetContainer()
{
    var account = CloudStorageAccount.FromConfigurationSetting("DataConnectionString");
    var client = account.CreateCloudBlobClient();

    return client.GetContainerReference(RoleEnvironment.GetConfigurationSettingValue("ContainerName"));
}
```

## Table

Table（表格）是给具结构化资料的应用程序储存与管理的一种储存服务，它在Azure储存区中会以Key-Value键值对方式储存，并且由Partition来切割在Azure储存区的储存位置，它实际的资料是XML，透过REST API呼叫时，会需要依据SDK上的说明，自行建置XML的要求与解析回应的资料，但若是.NET Framework的开发人员，在Azure SDK中提供的Microsoft.WindowsAzure.StorageClient命名空间就有提供辅助的API以及类别，将这件事在API中处理掉了。SDK提供的辅助组件所应用的技术是WCF Data Services，因此若对WCF Data Services熟悉的开发人员，会很容易的上手Table储存的开发。

```csharp
namespace TableExample
{
    public class Contact : TableServiceEntity
    {
        public string Name { get; set; }
        public string Address { get; set; }
        public string Phone { get; set; }
        public string Cellphone { get; set; }

        public Contact()
        {
            base.PartitionKey = "ContactTable";
            base.RowKey = Guid.NewGuid().ToString();
        }
    }
}
```

虽然Table可以储存结构化的资料，但它并不是关联性数据库，所以像是join，汇总函数等都无法使用，要由开发人员另外处理。

## Queue

Queue（伫列）是一种先到先服务（First-Come, First-Serve），或称为FIFO（先入先出）的储存服务，它可以允许应用程序将讯息储存到伫列中排队，然后由负责处理的应用程序（通常是Worker）由伫列提取讯息并处理以后，将讯息由伫列中移除。讯息可以是字串或是最长8KB的二进制资料，伫列经常会作为跨执行个体通讯以及工作切割通知的讯息传递之用。

```csharp
protected void cmdAddQueue_Click（object sender, EventArgs e）
{
    CloudStorageAccount account = CloudStorageAccount.FromConfigurationSetting("DataConnectionString"）;
    CloudQueueClient queueClient = account.CreateCloudQueueClient();
    CloudQueue queue = queueClient.GetQueueReference("theaterseatorders");

    queue.CreateIfNotExist();

    queue.AddMessage(new CloudQueueMessage("SEATNUM=1-1,EMAIL=test@test.com"));
    queue = null;
}
```

## File

档案服务是 Azure 近期 (2014) 才加入的新规资料储存服务，它也是用来储存二进制档案，但它和 Blob 不同的是 Blob 是 Internet-facing (面向 Internet) 的档案储存服务，档案服务则是给同一区域内的 Azure 服务 (如虚拟机器服务) 共享档案资源的服务，它使用 SMB 2.1 (推出时) 与 SMB 3.0 (GA时) 网络芳邻的方式简化存取档案的工作，同时也可以支援由资料中心外部的网络芳邻连线。

## 备援

自v1.5版起的 Azure Storage 开始支援异地备援 (Geo-replication)的功能，只要应用程序将资料传送到TABLE或BLOB储存，Azure会自动将资料往邻近的资料中心传递，以备援储存服务，当主要的资料中心发生断线或是无法提供服务时，Azure核心中的DNS Service会自动将要求导向到备援的资料中心继续提供服务。

- 异地备援所产生的网络与储存成本由微软自行吸收，不另计费。
- 异地备援的工作是异步且自动化，应用程序无需做任何修改。
- 异地备援可以透过联系Windows Azure支援团队的方式停用。

目前 Azure 储存服务支援下列备援类型：

- LRS (Local Redundant Service): 在区域内将资料产生三份复本储存。
- ZRS (Zone Redundant Service): 在区域内除了原本的三份复本之外，再额外产生三份复本，此模式只支援 Blob 格式。
- GRS (Geo-Replication Service): 在已配对的资料中心间异地备援，两边都产生三份的复本。
- RA-GRS (Read-Only Geo-Replication Service): 在已配对的资料中心间异地备援，但另一边的储存可读取 (但只读)。

## 凉储存

凉储存 (Cool Storage) 是微软在 Build 2016 研讨会中所发表的新储存功能，它可以将资料储存在较持久的储存装置，并且利用资料保存技术将储存成本压低，以适用于长时间储存又不需经常存取的资料 (经常存取的称为热资料)，凉储存仅适用于区块式 Blob 储存体 (Block Blob)，每单位 GB 的储存成本比一般储存功能便宜约 50%，但由凉储存将资料取出或存入时除本身的交易成本外，尚需要支付额外每 GB 单位的取出与写入成本 (Data Retrival/Data Write)，取出成本比写入成本要高。