ZFS RAIDZ2存储1GB文件仅占用2GB空间的疑问
ZFS RAIDZ2存储1GB文件仅占用2GB空间的疑问
嘿,我来帮你理清这个疑惑~先把你的环境信息整理出来方便理解:
你搭建了一个由4块磁盘组成的RAIDZ2存储池:
root@zfs-demo:/data# zpool status pool: data state: ONLINE config: NAME STATE READ WRITE CKSUM data ONLINE 0 0 0 raidz2-0 ONLINE 0 0 0 sdb ONLINE 0 0 0 sdc ONLINE 0 0 0 sdd ONLINE 0 0 0 sde ONLINE 0 0 0 errors: No known data errors
然后你创建了一个1GB的测试文件:
root@zfs-demo:/data# ls -alh total 1023M drwxr-xr-x 2 root root 3 Dec 17 18:22 . drwxr-xr-x 19 root root 4.0K Dec 17 18:10 .. -rw-r--r-- 1 root root 1.0G Dec 17 18:22 1GB.bin
原本你以为RAIDZ2的双校验会让1GB文件占用「1GB文件+2GB校验」总共3GB空间,但实际池的已用空间只有2.01GB:
root@zfs-demo:/data# zpool list NAME SIZE ALLOC FREE CKPOINT EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT data 39.5G 2.01G 37.5G - - 0% 5% 1.00x ONLINE -
这其实是对RAIDZ2校验机制的误解哦!RAIDZ2并不是给整个文件存两份完整的校验数据,而是采用了分布式条带校验的方式:
- 你的RAIDZ2池有4块磁盘,RAIDZ2会把数据拆分成若干小条带,每一组条带里会用「2块磁盘存校验,剩下2块磁盘存数据」(总盘数-2=可用数据盘数量)
- 对于1GB的文件,数据会被拆分对应条带,每组条带的校验只对应这组的内容,而不是整个文件的两份拷贝
- 总占用空间可以用这个公式计算:
文件大小 × (总磁盘数 / (总磁盘数 - 2)),代入你的4块盘就是1GB × (4/2) = 2GB,刚好和你看到的已用空间匹配
简单说,RAIDZ2的双校验是分散在各个条带里的,不是给整个文件做两份完整备份,所以不会额外占用两倍文件大小的空间,只会按照磁盘数量的比例来占用校验空间~
备注:内容来源于stack exchange,提问作者PrestonDocks
相关产品推荐
相关产品推荐

