Windows 存储池(Storage Space)列数(Columns)的一些讨论

2020-03-22 20:38:35 +08:00
 ZRS

网上能找到的有效信息过于少,微软的文档也没找到很靠谱的说法。

我起初是计划使用存储池放 8 块同容量硬盘,组双奇偶校验模式,可允许任意两盘损坏同时能够使用 ReFS 的巡检和坏块自动修复功能,类似 RAIDZ-2 或者 RAID6 。

但从各种地方看来的文章都表示存储池无法实现(8-2)/8 = 75%的空间利用率,且无法在 GUI 界面指定列数。比如

https://zhuanlan.zhihu.com/p/22604396

https://social.technet.microsoft.com/Forums/ie/en-US/7eb92624-4253-4275-a1b0-e3a8686414d3/understanding-storage-spaces-and-columns?forum=winserverfiles

其中还有“双奇偶校验最小需要 7 盘,4 盘空间却只能允许 2 块损坏”等论述,看得我一头雾水。

研究了半天微软这个列数的定义,发现它指的是一个定义在池上的虚拟磁盘能够同时写入的最大物理磁盘数。按照直觉来说,如果我要耗尽一个池中所有资源来做一个虚拟磁盘,那么肯定是要使用所有的物理硬盘才对。但使用 GUI 建立奇偶校验盘时,列数却默认不会是最大的磁盘数。

查询了相关命令文档,那么想实现类 RAIDZ2 或 RAID6 的效果,就可以使用 powershell 这么来设置:

$New-VirtualDisk -StoragePoolFriendlyName "YourPoolName" -FriendlyName "YourDiskName"  -ProvisioningType Fixed -ResiliencySettingName "Parity" -PhysicalDiskRedundancy 2 -NumberOfColumns $YourMaxDiskNumber -UseMaximumSize

经测试,这样建立的 2 块冗余虚拟磁盘能够达到理想的空间利用率(n-2)/n,但是仅限于物理磁盘数量 n>=5 块时。当 n 降到 4 就会报错“The storage pool does not have sufficient eligible resources for the creation of the specified virtual disk.”原理不明。

同时测试了任意拆卸 1 块或 2 块物理磁盘后表现,均可以保持正常的文件读写,没有发生文件丢失情况。插入新盘后需要手动修复降级虚拟磁盘。同时使用 powershell 删除故障磁盘(不使用 powershell 删不掉,原理不明):

$ Get-PhysicalDisk

$ $Disk = Get-PhysicalDisk -SerialNumber DamagedDiskSerialNumber

$ Remove-PhysicalDisk -PhysicalDisks $Disk -StoragePoolFriendlyName "YourPoolName"

折腾完以上的问题,还是存在一些疑问,为什么微软会设计出一个列数的概念来?这个概念对存储池管理有什么帮助吗,为什么 GUI 界面上不讲清楚,或者采用默认最大可利用率的设置呢?

3087 次点击
所在节点    问与答
12 条回复
Mithril
2020-03-22 20:45:11 +08:00
个人经验不要折腾这东西,直接 RAID1 就完了。
这个扩展困难,缓冲击穿以后写入速度非常感人。
再用这功能我自剁双手。
Osk
2020-03-22 20:50:28 +08:00
之前用 raid 5 模式,三盘,Server 2019,缓存满后写入只有 25MB/s 左右,怀疑人生,后来找机会换成 raid 1 了
venster
2020-03-22 20:51:15 +08:00
refs 有个神奇的自动修复功能,修复不了会把文件直接删了。坛子里有人遇到了,我也遇到过类似的现象 。反正打死我也不会用 refs 格式
also24
2020-03-22 20:52:14 +08:00
官方关于存储池的列的文档可以看这里:
https://social.technet.microsoft.com/wiki/contents/articles/11382.storage-spaces-frequently-asked-questions-faq.aspx#What_are_columns_and_how_does_Storage_Spaces_decide_how_many_to_use

你发的那个问答里也引用了这篇文档。

关于为什么会有列的概念,为什么不默认最大列,其实文档里已经有所描述:
Due to striping, a storage space simultaneously allocates capacity from as many disks as its stripe requires. Therefore, when increasing pool capacity, you can usually achieve optimal pool capacity utilization when you add disks in multiples of the number of disks the storage space needs. For example, adding disks in multiples of four might provide optimal capacity utilization for a pool comprised of two-column, two-way mirror spaces (2 columns + 2 data copies = 4 disks per stripe).

Note Storage Spaces in Windows Server 2012 R2 and earlier by default uses the largest column count possible given the number of disks you have and the resiliency type you select. This is useful for environments with a small number of disks where you want to maximize performance and don't have to replace disks very often. However, in environments with a large number of disks, use a column count number one less than the maximum. This allows Storage Spaces to automatically repair virtual disks following a disk failure or after you retire a disk.


简单说就是:
如果磁盘数量很小,那也可以考虑设置为最大列数,毕竟这样性能好。
如果磁盘数量很大,默认列数少一些,可以提供更多的容错空间(那些没写入的列相当于在做热备了)。
ZRS
2020-03-22 20:57:34 +08:00
@Mithril @Osk 我实际就是用的 RAID1 来放重要数据,只是这个疑问一直没搞明白才折腾这么多,现在终于大概明白了。如果 8 盘一步到位其实不如去用 RAIDZ2 。

