linux-运维进阶-12 RAID和LVM

linux-运维进阶-12 RAID和LVM

RAID

  RAID是英文Redundant Array of Independent Disks的缩写,中文简称为独立冗余磁盘阵列。简单的说,RAID是一种把多块独立的硬盘(物理硬盘)按不同的方式组合起来形成一个硬盘组(逻辑硬盘),从而提供比单个硬盘更高的存储性能和提供数据备份技术。

​ 组成磁盘阵列的不同方式称为RAID级别(RAID Levels)。在用户看起来,组成的磁盘组就像是一个硬盘,用户可以对它进行分区,格式化等等。总之,对磁盘阵列的操作与单个硬盘一模一样。不同的是,磁盘阵列的存储速度要比单个硬盘高很多,而且可以提供自动数据备份。数据备份的功能是在用户数据一旦发生损坏后,利用备份信息可以使损坏数据得以恢复,从而保障了用户数据的安全性。

RAID分类

​ RAID技术经过不断的发展,现在已拥有了从 RAID 0 到 7 八种基本的RAID 级别。另外,还有一些基本RAID级别的组合形式,如RAID 10(RAID 0与RAID 1的组合),RAID 50(RAID 0与RAID 5的组合)等。不同RAID 级别代表着不同的存储性能、数据安全性和存储成本。但我们最为常用的是下面的几种RAID形式。

  RAID级别的选择有三个主要因素:可用性(数据冗余)、性能和成本。如果不要求可用性,选择RAID0以获得最佳性能。如果可用性和性能是重要的而成本不是一个主要因素,则根据硬盘数量选择RAID 1。如果可用性、成本和性能都同样重要,则根据一般的数据传输和硬盘的数量选择RAID3、RAID5。

下面以几张图来举例

RAID0

RAID-0
无冗余、无校验
磁盘条带化
所有数据以块的形式分布在所有磁盘上
性能好,读写快:因为存储数据的负载分散到了更多物理驱动上
成本低、容量大、磁盘利用率高
可靠性低、数据安全性低
适用于对数据安全要求不高的场景

1ZCuKU.png

RAID1

RAID-1
磁盘镜像
两块磁盘互为镜像
读取快、写入慢:因为要写两次
成本高、磁盘利用率低(50%)
可靠性高、数据安全性高
适用于保存关键重要数据的场景

1ZCKrF.png

RAID5

RAID-5
分布式奇偶校验
兼顾存储性能、数据安全、成本
至少需要三片硬盘
是RAID-0和RAID-1的折中
磁盘利用率:0>5>1
数据安全性:1>5>0
读取速度:5接近于0
写入速度:5小于0
最常见的RAID方法
A1+A2+A3=AP,其中一片坏了,可以由剩余磁盘去恢复已损坏数据(P:parity 差错校验)

1ZC35R.png

RAID10(不是读作十,而是一零)

RAID-10
高可靠性与高效磁盘结构
数据通常先镜像后条带化,即先RAID-1后用RAID-0(一个0下两个1)
如果先0后一的话,容错性不如前者
至少需要4个磁盘

1ZCBad.png

部署磁盘阵列

mdadm

用于管理Linux系统中的软件RAID硬盘阵列,格式为

1
mdadm [模式] <RAID设备名称> [选项] [成员设备名称]

安装Linux 软阵列管理工具mdadm

1
[root@localhost ~]# yum install mdadm -y

题目:添加4块20G的硬盘,将硬盘用工具组合成软RAID10。

生成磁盘阵列

参数 作用
-a 检测设备名称
-n 指定设备数量
-l 指定RAID级别
-C 创建
-v 显示过程
-f 模拟设备损坏
-r 移除设备
-Q 查看摘要信息
-D 查看详细信息
-S 停止RAID磁盘阵列
-x 指定备份盘数量

首先用fdisk -l查看系统中的磁盘信息

生成磁盘阵列

1
2
3
4
5
6
7
8
9
[root@localhost ~]# mdadm -Cv /dev/md0 -a yes -n 4 -l 10 /dev/sd{b,c,d,e}
mdadm: layout defaults to n2
mdadm: layout defaults to n2
mdadm: chunk size defaults to 512K
mdadm: size set to 20954112K
mdadm: Fail create md0 when using /sys/module/md_mod/parameters/new_array
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md0 started.
[root@localhost ~]#

