@
xud6 不是说三副本没有可能,我也觉得 ec 宣传成三副本不是很理智,只是当初普遍猜测可能三副本不存在才导致数据不能恢复。现在两份公告都出来,如果认为公告全部属实的话(我现在认为都是真的),假设最少的推测应该是仓库 II 硬盘有静默 bug,复制过去的时候发生了写入错误,切换指向导致新读取的数据有误,造成 VM IO 异常。
本身公有云的存储定价就已经比硬盘本身采购价便宜了,盈利模型是基于多年成本平摊和 IO 及带宽额外收费。行业里 aws 的税前利润率在 50% 左右,国内这些可能在 30% 附近,在这种情况下,三副本留给盈利的空间还是不少的,至于八个九的可靠性?我觉得这个价钱蛮难做的。
关于你提到的校验的问题:
第一层是硬盘硬件层面的,逻辑 512K 扇区实际是 520K,多出来 8K 用作硬件校验。但这次事故中因为 bug 导致失效。
正常情况下,如果读取的数据与校验信息不匹配,那硬盘应该向操作系统反馈读取失败,有 bug 的情况下即使校验不通过,也被当作了正常数据。
第二层是存储后端层面的,以前 ceph 底层存储是建立在某种文件系统上的,这几年 bluestore 已经成熟,可以将硬盘本身作为块存储对待了,少了一层文件系统。由于替代了文件系统的作用,bluestore 默认是有写入校验信息的。但用户可以通过手工设定参数,在配置存储池的时候取消对应的校验。我说的禁用校验是说的这一层。
在这一层上 ceph 模拟了一个 fsck 行为,scrub 就是 fsck,可以是 metadata 层面的也可以是 object 层面的。我从来没有尝试过禁用校验,但极大概率禁用之后 fsck 将无法运作。
假如第二层的校验没有被禁用,那么静默错误是能够被定时 scrub 检测到的。
但为什么运维人员会自信地认为校验可以关闭,猜测是在迁移到 bluestore 之前,下面还有一层文件系统,出错会被发现。但由于 bluestore 替代了文件系统的作用,这个时候再关闭校验就不明智了。这里关闭校验确实可以加快迁移速度,符合公告中的说法。
第三层是对象或者说文件层面的了,这里可以简化为 VM 镜像文件。
更高层就是 VM 内虚拟硬盘上的文件系统了,比如 ext4 等等。
这里每一层的校验信息都是由当前一层处理的,异常就向更高一层反馈错误,并抛弃数据,正常的情况下,返回的是不包含当前层校验信息的纯数据。所以不存在什么校验信息已经存在,不需要再计算一次。默认情况下,仓库 II 读取到文件准备写入的时候,传递给 osd 的数据,会被 bluestore (libRADOS) 加上当前层的 crc32c 校验写入,osd 所在主机的 cpu 负责 crc32c 的重新计算,这个校验行为对于上层是透明的。
如果复盘事故,说发现错误的是腾讯就没意思了,腾讯的虚拟机三分钟就检测到了 VM 的异常,那是因为 VM 的 IO 请求由于 metadata 出错映射到了不该读写的位置上因而报错,真正感知到或者说校验层面上没通过是 VM 虚拟硬盘的文件系统发现的。此时 ceph 还认为 VM 镜像的块存储是正常的呢。
如果仓库 II 是按照合理的方式构建的(比如三副本所在硬盘来自三个不同批次),目前的推理也不需要更多假设。镜像迁移的过程中,复制读取出来的数据是正常的,但写入的第一个主副本恰好发生在了存在静默错误的硬盘上。按照 ceph 的架构,客户端只负责一次写入,由一个主副本复制出三个的过程是 ceph osd 内部完成的,一份错误扩散到了三份。这样就能解释为什么三副本会失效了。
腾讯这次事故给我的启示是,bit 级的错误比如 BitRot/SilentCorrupt 已经是个很严峻的问题了,目前硬盘自身的 BER 大概是 10^14~10^15 上下,差不多 12TB 的水平,这个数据量在今天不过是一块硬盘而已。虽然常用指标叫做 URE (Unrecoverable Read Error),但实际错误的发生是写入的过程,或者是写入后发生了 bit 翻转等等,原因是错误只有被读取到的时候才会被发现。
这一次的问题就出在写入出错上,但即使硬盘没有问题,还是有可能因为宇宙射线等等原因造成写入错误,这才是问题的关键。但目前看腾讯无论是设计还是运维,都没有对这个问题有足够的重视。
至于八个九的可靠性,那就更不用说了,都是建立在软件万无一失,从来不会发生 BitRot/SilentCorrupt 这种事的基础上的,模型是有问题的,不然出了事情总不能都怨用户是那宇宙唯一吧。目前来说,大概真实的六个九就足够了,达到这个水平的意思是该去别的地方做工作了,比如完善运维机制,修订空间释放策略等等。