Microsoft云存储服务分为两个部分,SQL Azure和Azure Storage。云存储系统的可扩展性和功能不可兼得,必须牺牲一定的关系数据库功能换取可扩展性。Microsoft实现云存储的思路有两种:

  1, 做减法。SQL Azure直接在原有的SQL Server上引入分布式的因素,在满足一定可扩展性的前提下尽可能不牺牲原有的关系型数据库功能。SQL Azure的可扩展性是有限的,单个SQL Azure实例不允许超过50GB,这是因为SQL Azure不支持子表动态分裂,单个SQL Azure实例必须足够小从而可以被一个节点服务。具体信息可以参考我以前的一篇文章:Microsoft SQL Azure架构设计

  2, 做加法。Azure Storage先做好底层可扩展性,然后再逐步加入功能,这与Google GFS & Bigtable的思路比较一致。Azure Storage分为Blob, Queue和Table三个部分,其中Azure Table Storage最具有代表性,由于底层系统支持子表分裂,单个用户的最大数据量可以达到100TB。然而Table Storage支持的功能有限,甚至不支持索引功能。具体信息可以参考msdn的一篇文章:Azure Storage架构介绍

Microsoft Azure Storage 逻辑上分为三层:

  1, 前端(Front-End Layer):类似互联网公司的Web服务器层,可采用LVS + Nginx的设计,主要做一些杂事,比如权限验证。由于前端服务器没有状态,因此很容易实现可扩展。

  2, 存储层 (Partition Layer):类似Bigtable,分为Partition Master和Partition Server两种角色,分别对应Bigtable Master和Tablet Server。每一个Partition(相当于Bigtable中的Tablet)同时只能被一个Partition Server服务,Partition Master会执行负载均衡等工作。Bigtable中分为Root Table, Meta Table和User Table,Azure Table Storage可能会为了简单起见消除Meta Table,所有的元数据操作全部放到Partition Master上。

  3, 文件系统层(DFS Layer):类似GFS,数据按照extent(相当于GFS中的chunk)划分,每个extent大小在100MB ~ 1GB之间。数据存储三份,写操作经过Primary同步到多个Secondary,读操作可以选择负载较轻的某个Primary或者Secondary副本。当发生机器故障时,需要选择其它机器上的Secondary切换为Primary继续提供写服务,另外需要通过增加副本操作使得每个extent的副本数维持在安全值,比如三份。为了简单起见,DFS Layer对上层Partition Layer可以不提供文件系统接口,只提供类似块设备的访问方式。

  Azure Storage的主键包括Partition Key + Row Key两部分,其中,Partition Key用于数据划分,规定相同的Partition Key只属于同一个Partition,从而被一台Partition Server服务,这就使得Partition Key相同的多个行之间能够支持事务。与SQL Azure不同,Azure Storage的并发操作通过乐观锁的方式实现。Azure Storage包含三个不同的产品,其中Azure Table Storage支持用户设置Schema,支持byte[], bool, DataTime, double, Guid, Int32, Int64, String这几种列类型;Azure Blob Storage将Blob数据存放到底层的DFS Layer中,Blob过大时可能存放到多个extent中,Partition Layer存储每个Blob的编号到Blob所在的多个extent位置之间的映射关系;Azure Queue Storage将Partition Key设置为Queue的编号,Row Key设置为消息的编号,从而保证属于同一个Queue的消息连续存放。

  总之,Microsoft Azure Storage和早期的Bigtable总体架构是很类似的,可能做了一些简化,这也间接说明了一点:如果不发生重大硬件变革,工程上要实现高可扩展的分布式B+树,将云存储系统分成文件+表格两层还是比较靠谱的。开发人员更多地需要在实现细节上下功夫,落实到线上的每行代码上。

