但丁我从中学开始鼓捣摄影和PT,十几年来攒下了七八块硬盘,和几十TB的数据。读完本科后为了到美帝来念书,以及回国时,部分数据还在好几块不同的硬盘中复制了多份。最近两块最旧的硬盘开始出现C5计数,而且计数缓慢增长。为了避免数据灭失,但丁我决定搞个有更高可靠性的存储系统。
另外我原来这堆硬盘都是外置的,每个盘单独接一个12V的电源适配器,搞得很是臃肿,这次也趁机让它们退休。
要保证数据的可靠性,同时为了挂PT,还要让数据在线,可以尝试的方案有各种硬RAID,比如RAID 1, 10, 5, 6这些,也可以使用各种软件定义存储(Software-defined storage, SDS)的方案。我觉得SDS相对来说弹性更强一些,重建存储空间时也更快(硬RAID需要重建整个硬盘,而SDS可以只处理有数据的部分)。最重要的,万一重建中出错了,由于是软件控制的,每个重建中的错误最多损失一个文件的完整性,而不会像硬RAID那样整个阵列全灭。
选定了大方向,下面考虑具体的方案。群晖、QNAP之类的成品NAS太贵了,每个盘位算下来要100美元左右,CPU性能还巨烂。目前自己有的数据都放进去就要4盘位,考虑到扩展性,成本太高。自己攒的话,手里有个闲置的ATX电源和两条4GB的DDR4内存,买个主板和CPU,再选个合适的机箱就可以了。既然4盘位不够用,那么Gen8这类玩意自然不在考虑之中,而且Gen8也好Gen10也好,CPU都太旧了,买回来很可能只有机箱+电源有价值保留。
在北美寻摸NAS的机箱不像在国内那么容易。在国内可以淘宝到各种合适的型号,从内部除了主板和电源位之外什么架子都没有的光板全塔ATX到紧凑的8盘位甚至10盘位热插拔NAS机箱都有价格合适的可以挑,实在不行还可以出几百块钱让淘宝上做机箱的五金店给你做一个符合要求的。北美这边什么100人民币一个的光板机箱是不存在的,随便什么机箱都几十上百刀,带热插拔的NAS机箱更是贵得离谱。最终但丁我选定了Thermaltake Core X2来装我这堆玩意。这是一个很大的mATX机箱,除了自带的4个3.5寸托架和3个2.5寸托架之外,机箱正面的空间还可以放下2~3个5×3.5英寸的硬盘笼,方便扩充。最重要的是,这么一个空间充裕的机箱只要70刀,比美帝市场上大部分全塔要便宜。这东西的缺点和优点差不多,就是特别大,好在我家里地方还算充裕。
选定了机箱,就要同时选定主板。什么赛扬J和N之类的平台不予考虑,性能太弱了,难保不成为瓶颈。我最终选定了华擎的H370m Pro4. CPU干脆上i3-8100,该支持的指令集它都支持,而且也不差它和赛扬之间那点电费,需要它展示出一定性能的时候不至于拖后腿。然后搞了块256GB的PM981做系统盘,这样系统就有充足的空间了(其实是128G的PM961和256G的PM981没差几刀,索性买个大的)。
下面考虑软件方案。我不光打算把照片、视频、CD这些文件放在NAS里,还打算在NAS上放备份和游戏(主要是Steam库)。这样为了读写性能,势必采取分层储存的方案,还需要它支持重复数据删除以节约我那堆拷贝来拷贝去的文件所占用的空间。为了在容量和可靠性之间取平衡,我认为使用类似RAID5的结构比较合理,RAID10需要损失一半的空间。我粗略估计需要30TB的空间来存放数据,也就是4块10TB的RAID5或者6块10TB的RAID10。第一我资金不是很充裕,一次性购买6块10TB的硬盘压力是比较大的。其次,RAID5类的单奇偶校验存储虽然在单盘TB级的水平上重建有风险,但我认为可以接受。经过计算,对于读取错误率(Unrecoverable read error rate,URE)为10E-15的情况下(10TB级硬盘的URE都在这个水平上),重建出现错误的概率约为1-(1-1E-15)^(3×10E12×8)=21.3% (二项分布,都会算吧?),这21.3%里有18.9个百分点是出现1个坏bit,多余1个坏bit的概率只有2.4%不到。而且URE=1E-15只是最坏情况,多数情况下硬盘读取的错误率是远低于这一数值的。对于可以把错误定位到文件级的SDS来说,有一定概率损失1个,最多不超过2个文件的完整性,我是可以接受的。我计划在将来资金充裕时将冗余度扩充到RAID6级,这样双奇偶校验就可以避免单奇偶校验出现读取错误而造成问题。
黑群晖、FreeNAS、RAID-Z/ZFS之类的玩意都要跟Linux较劲,虽然但丁我不是没用过Linux的环境来工作,但还是很不喜欢那种大事小情都要搜半天,再读半天才能找到解决方案的东西。Windows存储空间各方面都满足我的需求,而且微软的东西文档相对健全,需要疑难解答的时候容易一些。
当年玩DreamSpark的时候有微软送的WIndows Server 2016的Key,试了试居然还能在2019上用。看网上说Windows Server 2012的存储空间性能不佳,正好试试2019上这货好不好用。
在我从2018年底筹划到2019年2月中的这个过程中,恰好遇到2月16-18日Presidential Day这个周末,BestBuy的WD Easystore 10TB打折,170刀一块。之前黑五不过打折到180,正好趁此机会剁手。果断订了4个WD 10TB,到隔壁免税的DE的门市去取。然而BestBuy效率低下,居然花了1周时间才准备好货来取,期间还遇到大雪耽搁了两条,这些略过不提。
目前圆头圆脑的WD Easystore 10TB拆出来是WD100EMAZ-00WJTA0,盘标为白色,这是一块5400rpm的氦气盘,而且是PMR的。据说它是HGST He10降速的产物,具有企业级的稳定性,最重要的是它有限时错误恢复(Time-limited error recovery,TLER)这一特性。TLER对于NAS和阵列来说是很有用的,它使得硬盘遇到读取错误时能在有限的时间内跳过错误,继续后面的读写,避免被主控视为掉线而触发重建,有助于提高整个阵列的可用性。但丁我不推荐拆方头方脑的WD My Book 10TB. 首先,它一般卖得更贵;其次,这玩意拆出来的盘是WD100EZAZ. 这哥们默认不开启TLER. 如果拿来做NAS或者阵列,一定记得设个启动脚本把TLER打开,这样它会保持TLER开启直到断电(据Reddit言)。具体怎么做我就不知道了,请查阅有关资料。
这里注意,现在这些盘都支持SATA3.2,而SATA3.2里把之前不使用的SATA电源3.3V针脚赋予了功能,特别是Pin3定义成reset,如果这个针脚一直有电,那么硬盘电机会处于强制停转状态。很多电源提供的SATA线在3.3V的针脚都是有电的,所以需要用胶带把硬盘上这个针脚盖住,防止它进入reset状态。当然,如果使用D4 Pin转SATA电源线,那么压根就没有3.3V输入,所以也不会遇到这个问题。具体针脚的定义很容易查到,我就不折腾了。
为了分层存储,还需要SSD充当性能层(Performance Tier)和回写缓存(Writeback Cache, WBC),按照微软的说法,消费级SSD不合适用于存储空间和存储空间直通。
https://blogs.technet.microsoft.com/filecab/2016/11/18/dont-do-it-consumer-ssd/
然后我很幸运地看到Amazon上480GB的Intel DC S3610卖不到90刀一块(似乎是HP OEM版的清仓)。这可是eMLC的神器,寿命超长,拿来做SSD层再好不过。根据微软的说法,单奇偶校验(parity)的存储需要2块SSD做镜像(Mirror)的WBC,双奇偶校验(dual parity)的存储需要3块SSD做WBC,于是先买了2块,过了一周又买了1块以备将来升级成双奇偶空间。这些HP OEM盘的SMART信息在HP服务器之外是看不到的,仅能看到通电时间和盘体温度,通电时间都显示为0,测试的读写性能也很好,应该是没什么问题的。
最开始基本的单奇偶校验空间正好需要2个SSD和4个HDD,而H370有6个SATA接口,一个不多一个不少。找个U盘把Windows Server 2019装上。
最初我对存储空间了解不足,照葫芦画瓢,把SSD设置为日志盘(Journal),同时赋予了一定容量的WBC. 参考的文章如下
https://zhuanlan.zhihu.com/p/30755766
—————————————以下是折腾之一————————————-
具体做法是先新建一个存储池(假设它叫Pool01),然后把所有盘都加入到存储池中,这一步在图形界面(GUI)下完成即可,我的系统自动识别出了SSD和HDD的磁盘类型。然后在powershell里执行以下命令
Get-StoragePool -FriendlyName "Pool01" `
| Get-PhysicalDisk `
| ? MediaType -eq SSD `
| Set-PhysicalDisk -Usage Journal
这样就把SSD设置成了日志盘。
然后创建两个存储分层,这两个分层在系统里不会显示占用了任何空间,但它们的存在会为之后WBC的建立提供方便。
New-StorageTier -StoragePoolFriendlyName "Pool01" `
-FriendlyName SSD_Tier `
-MediaType SSD
New-StorageTier -StoragePoolFriendlyName "Pool01" `
-FriendlyName HDD_Tier `
-MediaType HDD
接下来创建虚拟磁盘。
New-VirtualDisk -StoragePoolFriendlyName "Pool01" `
-FriendlyName VDisk01 `
-UseMaximumSize `
-ResiliencySettingName Parity `
-NumberOfColumns 4 `
-WriteCacheSize 128GB
我这里把WBC设成了128GB. 日志盘剩余未分配的空间会自动被系统用于给奇偶校验的盘做写缓存。
接下来在服务器管理的GUI种把磁盘从脱机设为联机,然后创建卷,就可以正常操作了。重复数据删除功能在创建卷时可以配置。我把重复数据删除设为“一般服务器用途”,计划任务设为在每天夜里和每周那几个我需要去学校的白天时段进行重复数据删除操作。
这样形成的虚拟盘写入性能很好,连续读取性能也很不错,但随机读取性能非常糟糕。当我把所有硬盘里的东西都转移上去,我试着删除一个有2万多个文件目录(因为发现它和另外某个盘上的东西重复了),结果系统化了好几分钟才准备好要删除的文件。这促使我寻求真正的分层存储。
然而GUI下的向导并不支持创建分层存储的奇偶校验空间。想要创建奇偶校验空间,唯有用Powershell来解决问题。我之前花了1周把数据陆续转移到存储池中,现在为了重新配置存储池,又得把它们转移回我那些用了好几年的硬盘里。我一共向存储池里写入了26TB左右的数据,这一周里重复数据删除一共发现了6TB多的重复数据。转移的时候真是提心吊胆,生怕出什么问题。幸运的是,旧硬盘里那几个出现C5的扇区似乎在我拷贝数据回去的时候又成功写入数据,使得SMART里的C5计数归零。我勾选了Fastcopy的校验选项,花了和拷贝差不多长的时间来校验,居然没发现写入错误。真是幸运。
———————————-以下是折腾之二:分层存储———————————
为了重新配置存储池,这里需要把之前创建的虚拟磁盘删掉,这一步可以在GUI中完成。然后需要在powershell中删掉之前创建的HDD层
remove-storagetier HDD_Tier
执行前系统会要求你确认。
SSD层配置出来默认就是Mirror模式,这正是我们所需要的,不必管它。
我们需要创建一个奇偶校验的HDD层。需要执行的命令如下:
New-StorageTier -StoragePoolFriendlyName "Pool01" `
-FriendlyName "HDD_Tier" `
-MediaType HDD `
-ResiliencySettingName "Parity" `
-NumberOfColumns 4 `
-PhysicalDiskRedundancy 1
然后为了执行命令方便,把SDD和HDD层的对象分别指派给两个变量
$SSD = Get-StorageTier -FriendlyName "SSD_Tier"
$HDD = Get-StorageTier -FriendlyName "HDD_Tier"
然后我们就可以创建虚拟磁盘了
New-VirtualDisk -StoragePoolFriendlyName "Pool01" `
-FriendlyName "VDisk01" `
-StorageTiers @($SSD, $HDD) `
-StorageTierSizes 360GB, 27.27TB `
-WriteCacheSize 80GB
480GB的Intel DC S3610可用空间约447GiB.我配置其中360GiB用于SSD高速层,另外80GiB用作WBC. 我的10TB盘加入存储池时被占用了少许空间,所以每个盘可用的空间略少于10E12字节,算下来每个盘大约9.09TiB,那么整HDD层最多可以配置(4-1)×9.09TiB(Windows下写作TB),约27.27TiB,加上SSD层的360GiB,一共有27.6TiB的可用空间(如题图)。
然后同样在GUI里把虚拟磁盘联机并创建卷,就可以正常使用了。重复数据删除功能也如前法炮制即可。
这样创建的虚拟磁盘读写性能都不错,然而我不知道该用什么软件才能正确测出它的读写性能。CrystalDiskMark和ATTO Disk Benchmark测连续写入都只有100MB/s左右,然而我同时开多个FastCopy向里面复制文件时可以达到300MB/s甚至更高。读取性能如果像ATTO那样反复读写同一个文件,这个文件会被放到SSD层里,读取速度可以达到2个SATA接口之和,也就是1GB/s左右。但无论我怎么测,评测软件给出的写入性能最多130MB/s,远远不及我实际使用的效果。求高人赐教。
原文链接:https://www.bilibili.com/read/cv2205840/