前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Windows Server分布式存储深入解析(课程实录)

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

作者头像
盆盆
发布2019-04-24 14:37:35
3.5K0
发布2019-04-24 14:37:35
举报
文章被收录于专栏:华来四Azure混合云

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大小能调整吗?

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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2017-02-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 华来四Azure混合云 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
文件存储
文件存储(Cloud File Storage,CFS)为您提供安全可靠、可扩展的共享文件存储服务。文件存储可与腾讯云服务器、容器服务、批量计算等服务搭配使用,为多个计算节点提供容量和性能可弹性扩展的高性能共享存储。腾讯云文件存储的管理界面简单、易使用,可实现对现有应用的无缝集成;按实际用量付费,为您节约成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档