首页 > 服务器 > lvm+zfs实现灵活扩容和最大利用不同容量磁盘
作者:ghostry 发布时间:2023-08-31 浏览: 1724
转载注明出处: https://blog.ghostry.cn/server/1085.htmlZFS 的 RAID-Z Expansion 已经两年了。还没有进到正式版。目前扩容还是要一组一组的换磁盘,成本较高。
zfs 的raidz要求磁盘容量一致,而很多人的硬盘是陆续购买的,容量并不一致,这形成了门槛。
为了解决这两个问题,我构思了使用lvm+zfs的方案。
想法是这样的,lvm可以把磁盘分割成等大的逻辑盘给zfs使用。并且参考群晖的shr方案。实现不同容量的硬盘组raidz而不浪费空间。
并且lvm使用精简卷和zfs的autotrim,让真实的磁盘占用等于真实文件大小,这样之后扩容的时候可以同盘迁移。
比如 现在有 两个4T和一个2T的盘,如果直接组raidz可用空间只有4T。
可以先把两个4T分别用lvm分割成两个2T的精简卷。这样,就得到了5个2T的精简卷。
然后就可以从三个盘分别拿出一个组成raidz,剩下两个组成mirror,这两个再组成一个大的池。
成品类似这样。
# zpool status
pool: data
state: ONLINE
config:
NAME STATE READ WRITE CKSUM
data ONLINE 0 0 0
raidz1-0 ONLINE 0 0 0
ldb ONLINE 0 0 0
ldc1 ONLINE 0 0 0
ldd1 ONLINE 0 0 0
mirror-1 ONLINE 0 0 0
ldc2 ONLINE 0 0 0
ldd2 ONLINE 0 0 0
errors: No known data errors
这样组合之后,空间完全利用,4T做冗余,6T可以使用。
三块硬盘坏掉任意一个,整个存储池不会损坏。
扩容的时候,比如新买了4T的盘。可以重新统筹,把所有4T分为2T,得到7个2T精简卷。组成一个3盘raidz和一个4盘raidz。
然后迁移旧数据到新池,由于有autotrim,文件又没有增加,不会出现空间不足的情况。(占用太满不行,还要先删除快照)
迁移后删掉旧池。新池同样支持任意坏一个盘而不影响整个数据。
只要统筹好,空间浪费情况能达到和shr一样的水平。并且zfs恢复是文件级的,不会像shr那样把整个盘走一遍,没有存满的时候恢复较快。
会用到的命令
#lvm创建pv
pvcreate /dev/sdc
#创建vg
vgcreate vdc /dev/sdc
# lvm开启自动扩容,编辑文件,意思是占用超过70%就扩容20%
vi /etc/lvm/lvm.conf
thin_pool_autoextend_threshold = 70
thin_pool_autoextend_percent = 20
#创建ThinPool
lvcreate -l +100%free --thinpool ldc vdc
#创建lv精简卷
lvcreate -V 5G --thin -n ldc1 vdc/ldc
#lv查看
lvs
lvdisplay
#zfs创建池
zpool create data raidz /dev/vdb/ldb /dev/vdc/ldc1 /dev/vdd/ldd1 mirror /dev/vdc/ldc2 /dev/vdd/ldd2
zpool set autotrim=on data
#zfs池增加精简卷
zpool add data raidz /dev/vdb/ldb /dev/vdc/ldc1 /dev/vdd/ldd1
#zfs查看池
zpool status
#移动文件
rsync -vaP --remove-source-files /data/ /new/
参考资料
https://zhuanlan.zhihu.com/p/82139330
https://www.truenasscale.com/2022/02/12/562.html
https://zhuanlan.zhihu.com/p/382959865
https://www.synology.cn/zh-cn/support/RAID_calculator
下一篇: Sublime Text 3.x (after Build 32XX)