Microsoft Azure Storage架构分析的更多相关文章

  1. Azure系列2.1 —— com.microsoft.azure.storage.blob

    网上azure的资料较少,尤其是API,全是英文的,中文资料更是少之又少.这次由于公司项目需要使用Azure,所以对Azure的一些学习心得做下笔记,文中不正确地方请大家指正. Azure Blob ...

  2. Microsoft Azure Storage Exployer使用指南

    概述 Microsoft Azure Storage Exployer 是微软官方推荐的一款管理Azure Storage 客户端工具,客户使用完全免费.支持Windows.Mac和Linux.用户使 ...

  3. Microsoft Azure Storage Explorer(2)

    之前写过一个往Microsoft Azure Storage Explorer里存储的功能,现在又要把东西给下载下来. 记录一下: public string DownFileFromAzure() ...

  4. 如何访问Microsoft Azure Storage

    首先先要创建存储账户 http://www.cnblogs.com/SignalTips/p/4119128.html 可以通过以下的几个方式访问 通过Visual Studio 2013 Commu ...

  5. Microsoft Azure存储架构设计

    SQL Azure简介 SQL Azure是Azure存储平台的逻辑数据库,物理数据库仍然是SQL Server.一个物理的SQL Server被分成多个逻辑分片(partition),每一个分片成为 ...

  6. Azure Storage架构介绍

    Windows Azure Storage由三个重要部分或者说三种存储数据服务组成,它们是:Windows Azure Blob.Windows Azure Table和Windows Azure Q ...

  7. Microsoft Azure Storage Explorer

    上周主管说,要把每次开过的发票,要下载成Pdf的文件,然后就实时的将这些发票存到云上面去. 就是这个Microsoft Azure ,微软的亲儿子. 先把代码贴上来吧,挺简单的. ##.链接账号密码 ...

  8. Azure Storage 系列(七)使用Azure File Storage

    一,引言 今天我们开始介绍 Storage 中的最后一个类型的存储----- File Storage(文件存储),Azure File Storage 在云端提供完全托管的文件共享,这些共享项可通过 ...

  9. Azure Queue Storage 基本用法 -- Azure Storage 之 Queue

    Azure Storage 是微软 Azure 云提供的云端存储解决方案,当前支持的存储类型有 Blob.Queue.File 和 Table. 笔者在<Azure File Storage 基 ...

随机推荐

  1. Struts2-result

    所有result-type <result-types> <result-type name="chain" class="com.opensympho ...

  2. python中global 和 nonlocal的使用

    1.global关键字用来在函数或其他局部作用域中使用全局变量.但是如果不修改全局变量也可以不使用global关键字. gcount = 0 def global_test(): gcount+=1 ...

  3. noip第29课作业

    1.   钢条切割 [问题描述] 一家公司购买长钢条,将其切割成短钢条出售,切割本身没有成本,长度为i的短钢条的价格为Pi.那给定一段长度为n的钢条和一个价格表Pi,求钢条的切割方案使得收益Rn最大. ...

  4. Sensor

    原理:http://blog.csdn.net/xiaolei05/article/details/18670161 1.Sensor Type       重力感应/加速度传感器 (G-Sensor ...

  5. express package.json解析

    教程:http://www.tuicool.com/articles/vuiyIz

  6. cocos游戏的例子(摘抄记录,非原创)

    3.1 搭建Cocos2d-JS v3.x 开发环境 下载所需的软件包 下载 Cocos Code IDE.目前 Cocos Code IDE 最新发布版本是 1.0.0-RC2.我们为什么 Coco ...

  7. 分形之二叉树(Binary Tree)

    上一篇文章讲的是分形之树(Tree),这一篇中将其简化一下,来展示二叉分形树的生长过程. 核心代码: static void FractalBinaryTree(const Vector3& ...

  8. 一场关于 .net core 和 .net framework 编码的案情分析

    案情背景 目前公司做新项目,基本所有新项目都是用.net core来做,旧项目一半还是基于 .net framework下面,一半已经迁移到了core平台.在做新项目的时候,有个功能需要对接到旧项目那 ...

  9. C#开发邮件收发(同步)

    发邮件界面: 收邮件界面: 先分析邮件发送类 邮件发送类使用smtp协议,这里以QQ邮箱为例 using System; using System.Collections.Generic; using ...

  10. OCP考试062题库出现大量新题-19

    choose three Which three statements are true about Oracle Data Pump? A) Oracle Data Pump export and ...