深入了解 Windows Azure

使用 Windows Azure 表的云中的 NoSQL 数据

Bruno Terkaly
Ricardo Villalobos

下载代码示例

Bruno Terkaly and Ricardo Villalobos将数据存储在磁盘上的价格下降那么厉害那似乎像是科幻小说,公司能够存储大量的数据,一发不可收拾。但能够存储大量数据,经济上解决了只有一半的问题。数据已成为如此庞大而复杂传统的数据库管理工具和数据处理应用程序是远远不够。随着这么多磁盘上的数据,出现了新问题,如接收数据、 执行搜索、 共享数据、 分析它和,最终,直观显示它。

云计算已加紧填补这一需要的力量。运行并行软件解决方案的能力 — — 数十、 数百个或甚至数千台服务器上运行 — — 是使组织能够处理所有存储数据的银弹。

Microsoft 意识到这一重要趋势几年前。Windows Azure 存储 (WAS) 2008 年 11 月发起,大大提高了企业的能力,要从数量庞大的数据存储中获得价值。

布拉德 · 卡尔德,杰出的工程师,在微软和牧羊人带领 WAS 系统,建设的话说"Windows Azure 存储是云存储系统,为客户提供高度可用和持久的任何时间段为存储数据看似无限量的能力。当使用 Windows Azure 存储时,你获得您的数据从任何地方,在任何时候,,只支付您的使用和存储。

是在 Microsoft 内部用于应用程序,如社会网络搜索 ; 现任视频、 音乐和游戏的内容 ; 和管理医疗记录。它还用于通过 Bing 搜索引擎提供几乎立即公开可搜索内容从 Twitter 或 Facebook 的职位或状态更新。约 350 TB 的数据,Facebook 和 Twitter 的数据的范围是非凡。当此数据被摄入时,事务吞吐量将达到每秒之间每天 2 到 30 亿交易总计约 40000 项交易高峰。

这个月,我们将探索 WAS 的一个方面 — — Windows Azure 表 — — 无论它是如何工作和如何开发人员可以快速启动并运行。

景观

现代数据科学家面临着很多选择时选择数据平台,每个都有自己的长处和弱点。例如,许多大数据解决方案基于 NoSQL,这意味着并不使用关系数据库管理系统 (RDBMS) 模型的概念 — — 有没有表和任何 SQL 语句。相反,数据结构通常是大规模关联数组或键/值对的集合。受欢迎的选择今天是 MongoDB、 卡桑德拉、 HBase、 附录、 Neo4j 和 Windows Azure 表。这篇文章将集中在 Windows Azure 表上。

主要的差异,尽管 SQL 和 NoSQL 数据库有一个共同点:这些技术是作为服务的云计算,让开发人员不用再向手动提供和 de-provision 的数据服务器提供的。例如,Windows Azure 表作为服务提供,开发人员永远不会觉得在不同的物理服务器。

在本月的专栏中,我们将开始与浅的一些功能和 Windows Azure 表的能力。接下来,我们将提供一些代码来演示如何您可能与 Windows Azure 表插入和查询数据的工作。而且,最后,我们会看看的一些设计目标和 WAS 的高级别的实现细节。

一些基础知识

Windows Azure 表的重要特性之一是跨三个地理上分散的地区,包括美国、 欧洲和亚洲提供了存储。每个 Microsoft 数据中心符合国际组织的标准化 (ISO) 27001、 SSAE 16 ISAE 3402、 欧盟示范条款和健康保险可携性与责任法案 (HIPAA) 业务关联协议 (BAA) 标准。另一个重要功能是地理冗余存储,使您可以复制您的数据在另一个数据中心内同一区域,添加另一级别的灾难恢复。

WAS 性能和能力是对存储帐户关联起来。每个存储帐户包括 200 TB 的存储容量。已优化 Windows Azure 表提供令人难以置信的快速查询写重工作负载下的性能。你可以阅读更多在bit.ly/cMAWsZ

图 1 显示为 2012 年 6 月 7 日之后创建的单个存储帐户的可扩展性目标。

图 1 可伸缩性目标为单个存储帐户的

有人分析也是可用的允许开发人员对存储的跟踪请求,使用趋势分析和优化存储帐户中的数据访问模式。阅读更多在 bit.ly/XGLtGt

请注意 WAS 系统包括其他抽象,如 blob 和队列。我们将在这里集中 Windows Azure 表,用于存储非关系型结构化和半结构化数据。他们支持 NoSQL 密钥值查找在规模和写重工作负载下的最简洁的方式表达的 Windows Azure 表值。从开发人员的角度来看,Windows Azure 表是用于存储大型对象集合的非均匀或现职高流量的网站上的页面。

