Azure 存储(Storage)是Microsoft Azure云中非常关键的基础性服务,绝大多数的服务(例如Azure虚拟机VM的VHD文件、大数据HDInsight等),都基于这一关键服务。
对于希望深入管理自己云应用的IT人员或者开发人员,特别是一些基于Azure提供多租户(Multi-tenancy)服务的厂商,希望能够更深入地掌握自己账户的存储的运行情况,以便进行有效控制、成本分摊及异常诊断等。
这里涉及到的一个关键概念就是Azure的存储分析,可以为存储帐户提供指标数据,进行跟踪请求、分析使用情况趋势及诊断问题等。
目前,可以针对存储帐户的关键类型,即Blob、表、队列等进行度量,后续也会将共享文件(FileShare,目前还在预览Preview阶段)提供度量分析支持。
在Azure管理门户(Management Portal)上,可以非常便捷地开启和设置对存储的监控、记录及后续分析的功能。如下图,可以针对选定的存储账号(Storage Account),在“配置”页中,对“监视”及“日志记录”中的Blob、 表、队列等,开启相关设置。
此外,还可以通过 REST API 或客户端库以编程方式启用存储分析,例如:PUT https:// <account-name>.blob.core.windows.net/?restype=service&comp=properties HTTP/1.1。
应该注意的是,对于存储账号,“监视”及“日志记录”默认的设置是“关闭”。根据实践,建议开启这一配置,以便进行排错、分析。
另外,在存储的架构层次里,建议针对存储账户,而非其更下一层,例如Blob的容器(Container),进行监控。当然,如果需要了解Container, Table, Queue中的容量规模,可以自己来估算大概规模:
例如,对于Blob Container,总规模公式:
48 bytes + Len(ContainerName) * 2 bytes +
For-Each Metadata[3 bytes + Len(MetadataName) + Len(Value)] +
For-Each Signed Identifier[512 bytes]
对于Table Entity,总规模公式:
4 bytes + Len (PartitionKey + RowKey) * 2 bytes +
For-Each Property(8 bytes + Len(Property Name) * 2 bytes + Sizeof(.Net Property Type))
对于Queue,总规模公式:
24 bytes + Len(QueueName) * 2 +
For-Each Metadata(4 bytes + Len(QueueName) * 2 bytes + Len(Value) * 2 bytes)
更详细的信息,可以参考下面的博客文章:
如何估算Container, Table, Queue的容量
对于客户端方式,也可以利用日志功能,对Azure存储访问请求及响应情况进行记录。
对于存储的监控、分析度量,一些关键的运行指标,值得重点关注:
- TotalRequests,即向存储服务或指定的 API 操作发出的请求数。
- TotalEgress,即传出数据量(字节)。
- TotalIngress,即传入数据量(字节)。
- TotalBillableRequests,即计费的请求数。从Azure存储内部机制而言,某些失败的请求是不在计费范围内的。
此外,还有一些不同类型的错误信息,也便于更深入地了解存储的异常情况,例如:
- ThrottlingError,了解被阻塞的存储访问数量。利用这一指标,可以更好地规划存储账号,合理地将负载分配到多存储账号,提高系统的整体性能。
- PercentThrottlingError,即失败并出现限制错误的请求百分比。
- PercentTimeoutError,即失败并出现超时错误的请求百分比。该数字包括客户端和服务器超时
- PercentAuthorizationError,即失败并出现 AuthorizationError 的请求百分比。对于安全性方面的监控,有助于防止恶意攻击、侵入等安全隐患。
- NetworkError,即向存储服务或指定的 API 操作发出且返回 NetworkError 的已验证请求数。
此外,还有一些指标可以帮助更好地了解性能相关情况,例如:
- AverageE2ELatency,即向存储服务或指定的 API 操作发出的成功请求的平均端到端滞后时间(毫秒)。该值包括在 Windows Azure 中读取请求、发送响应以及接收响应确认所需的处理时间。
- AverageServerLatency,即Azure 存储处理成功请求使用的平均滞后时间(毫秒)。该值不包括在 AverageE2ELatency 中指定的网络滞后时间。
结合这些指标,可以更好地优化应用中数据结构的设计,合理设计分区(Partition Key),提供应用的响应性能。