|
LVM(Logical Volume Manager)逻辑卷管理,是一种将一个或多个硬盘的分区在逻辑上集合,相当于一个大硬盘来使用,当硬盘的空间不够使用的时候,可以继续将其它的硬盘的分区加入其中,可以认为是一种磁盘空间的动态管理。 LVM必要性 如果虚拟机装的是20G的硬盘,如果不用LVM,你的磁盘是无法扩容的,不是说不能从20G变成40G,因为可以通过挂载多个硬盘的方式。 比如mysql挂载到这20G硬盘上,
8 r9 o6 z J+ [
( p. V; t" \$ i+ R/ u: d* w% N. U8 y3 `0 O( ~' J
如果没有用lvm,再想扩容20个G的话, 2 h, P3 ?. K" a' c. H& |* _
0 X2 Q$ P5 v. h% Y Q1 z
. _' W2 B! @; e! C等于又多出了一个硬盘,2个磁盘即所谓的2个硬盘,硬盘a装的是sda,硬盘b装的是sdb。 这2个20G是独立的,并不能让一个20G扩容到40G,独立的就麻烦了:mysql往这个磁盘写,怎么让它往另外一个磁盘上写呢,写不了,因为在配置mysql数据目录的时候,就指定了往哪个目录里面写,
7 i: Y5 i& K) k7 J3 y4 ] , t0 _ a1 U4 q, s: c! H' r
3 F( ^- j% ^, f5 y
mysql的数据目录是/var/mysql/data,往硬盘a上的这个目录下写入数据,但不能往硬盘b的这个目录下写入数据,因为2个磁盘不能共享一个位置,只能往一个磁盘上写,除非把数据库的目录挪到另外一个磁盘上。 mysql的数据目录是/var/mysql/data,对于linux来说,叫目录挂载,在相同的目录下,不能起相同文件夹的名字,不像Windows的C、D、E盘。 在硬盘a上有了目录/var/mysql/data了,在硬盘b上就不能再有这样一个目录了,除非把硬盘a的这个目录删了。
# N9 r! X3 M4 _ X) C
/ L4 m0 t/ P0 G( n- g q$ H) p) p: C$ Y: o! O" g9 e ]4 w% h
2个磁盘怎么写数据?把磁盘2修改成40G,把磁盘1的数据复制过来?这也不科学,因为中间有个数据复制的过程, ; o& o8 G$ y! F% J; }9 }
% e- O' O5 I- j) r; E
+ j1 |6 h8 T( e, E8 l
20G还可以复制,那2PB(2000T)呢?一个普通的机械硬盘,复制4TB的数据,需要72小时。 所以只能通过LVM解决了,LVM有卷和组的概念,LV是逻辑卷,VG(volume group)是卷组,PV是物理卷,卷组里面可以放磁盘,
2 v5 c2 |" K, |! U
5 W- c% P- t" Y2 d# W7 m8 ?, {
3 ^- Z6 D5 q0 I: k8 @) C( b$ s2 C# D以mysql写入数据为例,
2 k8 i' Z" I3 I2 t* [* a" ~' J# W1 d
7 K* G( y( e0 {) [5 g
( y9 b. E0 {7 }9 G, U# ~3 {vg逻辑卷组里面放了一块20G的磁盘lv,这个lv就是逻辑卷,vg是逻辑卷组,卷组里面可以放多个逻辑卷,
% f/ h& N# o! j, ]- |
0 i2 q' }! h, f# h% Y! \% v: b+ o; g3 G* I E0 t: Z
mysql存储数据用的是vg逻辑卷组,而不是lv逻辑卷,逻辑卷组虽然不能无限的挂载逻辑卷,但挂载几个TB还是可以的,超过几个TB的数据,不还有分库分表嘛。 接下来看下使用lvm怎么把20G扩容到60G? ! ^6 I+ a: F) P) |

+ R+ {5 l" A8 n) y% u4 Z& |0 k# E9 Y* Y/ k) L" \
虚拟机现在有一个20G的硬盘,再加一块硬盘,就和买一块硬盘插入上去是一个道理。加设备要关机,但在实际环境中,有个技术叫热插拔,不关机也可以插拔硬盘, - 添加硬盘 I9 R: K; i% i4 N; r! F7 q
* c/ ]. R( N% R

6 f9 \% |" l/ m% y) l9 }% s2 E4 v" _6 z! {
- 选择磁盘
. M+ {/ {( I1 I3 m' E - r6 |$ |! t/ B: q4 M

! [1 ?3 d; _2 _2 v% ` m0 z7 ^+ j; G! {9 y7 m0 |. e
- 指定磁盘容量
5 `1 |5 e2 _: b& h
1 @/ e1 t# U8 m. I
' D6 i1 i$ Y2 f% D0 p% Q5 n
4 x3 _, Q3 Z4 T2 d! j- 指定磁盘文件
( X6 Z8 s% x c) k* ~ + b5 m( Z. [5 [, K/ V

( h0 g/ q: t, U) r# y t. g* `$ |: A
这样就多了一块40G的硬盘,
+ X( z+ a0 y; `0 B " y8 `4 z- A% a) q0 B
# J6 ~7 m% C5 f) _3 T1 }怎么把这两块硬盘变成一块? - 查看当前磁盘大小; c. P# W' [# z/ v% `+ ?' q' |+ D
df -h( O3 P1 g/ @% y2 n& K* }
! ]$ a/ B% ~% E% V
; Q, K# D8 b7 V) K1 K# `4 _- u( n& |6 y
有一个ubuntu-vg-ubuntu-lv,这个大小是19G,怎么把19G变成60G? - 查看当前的逻辑卷 J* B" o' `8 Z/ D! O' h
lvdisplay9 _! _3 }& e) ^/ }$ b, d
" Q6 k$ V) u1 ` D
2 Z( `! P9 ]& X$ W3 q3 g
2 Y9 D! r" J+ O$ A3 Q
ubuntu-lv这个是逻辑卷的名字,属于ubuntu-vg这个逻辑卷组,挂载到了/dev/ubuntu-vg/ubuntu-lv这个路径下,大小是19G, - 查看vg的大小
1 ?5 d1 n3 P$ L; ]0 X/ _pvdisplay: [. ?4 x# O; j5 M/ r' v
/ `# _" n. r1 E/ [

0 h+ y9 u, h+ a3 I& F$ I) c
1 M7 W3 l& r" z, G这个逻辑组的大小也是19G,free为 0代表没有空闲空间,/dev/sda3 这个是物理卷,实实在在存储数据的硬盘。 买回新的硬盘,第一件事情就是格式化,在linux下格式化的命令是fdisk,在windows下也是fdisk,只不过都用工具替代了这个命令,这是最原始的格式化工具。
: \& ^. \& E) a) Z" J3 t% R6 m5 o
% p) a4 ?) Z Z4 i' v4 b Q( H" y# G- t7 {: D1 c5 n$ y9 D
sda是第一块硬盘, 7 w. w! \; I0 X! x* \7 l
c2 h- K2 d- p4 v( F
sdb是第二块硬盘,
4 V# \- P, n: K1 ]5 C! j
7 i* ~ C) o5 v
7 K# P" P" S' v% ]8 j- 检索硬盘4 j& O6 k( h" X" ]$ m
fdisk -l |grep '/dev'4 v% Z+ u7 \0 @0 K+ @' I" [
0 s% Z& h& | F' F- O
# E2 [/ L/ X3 K# v; M5 D( Y
' D: }3 d- l/ B
可以看到有一个/dev/sdb 40G的硬盘,如果再加一个硬盘,就会看到有一个/dev/sdc,...,一直到/dev/sdz,再新增硬盘,就是/dev/sda1,/dev/sdb1.... 创建新的分区 /dev/sdb是新加入的磁盘,但还不能使用,还需要对这个硬盘创建分区, $ k7 j/ J5 X1 ]4 A1 Q# E! W* t0 B* S
( O% k# j' Y. u
& M; _0 E$ U X% F( R( j0 w) K3 ?; ]) U, t# u. E6 g

: A0 x# B2 A' p, K! o/ ~$ N) y3 a/ |+ b) ^! s7 j+ c2 d
新建分区,分主分区和扩展分区,一块硬盘最多可以分4个分区,要么是主分区,要么是扩展分区,一共只能分4个分区。 这里测试就分一个主分区,但从哪里开始? % [0 N* j5 b4 i& v% S, G; l2 L
' l$ z+ Q5 R4 R6 D% }/ N' E
: U i8 v6 y& x! G V
磁盘有个簇的概念,空间有个范围,写在2000到4000的位置,那0-2000空着行不? 硬盘是个方块,里面有个碟片,碟片是圆的,上面有个机关式的会转,类似vcd、dvd一样。 坏道是怎么来的?盒子里面是个圆圈,有激光在上面读,正常在里面高速旋转,磁头就会到那个上面来,像vcd一样转转转,如果没有断电会收回去,放回到原来的位置,一断电就收不回去了,卡在这个位置上,就停下来了,卡在磁盘的盘片上,一来电,就滋滋滋,再放回去,直接拉回去,就会产生一道杠,这就是磁盘坏道的由来,所以电脑运行的好好的,就不可以突然断电,不然就会卡在那个上面 ,回不去,一开机,再拉回来,搞几次, 磁盘就坏了。 为了解决这个问题,热插拔怎么搞定这个问题的,这个后续的文章再说。 ( d, S. R- i H8 }

k; [6 `3 C8 `7 [
" U7 e% c% u( f; R9 O, _4 A# \分一个主分区之后,再写入进去。磁盘叫sdb分了一个区,分的第一区叫sdb1,第2个区就是sdb2。 接下来就要格式化了,一开始装的时候,就是ext4文件系统,磁盘格式化的时候也是这个格式, - 磁盘格式化
: ]: `1 E+ ?* {4 R( |: n smkfs -t ext4 /dev/sdb1$ O& d2 C+ I* o9 r9 |6 @
0 H1 T4 s& T0 N $ `0 z. F( h9 y
7 D- l. J" W: t! H% E
- 创建物理卷(实实在在往里面写入数据的磁盘)
$ F8 R- Z1 P4 ^; Dpvcreate /dev/sdb12 ^- ^. V+ W! U) B1 _) `- X
把sdb1这个分区变成了物理卷,就可以往里面写了。
6 N z6 ?- z3 Z Y7 ~ h; a物理卷交给lvm管理,即逻辑卷lv- G" v7 Q$ C$ ]' B% h9 y( U2 ~
9 ]# W5 H! A" H& Y0 T* y

/ P8 {# k7 K1 l# {3 c) i2 P; X. X/ N" n1 O% N# T/ x# K) p
- 查看卷组
9 i$ L: w( i, U2 H: Qpvscan. @: X3 w9 w3 O- a
5 r& z: ]: R7 O
2 ~* E- R4 ?2 E/ P0 W; ^ K) y- [' k
sda这个物理卷,其实有3个分区,sda1、sda2、sda3,数据真正写在sda3上,没有空闲空间,因为在装的时候,所有的空间为19个G都给到了sda3这个分区。 /dev/sda3这个物理卷对应的逻辑卷lv属于ubuntu-vg这个卷组,/dev/sdb1这个物理卷,还没有分配卷组。 这两个磁盘总共60G的大小,有40个G还没有加入卷组,
! g. Q$ s- q6 W
0 w" X: e7 X0 _% f9 e0 M
5 \: e5 L! \! @2 c( p* O8 t/ a此时这个卷组只有一个逻辑卷19G,没有空闲空间,所以需要把sdb1弄到这个卷组里面,达到扩容的效果。 - 把物理卷/dev/sdb1扩展到卷组里面去
% P+ }' ?0 }" a, H8 lvgextend ubuntu-vg /dev/sdb1 Q' Q1 C( D9 }0 M( z, A
$ m) C! a# J% j# v7 [ - a- T, T5 C0 f" o7 e4 W! l
) V: C# _! h8 x" b! D- 添加成功之后,查看卷组
/ C! x$ l5 n- N9 n/ b- _. X
+ x, T2 X6 y6 ~( u& O ' H( \: B1 B; r% ~8 n6 O: y! T1 k
4 G' i. C: V' j$ e可以看到/dev/sdb1已经添加到卷组中了 - 查看卷组的情况9 F9 _5 a6 x h2 F; ?
/ ?- y9 ^! `/ h1 h ( f" j( L+ v: v
7 i: X0 B4 Z# Y; ?# L$ l1 C/ H
这个卷组多了一块物理卷,空闲空间有40G,说明有40G的空间等待分配,把40G的空闲空间添加到原始空间里去,目前原始空间大小是19G,添加之后,就变成了60G,达到扩容的效果。 - 查看逻辑卷0 u6 Q! t+ E- M! t. K& D5 H3 W
0 T) ]- e; G1 e# N: G

. m1 A% ^# x; D3 Y
! Y7 `* ? I: b物理卷写东西是通过往pv里写数据实现的,实际上通过/dev/ubuntu-vg/ubuntu-lv这个路径往pv里写,这就是逻辑卷的概念。 这个路径是19G,要把它增加到60G,为这个逻辑卷lv扩容,有2种方式: - 按照大小扩容(增加10个G)4 |. `7 B7 p3 x+ j" z. v. N
lvextend -L +10G /dev/ubuntu-vg/ubuntu-lv
! ]) e1 o0 q$ D 6 |/ }6 ^9 r" g8 Y3 t! A

