Windows存储空间常见技术
我们今天的主题是Windows Server 存储空间的I/O分发,主要包括以下两种情况下的I/O分发:
首先我们来了解在Windows Server 存储空间中经常用到的几个技术:
这几个技术对我们认识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节点分类
同时节点又分为SMB服务器和SMB客户端,SMB客户端通常指的是没有物理连接到存储的节点。在分布式存储中,SMB客户端通常不提供和协调资源,更多的是使用资源。
听起来,SMB Client节点就像小朋友去野炊的时候,那个不带米、不带菜也不带调料,只带碗筷来吃饭的小朋友。
这张图中的node1、node2都是协调者节点,node3是数据服务器,node1和node2也可能是数据服务器,因为会发生物理连接的故障。三个节点共同完成数据的读写。
早期的Windows Server,比如2008的群集磁盘是通过SCSI SPC-3协议为磁盘所有者节点保留控制权的,而CSV可以保证多个节点同时读写CSV, 它怎么做到的呢?
因为,CSV增加了编排层,包括以下几个编排工具来完成I/O的分发
这些个过滤器和文件系统给我们带来访问本地卷相近的体验,大家用过CSV的都应该能感受得到,就是C:\ClusterStorage\Volume,并且让NTFS/ReFS卷可以被多台服务器同时访问,每个协调者节点都具有CSVFS文件系统和CsvNsFlt/CsvFlt 编排过滤器。
大家可以再回看刚才那张图,这张图里布满了“I/O管道”,应用访问CSV卷时,这些管道负责I/O分发,“I/O管道”可以分为3种:
在写入的时候顺序通常是从上往下发,就好像水流从高处往地处流一样。
当然,水可以借助水泵从低处往高处走,同样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重定向的可能原因:
所以,我们可以结合之前讲的存储空间Heatmap和分层的概念,就容易理解为什么分层的存储用的是文件级I/O重定向了。
而,块级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,因为没有发生SMB传输,减少了网络延迟、抖动和速率的干扰
提问:每天晚上1点启动冷热数据移动,存储分层服务按照1MB的单位分析数据热度并移动数据到预期的层,这个1MB大小能调整吗?
回答:这个我没找到调的入口。看起来是不行的