> 文章列表 > 关于线性与条带化下LVM数据在物理卷上分布的讨论

关于线性与条带化下LVM数据在物理卷上分布的讨论

关于线性与条带化下LVM数据在物理卷上分布的讨论

关于线性与条带化下LVM数据在物理卷上分布的讨论

  • 一、环境介绍
  • 二、线性模式
    • 逻辑卷创建
    • 逻辑卷删除
  • 三、条带化
    • 逻辑卷创建
    • 逻辑卷删除

LVM有两种模式:

  • 线性模式:先写满组成线性逻辑卷的第一个物理卷,再向第2个物理卷中写入数据,以此类推;
  • 条带化:写入数据时按照固定大小交错地将数据写入组成逻辑卷的多个物理卷中(类似于RAID 0)。

那么新增磁盘后,对某一LVM进行增扩容,扩容的部分在不同的模式下会怎么分布到不同磁盘上的呢?

一、环境介绍

本次使用三块磁盘sdc sdd sdg进行试验,其大小如图:
关于线性与条带化下LVM数据在物理卷上分布的讨论
创建三个物理卷:

pvcreate /dev/sdc
pvcreate /dev/sdd
pvcreate /dev/sdg

然后创建一个卷组database

vgcreate database /dev/sdd

完成之后如下:
关于线性与条带化下LVM数据在物理卷上分布的讨论

二、线性模式

逻辑卷创建

将三个物理卷sdc sdd sdg加入到卷组database

vgextend database /dev/sdc /dev/sdg

关于线性与条带化下LVM数据在物理卷上分布的讨论
根据线性模式的定义,只有用完一个物理卷,才会用下一个。首先,先添加一个200G的逻辑卷lv1

lvcreate -n lv1 -L 200G database

关于线性与条带化下LVM数据在物理卷上分布的讨论
关于线性与条带化下LVM数据在物理卷上分布的讨论

此时发现,该逻辑卷被全部分配到了物理卷sdd上,下面,我们申请一个10G的逻辑卷lv2
关于线性与条带化下LVM数据在物理卷上分布的讨论

关于线性与条带化下LVM数据在物理卷上分布的讨论
与预想的一致,由于sdd还没用完,且剩余的空间大于新申请的逻辑卷大小,因此lv2也在sdd上。
下面,我们创建一个50G的逻辑卷lv3,查看它会被直接分配给新的物理卷,还是会一部分被分配给sddsdd空间占满,剩下的部分分配到新的物理卷。创建lv3后结果如下:
关于线性与条带化下LVM数据在物理卷上分布的讨论
关于线性与条带化下LVM数据在物理卷上分布的讨论
结果发现,线性化模式的LVM在申请逻辑卷的时候并不会为了利用零散的空间而拆分一个逻辑卷到不同的物理卷上。此时我们不免想到,如果申请的空间大于一个物理卷的上限呢?
因此,我们再申请一个250G的逻辑卷lv4,除了验证上述问题外,还验证了超出物理卷上限的部分若可以被某一物理卷的剩余部分容纳,此时它会如何选择sdcsdg的剩余空间都小于250G,且不够的空间都可以被sdd容纳。添加lv4后结果如下:
关于线性与条带化下LVM数据在物理卷上分布的讨论
关于线性与条带化下LVM数据在物理卷上分布的讨论
结果还是还是比较符合逻辑的,lv4中的248G被分配给了sdcsdc被占满后,剩余的2G被分配给了sdd会优先使用未被分配的小空间
然后我们删除lv4,申请一个大小为240G的逻辑卷lv5,此时lv5可以被sdc容纳,也可以占满sdg后占用一部分sdd剩余的小空间。

lvremove /dev/database/lv4

删除lv4后:
关于线性与条带化下LVM数据在物理卷上分布的讨论

关于线性与条带化下LVM数据在物理卷上分布的讨论
新建lv5后:
关于线性与条带化下LVM数据在物理卷上分布的讨论
关于线性与条带化下LVM数据在物理卷上分布的讨论
lv5被完整地分配给了sdc。因此,LVM比起利用零散的小空间,更倾向于不对完整的逻辑卷做拆分
在这里,我就不尝试更极端的情况了,结论为:

  • 若新建逻辑卷lv能完整地被某个物理卷pv的小空间容纳,那么逻辑卷lv会被分配给物理卷pv
  • 若新建逻辑卷lv不能完整地被每个物理卷的剩余空间容纳,那么逻辑卷lv会被拆分分配给不同的物理卷,并优先使用未被分配的小空间(不一定,看条带化部分)。

总结来说,线性模式下的LVM认为将逻辑卷拆分到不同的物理卷上是最不合适的,所以如果能将一个逻辑卷放到一个物理卷上,就这么做,如果放不下就拆分,分开的部分尽量使用未被分配的小空间(不一定,看条带化部分)

逻辑卷删除

逻辑卷删除的逻辑应该类似于创建,因此我这里只做一个尝试,即某一逻辑卷删除后是否会对不合理拆分的剩余逻辑卷做重分配(感觉不太可能,开销比较大,不光涉及到数据的迁移,还涉及逻辑块到物理块的重映射)。
我们构造如下的分布:
关于线性与条带化下LVM数据在物理卷上分布的讨论
关于线性与条带化下LVM数据在物理卷上分布的讨论
lv1被分配给sdd,大小为200G;lv2被分配给sdc,大小为200G;lv3大小为250G,被拆分给了sdgsdd。然后,我们删除lv2,此时sdc可以完整容纳lv3,看看是否重分配。删除lv2后:
关于线性与条带化下LVM数据在物理卷上分布的讨论
关于线性与条带化下LVM数据在物理卷上分布的讨论
与预期一致,不会进行重分配。

三、条带化

逻辑卷创建

我们重置环境,并只将sdg移出卷组database
然后创建条带数2,交替存储的块大小8MB(一个物理卷每存8MB换一个物理卷),逻辑块总数为51200(200GB)的逻辑卷striped_lv1

vgreduce database /dev/sdg#选项i 表示数据交错保存在两个物理卷上
#选项I(大写字母i)表示指定逻辑卷的块大小(MB),本例中为4MB
#选项l(小写字母L)表示逻辑块数量(对应vgdisplay中物理块大小,大小为4MB),本例中表示块数量为51200个(200G)
lvcreate -i 2 -I 8 -l 51200 -n striped_lv1 database

卷组剩余块数和物理块大小可以通过vgdisplay命令查看

关于线性与条带化下LVM数据在物理卷上分布的讨论
添加后:
关于线性与条带化下LVM数据在物理卷上分布的讨论
关于线性与条带化下LVM数据在物理卷上分布的讨论
200G的空间被平均分配到了sdcsdd上(每个100G),符合我们对条带化的认识。
此时sdc还剩198Gsdd还剩132G,我们新建一个300G的逻辑卷striped_lv2,按常理说,sdcsdd都应该分配150G,但sdd空间不够,看看会发生什么。创建striped_lv2后:
关于线性与条带化下LVM数据在物理卷上分布的讨论
操作失败,还需要8764个块,每个块4MB,所以还需要大约34.23G这里我没有想明白,按理说sdd还剩132.8G,应该只差17.1G左右,然而还需34.23G,正好是其一半,原因?
然后我们将物理卷sdg加入database组。
关于线性与条带化下LVM数据在物理卷上分布的讨论
关于线性与条带化下LVM数据在物理卷上分布的讨论
此时之前的分配并没有发生变化。
然后添加一个条带化到三个物理卷,大小为450G的逻辑卷striped_lv3。创建striped_lv3后:
关于线性与条带化下LVM数据在物理卷上分布的讨论
同样执行失败,因为按理说每个物理卷都会被分配150G,但sdd不够,差17G,但信息中说差13146个块,每个块4MB,所以缺51.3G,正好是sdd差值的三倍(条带化的物理卷的数量),这里暂时没有想通,同上。
这里我不再尝试3物理卷条带化成功的例子了,再创建条带数2,大小200G的逻辑卷striped_lv2。创建后:
关于线性与条带化下LVM数据在物理卷上分布的讨论
关于线性与条带化下LVM数据在物理卷上分布的讨论
200G的空间又被平均分配到了sdcsdd上(每个100G)。我们删除striped_lv2,再创建条带数2,大小300G的逻辑卷striped_lv3。创建后:
关于线性与条带化下LVM数据在物理卷上分布的讨论
关于线性与条带化下LVM数据在物理卷上分布的讨论
由于sdd空间不足,300G的空间被平均分配到了sdcsdg上(每个150G)。
我们创建条带数2,大小60G的逻辑卷striped_lv4。创建后:
关于线性与条带化下LVM数据在物理卷上分布的讨论
关于线性与条带化下LVM数据在物理卷上分布的讨论
60G的空间被平均分配到了sdcsdd上(每个30G)。但分配前sdgsdd空间少,striped_lv4也仍被分配到了sdd上,所以条带化的LVM也并没有倾向于使用未分配小空间的特性。所以线性模式也不一定有,可能是物理卷分配顺序的原因体现地像有这个特性。

逻辑卷删除

由于条带化模式下的逻辑卷不存在拆分,所以也不可能存在重分配问题,没什么要测的。