ZFS存储池在线扩容与镜像

本文主要讨论在ZFS文件系统磁盘空间不足时,如何在线对存储池进行镜像和扩容。主要包括以下几个步骤:

  1. 备份文件系统
  2. 重置新磁盘
  3. 将新磁盘加入存储池
  4. 移除旧磁盘
  5. 重置旧磁盘
  6. 将旧磁盘加入存储池

本文使用的软件版本:

  1. FreeBSD 13.0
  2. zpool zfs-kmod-2.0.0-FreeBSD

 ZFS(Zettabyte File System)是Sun公司为Solaris操作系统开发的新一代文件系统,除了支持极大数据的存储需求和很高的数据完整性之外,还具有诸多新颖和强悍的功能,包括存储池、多种缓存、写时拷贝事务模型、快照与克隆、块大小可变、加密、高可用等,可以说是目前世界上最先进的文件系统。

0 文件系统存储现状与需求

最开始使用ZFS文件系统时,只有一块500G的硬盘,在其中一个分区上创建了ZFS文件系统,也未做镜像,没想到后来数据起来越多、起来越重要,这时就不得不考虑扩容和镜像的问题了。在找了一块大小相同的磁盘以后,这次在线扩容与镜像的实际需求就是两项:一是扩大存储空间,把整个500G全部用于ZFS文件系统,二是找一块相同参数的硬盘做RAID1镜像,提高存储的可靠性。

先使用zpool status命令看一下当前存储池使用情况:

ZFS存储池在线扩容与镜像_第1张图片

 从图中可以看出,这个磁盘中的一个MBR扩展分区被格式化为ZFS文件系统,挂载点为/data。

 同时,当前存储池大小为99.5G,已使用了66.2G,目前工作状况良好。 

检查/dev目录下的磁盘:

ZFS存储池在线扩容与镜像_第2张图片

 可以看出,ada0为旧磁盘,未识别出分区;ada1为新磁盘,有2个分区。

所以此次在线换盘和扩容镜像的步骤就是:

(1)备份/data目录

(2)重置新磁盘ada1

(3)将新磁盘ada1加入到存储池

(4)将旧磁盘ada0从存储池中移除

(5)重置旧磁盘ada0

(6)将旧磁盘ada0作为ada1的镜像加入到存储池

现在正式开始吧。

1 备份文件系统

在开始操作之前,一定要注意,备份数据!数据很重要,一旦丢失就再也找不回来了。

切记!切记!切记!

tar zcvf /BACKUP_DEVICE/data-backup-20230531.tar.gz data

注意:这里的BACKUP_DEVICE一定要是除这两个硬盘之外的第三个磁盘,不然备份就没有意义了。

2 重置新磁盘

(1)对新磁盘进行分区

使用gpart命令对新磁盘ada1进行分区:

#gpart create -s GPT ada1
ada1 created
#gpart add -a 4K -t freebsd -s 2G ada1
ada1s1 added
#gpart add -a 4K -t freebsd ada1
ada1s2 added

(2)查看新磁盘分区信息

使用gpart list命令查看新磁盘信息:

# gpart list ada1
Geom name: ada1
modified: false
state: OK
fwheads: 16
fwsectors: 63
last: 976773127
first: 40
entries: 128
scheme: GPT
Providers:
1. Name: ada1s1
   Mediasize: 2147483648 (2.0G)
   Sectorsize: 512
   Stripesize: 0
   Stripeoffset: 20480
   Mode: r0w0e0
   efimedia: HD(1,GPT,8960349a-012d-11ee-aad1-fc4dd4d7ca1b,0x28,0x400000)
   rawuuid: 8960349a-012d-11ee-aad1-fc4dd4d7ca1b
   rawtype: 516e7cb4-6ecf-11d6-8ff8-00022d09712b
   label: (null)
   length: 2147483648
   offset: 20480
   type: freebsd
   index: 1
   end: 4194343
   start: 40
2. Name: ada1s2
   Mediasize: 497960337408 (464G)
   Sectorsize: 512
   Stripesize: 0
   Stripeoffset: 2147504128
   Mode: r0w0e0
   efimedia: HD(2,GPT,8ce01767-012d-11ee-aad1-fc4dd4d7ca1b,0x400028,0x39f85fe0)
   rawuuid: 8ce01767-012d-11ee-aad1-fc4dd4d7ca1b
   rawtype: 516e7cb4-6ecf-11d6-8ff8-00022d09712b
   label: (null)
   length: 497960337408
   offset: 2147504128
   type: freebsd
   index: 2
   end: 976773127
   start: 4194344
Consumers:
1. Name: ada1
   Mediasize: 500107862016 (466G)
   Sectorsize: 512
   Mode: r0w0e0

3 将新磁盘加入存储池

使用zpool add命令将新磁盘加入存储池:

# zpool add data ada1s2

查看存储池状态如下:

ZFS存储池在线扩容与镜像_第3张图片可以看到,新磁盘的第2个分区已经被加入到存储池中了。

4 将旧磁盘从存储池中移除

使用zpool remove命令将旧磁盘从存储池中移除:

# zpool remove data /dev/diskid/DISK-WD-WCC2ERN19398s2+05517865

查看存储池状态如下:

 ZFS存储池在线扩容与镜像_第4张图片

 从状态信息中可以看到,旧磁盘撤离操作正在进行,存储在旧磁盘上的数据正在向新磁盘上转移,旧磁盘当前下在存储池中,稍微等待一下,直到复制过程100%完成。

等待了20分钟以后,复制过程终于完成了,再次查看存储池状态时,可以看到存储池中目前只剩一块磁盘(分区)了。

ZFS存储池在线扩容与镜像_第5张图片

 文件数据100%从旧磁盘转移到新磁盘后,两块磁盘的交接工作就完成了,旧磁盘也就从存储池中完全移除了。

5 重置旧磁盘

重置旧磁盘前,一定要再次确认一下数据是否已经完全转移到了新磁盘,因为肯定有人因为找不到第三块硬盘而没有进行数据备份,这是最后一次机会确认数据,一定要小心!

旧磁盘上的数据已全部转移完成以后,就可以对旧磁盘进行格式化,使其以新的面貌加入重新加入到存储池中。重置时注意要使用和新磁盘一样的分区参数,以便两个磁盘可以同步镜像。

(1)对旧磁盘进行分区

使用gpart命令对旧磁盘ada0进行分区:

#gpart destroy -s GPT ada0
ada0 destroyed
#gpart create -s GPT ada0
ada0 created
#gpart add -a 4K -t freebsd -s 2G ada0
ada0s1 added
#gpart add -a 4K -t freebsd ada0
ada0s2 added

(2)查看旧磁盘分区信息

使用gpart list命令查看旧磁盘信息:

# gpart list ada0
Geom name: ada0
modified: false
state: OK
fwheads: 16
fwsectors: 63
last: 976773127
first: 40
entries: 128
scheme: GPT
Providers:
1. Name: ada0s1
   Mediasize: 2147483648 (2.0G)
   Sectorsize: 512
   Stripesize: 0
   Stripeoffset: 20480
   Mode: r0w0e0
   efimedia: HD(1,GPT,ac8b4ec7-0134-11ee-931b-fc4dd4d7ca1b,0x28,0x400000)
   rawuuid: ac8b4ec7-0134-11ee-931b-fc4dd4d7ca1b
   rawtype: 516e7cb4-6ecf-11d6-8ff8-00022d09712b
   label: (null)
   length: 2147483648
   offset: 20480
   type: freebsd
   index: 1
   end: 4194343
   start: 40
2. Name: ada0s2
   Mediasize: 497960337408 (464G)
   Sectorsize: 512
   Stripesize: 0
   Stripeoffset: 2147504128
   Mode: r0w0e0
   efimedia: HD(2,GPT,aef872aa-0134-11ee-931b-fc4dd4d7ca1b,0x400028,0x39f85fe0)
   rawuuid: aef872aa-0134-11ee-931b-fc4dd4d7ca1b
   rawtype: 516e7cb4-6ecf-11d6-8ff8-00022d09712b
   label: (null)
   length: 497960337408
   offset: 2147504128
   type: freebsd
   index: 2
   end: 976773127
   start: 4194344
Consumers:
1. Name: ada0
   Mediasize: 500107862016 (466G)
   Sectorsize: 512
   Mode: r0w0e0

可以看到,旧磁盘的分区数量和大小与新磁盘一模一样。

(3)查看dev信息

使用ls命令查看设备文件夹下的信息如下:

ZFS存储池在线扩容与镜像_第6张图片

 两块硬盘在设备文件夹中的信息也是一模一样。

6 将旧磁盘加入存储池

zpool attach命令格式如下:

zpool attach [-f] pool device new_device

zpool attach命令将new_device连接到现有pool的device设备上。使用这个命令时,要注意这里的device不能是raidz配置的一部分。如果device当前不是某个镜像配置的一部分,device将自动转换为device和new_device的双向镜像。如果device是某个双向镜像的一部分,则连接new_device将创建一个三向镜像,依此类推。无论哪种情况,new_device都会立即开始重新同步。

其中,-f选项能够强制使用new_device,即使它显示为正在使用。但是并非所有设备都可以通过这种方式进行覆盖。

使用attach命令前存储池状态如下:

ZFS存储池在线扩容与镜像_第7张图片

 可以看到data1存储池里只有ada1s2一个设备。

执行attach命令:

# zpool attach data ada1s2 ada0s2

结果如下:

ZFS存储池在线扩容与镜像_第8张图片

 可以看到,旧磁盘又重新加入了存储池,只不过这次是以更大的分区加入的。而且,存储池中新旧两块磁盘自动进行了镜像(mirror-1)。存储池状态显示,这两块硬盘正在重新同步(resilvering),等同步结束后,此次扩容和镜像的工作就算是圆满完成了。


声明:本文是小萌在自有服务器上的一次操作记录,用于帮助大家更好地了解ZFS文件系统,对于未按要求进行备份而导致数据丢失等意外情况不承担任何责任。

你可能感兴趣的:(操作系统,服务器,运维,开源)