查看阵列信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
[root@localhost ~]# mdadm -D /dev/md0 
/dev/md0:
Version : 1.2
Creation Time : Thu Jan 24 21:29:53 2019
Raid Level : raid10
Array Size : 41908224 (39.97 GiB 42.91 GB)
Used Dev Size : 20954112 (19.98 GiB 21.46 GB)
Raid Devices : 4
Total Devices : 4
Persistence : Superblock is persistent

Update Time : Thu Jan 24 21:30:20 2019
State : clean, resyncing
Active Devices : 4
Working Devices : 4
Failed Devices : 0
Spare Devices : 0

Layout : near=2
Chunk Size : 512K

Consistency Policy : resync

Resync Status : 17% complete

Name : localhost.localdomain:0 (local to host localhost.localdomain)
UUID : 681083d9:0b891154:c4a4358f:3511a208
Events : 2

Number Major Minor RaidDevice State
0 8 16 0 active sync set-A /dev/sdb
1 8 32 1 active sync set-B /dev/sdc
2 8 48 2 active sync set-A /dev/sdd
3 8 64 3 active sync set-B /dev/sde
[root@localhost ~]#

使用磁盘阵列

使用制作出来的md0,将磁盘分出一个5G大小的分区,格式化为xfs,挂载到/mnt/raid使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
[root@localhost ~]# mkdir /mnt/raid
[root@localhost ~]# fdisk /dev/md0
Welcome to fdisk (util-linux 2.23.2).

Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.

Device does not contain a recognized partition table
Building a new DOS disklabel with disk identifier 0x48492670.

Command (m for help): n
Partition type:
p primary (0 primary, 0 extended, 4 free)
e extended
Select (default p): p
Partition number (1-4, default 1):
First sector (2048-83816447, default 2048):
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-83816447, default 83816447): +5G
Partition 1 of type Linux and of size 5 GiB is set

Command (m for help): p

Disk /dev/md0: 42.9 GB, 42914021376 bytes, 83816448 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 524288 bytes / 1048576 bytes
Disk label type: dos
Disk identifier: 0x48492670

Device Boot Start End Blocks Id System
/dev/md0p1 2048 10487807 5242880 83 Linux

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.
[root@localhost ~]# partprobe
Warning: Unable to open /dev/sr0 read-write (Read-only file system). /dev/sr0 has been opened read-only.
[root@localhost ~]# mount /dev/md0p1 /mnt/raid/
mount: /dev/md0p1 is write-protected, mounting read-only
mount: unknown filesystem type '(null)'
[root@localhost ~]#

损坏磁盘阵列及修复

1
2
3
4
5
6
7
8
[root@localhost ~]# mdadm /dev/md0 -f /dev/sdb
…………
[root@localhost ~]# mdadm -D /dev/md0
…………
[root@localhost ~]# umount /raid
[root@localhost ~]# mount –a
[root@localhost ~]# df –h
…………

停止磁盘阵列

umount卸载已经挂载的分区,用fdisk删除阵列硬盘上的分区

1
2
3
4
5
[root@localhost ~]# mdadm -S /dev/md0
mdadm: stopped /dev/md0
[root@localhost ~]# partprobe
Warning: Unable to open /dev/sr0 read-write (Read-only file system). /dev/sr0 has been opened read-only.
[root@localhost ~]#

LVM

​ LVM是 Logical Volume Manager(逻辑卷管理)的简写,它是Linux环境下对磁盘分区进行管理的一种机制,它由Heinz Mauelshagen在Linux 2.4内核上实现,目前最新版本为:稳定版1.0.5,开发版 1.1.0-rc2,以及LVM2开发版。Linux用户安装Linux操作系统时遇到的一个常见的难以决定的问题就是如何正确地评估各分区大小,以分配合适的硬盘空间。普通的磁盘分区管理方式在逻辑分区划分好之后就无法改变其大小,当一个逻辑分区存放不下某个文件时,这个文件因为受上层文件系统的限制,也不能跨越多个分区来存放,所以也不能同时放到别的磁盘上。而遇到出现某个分区空间耗尽时,解决的方法通常是使用符号链接,或者使用调整分区大小的工具,但这只是暂时解决办法,没有从根本上解决问题。随着Linux的逻辑卷管理功能的出现,这些问题都迎刃而解,用户在无需停机的情况下可以方便地调整各个分区大小。