- v5 I: d& ^8 T4 x% w5 U, b4 i
7 y2 I& [, S9 w2 X) M! x4 {增加10个G之后,这个lv逻辑卷的大小为29G了,
$ Z8 P1 i* q. v3 o& H( y" Y
# T `5 M: d( o' ~. W+ P8 {; F" Q! N, ^1 w4 |0 P. ?1 h; Q7 D
还需要再刷新一下, resize2fs /dev/ubuntu-vg/ubuntu-lv % S5 v3 c; G7 q& _( ^
) o$ p# K0 Y+ B' s9 o
/ i; u. T& g4 `, f4 ]
1 A" v( D5 l! c" j4 D7 P% Y" L
, x" f3 G+ Q* n
1 R$ a {* S& n) \& E! }: G# D K
查看卷组 , P* G/ S6 G' P- W B* b' R

3 s5 y# j4 o' @# l
" F6 u' V) }, V6 l- }空闲空间还有30G,一次性想把这30个G弄上去,就使用百分比的方式。 - 按照百分比扩容
$ {! W# m( U P6 N2 olvextend -l +100%FREE /dev/ubuntu-vg/ubuntu-lv9 U! C \% {; m) |8 z
h! p; V# p& P

$ V8 h5 r5 Z" q3 n
3 {! }1 u) f3 v8 ]$ }查看lv大小是60G了, 2 y1 G, f. l- t

& F. K9 t6 E- P" L' i& P, W0 x
_; j# \3 G) f/ v再刷新下,才可以使用
3 J; B$ O- J5 n: K( p
$ k" p, k( r: B8 ]3 C" `+ [
" S/ l _+ i# ~* u, P
) i! j% ~& d3 Y) f! n这样就扩容到了60G了。 小结 lvm是一种技术,它能将不同的硬盘变成一块硬盘用,有一个分组的概念,然后在组里面挂载所有的逻辑卷,逻辑卷是指向磁盘本身的,也就是说你不用lvm,就没有逻辑卷的概念。直接往硬盘里写东西,硬盘肯定是分开的 ,只有中间加入了一个概念叫逻辑卷,由逻辑卷帮你托管物理卷。真的磁盘叫物理卷,逻辑磁盘是不是真正的磁盘,和物理删除和逻辑删除是一个道理。由逻辑卷帮你操作物理卷,它来负责分发和写入,从磁盘上实现了所谓的负载均衡。 那写入的时候怎么写入呢? mysql往里面写入数据,
( u _* v. a" [3 k; ]2 J& `, D8 K 7 W( j, f& ~( K v4 G
$ V$ ~4 H5 C5 _- X1 R# ~& n9 V创建一个user表,也许写在第一个逻辑卷里,创建一个商品表,写在第二个逻辑卷里,写到哪个磁盘,对我们来说是无感知的,因为mysql直接和卷组打交道,卷组vg帮我们做分散写。 如果下掉一块硬盘会怎样?有可能数据就读不出来了,因为是散列的往里写,没有真正的写入一块硬盘里,而是把一组数据分散写在不同的磁盘里,具体的怎么写法不知道,但就知道被分散写进去了。 一旦下掉一块硬盘,数据就可能无法读取了,一旦lvm扩容,就不可以再把硬盘卸载掉了。 不卸载可以再引申一个新的问题:磁盘坏道,因为磁盘不可能不坏吧,从而引入新的概念,热备份,后续再更新,敬请期待。 |