背景是我们的数据库数据目录位于 VG 上的 LV 上。我们想使用 LVM 的快照功能备份数据库数据,但此 VG 没有剩余的可用 PE。我们也无法缩小 LV(我们使用 XFS)。VG 有两个 PV,每个 PV 都是 RAID 10(每个有 8 个硬盘)。我们有两块额外的备用硬盘(用于热故障转移,大小与组成 RAID10 PV 的大小相同)。
我正在考虑使用其中一个备用驱动器并在其上创建一个 PV,然后将其添加到托管数据库数据目录的 VG。这可行吗?VG 可以包含不同类型的 PV,例如 2 个 RAID 10 PV 和 1 个非 RAID 硬盘吗?
答案1
任何块设备节点都可以成为 PV 并添加为 VG 的成员。例如,我的一台计算机中有一个硬盘和一个固态磁盘,它们属于一个 PV,并充当缓存 (https://man7.org/linux/man-pages/man7/lvmcache.7.html)。
在创建快照 LV 时,您可能希望使用 RAID10 PV 来托管实时数据库数据,并使用备用磁盘来存储写时复制 (COW) 快照。我建议这样做,因为一旦备用磁盘发生故障,正在进行的备份将丢失,而实时数据库不会丢失。可以在创建快照的命令行中指定托管 LV 的确切 PV,如下所示。
# lvcreate -L 10G -n backup_snap_lv -s data_vg/data_lv /dev/sdb
# lvdisplay --maps data_vg/backup_snap_lv
答案2
应该没有问题,因为这是 LVM 的理念。在底层,您有物理存储设备。在它们上面创建 PV,然后当您将 PV 添加到 VG 时,VG 不关心下面是什么,然后当您向 LV 添加空间/创建 LV 时,LV 不关心 VG 从哪里获得这个空间。
当然,也有特殊情况,当您创建镜像(LV 的两个副本)时,您可以让它们驻留在不同的 PV 上(对于非常严格的模式,您还需要第三个 PV)
答案3
LVM(大多数情况下)并不关心 VG 的 PV 所在的块设备的具体情况。唯一的主要例外是,如果底层块设备声明它们支持丢弃操作,LVM 可能会尝试将丢弃操作传递给底层块设备。
例如,在我的家庭服务器系统上,我有四个 4TB SATA 硬盘和两个 1TB NVMe SSD,全部设置为系统上唯一 VG 的 PV,我这样做是因为当我需要更换磁盘时,它可以更轻松地迁移数据(它变成了一个简单的pvmove
命令,而不需要执行诸如合并 VG 之类的操作)。
然而,对此有一个很大的警告。由于 LVM 不关心底层块设备,因此它不够智能,无法“智能地”放置新的 LV(或在某些情况下扩展现有的 LV),除非您只关心最小化可用空间碎片。因此,您应该总是在这样的设置中,明确指定在创建新的 LV 时要使用什么 PV,以便您获得您所期望的行为。
另外,假设这些备用驱动器真的热备件(即,如果阵列中其余驱动器发生故障,系统将自动使用它们作为替换),除非您迫切需要更多空间并且真的不在乎双驱动器故障的可能性(实际上,由于每个阵列中有那么多驱动器,这种情况是相对有可能的),否则我不建议重新利用其中一个。如果您可以通过其他方式释放空间,那么这可能是您获得更多可用空间的首选方法。