什么是逻辑卷管理器?

  • LVM 是逻辑盘卷管理(Logical Volume Manager)的简称,它是 Linux 环境下对卷进行方便操作的抽象层。
  • LVM 是建立在硬盘和分区之上的一个逻辑层,来为文件系统屏蔽下层磁盘分区布局,从而提高磁盘分区管理的灵活性。
  • LVM允许在多个物理设备间重新组织文件系统,包括重新设定文件系统的大小。

1ZCTGq.png

概念区分

PV(物理卷):

  • 物理卷(physical volume, PV)在 LVM 系统中处于最底层
  • 物理卷可以是整个硬盘、硬盘上的分区或从逻辑上与磁盘分区具有同样功能的设备(如:RAID)
  • 物理卷是 LVM 的基本存储逻辑块,但和基本的物理存储介质(如分区、磁盘等)比较,却包含有与 LVM 相关的管理参数

VG(卷组):

  • 卷组(Volume Group, VG)建立在物理卷之上,它由一个或多个物理卷组成
  • 卷组创建之后,可以动态添加物理卷到卷组中,在卷组上可以创建一个或多个“LVM 分区”(逻辑卷)
  • 一个 LVM 系统中可以只有一个卷组,也可以包含多个卷组
  • LVM 的卷组类似于非LVM系统中的物理硬盘

LV(逻辑卷):

  • 逻辑卷(Logical Volume, LV)建立在卷组之上,它是从卷组中“切出”的一块空间
  • 逻辑卷创建之后,其大小可以伸缩
  • LVM 的逻辑卷类似于非 LVM 系统中的硬盘分区,在逻辑卷之上可以建立文件系统 (比如 /home 或者 /usr 等)

创建逻辑卷过程

添加一块20G和一块10G的硬盘(物理卷大小不需要一样,没有硬性要求)

物理卷操作

将两块硬盘变为物理卷

1
2
3
4
[root@localhost ~]# pvcreate /dev/sd{b,c}
Physical volume "/dev/sdb" successfully created.
Physical volume "/dev/sdc" successfully created.
[root@localhost ~]#

查看系统中的物理卷

1
2
3
4
5
[root@localhost ~]# pvs
PV VG Fmt Attr PSize PFree
/dev/sda2 centos lvm2 a-- <19.00g 0
/dev/sdb lvm2 --- 10.00g 10.00g
/dev/sdc lvm2 --- 20.00g 20.00g

扫描系统中的物理卷

1
2
3
4
5
[root@localhost ~]# pvscan 
PV /dev/sda2 VG centos lvm2 [<19.00 GiB / 0 free]
PV /dev/sdb lvm2 [10.00 GiB]
PV /dev/sdc lvm2 [20.00 GiB]
Total: 3 [<49.00 GiB] / in use: 1 [<19.00 GiB] / in no VG: 2 [30.00 GiB]

查看物理卷详细信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@localhost ~]# pvdisplay /dev/sdb
"/dev/sdb" is a new physical volume of "10.00 GiB"
--- NEW Physical volume ---
PV Name /dev/sdb
VG Name
PV Size 10.00 GiB
Allocatable NO
PE Size 0
Total PE 0
Free PE 0
Allocated PE 0
PV UUID R1Tcud-WHmk-JfIV-0Zh3-0bg3-enz0-SK81CJ

[root@localhost ~]#

pvdisplay后面不加某一块物理卷,那么显示的就是系统中所有的物理卷的详细信息

卷组操作

创建卷组aaa,将两个物理卷加入到卷组里

1
2
3
[root@localhost ~]# vgcreate aaa /dev/sd{b,c}
Volume group "aaa" successfully created
[root@localhost ~]#

查看系统中卷组用命令vgs,扫描用vgscan,查看详细信息用vgdisplay,用法和pv那套命令一样

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
[root@localhost ~]# vgdisplay aaa
--- Volume group ---
VG Name aaa
System ID
Format lvm2
Metadata Areas 2
Metadata Sequence No 1
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 0
Open LV 0
Max PV 0
Cur PV 2
Act PV 2
VG Size 29.99 GiB
PE Size 4.00 MiB
Total PE 7678
Alloc PE / Size 0 / 0
Free PE / Size 7678 / 29.99 GiB
VG UUID sIRezl-w3K2-9o2i-wDjV-szxH-7mbY-5RW0jW

[root@localhost ~]#

逻辑卷操作