Windows Azure 表可以从几乎任何地方访问。整个存储系统是具象状态传输 REST 启用的这意味着任何能够 HTTP 的客户端可以与 WAS 系统通信。明显的客户包括 iOS、 Android、 Windows 8 和不同的 Linux 发行版。其余 API 支持插入、 upserts、 更新和删除操作,并选择或查询。

当使用 Windows Azure 表,起始点关键了解如何控制数据的分区方案。对于任何给定的 Windows Azure 表,数据架构师必须定义 (提前),PartitionKey 和 RowKey。这也许是最重要的决定,你会使用 Windows Azure 表时。PartionKeys 和 RowKeys 确定如何您的数据自动分区的存储服务和您的查询将执行的方式。建议您了解如何在名为 PartitionKey 和 RowKey 您决定最后定稿之前查询您的数据。稍后,我们将深入探讨力学事务的一致性及它们与 PartitionKeys 的关系。现在,让我们看一下如何在 WAS 系统分区表的数据的一个简单示例。

快速教程

想象一下您想要存储和检索电子邮件从变异­ou 的域例如,以下:bterkaly@microsoft.com、 ricardo.villalobos@microsoft.com、 brunoterkaly@hotmail.com 和 ricardovillalobos@hotmail.com。这些电子邮件地址中的域名是 microsoft.com 和 hotmail.com,而电子邮件名称是 bterkaly 和 ricardo.villalobos。典型的查询首先搜索的域名,然后通过电子邮件名称。

在此简单示例中,PartitionKey 和 RowKey 的选择是相当简单的。我们会将域名映射到 PartitionKey 和 RowKey 的电子邮件名称。

中的代码图 2 应使事情搞清楚。它说明了四个简单的功能:

  • 定义实体 (EmailAddressEntity)
  • 定义的表,将存储实体 (电子邮件­AddressTable)
  • 插入到表的实体 (插入电子邮件地址­到 EmailAddressTable 的实体)
  • 查询表来搜索特定的实体 (bterkaly@microsoft.com 搜索)

图 2 实体 EmailAddressEntity

 

// Our entity derives from TableEntity public class EmailAddressEntity : TableEntity {   // Basic information that makes up our entity   public string EMailAddress { get; set; }   public string PhoneNumber { get; set; }   // A necessary default constructor   public EmailAddressEntity()   {   }   // A two-parameter constructor   public EmailAddressEntity(string email, string phone)   {     EMailAddress = email;     PhoneNumber = phone;     SetKeys(email, phone);   }   // A method that initializes the partition key and row key   public void SetKeys(string email, string phone)   {     int startIndex = email.IndexOf("@");     // Extract the mailname from the e-mail address     string mailname = email.Substring(0, startIndex);     // Extract the domain from the e-mail address     string domain = email.Substring(startIndex + 1);     // Perform the mandatory assignments to the partition key and row key     PartitionKey = domain;     RowKey = mailname;     PhoneNumber = phone;   } }

首先,我们定义实体结构本身,EmailAddressEntity,如中所示图 2。 实际的表 (一个实体容器) 将在以后定义,当我们向表中插入 EmailAddressEntity。 一个实体可以被作为一个单独的对象 ; 它是可以在 Windows Azure 表中存储的数据的最小单位。 如前文所述,实体是类型化的名称-值对,通常称为属性的集合。 表是实体的集合,每个实体属于一个表,就像关系数据库表中的行不会。 但是,Windows Azure 表存储中的表不具有固定的架构。 没有任何规定要求在一个表中的所有实体都是结构上完全相同,正如关系数据库表的情况。

有四个主要部分中的信息图 2。 首两个电子邮件地址和电话号码,只不过是两种我们想要存储的字符串。 其他两个是 PartitionKey 和 RowKey,其中我们以前讨论过的属性。 所需的所有实体的三个属性是时间戳,它由系统内部使用,以便开放式并发。

时间戳列不同于 PartitionKey 和 RowKey 列因为它由 WAS 系统会自动填充。 相比之下,发展商所插入的 PartitionKey 和 RowKey 属性。

总之,PartitionKey 和 RowKey 的重要性是大多是有关查询性能和事务的一致性。 我们以前解释查询性能,很大程度上依赖于数据的存储节点跨分区的方式。 但是,PartitionKeys 还允许您对多个实体进行更改,因为相同的操作,使开发人员能够回滚更改的一部分应任何单个操作失败。 要求是实体是同一实体组,这实际上意味着实体共享相同的 PartitionKey 的一部分。 在单个 PartitionKey 内支持事务。

