从最近发的一个工单来吐槽一下群晖的技术支持和 DSM Raid

2023-10-28 10:12:56 +08:00
 gridsah

以下内容纯主观吐槽,各位看个乐即可,也给双 11 准备买群晖的朋友提供一点 FS 方面的参考。

事情起因是,我把自用的存储从 zfs/ext4 迁移到了 btrfs: Gen10 从 zfs 迁到了 btrfs raid10 ,白群晖从 ext4 切到了 btrfs 。

然后我就开始读 btrfs 的文档。(btrfs 和 zfs 的区别还挺大,这点等我下次摸鱼的时候再开帖子唠

我要吐槽的是:

a. 群晖在销售页面关于 btrfs 如何保护用户数据吹得有点过。zfs/btrfs 实现 self-healing 功能的前提是,数据有热冗余,单凭 checksum 只能检测出 data corruption 但无法修复。而群晖的销售给用户的印象是,他们有黑科技能恢复损坏的数据,但实际上他们只是尽量让 mdadm 和 btrfs 不出问题,至于用户的数据,坏了就坏了,修不了

b. 群晖的技术支持的客服,不知道是水平不行,还是警惕心太强,回复不但笼统,而且敷衍,甚至有时是错的。这个工单中,可能认为我是他们竞争对手的人,来套他们的方案...... 但我只是想知道他们如何保护我的数据。以上情况也不是第一次出现在我提的工单里了

下面贴一下工单对话,主题是 "关于存储池'数据清理'功能可以修复 checksum 异常的数据的疑惑":

看了一下我的设备所使用的存储空间的结构,先用 mdadm 创建 raid1 ,再将映射为 md2 的设备作为 pv 交由 lvm 管理,lvm 在 pv 上创建 vg ,进而创建 lv ,最后把 btrfs 放在 lv 上。

据我所知,btrfs 会记录每个 extent 的 checksum 值用于验证这个 extent 中的数据是否完整。而修复 checksum 有异常的数据需要额外的,具有正常的 checksum 的另一份数据。

比如在 Linux 上 btrfs 默认存储两份 metadata 用于在 metadata 损坏时修复这些损坏的 metadata ,而 data 则只存了一份,所以在这种情况下,如果 data 的 checksum 出现异常则无法修复。

而群晖 btrfs 文件系统中也使用了一样的配置,即,2 份 metadata 和 1 份 data 。所以我的理解是数据清理这个功能只能修复 btrfs 中的 metadata ,而不能修复 data 。是这样的吗?

如果不是的话,数据清理的行为和结果是什么样的?
您对于数据清理中 FS scrubbing 这个部分理解没有问题,但是执行数据清理这个操作会包含两个操作,FS scrubbing 和 RAID scrubbing 。

理论上如果 Btrfs 不开 COW 的话其实并不会知道某个 data 有损坏,只有读到这个文件才会知道文件损坏了。

而当文件系统在进行 FS scrubbing 的时候如果查到某个文档 data 真的坏了,那就会去做 RAID scrubbing 然后用 RAID parity 来修修看(不管有没有开 COW )。
数据清理如果包含 btrfs scrub & mdadm scrub 两个操作的话,它们的执行逻辑是怎样的?
先 btrfs scrub ,再 mdadm scrub ,这两个步骤一定会按这样的顺序发生?
或者像你说的那样,btrfs scrub 遇到 data checksum 不一致时才发生 mdadm scrub ?

我注意到,对于 mdadm scrub 来说:
1. mdadm raid5/6 在遇到数据不一致时会假定 checksum 错误,然后根据(尽管可能已经损坏的)已有数据重新计算 checksum
2. mdadm raid1 遇到数据不一致时会假定第一个硬盘的数据是正确的,然后覆写到其他的硬盘中
如果发生 data checksum 不一致的情况,那么 mdadm scrub 为什么可以修复 btrfs 中的数据?

按照我的理解来看,mdadm scrub 所更新的数据只是用于构成 mdadm 的数据。mdadm 暴露给 btrfs 的,btrfs 可以看到的数据并没有变化,所以我认为 mdadm scrub 无法修复 btrfs 中 data checksum 不一致的问题。这个推断的过程哪里有问题?
抱歉让您久等了,目前这边有与相关工程师讨论,回复如下:

目前 DSM 在执行数据清理的时候是会先执行 FS scrubbing 再执行 RAID scrubbing ,但由于您当前的许多问题涉及到 Btrfs 的底层原理及行为,由于 Btrfs 是 Oracle 所研发,因此对于此文件系统的具体原理与技术规范的准确解释,我们建议您可以直接查阅或咨询 oracle 官方。

参考: https://docs.oracle.com/en/operating-systems/oracle-linux/8/fsadmin/fsadmin-ManagingtheBtrfsFileSystem.html#btrfs-setup
我不关心 btrfs 的技术细节,我想问的是 DSM 如何保证数据被修复,或者向用户报告数据无法被修复。

btrfs 存储 2 份 metadata 和 1 份 data ,那么 data 损坏时,DSM 所用的 raid(mdadm)又不能保证 data 可以被修复。那么,在这种情况下,一旦数据无法被修复,DSM 会向用户报告拥有这部分 data 的文件损坏,需要用户手动介入?
首先,DSM 本身、Btrfs 文件系统又或是带有冗余功能的 RAID ,都不能完全保证在原始数据错误的情况下数据的完整性。

一般情况下如果数据在文件系统中出现错误,则大概率就已经发生文件系统错误,而文件系统检查都是以修好文件系统本身的结构为主,损坏的文件本身很有可能还是坏的。

因此若您的数据十分重要,Synology 始终建议您备份多个数据副本到不同的地方,以保证数据安全。

参考:如何备份 Synology NAS

关于这句 "首先,DSM 本身、Btrfs 文件系统又或是带有冗余功能的 RAID ,都不能完全保证在原始数据错误的情况下数据的完整性。" 本身就不对。

对于 Btrfs raid1/10 以及不稳定的 btrfs raid5/6 ,又或者是 zfs mirror/raidz 这种有 self-healing 的 fs 来说,在一份 data 损坏的情况下都可以根据 fs 内部的热冗余或 raid 中的奇偶校验码来修复损坏的那份数据。只有当 data 损坏且没有热冗余的情况下 fs 才会报告 data corruption 需要用户介入。

(注意,目前只有 btrfs/zfs 有 self-healing 。mdadm 没有,硬件 raid 也没有。

威联通用的是纯 zfs ,使用 mirror/raidz 的情况下可以触发 self-healing 修复 corrupted data ;或者像我一样自建存储,使用 btrfs raid10 也能让 self-healing 生效。

总之,准备购买群晖的朋友要注意,就我目前阅读的结论来看,群晖,不论采用什么方案都无法保证数据完整性,他们只能尽量保证 DSM 的运行不出问题;就我发了六七个工单的体验来看,对于知识不够丰富的个人用户来说,群晖的技术支持约等于 0 ,对于有服务器运维经验的用户来说,客服的回复多数时候有误导性。

4336 次点击
所在节点    程序员
69 条回复
gridsah
2023-10-28 14:04:52 +08:00
@xianghou #19
@akira #20

我原本的打算就是,客服肯定回答不了,直接转研发,我和他们聊。

@sentinelK #11

我知道,所以,工单到那也就停了。
GooMS
2023-10-28 14:20:50 +08:00
@gridsah 巧好我遇到了一个关于 photos 的问题,不知道你方便想咨询一下你,
我和家人每个人都有自己的帐号,然后我创建的相册(共享空间)则其他人看不见,只能通过手动分享,但给每个相册都分享有点繁琐了,并且分享链接是必然生成的,相当于在公网上。因为这个问题迟迟我一直没有真正的用起来。
gridsah
2023-10-28 15:22:41 +08:00
@geniussoft #12 补 #15 的内容

#12 只是我阅读群晖这篇文档后的推测。目前我依旧坚持我写在 #10 的判断。

即,群晖先做 fs scrub 再做 raid (mdadm) scrub 的成果是,修复影响 btrfs over lvm over mdadm 这套组合正常运行的问题,而由于 mdadm 暴露给 btrfs 的,btrfs 能看到的数据没有变化,所以 btrfs 不能修复已损坏的数据,最终,用户已损坏的数据保持在已损坏状态。

原因如下。

我试图从 raid.wiki.kernel.org 中验证 mdadm 是否有直接的可供 DSM 使用的,用以获取数据 redundant copy 的方法,以佐证我 #12 的猜测,但是没找到。我只找到了:

https://raid.wiki.kernel.org/index.php/Detecting,_querying_and_testing#Simulating_data_corruption mdadm 并不保证数据完整性
https://raid.wiki.kernel.org/index.php/Scrubbing_the_drives mdadm 检测到 block error 时,对于 raid1 就从第一个盘取数据然后搬到其他盘,对于 raid5/6 就根据现有数据重新计算校验和

-----

如果让我来实现这个获取数据的 redundant copy 的功能的话,我先给一个 raid1 的思路,先从 btrfs 中拿到到已损坏的数据所处的,相对于文件系统起始的位置偏移;再计算 btrfs 所在的 lv 的对于硬盘的物理位置,结合二者可以计算出硬盘什么位置有 block error ,然后去 mdadm raid1 的从盘上对应的位置找到对应位置,利用从盘上的数据计算 checksum 并和 btrfs 中的 checksum 比对,以确定到底是主盘上的数据有问题,还是从盘上的数据有问题,然后修复。

这还是建立在存储池空间连续的情况下。群晖给存储池提供了足够的的灵活性,如果用户先建立数个小存储池 (对应数个 lv),然后给存储池扩容,这就导致属于每个存储池 (lv) 的空间并不连续,会增加计算难度。

这还没算 SHR+raid1 等其他组合的计算难度和工作量。除了 raid1 还有 raid5/6......

总之,实际操作复杂得多。计算这些数据需要群晖的开发人员对于 mdadm, lvm, btrfs 中数据在硬盘上的的物理分布有深入的理解。而兼容群晖所提供的灵活性也需要大量的开发和测试工作。

**而就我对群晖的主观认知,他们不会投入精力在定制这些基础组件上,所以我判断他们用的是原版的 mdadm 。**

而原版 mdadm 的行为,如文档所说,并不保证数据完整性。

-----

所以 bro 你还有其他可以佐证的文档没有。

( 我最近在读关于群晖如何保证数据完整性的文档,目前我的主观判断是,群晖无法真正保证用户数据的完整性,所以我原定的双十一购买新的群晖的计划也就无了
gridsah
2023-10-28 15:23:21 +08:00
@GooMS #22 我没太看懂你在说啥,给一个具体的案例?
gridsah
2023-10-28 15:30:55 +08:00
@gridsah #23

这还是建立在存储池空间连续的情况下。群晖给存储池提供了足够的的灵活性,如果用户先建立数个小存储池 (对应数个 lv),然后给存储池扩容,这就导致属于每个存储池 (lv) 的空间并不连续,会增加计算难度。

这段的 '存储池' 改成 '存储空间'。
geniussoft
2023-10-28 15:32:16 +08:00
@gridsah
对于 raid 5/6 ,读取的时候不读检验部分。

对于你担心的,
如果数据是正确的(符合 crc ),而 RAID 校验又不一致,
唯一的可能就是 raid 校验部分有问题。
(因为文件系统不读校验)

所以此时的处理方法 — 假设数据正确,重算校验 — 是完全正确的。
gridsah
2023-10-28 15:35:02 +08:00
@geniussoft #26 我没太看懂你这段再说啥,能不能说具体一点?
geniussoft
2023-10-28 15:39:51 +08:00
@gridsah raid5/6 默认是不读校验条带的,除非降级或者 scrub 。

如果像你说的,FS 读到的数据是正确的,但是 RAID 又出现了不一致,那肯定是校验条带出的问题……
gridsah
2023-10-28 15:50:23 +08:00
@geniussoft #28 我的假设是 btrfs 已经检测到了 data extent (不是 metadata) 的 checksum 异常,这才表示 data corruption 。

在 raid1 中,这表示 (a) mdadm raid1 主盘 (第一块盘) 中的数据有了问题,但由于 btrfs 只存了一份 data extent 所以 btrfs 修不了。mdadm 再做 scrub 的话,会把主盘上的有了问题的数据覆写到从盘上。此时数据就彻底坏了。

(b) mdadm raid1 的从盘 (第二块硬盘) 中的数据有了问题,但主盘上的数据可能是好的,mdadm 再做 scrub ,会把主盘上的可能 OK 的数据覆写到从盘上。此时数据可能就正常了。

你说的 'raid5/6 默认是不读校验条带的' 是指什么时候不读,不读条带数据,还是不读校验数据?
gridsah
2023-10-28 15:58:25 +08:00
@geniussoft #28 bro 你如果想要提出你的不同意见的话,最好完整地加上前音后果,准确地使用术语,这可以提升我们的沟通效率。

or, bro, we can use English to talk about that, if you do not know how to say those concepts in Mandarin clearly.

That's OK for me.
gridsah
2023-10-28 16:08:33 +08:00
读到这的朋友请宽容一下我上面的那些错别字,我自己定制了 rime 的输入方案,还没磨合好.... thanks
beijiaoff
2023-10-28 16:48:35 +08:00
@GooMS 你说的 photos 的问题。你需要共享空间的那个目录给对应用户可读权限,对方就能在共享空间看到了。不需要手动分享。(但是非管理员无法以时间线形式看共享空间,只能以文件夹的形式)
GooMS
2023-10-28 16:51:31 +08:00
@beijiaoff 共享空间中上传的图片都可以看到,但是把图片创建相册就不行了
GooMS
2023-10-28 16:51:42 +08:00
@GooMS 相册就无法看见
lifanxi
2023-10-28 17:21:07 +08:00
群晖最近十来年 Ticket 的回复质量直线下降,楼主这个 Ticket 回复我觉得已经好得超出预期了,至少是在一定程度上有在想办法认真回复,而不是乱丢一个文档把人打发走。
Damenly1
2023-10-28 18:00:31 +08:00
@gridsah #30 Welcome to send your questions to linux-btrfs@vger.kernel.org
XiLingHost
2023-10-28 19:25:06 +08:00
qnap 的客户支持其实挺不错的,我之前开工单以后他们的工程师会打电话过来一起处理
Rorysky
2023-10-28 19:42:37 +08:00
@gridsah #10 不是最底层做了一次 raid 1 了么? 为什么数据还只是存储一份? raid 是高可用,没说一点可靠性没有呀
zhughs
2023-10-28 19:51:53 +08:00
感觉有点强人所难,就好比你买了个微软 win11 系统然后去问微软客服 refs 怎么保护我的数据一样。
再说 btrfs 又不是群晖开发的,你这么问人家难免会有些来找茬的感觉。
对于楼主问题:
在 Linux 上 btrfs 默认存储两份 metadata 用于在 metadata 损坏时修复这些损坏的 metadata ,而 data 则只存了一份,所以在这种情况下,如果 data 的 checksum 出现异常则无法修复。

有查到官方文件中大致解决流程是在启用一致性校验的共享文件夹中写入数据时会生成文件的 btrfs 文件系统 checksum ,在你读文件时会重新计算文件的 checksum 查看是否和之前记录的 checksum 一致,如果不一致则可能是 data 区域坏了,那这个时候就会调用 mdadm 的修复功能,以 3 块盘 raid5 为例,在正常读文件的时候是不会去读校验块的,所以可能是数据盘 2 块的其中一块发生问题导致 data 出错,那这个时候就会尝试使用 mdadm 的校验块和两块盘分别尝试进行数据恢复,如果重计算出来的 data 和 btrfs 里之前记录的 checksum 一致则就恢复成功,那如果都失败那就完蛋了。而又由于 btrfs 文件系统的 checksum 是在 metadata 里的会存两份,所以文件的 checksum 出错概率会相对比较低。
gridsah
2023-10-28 20:20:37 +08:00
@Damenly1 #36 That's not a btrfs problem. That's a problem about how Synology uses btrfs and mdadm or even how Synology customs btrfs and mdadm. So sending an email to btrfs team will have no help with the problem.

@Rorysky #38 不是数据只存储了一份,是 btrfs 只看见了一份。mdadm+lvm 屏蔽了 btrfs 对于底层存储结构的感知。

@zhughs #39 emmmmm 你举的微软的例子,我这么干过,只不过我问的不是 refs ,是 DFS ,微软的客服教我怎么提 ticket 怎样升级到对应工程师那里,最后,怎么付钱。群晖既然敢把这个东西商用,那就要接受客户的相关提问,或者,回答不了的时候,教客户怎么升级 ticket ,并且收费,而不是强行回答。我都愿意买没什么性价比的白群晖了,愿意付钱。

直白点说,你对于 btrfs 和 mdadm 的存储结构和行为的理解不对。从 '那这个时候就会调用 mdadm 的修复功能' 这里开始错。mdadm 自己的修复功能就像我之前说的那样,mdadm 自己也不知道自己的 raid5 中哪里的数据对,哪里的数据不对,mdadm 所做的只是让 mdadm 可以正常运行下去,而不是修好用户的数据。

至于你后面所描述的修复行为,mdadm 没有这样的功能,btrfs 也没有。要有那就只能是群晖自己做的,而就我对于这个功能的工作量的估计与对群晖的了解来看,群晖没有能力对底层做这样的改动。 *注意,这句是我的主观判断。*

'而又由于 btrfs 文件系统的 checksum 是在 metadata 里的会存两份,所以文件的 checksum 出错概率会相对比较低。'

并不是 checksum 在 metadata 里存两份,而是每一个 data extent 有存有自己的校验和,metadata 也有自己的校验和,然后默认情况下硬盘中有两份一模一样的 metadata ,所以可以做到 metadata 的 self-healing ,而 data extent 只有一份,所以无法触发 self-healing 。

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

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

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

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

© 2021 V2EX