创建一个逻辑卷system,大小为1G,要求指定大小的时候使用基本单元

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[root@localhost ~]# lvcreate -n system -l 250 aaa
Logical volume "system" created.
[root@localhost ~]# lvdisplay /dev/aaa/system
--- Logical volume ---
LV Path /dev/aaa/system
LV Name system
VG Name aaa
LV UUID Qnfuv6-a0lS-WRy6-s0Uo-4pFS-Y1yf-y4Jd9v
LV Write Access read/write
LV Creation host, time localhost.localdomain, 2019-01-24 21:52:17 -0500
LV Status available
# open 0
LV Size 1000.00 MiB
Current LE 250
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 8192
Block device 253:2

[root@localhost ~]#

创建逻辑卷network,大小为3G,不需要用基本单元指定大小

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[root@localhost ~]# lvcreate -n network -L 3G aaa
Logical volume "network" created.
[root@localhost ~]# lvdisplay /dev/aaa/network
--- Logical volume ---
LV Path /dev/aaa/network
LV Name network
VG Name aaa
LV UUID pga3dS-2S08-dit2-2Wm1-ZA7x-OPa8-tLxUtr
LV Write Access read/write
LV Creation host, time localhost.localdomain, 2019-01-24 21:54:51 -0500
LV Status available
# open 0
LV Size 3.00 GiB
Current LE 768
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 8192
Block device 253:3

[root@localhost ~]#

将system格式化为xfs,挂载到/mnt/aaa_system

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
[root@localhost ~]# mkfs.xfs /dev/aaa/system 
meta-data=/dev/aaa/system isize=512 agcount=4, agsize=64000 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0, sparse=0
data = bsize=4096 blocks=256000, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
log =internal log bsize=4096 blocks=855, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
[root@localhost ~]# partprobe
Warning: Unable to open /dev/sr0 read-write (Read-only file system). /dev/sr0 has been opened read-only.
[root@localhost ~]# mkdir /mnt/aaa_system
[root@localhost ~]# mount /dev/aaa/system /mnt/aaa_system/
[root@localhost ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/centos-root 17G 1.3G 16G 8% /
devtmpfs 476M 0 476M 0% /dev
tmpfs 488M 0 488M 0% /dev/shm
tmpfs 488M 7.7M 480M 2% /run
tmpfs 488M 0 488M 0% /sys/fs/cgroup
/dev/sda1 1014M 130M 885M 13% /boot
tmpfs 98M 0 98M 0% /run/user/0
/dev/mapper/aaa-system 997M 33M 965M 4% /mnt/aaa_system
[root@localhost ~]#

逻辑卷在系统中的两种表示方式

第一种:/dev/[卷组名]/[逻辑卷]

1
2
[root@localhost ~]# ll /dev/aaa/system 
lrwxrwxrwx. 1 root root 7 Jan 24 21:55 /dev/aaa/system -> ../dm-2

第二种:/dev/mapper/[卷组名]-[逻辑卷]

1
2
3
[root@localhost ~]# ll /dev/mapper/aaa-system 
lrwxrwxrwx. 1 root root 7 Jan 24 21:55 /dev/mapper/aaa-system -> ../dm-2
[root@localhost ~]#

逻辑卷扩容

  发现system只有1G大小远远不够用,至少要有5G的空间才够用,所以要将system扩容到5G

1
2
3
4
5
[root@localhost ~]# umount /mnt/aaa_system
[root@localhost ~]# e2fsck -f /dev/aaa/system
[root@localhost ~]# lvextend -L 10G /dev/aaa/system
[root@localhost ~]# resize2fs /dev/aaa/system
[root@localhost ~]# mount /dev/aaa/system /mnt/aaa_system

逻辑卷快照

相当于是磁盘的备份

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[root@localhost ~]# echo "helloworld" > /mnt/aaa_system/hello.txt

创建快照:
[root@localhost ~]# lvcreate -L 10G -s -n SNAP /dev/aaa/system
Reducing COW size 10.00 GiB down to maximum usable size 1004.00 MiB.
Logical volume "SNAP" created.
[root@localhost ~]# lvdisplay
......

[root@localhost ~]# rm -f /mnt/aaa_system/hello.txt
[root@localhost ~]#

还原快照:
[root@localhost ~]# umount /mnt/eagle_system
[root@localhost ~]# lvconvert --merge /dev/eagleslab/SNAP
欢迎打赏,谢谢
------ 本文结束------
0%