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 个技术:
存储空间列数
存储空间的列用来组织 I/O 分发到硬盘,列类似于一个虚拟的通道,和 RAID 的分条宽度相似。但是存储空间分条数据写入列和 RAID 分条后往硬盘写入不同,存储空间分条的数据先找到列这个通道,再写到列里的硬盘,写入列数体现了数据写入通道数。每个列通道里包含一块到三块不等的硬盘,列和硬盘数之比称之为列 / 硬盘数比, 如图 1 所示。
图 1
列 / 硬盘数比以及最大和最小列数因存储空间布局不同而不同,通常,简单布局的存储空间有一块硬盘,所以列: 硬盘为 1:1, 双重镜像的存储空间有 2 块硬盘,列: 硬盘比为 1:2,三重镜像的列: 硬盘比为 1:3。列数并非一成不变的,在构建存储池以后,存储池根据实际情况将列数调整为自动或者固定值,可以使用这个 PowerShell 命令查看存储空间列数。
条带交错大小(Interleave,和 RAID strip size 类似)和列数决定着分条尺寸。列数并非一成不变的,在构建存储池以后,存储池根据实际情况将列数调整为自动或者固定值,可以使用如下示例 PowerShell 命令查看存储空间列数。
- PS C: \ > Get - StoragePool - FriendlyName < your storage pool name > | Get - ResiliencySetting - Name Mirror | ft Name,
- NumberofColumnsDefault
如果在创建存储空间的时候没有特别指明列数,这个列数就会是自动(auto), 如果是 auto 的话,存储空间会按照环境自行调整,column 也有个推荐的计算公式。因此我们可以自己修改列数:
- PS C:\> Get-StoragePool-FriendlyName <your storage pool name> | 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:
图 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
大家可以打开你的电脑,在命令提示符里输入:
- fsutiltiering 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 的下发。我们就不再一一展开了。
来源: http://www.bubuko.com/infodetail-1958031.html