@venster 我看过那个贴,这个是 ReFS 的一个 feature,可能它认为反正坏了而且无法修复...那就删了吧。奇妙的逻辑,不知道 zfs 是怎么处理无法修复的坏块的问题的。

@also24 THX 是我看的不认真了...
also24
2020-03-22 21:15:38 +08:00
关于 “双奇偶校验最小需要 7 盘,4 盘空间却只能允许 2 块损坏”

我翻了下资料也是看的一头雾水。

这篇文档虽然是讲存储直通的存储效率的,但是里面详细的写了 Dual Parity 的计算原理。
https://docs.microsoft.com/en-us/windows-server/storage/storage-spaces/storage-spaces-fault-tolerance#dual-parity


如图:
https://i.loli.net/2020/03/22/N54C39J1rQzTjcB.png

单纯从这个图上来看,Dual Parity 最小应该是需要 4 盘,可容忍 2 盘损坏,存储效率为 50% 。

同时,文档里紧跟着就说你可以通过把磁盘加到 6 块,存储效率就提升到了 75% 。
https://i.loli.net/2020/03/22/65alozekbsJIpKH.png

我猜测 Dual Parity 至少 7 块盘可能就是从这里出来的。

多出来的另外一块是什么?继续往下看文档可以看到:Local reconstruction codes
在跨服存储的情况下,会有一份被称为 “Global Parity” 的数据占用一块盘。

最终计算结果,6+1 = 7


关于这个 “Global Parity” ,翻了下找到一个问答,可以看一下里面的最后一个回答,看起来在旧版本里,即使你是本地存储,也会消耗这一块盘,但是在新版本里,似乎已经修正了这个坑爹设定:
https://social.technet.microsoft.com/Forums/windowsserver/en-US/1b27c699-80f0-4b8c-887f-779f0e5fedc8/space-calculation-with-dual-dual-parity-volume
also24
2020-03-22 21:22:31 +08:00
我其实也挺喜欢存储池的,但是说真的存储池的写入速度真的惨。
我现在已经把手头的存储池全都调整了,只使用 Simple 和 Mirror 这两种布局。

在我看来,存储池的一大好处是池子里允许混用多种布局。
这就给我存储内容带来了很大便利,直接按照重要程度来存就好了。

另一大好处就是重复数据删除,存备份文件的时候,不考虑增量,直接一股脑塞进去备份盘,反正存储池会帮我删。

还有一点就是,即使是多磁盘 Simple 布局,在默认 1 列的情况下,单块磁盘脱机后,也并不会损毁全部数据,用来存储电影电视剧之类的文件还是挺不错的。
ZRS
2020-03-22 21:30:13 +08:00
@also24 我手头 Gen10 采用的就是两盘 mirror,两盘单独使用的模式。去重我也开过,但是感觉整体收益非常有限又关掉了。可能和我文件有关,主要是照片和视频这些多媒体文件。

我想请问 1 列 Simple 如果出现单磁盘损坏,具体是怎么表现的?可以明确知道哪些文件坏掉了吗?我很在意这个,一直想找个办法把所有硬盘拼成一个分区来便于放影音库挂 PT,但是又担心 Simple 出现单盘损毁会导致全部数据挂掉或者整个目录结构混乱,不知道哪些东西少了。
also24
2020-03-22 21:39:14 +08:00
@ZRS #8
我说的 Simple Mirror 混用主要是说共享磁盘组的情况下。
例如,你可以选 2 块 4T 盘,建出 4T Simple + 2T Mirror 的池子。
这样就大大增加了灵活性,硬件层面只需要不断的加盘扩容就行了。

去重方面,因为是基于文件块级别的去除,所以对媒体文件之类的可能效果不会很好(还吵)。


关于 Simple 的损坏测试,我之前是使用两个磁盘拼了 Simple 测试的,关机拔掉一块磁盘再开机。

存储池会显示为损坏,但是可以进行操作,盘符可以正常使用。
只要你能看到的文件,全都可以正常使用,没有发生混乱的情况。
损坏的那些文件会直接表现为不存在(没太注意是否保留了目录)。


需要说明的是,我做测试的时候两块磁盘都还剩余非常多的容量,这可能也促使了文件不会被强制存储于不同的硬盘。
不清楚在文件碎片较多的时候,是否也能保持比较好的表现。
also24
2020-03-22 21:41:01 +08:00
And,如果是影音库文件的话,也可以参考另一个帖子 /t/651149 楼主的思路:
将磁盘目录备份下来,以便进行灾后重建。
pubby
2020-03-22 22:29:13 +08:00
@ZRS "我看过那个贴,这个是 ReFS 的一个 feature,可能它认为反正坏了而且无法修复...那就删了吧。奇妙的逻辑,不知道 zfs 是怎么处理无法修复的坏块的问题的。"

1. zpool status 告诉你哪些文件损坏,让你自己删或者从备份恢复
2. zpool clear 清除错误
3. zpool scrub 重新再扫一遍
lucifer9
2020-03-22 22:32:41 +08:00
@ZRS #5 8 盘位直接上 raidz2 损失比较大。通常 6,10 盘位组 raidz2 是比较建议的。
https://docs.google.com/spreadsheets/u/1/d/1pdu_X2tR4ztF6_HLtJ-Dc4ZcwUdt6fkCjpnXxAEFlyA/edit#gid=804965548

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/655165

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX