关于线性与条带化下LVM增加磁盘数据分布的讨论
- 一、环境介绍
- 二、线性模式
- 逻辑卷创建
- 逻辑卷删除
- 三、条带化
- 逻辑卷创建
- 逻辑卷删除
LVM有两种模式:
- 线性模式:先写满组成线性逻辑卷的第一个物理卷,再向第2个物理卷中写入数据,以此类推;
- 条带化:写入数据时按照固定大小交错地将数据写入组成逻辑卷的多个物理卷中(类似于RAID 0)。
那么新增磁盘后,对某一LVM进行增扩容,扩容的部分在不同的模式下会怎么分布到不同磁盘上的呢?
一、环境介绍
本次使用三块磁盘sdc sdd sdg
进行试验,其大小如图:
创建三个物理卷:
pvcreate /dev/sdc
pvcreate /dev/sdd
pvcreate /dev/sdg
然后创建一个卷组database
:
vgcreate database /dev/sdd
完成之后如下:
二、线性模式
逻辑卷创建
将三个物理卷sdc sdd sdg
加入到卷组database
:
vgextend database /dev/sdc /dev/sdg
根据线性模式的定义,只有用完一个物理卷,才会用下一个。首先,先添加一个200G
的逻辑卷lv1
:
lvcreate -n lv1 -L 200G database
此时发现,该逻辑卷被全部分配到了物理卷sdd
上,下面,我们申请一个10G
的逻辑卷lv2
:
与预想的一致,由于sdd
还没用完,且剩余的空间大于新申请的逻辑卷大小,因此lv2
也在sdd
上。
下面,我们创建一个50G
的逻辑卷lv3
,查看它会被直接分配给新的物理卷,还是会一部分被分配给sdd
至sdd
空间占满,剩下的部分分配到新的物理卷。创建lv3
后结果如下:
结果发现,线性化模式的LVM在申请逻辑卷的时候并不会为了利用零散的空间而拆分一个逻辑卷到不同的物理卷上。此时我们不免想到,如果申请的空间大于一个物理卷的上限呢?
因此,我们再申请一个250G
的逻辑卷lv4
,除了验证上述问题外,还验证了超出物理卷上限的部分若可以被某一物理卷的剩余部分容纳,此时它会如何选择。sdc
和sdg
的剩余空间都小于250G
,且不够的空间都可以被sdd
容纳。添加lv4
后结果如下:
结果还是还是比较符合逻辑的,lv4
中的248G
被分配给了sdc
,sdc
被占满后,剩余的2G
被分配给了sdd
,会优先使用未被分配的小空间。
然后我们删除lv4
,申请一个大小为240G
的逻辑卷lv5
,此时lv5
可以被sdc
容纳,也可以占满sdg
后占用一部分sdd
剩余的小空间。
lvremove /dev/database/lv4
删除lv4
后:
新建lv5
后:
lv5
被完整地分配给了sdc
。因此,LVM比起利用零散的小空间,更倾向于不对完整的逻辑卷做拆分。
在这里,我就不尝试更极端的情况了,结论为:
- 若新建逻辑卷
lv
能完整地被某个物理卷pv
的小空间容纳,那么逻辑卷lv
会被分配给物理卷pv
; - 若新建逻辑卷
lv
不能完整地被每个物理卷的剩余空间容纳,那么逻辑卷lv
会被拆分分配给不同的物理卷,并优先使用未被分配的小空间(不一定,看条带化部分)。
总结来说,线性模式下的LVM认为将逻辑卷拆分到不同的物理卷上是最不合适的,所以如果能将一个逻辑卷放到一个物理卷上,就这么做,如果放不下就拆分,分开的部分尽量使用未被分配的小空间(不一定,看条带化部分)。
逻辑卷删除
逻辑卷删除的逻辑应该类似于创建,因此我这里只做一个尝试,即某一逻辑卷删除后是否会对不合理拆分的剩余逻辑卷做重分配(感觉不太可能,开销比较大,不光涉及到数据的迁移,还涉及逻辑块到物理块的重映射)。
我们构造如下的分布:
lv1
被分配给sdd
,大小为200G;lv2
被分配给sdc
,大小为200G;lv3
大小为250G,被拆分给了sdg
与sdd
。然后,我们删除lv2
,此时sdc
可以完整容纳lv3
,看看是否重分配。删除lv2
后:
与预期一致,不会进行重分配。
三、条带化
逻辑卷创建
我们重置环境,并只将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命令查看
添加后:
200G的空间被平均分配到了sdc
和sdd
上(每个100G
),符合我们对条带化的认识。
此时sdc
还剩198G
,sdd
还剩132G
,我们新建一个300G
的逻辑卷striped_lv2
,按常理说,sdc
和sdd
都应该分配150G
,但sdd
空间不够,看看会发生什么。创建striped_lv2
后:
操作失败,还需要8764
个块,每个块4MB
,所以还需要大约34.23G
。这里我没有想明白,按理说sdd
还剩132.8G
,应该只差17.1G
左右,然而还需34.23G
,正好是其一半,原因?。
然后我们将物理卷sdg
加入database
组。
此时之前的分配并没有发生变化。
然后添加一个条带化到三个物理卷,大小为450G
的逻辑卷striped_lv3
。创建striped_lv3
后:
同样执行失败,因为按理说每个物理卷都会被分配150G
,但sdd
不够,差17G
,但信息中说差13146个块,每个块4MB
,所以缺51.3G
,正好是sdd
差值的三倍(条带化的物理卷的数量),这里暂时没有想通,同上。
这里我不再尝试3物理卷条带化成功的例子了,再创建条带数2
,大小200G
的逻辑卷striped_lv2
。创建后:
200G的空间又被平均分配到了sdc
和sdd
上(每个100G
)。我们删除striped_lv2
,再创建条带数2
,大小300G
的逻辑卷striped_lv3
。创建后:
由于sdd
空间不足,300G
的空间被平均分配到了sdc
和sdg
上(每个150G
)。
我们创建条带数2
,大小60G
的逻辑卷striped_lv4
。创建后:
60G
的空间被平均分配到了sdc
和sdd
上(每个30G
)。但分配前sdg
比sdd
空间少,striped_lv4
也仍被分配到了sdd
上,所以条带化的LVM也并没有倾向于使用未分配小空间的特性。所以线性模式也不一定有,可能是物理卷分配顺序的原因体现地像有这个特性。
逻辑卷删除
由于条带化模式下的逻辑卷不存在拆分,所以也不可能存在重分配问题,没什么要测的。