SDS不仅是一个软件和硬件解耦的过程,更是一个存储数据平面和控制平面解耦的过程。同样,Windows Server SDS也是一个数据平面和控制平面解耦的过程,结构后分为3个部分:存储池、存储空间和服务层。本文我们主要讲述Windows Server 存储空间I/O的分发,看看Windows Server SDS控制平面SDS如何对数据进行处理。我们将话题一分为二来看看不同层次的I/O分发:

(1)存储空间I/O在群集节点间的分发

(2)存储空间I/O在节点硬盘间的分发

本文我们就这两种I/O分发进行讨论,在进入正题前,我们先来了解在WindowsServer 存储空间中经常用到的几个技术,这几个技术对我们认识WindowsServer 存储空间的数据读写有很大的帮助。所以在讲Windows Server 存储空间的I/O分发之前,我们先逐个认识下这3个技术:

  1. 存储空间列数(# of Column)

  2. CSV组件和I/O分类

  3. 存储分层和数据热度收集

 

存储空间列数

存储空间的列用来组织I/O分发到硬盘,列类似于一个虚拟的通道,和RAID的分条宽度相似。但是存储空间分条数据写入列和RAID分条后往硬盘写入不同,存储空间分条的数据先找到列这个通道,再写到列里的硬盘,写入列数体现了数据写入通道数。每个列通道里包含一块到三块不等的硬盘,列和硬盘数之比称之为列/硬盘数比,如图1所示。

                            

图1

列/硬盘数比以及最大和最小列数因存储空间布局不同而不同,通常,简单布局的存储空间有一块硬盘,所以列:硬盘为1:1, 双重镜像的存储空间有2块硬盘,列:硬盘比为1:2,三重镜像的列:硬盘比为1:3。列数并非一成不变的,在构建存储池以后,存储池根据实际情况将列数调整为自动或者固定值,可以使用这个PowerShell命令查看存储空间列数。

 条带交错大小(Interleave,和RAID strip size类似)和列数决定着分条尺寸。列数并非一成不变的,在构建存储池以后,存储池根据实际情况将列数调整为自动或者固定值,可以使用如下示例PowerShell命令查看存储空间列数。

PS C:\> Get-StoragePool-FriendlyName 
 | Get-ResiliencySetting -Name Mirror |ft Name,NumberofColumnsDefault

 如果在创建存储空间的时候没有特别指明列数,这个列数就会是自动(auto),如果是auto的话,存储空间会按照环境自行调整,column也有个推荐的计算公式。因此我们可以自己修改列数:

PS C:\> Get-StoragePool-FriendlyName 
 | Get-ResiliencySetting -Name Mirror |Set-ResiliencySetting -NumberofColumnsDefault <# of column you desired>

 CSV结构

接下来我们看一下CSV的结构和组件,首先看下CSV的节点分类:

硬盘所挂载的节点称之为协调者节点,没有CSV硬盘挂载的节点称之为数据服务器,协调者节点同时也可以是数据服务器。节点又分为SMB服务器和SMB客户端,SMB客户端通常指的是没有物理连接到存储的节点。在分布式存储中,SMB客户端通常不提供和协调资源,更多的是使用资源。听起来,SMB Client节点就像小朋友去野炊的时候,那个不带米、不带菜也不带调料,只带碗筷来吃饭的小朋友。图2所示的这张图中的节点1和节点2都是协调者节点,节点3是数据服务器,节点1和节点2也可能是数据服务器,因为会发生物理连接的故障;节点1和节点2通常是SMB候选服务器,而节点3是SMB客户端,三个节点共同完成应用数据的读写。

 图2

 早期的Windows Server,比如2008的群集磁盘是通过SCSI SPC-3协议为磁盘所有者节点保留控制权的,而CSV可以保证多个节点同时读写CSV, 它怎么做到的呢?因为Windows Server 2008 R2及后续版本的CSV增加了编排层,包括以下几个编排工具来完成I/O的分发:

(1)CSVFS文件系统

(2)CsvNsFlt过滤器

(3)CsvFlt过滤器

这些个过滤器和文件系统给我们带来访问本地卷相近的体验,大家用过CSV的都应该能感受得到,就是C:\ClusterStorage\Volume,并且让NTFS/ReFS卷可以被多台服务器同时访问,每个协调者节点都具有CSVFS文件系统和CsvNsFlt/CsvFlt编排过滤器。在图2中我们可以看到CSV具备多个I/O分发“管道”,应用访问CSV卷时,数据通过这些管道进行传输,这几个I/O分发“管道”包括:

(1)直接I/O

(2)文件系统重定向I/O

(3)块级别重定向I/O

同时,无论是协调者节点还是数据服务器节点,其所包含的过滤器以及CSVFS/NTFS/卷/硬盘都可以用高度(Altitude)来标识,我们可以使用fltmcinstances这个命令来查看Windows Server过滤器和其他组件的高度,如图3所示。

图3

在写入数据时候顺序通常是从上往下发,就好像水流从高处往地处流一样。当然,水可以借助水泵从低处往高处走,同样CSV的I/O可以借助SMB协议从低处往高处传输。CSV组件里的过滤器以及CSVFS/NTFS/卷/硬盘用高度(Altitude)来标识,大家再看看图2,是不是组件和过滤器分布得有上有下。通常各个实例的高度按照从高到低排列为:CSVFS>NTFS>卷>硬盘,I/O在节点间可以从低层过滤器实例发往高层过滤器实例,也即I/O重定向。总而言之,在CSV里,I/O的路径包括:

    (1) I/O从水平较高的层往水平低的层下发

    (2) I/O在节点间可以从低层过滤器实例发往高层过滤器实例,也即I/O重定向

    (3) 各个实例的高度按照从高到低排列为:CSVFS>NTFS>卷>硬盘

CSV这些个文件系统和过滤器处理不同的I/O: CsvFlt 作用于文件级I/O定向、CsvNsFlt 作用于块级别I/O定向、CSV文件系统(CSVFS)作用于直接I/O。接下来我们看看CSV的几种I/O的特点,首先看看直接I/O,直接I/O指的是不会通过网络传输的读写I/O,而是从CsvFs通过CsvVbus直接到硬盘堆栈。图4所示的节点1和节点2物理连接到共享磁盘,它们可以完全不使用网络而是直接发送读写到磁盘,节点3因为没有连接到存储因而无法看到共享磁盘,所以不能使用直接I/O,但是节点3属于群集,所以节点3使用重定向I/O进行读写。

图4

 再看看文件级重定向I/O,文件系统重定向I/O发生在节点文件系统之间,节点间通过SMB协议传输数据,如图5所示,协调者节点2的CsvFS将数据发送到CsvFlt再到NTFS,而数据服务器节点1和节点3通过SMB协议将元数据发送给协调者节点2。需要强调一点的是,文件级的I/O重定向的路径和CSV元数据更新的路径是一致的(我们这里所描述的元数据指的是除了读写以外的所有操作,比如创建、关闭、重命名、删除文件,修改文件属性、修改文件大小等)。

图5

 最后看看块级重定向I/O,块级重定向I/O从CSV卷管理器发起I/O传输,节点间通过SMB协议传输数据。块级重定向I/O完全绕过CSV NTFS这一层直接访问NTFS下面的硬盘(就像直接I/O绕过卷这一层直接访问硬盘一样)。协调节点不使用CsvFs来传输数据,而是直接通过CsvNsFlt把数据传输给硬盘,如图6所示。以下3种情况会发生块级别重定向I/O:

  • 图中节点3没有物理连接到硬盘,所以可能会使用块级别的重定向I/O

  • 节点1虽然物理连接到硬盘,但是也有可能发生重定向I/O,比如硬盘控制卡、链路故障等原因导致I/O失败的时候。这种情况下,CsvVbus首先会尝试发送I/O给硬盘,如果发送不成功,那么就会通过块级别重定向I/O发送给协调者节点。

  • WindowsServer 存储空间。

图6

 

存储分层和数据热度收集

讲完了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针对的分层的存储空间卷才有效。

 

存储分层和数据热度收集

3个主要概念讲完了,接下来就要讲存储空间在节点级I/O分发了。我们在环境中创建了4个存储空间,并配置为CSV, 分别分配给两个不同的群集节点,2个分层CSV分别使用简单和镜像布局;另外2个不分层的CSV分别使用简单和镜像的布局。如图7所示。

图7

 然后,我们使用Get‐ClusterSharedVolumeState查询CSV状态,筛选出发生文件级别重定向的I/O,在结果中可以看到,这里的两个CSV基于分层存储空间,对于所有节点来说都是文件级别的I/O重定向,与存储空间布局无关,如图8所示。

图8

同样,我们使用Get‐ClusterSharedVolumeState查询CSV状态,筛选出发生块级别重定向的I/O,在结果中可以看到,这里的两个CSV,对于所有者节点来说是直接I/O,但是对于非所有者节点来说,是块级别的重定向I/O,而且发生块级别的重定向I/O的原因与存储空间布局有关,如图9所示,如果CSV是镜像布局的存储空间,那么原因是StorageSpaceNotAttached,如果CSV是简单布局的存储空间,那么原因是NoDiskConnectivity。

图9

 关于Windows Server存储空间I/O的分发方式,我们可以小结成下表:

FIL03

FIL04

Tier-Simple

文件系统重定向I/O

文件系统重定向I/O

Tier-Mirror

文件系统重定向I/O

文件系统重定向I/O

Non-Tier-Simple

块级别重定向I/O

直接I/O

Non-Tier-Mirror

块级别重定向I/O

直接I/O

 

而进一步来看,除了Windows Server 存储空间会发生文件级I/O重定向之外,发生文件级I/O重定向的可能原因还包括:

(1)人为误操作重定向模式(CSV重定向状态在群集控制台可见)

(2)不兼容的文件系统过滤器附加到NTFS/ReFS文件系统栈

(3)不兼容的卷过滤器附加在NTFS/ReFS文件系统下

(4)存储空间设置了分层,启用了Heatmap(数据热度收集)

 

发生块级I/O重定向的可能原因还包括:

(1)节点没有物理连接到硬盘(NoDiskConnectivity)

(2)存储空间没有附加给节点(StorageSpaceNotAttached),通常是因为:

    a. 存储空间的布局设置为镜像和奇偶校验

    b. 启用了回写缓存的简单布局(禁用回写缓存,则使用直接I/O)

讲完节点间的I/O分发,我们再看硬盘级I/O分发,要结合之前的概念来理解。我们先看看简单布局的存储空间,列数为2的配置下,数据如何分发。因为每个列代表着一个I/O虚拟通道,每个虚拟通道包含一块硬盘,数据被条带化后,由两个列写入到各自的一块硬盘,同时我们计算出分条尺寸=2*256=512KB,如图10所示。

 

图10

镜像布局的存储空间,列数为2的配置下,数据又如何分发呢?镜像布局和简单、奇偶校验布局不同的一点是在条带层底下添加了I/O镜像层,也即数据复制层,所以双重镜像布局要求每个列必须包含两块硬盘。条带后的数据写入列之前在复制层将一份数据复制成两份,然后将两份数据分别写入列的两块硬盘。如图11所示。同时,数据被分条后,尽管写入硬盘的分条尺寸为1024KB,但是写到两个列的数据都是256KB,分条尺寸=2*256=512KB。

图11

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