RAID来源
RAID功用
RAID的实现:硬件、软件
RAID的级别
在CentOS 6上软件实现RAID
一、RAID来源
1、防止重要数据因磁盘损坏而丢失,人为损坏不能恢复。RAID不能取代备份
2、IO能力有限
3、对廉价且高IO能力的硬件设备的需求
Berkerly在A case for Redundent Arrays of Inexpensive Disks 论文中说明了RAID。将多个IDE接口的磁盘按照特定的结构组织在一起,提高IO,提高耐用性。
控制器:硬盘跟主板交互,通过主板上接的控制器和硬盘上的控制器,基于某种协议或工业标准,有相同的频率,电压....,才能实现通信。
多块不同的硬盘有不同控制器,都要与主机通信,所以只需要一个中间层,能将所有硬盘控制器的协议统一成一个协议,进而与主板交互。主板通过此控制器就能完成与每个硬盘交互。
生产出这样一个控制器的价格相当的不廉价。后来改名为 Redundant Arrays of Indepent Disks 独立冗余磁盘阵列
二、RAID功用
将多个硬盘 按照特定的格式组织起来,当一块硬盘使用
提升IO能力
提升耐用性
三、RAID的实现
1、硬件实现
1)主板集成控制器
特殊线缆直接连接主板的适配器
2)主板不集成控制器
特殊线缆连接适配卡
3) RAID提升IO能力有限
某些厂商给RAID设备提供了CPU,RAM(RAID的专用内存),IO,是一个独立的设备。数据来时,直接存入内存中,并告知主板,存储好了,性能多好。
如果断电了,内存中数据,岂不跟跟异步IO一样?承诺给别人的事情,你没有做到。这个人的形象、能力、开锅......
为了解决这个问题,为RAID提供外部电源,目的:在系统断电后,保证让内存中的数据同步到
磁盘中,不至于丢失。下次开机后,又继续为电源充电。
**********对于有内存的RAID设备,一定要检查有无供电功能******************
2、软件实现
Linux内核提供一个模块(md模块,Multi Devices),程序员为了软件实现raid,就必须调用此模块,RAID是一种通用的功能,所以就有程序员开发程序,能够调用内核中模块,完成RAID的软件实现。我们仅需要调用用户空间中mdadm工具即可。
四、RAID的级别
常见的RAID设备:RAID0,RAID1,RAID5,RAID10,RAID50,JBOD
RAID0(条带卷,strip)
将多块硬盘平行组织起来当作一块硬盘 实现IO并行的磁盘组织结构
1、IO能力为1块磁盘的N倍,但有上限。磁盘块越多,能力不增反降
写入时,对数据的切割时间
读出时,对数据的合并时间
2、没有冗余能力,随着块数增加,损坏的可能性为单块的N倍。
3、可用空间为N * min(S1,S2,....),至少需要2个磁盘块。
RAID1(镜像卷,mirror)
1、有冗余能力,可以坏掉一个盘
2、可用空间为 1*min (S1,S2)
3、IO能力:读:分散性,性能上升。写:不分散,性能略微下降
RAID4
校验盘:根据另外两个盘的值进行对位异或运算得出校验盘的块编号。
硬盘坏掉:监控指示灯,API接口,控制器支持多个空闲盘,用于做热备。(不停机备份)
优点:兼具RAID1,RAID0的特性
缺点:单个磁盘做校验,无论读写均要使用校验盘,对单个盘的IO压力大,则出现性能瓶颈。
1、有冗余能力,可以坏掉一个盘
2、可用空间为 (N - 1) * min (S1,S2,S3,...),至少3个盘
3、如果坏掉一个盘,转换为降级模式工作。依然能够读写。
RAID5
校验码循环放于不同的盘,默认为校验码为左对称,如图所示
1、有冗余能力,可以坏掉一个盘
2、可用空间为 (N - 1) * min (S1,S2,S3,...),至少3个盘
3、如果坏掉一个盘,转换为降级模式工作。依然能够读写。
RAID6
两个盘做校验盘,循环校验,根据异或值做校验。
1、有冗余能力,可以坏掉2个盘
2、可用空间为 (N - 2) * min (S1,S2,S3,S4...),至少4个盘
3、如果坏掉2个盘,转换为降级模式工作。依然能够读写。
RAID10
先用2个盘做RAID1,再用多个RAID做RAID0
1、有冗余能力,每组只能坏一个盘
2、可用空间为(N/2) * min(S1,S2,S3,S4,...)最少4个盘
3、每组两个盘同时坏的可能性不大。
RAID01
先用多个盘做RAID0,再用2个RAID做RAID1
1、有冗余能力,两个组不能同时坏,只能坏一个组
2、可用空间为(N/2) * min(S1,S2,S3,S4,...)最少4个盘
3、每组都坏的可能性很大
RAID50
先用至少3个盘做RAID5,再用多个RAID做RAID0
RAID7
Optimized Asynchrony for High I/O Rates as well as high Data Transfer Rates(最优化的异步高I/O速率和高数据传输率)”RAID 7 存储计算机操作系统(Storage Computer Operating System )是一套实时事件驱动操作系统
JBOD
将多块磁盘空间合并成一个大的连续的磁盘空间,存储数据时,先填满第一个,第二个,....
例如,需要存储3T数据,有3个1T磁盘,基于JBOD方式组织磁盘。
五、在CentOS 6上软件实现RAID
1、Raid在内核中实现
模块 md
用户空间管理工具 mdadm
2、语法
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
|
mdadm [MODE] [RAID_DEVICE] [OPTIONS..] [componet-device]
MODE:
-C 创建模式
-n
# ## 创建由#指定个数磁盘块RAID
-l
# ## 指定RAID级别
RAID0、RAID1、RAID5、RAID6、RAID10
-a {
yes
|no}
## 是否自动创建目标设备的设备文件
-c CHUNK_SIZE
## 默认512K,指明块大小
-x
# ## 空闲盘的个数,RAID0没有冗余能力不需要空闲盘。
-A 装配模式
-F 监控模式
-f(标记为损坏),-r(remove),-a(add)管理模式
RAID_DEVICE:
/dev/md
# [0,]
开机RAID设备名,可能发生变化,挂载用LABEL或UUID。
OPTIONS:
-D RAID_DEVICE
## 显示RAID设备的详细信息
-S RAID_DEVICE
## 停止RAID设备
componet-device:
-n
# 和 -x # 所指定的所有磁盘块对应的设备文件名,支持命令行展开{f,b}_{d,c}
分区(在同一个磁盘不同的分区(单个分区坏了整个磁盘坏了,没有磁盘的冗余。建议使用不同磁
盘的不同分区))
整个磁盘
cat
/proc/mdstat
## 观察md设备的状态
watch
-n
# 'COMMAND' ## 由#指定的秒数进行每#秒运行一次COMMAND,实现动态观察命令的结果。
# watch -n1 'cat /proc/mdstat'
# watch -n1 'date'
# watch -n1 'ifconfig'
|
3、对选项的注释
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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
|
1、完成分区,调整为fd
[root@localhost ~]
# fdisk /dev/sdb
显示分区表: p
添加/删除分区:n
/d
主分区p,扩展分区e
调整
id
号: t
n,1, ,+5G,t,1,fd
n,2, ,+5G,t,2,fd
n,3, ,+5G,t,3,fd
w
[root@localhost ~]
# partx -a /dev/sdb
[root@localhost ~]
# partx -a /dev/sdb
2、创建RAID:
[root@localhost ~]
# mdadm -C /dev/md0 -a yes -l 5 -n 3 /dev/sdb{1,2,3}
3、查看状态
[root@localhost ~]
# watch -n1 'cat /proc/mdstat'
逐位对齐,异或运算
Personalities : [raid0] [raid6] [raid5] [raid4]
md0 : active raid5 sdb3[3] sdb2[1] sdb1[0]
10498048 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3
/3
] [UUU]
unused devices: <none>
4、查看RAID状态
[root@localhost ~]
# mdadm -D /dev/md0
Raid Level : raid5
## -l 对应的级别
Array Size : 10498048 (10.01 GiB 10.75 GB)
## 阵列大小
Used Dev Size : 5249024 (5.01 GiB 5.38 GB)
## 已用空间(校验盘的空间)
Raid Devices : 3
## 创建时,-n # 指定RAID设备的个数
Total Devices : 3
## 创建时,-n 和-x指定设备的个数
Layout : left-symmetric
## 默认左对称
Chunk Size : 512K
## 没有指定的默认大小为512K
[root@localhost ~]
#
5、创建ext3文件系统
[root@localhost ~]
# mke2fs -j /dev/md0
mke2fs 1.41.12 (17-May-2010)
文件系统标签=
块大小=4096 (log=2)
131225 blocks (5.00%) reserved
for
the super user
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632
[root@localhost ~]
#
6、查看设备属性信息
[root@localhost ~]
# blkid /dev/md0
/dev/md0
: UUID=
"baf5e95b-fbb0-479a-9f69-97e890fdffbe"
SEC_TYPE=
"ext2"
TYPE=
"ext3"
7、设定LABEL
[root@localhost ~]
# tune2fs -L 'MY222' /dev/md0
[root@localhost ~]
# e2label /dev/md0 ‘MY222'
8、查看LABEL
[root@localhost ~]
# e2label /dev/md0
MY222
[root@localhost ~]
# blkid /dev/md0
/dev/md0
: UUID=
"baf5e95b-fbb0-479a-9f69-97e890fdffbe"
SEC_TYPE=
"ext2"
TYPE=
"ext3"
LABEL=
"MY222"
9、查看默认挂载属性
[root@localhost ~]
# tune2fs -l /dev/md0
[root@localhost ~]
# dumpe2fs -h /dev/md0
Default
mount
options: (none)
Filesystem features: has_journal 文件系统 为日志型文件系统
10、挂载文件系统至根文件系统下的某个空目录中,(如果有文件会被暂时隐藏)
1)创建目录
[root@localhost ~]
# install -d -m 700 /mydata
2)查看目录是否存在
[root@localhost ~]
# [ -d /mydata ]
[root@localhost ~]
# echo $?
0
[root@localhost ~]
# find / -maxdepth 1 -type d -perm 700 -ls
-maxdepth levels
## 查看指定路径下的由Levels指定级别的目录
3)挂载文件系统至目录
1)、按设备名挂载
[root@localhost ~]
# mount /dev/md0 /mydata
[root@localhost ~]
# mount | fgrep /mydata
/dev/md0
on
/mydata
type
ext3 (rw)
## 按设备卸载: [root@localhost ~]# umount /dev/md0
2)、按UUID挂载
[root@localhost ~]
# blkid /dev/md0
[root@localhost ~]
# mount -U "baf5e95b-fbb0-479a-9f69-97e890fdffbe" /mydata
[root@localhost ~]
# mount | fgrep /mydata
/dev/md0
on
/mydata
type
ext3 (rw)
## 按目录卸载[root@localhost ~]# umount /mydata
3)、按LABEL挂载
# mount | fgrep /mydata
4)改变为降级模式
[root@localhost ~]
# install -m 640 /etc/fstab /mydata/not_exist ## 目标文件不存在,复制重命名
[root@localhost ~]
# ls -l /mydata/not_exist
-rw-r----- 1 root root 1093 8月 12 08:34
/mydata/not_exist
[root@localhost ~]
# mdadm /dev/md0 -f /dev/sdb1
mdadm:
set
/dev/sdb1
faulty
in
/dev/md0
5)查看状态
[root@localhost ~]
# mdadm -D /dev/md0
Number Major Minor RaidDevice State
0 0 0 0 removed
1 8 18 1 active
sync
/dev/sdb2
3 8 19 2 active
sync
/dev/sdb3
0 8 17 - faulty
/dev/sdb1
## 设备标记为失败
6)测试降级模式是否能查看文件内容
[root@localhost ~]
# cat /mydata/not_exist
#
# /etc/fstab
# Created by anaconda on Thu Aug 3 08:30:25 2017
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/myvg-lv_root
/ ext4 defaults 1 1
UUID=5009dc18-28f5-4b32-8c7c-0ea1328ea224
/boot
ext4 defaults 1 2
7)拆除坏的设备
[root@localhost ~]
# mdadm /dev/md0 -r /dev/sdb1
mdadm: hot removed
/dev/sdb1
from
/dev/md0
8)换新设备,设备
id
: fd
[root@localhost ~]
# mdadm /dev/md0 -a /dev/sdb1
9)观察状态
1)、恢复模式
[root@localhost ~]
# watch -n1 'cat /proc/mdstat'
[root@localhost ~]
# mdadm -D /dev/md0
State : clean, degraded, recovering
# 降级和恢复模式
Active Devices : 2
## 活动设备2
Working Devices : 3
## 工作设备3
Failed Devices : 0
Spare Devices : 1
Rebuild Status : 34% complete
## 恢复34%
4 8 17 0 spare rebuilding
/dev/sdb1
## 根据异或运算,对位重建/dev/sdb1
1 8 18 1 active
sync
/dev/sdb2
3 8 19 2 active
sync
/dev/sdb3
2)、恢复完毕
[root@localhost ~]
# mdadm -D /dev/md0
State : clean
Active Devices : 3
Working Devices : 3
Failed Devices : 0
Spare Devices : 0
Layout : left-symmetric
Chunk Size : 512K
Number Major Minor RaidDevice State
4 8 17 0 active
sync
/dev/sdb1
1 8 18 1 active
sync
/dev/sdb2
3 8 19 2 active
sync
/dev/sdb3
10)卸载
[root@localhost ~]
# umount /mydata
11)停止设备
[root@localhost ~]
# mdadm -S /dev/md0
mdadm: stopped
/dev/md0
|