中的代码图 3 阐释了实例化类型 EmailAddressEntity 的一个实体 (从图 2),然后将该实体插入到 EmailAddressTable。 请注意我们正在使用本地存储模拟器。 这让我们运行和测试我们的代码和数据本地没有连接到一个数据中心。

图 3 插入 EmailAddressEntity

try {   // Use the local storage emulator   var storageAccount = CloudStorageAccount.DevelopmentStorageAccount;   // Create a cloud table client object   CloudTableClient tableClient = storageAccount.CreateCloudTableClient();   // Create an e-mail address table object   CloudTable emailAddressTable =     tableClient.GetTableReference("EmailAddressTable");   // Create the table if it does not exist   // Only insert a new record once for this demo   if (emailAddressTable.CreateIfNotExists() == true)   {     // Create a new EmailAddressEntity entity     EmailAddressEntity emailaddress = new       EmailAddressEntity("bterkaly@microsoft.com", "555-555-5555");     // Create an operation to add the new e-mail and phone number to     // the emailAddressTable     TableOperation insertEmail = TableOperation.Insert(emailaddress);     // Submit the operation to the table service     emailAddressTable.Execute(insertEmail);   } } catch (Exception ex) {   // Put the message in the Web page title (for testing purposes)   // Real error messages should go to a proper log file   this.Title = ex.Message.ToString();   throw; }

如中所示,您可以在 Visual Studio 2012 年的服务器资源管理器窗格中查看您的数据图 4,这使得编写和测试代码更加容易的过程。 您还可以附加到在数据中心中的 Windows Azure 表的实际实例的服务器资源管理器。

Server Explorer
图 4 服务器资源管理器

中的代码图 5 阐释如何查询数据。

图 5 查询 Windows Azure 表

// Use the local storage emulator var storageAccount = CloudStorageAccount.DevelopmentStorageAccount; try {   // Create the table client   CloudTableClient tableClient = storageAccount.CreateCloudTableClient();   CloudTable emailAddressTable =     tableClient.GetTableReference("EmailAddressTable");   // Retrieve the entity with partition key of "microsoft.com"    // and row key of "bterkaly"   TableOperation retrieveBrunoEmail =     TableOperation.Retrieve<EmailAddressEntity>(     "microsoft.com", "bterkaly");   // Retrieve entity   EmailAddressEntity specificEntity =     (EmailAddressEntity)emailAddressTable.Execute(retrieveBrunoEmail).Result;   TableResult result =     emailAddressTable.Execute(TableOperation.Retrieve<EmailAddressEntity>(     "microsoft.com", "bterkaly"));   // Pull the data out that you searched for   // Do something with emailAddress and phoneNumber   string emailAddress = specificEntity.EMailAddress;   string phoneNumber = specificEntity.PhoneNumber; } catch (Exception ex) {   // Put the message in the Web page title (for testing purposes)   // Real error messages should go to a proper log file   this.Title = ex.Message.ToString();   throw; }

 

该代码将执行一个简单的查询,使用 PartitionKey 和 RowKey。请注意您可以构造相当复杂的查询使用这些筛选器,因为您可以联接在一起在特设的时尚。我们建立一个查询对象,该对象使用组合的筛选器。最后一步就是执行查询并做与 EmailAddressEntity 所需的任何。WAS 客户端库极大地简化了创建读取更新/删除 (CRUD) 操作以及所需的查询。

里面是什么

我们认为它可能有助于在 WAS 系统,所示的内部体系结构略有深入了解一下图 6。很多的下列叙述基于引用本文中稍后介绍的布拉德 · 卡尔德纸。

Windows Azure Storage Internals图 6 Windows Azure 存储塔内件

是由组成的系列存储邮票跨其八个数据中心。存储邮票是 10 至 20 架的存储节点的群集。每个机架坐在一个单独的故障域。每个机架带有冗余网络和电源。每个存储邮票包含大约 30PBs 的原始数据存储。

要保持低成本,它是重要的是要保持高于 70%的利用率,衡量能力、 交易和带宽运行这些存储邮票。90%以上的持续被认为太高了,不过,因为这会使小净空高度出现了机架故障时,系统需要做更多与少。

存储位置服务

开发人员已不能直接控制对存储位置服务 (SLS)。在帐户一级,不仅不会补充劳工计划将帐户命名空间映射跨所有邮票,也是负责灾难恢复、 存储的帐户分配和负载平衡。补充劳工计划极大地简化了添加新存储在数据中心中的能力。它可以为客户分配新存储帐户的新的邮票,以及平衡现有存储帐户从旧邮票加载到的新的邮票。所有这些操作的补充劳工计划是自动完成的。

让我们看看存储邮票组成的三层靠近了 — — 流、 分区和前结束 (FE) — — 从底部开始。

流层提供内部接口的分区图层用来读取和写入大型文件,并负责核心复制功能。流层还处理打开、 关闭、 删除、 重命名、 阅读、 追加到和串联这些较大的文件。它不是在流的数据的对象的语义。

分区层为不同类型的存储的对象 (表、 blob,队列) ; 提供数据模型 逻辑和语义,以处理不同类型的对象 ; 一个高度可伸缩的命名空间的对象 ; 负载平衡的访问对象跨所有可用的分区服务器 ; 事务排序和强一致性的访问对象 ; 和土力工程处复制的数据对象从主到次区域。

分区层还封装称为对象表重要的内部数据结构。有几个版本的对象表中,包括实体表,其中存储的所有帐户的所有实体行的邮票。它用来公开 Windows Azure 表数据抽象。对象表还与要确保数据的一致性的 blob、 故事和队列进行订购交易的分区图层进行交互。

铁层是由一组采取传入请求的无状态服务器组成。一旦收到请求,FE 查找 enter 键、 进行身份验证和授权请求,然后将请求路由到适当的分区服务器分区图层 (基于 PartitionName) 中。为了提高性能,FE 维护和缓存分区图,以便路由到适当的分区服务器加快对频繁访问的数据。

总结

在本文中,我们提供了一些高级别、 可操作的指导原则,以及一些建筑细节上的 WAS 系统如何设计的和特别是如何 Windows Azure 表可以帮助您管理您的数据。我们想感谢布拉德 · 卡尔德的一些分享他个人的见解"Windows Azure 存储空间:高度可用云存储服务有强的一致性,"23 ACM 专题讨论会对操作系统的系统原则 (SOSP) 最近发表的文件。您可以下载他的论文在 bit.ly/tMIPus

Windows Azure 存储客户端库 2.0

早在 2012 年 10 月下旬,Microsoft 发布了一个新的客户端存储库 — — Windows Azure 存储 (WAS) 客户端库 2.0 — — 这大大提高了可用性、 可扩展性和性能与 Windows Azure 表进行交互时。您可以安装 WAS NuGet 从与客户端库 2.0 bit.ly/YFeHuw。这可以在 Visual Studio 2012 内。详细看看一些强大的新功能,请访问 bit.ly/VQSaUv

新的库包含一些新的办法,以提高可用性、 可扩展性和性能的功能。一个不错的功能保存您的工作与平原旧 C# 对象 (POCO) 时担心序列化和反序列化逻辑的麻烦。另一个很酷的功能是 EntityResolver,它允许您为执行客户端的预测,以便您可以基于您感兴趣的信息动态创建对象。简而言之,你可以直接从转换表实体数据没有单独的表中的实体类类型的反序列化的每个属性单独的客户端对象类型。另一种功能强大的技术是 IQueryable 接口,这将使您的表达方式来定义复杂的 LINQ 查询。

Bruno Terkaly是 Microsoft 的开发推广人员。他的知识深度来源于多年来相关领域以及使用大量平台、语言、框架、SDK、库和 API 编写代码的经验。他花时间编写代码,博客,给现场演示上构建基于云计算的应用程序,特别使用 Windows Azure 平台。Terkaly 也是作者的两个 Windows 存储应用程序,教孩子汽车颜色和教孩子音乐。您可以阅读他在博客上的 blogs.msdn.com/brunoterkaly

Ricardo Villalobos 是一名资深的软件设计师,具有 15 年为供应链管理行业设计和创建应用程序的经验。他在从达拉斯大学工商管理持有不同的技术认证,以及硕士学位,微软作为一个云建筑师在 Windows Azure CSV 孵化组工作。

Terkaly 和比利亚洛联合目前在逃的行业会议。他们鼓励读者与他们联系的可用性。可以在达成 Terkaly bterkaly@microsoft.com 和比利亚洛沃斯可以达成 Ricardo.Villalobos@microsoft.com

衷心感谢以下技术专家对本文的审阅:布拉德 · 卡尔德 (Microsoft) 和洁 Haridas (微软)