引言
在存储领域,数据正确性是那个1,其余的功能性、稳定性是后面的0,如果数据正确性(完整性)不能得到保障,就算其他方面做得多好,对整个存储产品的评价一定负面的(失败的)。
关于数据正确性测试的网上文章其实很少,我不妨整理一些基本的内容和相关参考资料。
fio verify 测试数据正确性
fio_verify应该是比较常见测试数据正确性的工具/方法,特别是在SSD硬盘厂商、云存储服务提供商,不少都会使用该工具。
fio verify 运行结束后,如果有数据正确性的问题,会在verify的日志里面有“verify failed”这样的关键字。
常见的fio verify 命令行举例:
ioengine=libaio iodepth=128 direct=1 do_verify=1 verify=crc32 rw=randwrite bs=4k numjobs=1
常用的几个关键参数:
do_verify=1 verify=crc32 (当然还有其他校验算法如:md5, crc32, crc16, sha1, sha512 等等)
在verify的时候,header是默认校验的,就是校验header的内容和header的crc校验,如果指定的verify=crc32,那么在校验header之后,还会校验data区域内容和data区域的crc。
如果使用verify=crc32,整个4KB(数据块 bs=4k)的数据会分为两个部分:
header部分:前40字节,其中最后4个字节是header的crc32校验
data部分:41~4096字节,其中最开始4个字节是data区域的crc32校验
(其中header和data的校验和是紧挨着的)
fio源码中的verify.h文件中对header的定义如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
/* * A header structure associated with each checksummed data block. It is * followed by a checksum specific header that contains the verification * data. */ struct verify_header { uint16_t magic; uint16_t verify_type; uint32_t len; uint64_t rand_seed; uint64_t offset; uint32_t time_sec; uint32_t time_nsec; uint16_t thread; uint16_t numberio; uint32_t crc32; }; |
https://fossies.org/linux/fio/verify.h
我们手工检查时,可以用 hexdump工具去dump数据来看看crc、header之类的信息。
除了验证普通的数据正确性,fio还提供了额外的功能来验证特殊的场景,如验证当机器正在进行fio时突然关机或者重启的数据一致性:这种验证方式称之为带trigger的verification,fio将当前的写状态保存到本地,随后的读可以找到相应的文件并可以确切的知道上一次写是停止到了哪里,这个验证方式有两个重要过程组成:
1.保存每个job的写状态
2.执行trigger命令
具体信息可以看fio文档中的 trigger 关键字。
注:循环冗余校验(英语:Cyclic redundancy check,通称“CRC”)是一种根据网上数据包或计算机文件等数据产生简短固定位数校验码的一种散列函数,主要用来检测或校验数据传输或者保存后可能出现的错误。生成的数字在传输或者存储之前计算出来并且附加到数据后面,然后接收方进行检验确定数据是否发生变化。一般来说,循环冗余校验的值都是32位的整数。
其他工具、方法
除了fio verify,还可使用 vdbench 来测试数据完整性。vdbench是一个 I/O 工作负载生成器,用于验证数据完整性和度量直接附加和网络连接的存储的性能。vdbench依赖java JDK。
或者 通过一些压缩、解压缩的工具,也可以辅助验证数据完整性,因为如果数据完整性有问题,压缩、解压缩也会失败的。
网络数据传输的可靠性/正确性
当然,提到存储数据的完整性,我也自然想到网络数据如何验证完整性呢?
● TCP 保证连接、传输的可靠性:网络层是没有可靠传输机制的,尽自己最大的努力进行交付。而传输层使用 TCP 实现可靠传输,TCP 保证可靠传输的机制有如下几种:
* 1)校验和 Checksum
* 2)序列号和确认应答机制
* 3)重传机制
* 4)流量控制(滑动窗口协议)
* 5)拥塞控制
详见链接:https://juejin.cn/post/6916073832335802382
● 如果要做一些简单的验证测试,可采用大文件传输,校验源端、目的端的文件md5的方法。
参考资料
其实这些资料很重要,大家可以继续这个去更深入的了解。
1. 阿里云文档中,关于文件存储NAS、对象存储OSS、块存储EBS 的区别描述:https://help.aliyun.com/document_detail/140812.html
2. fio最新文档,值得细读:https://fio.readthedocs.io/en/latest/fio_doc.html
3. 目前fio verify 最好的中文文档:https://search.iczhiku.com/publices/message1556021633930.html
4. fio 源码:https://github.com/axboe/fio
5. vdbench: https://wiki.lustre.org/VDBench
6. 使用手册:https://www.oracle.com/technetwork/server-storage/vdbench-1901683.pdf
7. TCP如何保证可靠传输:https://segmentfault.com/a/1190000022944999
HD_WRITE_VERIFY & HD_WRITE_VERIFY_DUMP v9.0(24.08) release (https://github.com/zhangyoujia/hd_write_verify 和 https://gitee.com/youplus2024/hd_write_verify) 存储稳定性测试工具和自动化测试系统,主要应用场景:测试存储、OS、云计算、备份/容灾等产品稳定性和校验数据一致性;十年产品:原型两年,V0.01-V9.0持续改进;八年内部使用,2023年8月开始对外分享和推荐,目前已有40多个公司在使用/试用,电子科技、并有国外使用者;