专栏首页华来四Azure混合云Windows Server分布式存储深入解析(课程实录)

Windows Server分布式存储深入解析(课程实录)

Windows存储空间常见技术

我们今天的主题是Windows Server 存储空间的I/O分发,主要包括以下两种情况下的I/O分发:

  1. 存储空间I/O在群集节点间的分发
  2. 存储空间I/O在节点硬盘间的分发

首先我们来了解在Windows Server 存储空间中经常用到的几个技术:

  1. 存储空间列数(# of Column)
  2. CSV组件和I/O分类
  3. 存储分层和数据热度收集

这几个技术对我们认识Windows Server 存储空间的数据读写有很大的帮助,所以在讲Windows Server 存储空间的I/O分发之前,我们先逐个认识下这3个技术。

首先是存储空间列数,存储空间的列用来组织I/O分发到硬盘的“中介”,列类似于一个虚拟的通道,和RAID的分条宽度相似。

存储空间分条后写入列和RAID分条后往硬盘写入不同,存储空间分条的数据先找到列这个通道,再写到列里的硬盘,写入列数体现了数据写入通道数。

每个列通道里包含一块到三块不等的硬盘,列和硬盘数之比称之为列/硬盘数比。

来看这张图。

通常,简单布局的存储空间有一块硬盘,所以列:硬盘为1:1, 双重镜像的存储空间有2块硬盘,列:硬盘为1:2,三重镜像为1:3.

列数并非一成不变的,在构建存储池以后,存储池根据实际情况将列数调整为自动或者固定值,可以使用这个PowerShell命令查看存储空间列数。

Get-StoragePool -FriendlyName <存储池名称> | Get-ResiliencySetting -Name Mirror

如果在创建存储空间的时候没有特别指明列数,这个列数就会是自动。因此我们可以自己修改列数:

PS C:\> Get-StoragePool -FriendlyName <存储池名称> | Get-ResiliencySetting -Name Mirror | Set-ResiliencySetting -NumberofColumnsDefault <你要设置的列数>

CSV组件和I/O分类

好,我们开始讲第二个概念,CSV组件和I/O分类。

CSV节点分类

  1. 硬盘所挂载的节点称之为协调者节点
  2. 没有CSV硬盘挂载的节点称之为数据服务器,协调者节点同时也可以是数据服务器。

同时节点又分为SMB服务器和SMB客户端,SMB客户端通常指的是没有物理连接到存储的节点。在分布式存储中,SMB客户端通常不提供和协调资源,更多的是使用资源。

听起来,SMB Client节点就像小朋友去野炊的时候,那个不带米、不带菜也不带调料,只带碗筷来吃饭的小朋友。

这张图中的node1、node2都是协调者节点,node3是数据服务器,node1和node2也可能是数据服务器,因为会发生物理连接的故障。三个节点共同完成数据的读写。

早期的Windows Server,比如2008的群集磁盘是通过SCSI SPC-3协议为磁盘所有者节点保留控制权的,而CSV可以保证多个节点同时读写CSV, 它怎么做到的呢?

因为,CSV增加了编排层,包括以下几个编排工具来完成I/O的分发

  1. CSVFS文件系统
  2. CsvNsFlt过滤器
  3. CsvFlt过滤器

这些个过滤器和文件系统给我们带来访问本地卷相近的体验,大家用过CSV的都应该能感受得到,就是C:\ClusterStorage\Volume,并且让NTFS/ReFS卷可以被多台服务器同时访问,每个协调者节点都具有CSVFS文件系统和CsvNsFlt/CsvFlt 编排过滤器。

大家可以再回看刚才那张图,这张图里布满了“I/O管道”,应用访问CSV卷时,这些管道负责I/O分发,“I/O管道”可以分为3种:

  1. 直接I/O
  2. 文件系统重定向I/O
  3. 块级别重定向I/O

在写入的时候顺序通常是从上往下发,就好像水流从高处往地处流一样。

当然,水可以借助水泵从低处往高处走,同样CSV的I/O可以借助SMB协议从低处往高处传输。

CSV组件里,过滤器以及CSVFS/NTFS/卷/硬盘用高度(Altitude)来标识,大家再看看图,是不是组件和过滤器分布得有上有下。

各个实例的高度按照从高到低排列为:CSVFS>NTFS>卷>硬盘,I/O在节点间可以从低层过滤器实例发往高层过滤器实例,也即I/O重定向。

CSV这些个文件系统和过滤器处理不同的I/O: CsvFlt 作用于文件级I/O定向、CsvNsFlt 作用于块级别I/O定向、CSV文件系统(CSVFS)作用于直接I/O

这张图表达的就是直接I/O,I/O不经过网络,经由CsvFs通过CsvVbus直接到硬盘堆栈。

我们再看看文件级重定向I/O, 文件级重定向I/O用这张图来表示:

文件系统重定向I/O发生在节点文件系统之间,节点间通过SMB协议传输I/O。

再看看块级重定向I/O, 块级重定向I/O从CSV卷管理器发起I/O在节点间的传输。

如这张图所示。

存储分层和数据热度收集

讲完了CSV组件和I/O分发的管道,以及3种典型的I/O类型,接下来我们讲第三个概念:存储分层和数据热度收集。

Windows Server 内置的存储分层管理服务(Storage Tiers Management Service)进行分层,默认,每天晚上1点启动冷热数据移动,在计划任务程序里自动执行,当然也可以手动执行;使用和碎片整理相同的defrage命令完成;存储分层服务按照1MB的单位分析数据热度并移动数据到预期的层。

那么大家会问了,热度怎么计算和追踪呢?

存储空间如果设置了分层,默认会启用Heatmap(数据热度收集)。Heat map是数据访问的总结视图,它将跟踪到的数据增加、更新、删除、查询、扫描等所有信息归总到块级别。

其实,Oracle也在使用ILM Heat map对其数据库进行表级别的跟踪,这些跟踪也最终汇总到块级别。

热度收集由一个参数控制,它就是TrNH,启用该标识会将分层的卷设置为“禁用数据热度收集”

通过以下命令,就可以给存储空间“贴上”TrNH标识,也就禁用掉了Heatmap。

fsutil tiering setflags <卷> /TrNH

通过fsutil tiering clearflags <卷> /TrNH 可以清除TrNH标识,也即启用Heatmap

大家可以打开你的电脑,在命令提示符里输入fsutil tiering clearflags <卷>

可以看看是否有TrNH标识,不过你在电脑里看到这个结果没有实际意义,因为TrNH针对的分层的存储空间卷才有效。

存储空间节点I/O分发

3个主要概念讲完了,接下来就要讲存储空间在节点级I/O分发了。

我们在环境中创建了4个存储空间,并设置为CSV, 分别分配给两个不同的节点,2个分层CSV分别使用简单和镜像布局;2个不分层的CSV分别使用简单和镜像的布局。

赶紧贴图:

然后,我们使用Get‐ClusterSharedVolumeState查询CSV状态。

分辨率不够,看不太清楚,这里的两个CSV基于分层存储空间,对于所有节点来说都是文件级别的I/O重定向。

与存储空间布局无关。

这个结果显示的是2个不分层的存储空间配置的CSV,对于Owner节点来说使用直接I/O,对于非Owner节点来说使用块级I/O重定向。

可以小结为下表:

通常,发生文件级I/O重定向的可能原因:

  1. 人为误操作重定向模式(CSV重定向状态在群集控制台可见)
  2. 不兼容的文件系统过滤器附加到NTFS/ReFS文件系统栈
  3. 不兼容的卷过滤器附加在NTFS/ReFS文件系统下
  4. 存储空间设置了分层,启用了Heatmap(数据热度收集)

所以,我们可以结合之前讲的存储空间Heatmap和分层的概念,就容易理解为什么分层的存储用的是文件级I/O重定向了。

而,块级I/O重定向发生的原因是

  1. 节点没有物理连接到硬盘(NoDiskConnectivity)
  2. 存储空间没有附加给节点(StorageSpaceNotAttached),通常是因为:
    • 存储空间的布局设置为镜像和奇偶校验
    • 启用了回写缓存的简单布局(禁用回写缓存,则使用直接I/O)

硬盘级I/O分发

讲完节点间的I/O分发,我们再看硬盘级I/O分发

要结合之前的概念来理解。

这是2列+简单布局的存储空间,每个列虚拟容器里包含一块硬盘,数据被条带化后,分别写入两个列。

这是2列+双重镜像布局的存储空间,镜像布局和简单、奇偶校验布局不同的一点是在条带层底下添加了I/O镜像层,也即数据复制层,所以双重镜像布局要求每个列必须包含两块硬盘。条带后的数据写入列之前在复制层将一份数据复制成两份,然后将两份数据分别写入列的两块硬盘。

当然,可以类推出2列和三重镜像,N列和其他布局的存储空间I/O的下发。我们就不再一一展开了。大家自己去想象吧。

技术答疑

提问:这是2012R2的还是2016?

回答:适用于2012和2016,但是我的截图是2012的。严格来说,2012和2016在物理结构上有不同,所以会略有差别。比如,2012共享模式,所有server节点都是协调者节点,但是在2016里是分布式结构,会出现数据服务器

提问:csv磁盘被重新挂载时会显示raw格式不可读

回答:你之前对CSV做了哪些操作?初看起来是CSV文件格式的问题。

提问:我把csv的存储做了LUN的快照,然后把快照挂载出来做之前数据的恢复,把快照映射到一台非群集的机器上,用存储的快照功能做数据的回滚,把快照挂到另一台机器上提取需要的数据

回答:为什么不用新的LUN做成CSV呢?

回答(Sean):如果CSV下层的卷mount起来是raw,十有八九是发生了卷头格式的信息损掉了,取决于很多情况。如果是gpt分区表挂了,可以从尾部提取回来

提问:如果某个节点突然失效,数据重建要多久,代价是什么

回答:和节点失效无关,比如用了双重镜像,有4台服务器,你一台失效了,数据仍然是完整的,但是你要重构的话,可以在存储空间里设置自动或者手动执行

提问:对,问题来了,此时对活着那台的性能消耗呢?我不可能把大部分的计算资源投入到重建中去。s2d是要消耗cpu的

回答:在存储空间里,有自动、一直和从不重构这三个选项,假如你存储池有足够的可用空间,建议设置为自动,存储空间在感知问题后,会自动重构数据。也可以设置并行重构和按序重构,这样来减少CPU的使用

提问:假设4节点4副本,此时某一个节点失效 ,当重构时,cpu的负载是3个节点一起还是集中到一个节点上。当节点失效时,我们硬件资源本来性能就不足的。

回答:S2D建议CPU配置足够多

提问:如果cpu要冗余过多,岂不是并不廉价

回答:S2D可以利用RDMA、VMQ\SR-IOV这些技术减少CPU消耗

提问:我记得2012R2的column是在创建时确定的吧,而且不能调整

回答: 如果创建时不设置具体的column数,那么就是auto。column在创建完毕之后也可以调。如果是auto的话,存储空间会按照环境自行调整,column也有个推荐的计算公式

提问:column调整用什么powershell?

回答:Get-StoragePool -FriendlyName <存储池名称> | Get-ResiliencySetting -Name Mirror | Set-ResiliencySetting -NumberofColumnsDefault <你要设置的列数>

请问:如下3种io 哪种性能最好?如果是直接io最好 ,那分层的csv即使直接挂载的node也只能使用文件系统重定向,岂不是性能反而有下降?

  • 直接I/O
  • 文件系统重定向I/O
  • 块级别重定向I/O

回答:直接I/O最好,其次是块级I/O,因为没有发生SMB传输,减少了网络延迟、抖动和速率的干扰

提问:每天晚上1点启动冷热数据移动,存储分层服务按照1MB的单位分析数据热度并移动数据到预期的层,这个1MB大小能调整吗?

回答:这个我没找到调的入口。看起来是不行的

本文分享自微信公众号 - 华来四Azure混合云(sysinternal),作者:黄利军

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2017-02-24

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 在Azure Stack上部署Kubernetes

    要参加微信课堂以及日常技术交流,请给我们发微信(微信号:markpah),请注明加入以下哪个群:

    盆盆
  • 在Azure Stack上部署Kubernetes

    Azure Stack是我们实现DevOps的重要利器,而要实现DevOps,离不开容器编排平台Kubernetes的支持。本文将介绍如何在Azure Sta...

    盆盆
  • 在中国区Azure Stack上部署Kubernetes

    Azure Stack是我们实现混合云DevOps的重要利器,而要实现DevOps,离不开容器编排平台Kubernetes的支持。本文将介绍如何在Azure ...

    盆盆
  • 硬件笔记(8)----USB学习笔记5

    如前面所述,当某个设备被连接到 USB 主机上,该设备会向主机提供其功能和电源要求。通常,设备会通过一个描述符表格(其固件的一部分)来提供这些信息。描述符表格是...

    小火柴棒
  • 新战场路在何方——详解360金融数据中台之旅

    自阿里巴巴引入中台概念后,市场对中台的关注度持续“高烧”不退。作为企业的基础平台,数据中台贯彻了整个数据生命周期。然而究其根本,数据中台不是一门技术,而是一种数...

    AI科技大本营
  • USB初学(一)---USB-HID的初步认识【转】

    HID是一种USB通信协议,无需安装驱动就能进行交互,在学习HID之前,先来复习一下USB协议的相关内容。

    233333
  • 终极k8s HA方式 - 附上个人安装心路历程

    一直觉得k8s的HA安装没有一个很优雅的方式,大部分都有外部依赖,haproxy keepalived等,构建部署时就会变得麻烦,所以很多人写了an...

    sealyun
  • 一天之内,两场好雨

    Rainbond开源
  • 【Python系统学习02】数据类型与类型转换

    换言之,但凡包裹在英文格式下的 单引号、双引号或三引号 里的内容,不论引号里边是英文、中文、甚至是数字、符号、火星文等,她都叫做字符串。

    xing.org1^
  • 一篇文章教你如何用 Redis 轻松实现秒杀系统的构思

    用上这三招,不论秒杀时负载多大,都能轻松应对。更好的是,Redis能够满足上述三点。因此,用Redis就能轻松实现秒杀系统。 用我这个方案,无论是电商平台特价秒...

    Java周某人

扫码关注云+社区

领取腾讯云代金券