在生产环境的服务器中,数据存储的主要设备是磁盘,磁盘的故障率以及磁盘读取数据的速度对服务器整体性能和可靠性有着非常重要的影响。特别是像web服务器、数据库服务器,这些对数据的读取和写入速度要求很高的服务器,磁盘的性能往往会成为其对外提供服务的性能瓶颈,特别是对数据库中存储了重要的线上业务数据的服务器,其数据存储的安全性也往往会远重要于其服务器自身的价值。

      目前常见的有硬盘类型有SATA 、SCSI、SAS、SSD等几种,其中SAS、SSD硬盘的寿命,速度都是很不错的,但是其价格是同容量SATA硬盘的N倍,所以在个人PC上,有些人也会经常通过组合SATA硬盘组成RAID阵列,提高磁盘整体性能达到更好的速度。

      RAID全称是 “A Case for Redundant Arrays of Inexpensive Disks (RAID)”,称为“廉价磁盘冗余阵列”,由加州大学伯克利大学在1987年发表的论文中而来。RAID的主要思想就是把若干小容量物理磁盘组成一个大容量虚拟存储设备,以提高磁盘存储的读、写效率,并提供冗余以提高数据存储的安全性。

     根据应用方向的不同,RAID也分为不同级别,常用的有RAID-0、RAID-1、RAID-5、RAID-10。

     RAID-0也称为条带模式(striping),即把连续的数据分散到多个磁盘上存取,最少需要磁盘数大于等于2。当系统有数据请求就可以被多个磁盘并行的执行,每个磁盘执行属于它自己的那部分数据请求。这种数据上的并行操作可以充分利用总线的带宽,显著提高磁盘整体存取性能。因为读取和写入是在设备上并行完成的,读取和写入性能将会增加,这也通常是使用RAID-0的主要原因。但RAID-0没有数据冗余,如果驱动器出现故障,那么将无法恢复任何数据,所以一般主要用在对设备读取要求高,但对数据安全性不做要求的业务中。

wKiom1Z-Kt6DR1skAAAc0Ov5Fko662.gif

       RAID-1又称为镜像(Mirroring),RAID-1要求至少有2的整数倍块硬盘,并使用0块或更多的备用磁盘。每次写数据时会同时写入镜像盘。这种阵列可靠性很高,但其有效容量减小到总容量的一半,同时这些磁盘的大小应该相等,否则总容量只具有最小磁盘的大小。这种方法完整备份了数据,对数据的写入速度稍有降低,而且磁盘的利用率只有二分之一。但其优点是对数据的容错很好,对数据的读取有较大的提高

wKiom1Z-KvWwufdSAAAcnkrjOtY519.gif


       RAID-5具有和RAID-0相近似的数据读取速度,同时磁盘空间利用率也要比RAID1高。属于是RAID-0和RAID-1的折中方案,是一种存储性能、数据安全和存储成本兼顾的存储解决方案。由于存储成本相对较低,是目前运用较多的一种解决方案。

       RAID-5阵列中数据的分布与RAID-0类似,数据也是分布到每块硬盘上,但Raid-5没有独立的奇偶校验盘,他通过将校验的数据循环存储并分散放在所有磁盘上,其中任意N-1块磁盘上都存储完整的数据,也就是说有相当于一块磁盘容量的空间用于存储奇偶校验信息。因此当RAID5能够支持在一块盘离线的情况下保证数据的正常访问,不会影响数据的完整性,从而保证了数据安全。当损坏的磁盘被替换后,RAID还会自动利用剩下奇偶校验信息去重建此磁盘上的数据,来保持RAID5的高可靠性。

       RAID-5的组建,至少需要三块或更多的磁盘,并可以使用0块或更多的备用磁盘,其数据安全保障程度要比RAID1低,写入数据的速度比对单个磁盘进行写入速度稍慢。如果有两块或两块以上硬盘同时离线,或者RAID信息出错等原因,阵列便会失效,这时就需要对数据进行重组。并且做raid 5阵列所有磁盘容量必须一样大,当容量不同时,会以最小的容量为准。 同时,最好硬盘转速一样,否则会影响性能。

wKioL1Z-KqKzqpAOAAAzQuLa70I593.gif

      RAID 1+0也被称为RAID-10标准,实际是将RAID-0和RAID-1标准结合的产物,是先对磁盘先进行RAID-1,然后RAID-0,这种方法即提供了冗余,而且也提升了速度。

       在连续地以位或字节为单位分割数据并且并行读/写多个磁盘的同时,为每一块磁盘作磁盘镜像进行冗余。它的优点是同时拥有RAID-0的超凡速度和RAID-1的数据高可靠性,但是CPU占用率同样也更高,而且磁盘的利用率比较低。由于利用了RAID-0极高的读写效率和RAID-1较高的数据保护、恢复能力,使RAID-10成为了一种性价比较高的等级,目前几乎所有的RAID控制卡都支持这一等级。


wKioL1Z-M7ThXM4GAABAYNzLc_A781.jpg

      但是,RAID-10对存储容量的利用率和RAID-1一样低,只有50%。因此,RAID10即高可靠性与高效磁盘结构它是一个带区结构加一个镜象结构,可以达到既高效又高速的目的,RAID 10能提供比RAID 5更好的性能,使用此方案比较昂贵。

wKiom1Z-MlCAdANgAAFjZw8Brf4223.jpg


      由于RAID的使用性很高,而对硬盘的使用内核需要识别,在最新的内核中已经默认加载了对常见RAID卡的驱动。RAID设备在linux系统中会被识别成/dev/md[N] N是数字。使用mdadm命令能够对RAID设备配置。

  目前 RAID技术大致分为两种:基于硬件的RAID技术和基于软件的RAID技术。其中在Linux下通过自带的软件就能实现RAID功能,由于是用软件去实现的RAID功能,所以它配置灵活、管理方便。同时使用软件RAID,还可以实现将几个物理磁盘合并成一个更大的虚拟设备,从而达到性能改进和数据冗余的目的。

       Linux软RAID是在linux操作系统层面进行的软件RAID配置,虽然也能对数据进行保护,但是在实际生产环境中,还是建议使用存储中磁盘阵列和硬RAID实现磁盘存储冗余。基于硬件的RAID解决方案比基于软件RAID技术在使用性能和服务性能方面不仅更胜一筹,而且在检测和修复多位错误的能力、错误磁盘自动检测和阵列重建等方面更有安全保障。


Last login: Fri Dec 18 15:27:27 2015 from 172.16.54.1
[root@localhost ~]# fdisk -l

Disk /dev/sda: 128.8 GB, 128849018880 bytes
255 heads, 63 sectors/track, 15665 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x0006280f

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1          26      204800   83  Linux
Partition 1 does not end on cylinder boundary.
/dev/sda2              26        7859    62914560   8e  Linux LVM
/dev/sda3            9165       15665    52219282+  83  Linux
/dev/sda4            7859        9164    10489446    5  Extended
/dev/sda5            7859        9164    10489414+  83  Linux

Partition table entries are not in disk order

Disk /dev/sdb: 21.5 GB, 21474836480 bytes
255 heads, 63 sectors/track, 2610 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000


Disk /dev/sdd: 21.5 GB, 21474836480 bytes
255 heads, 63 sectors/track, 2610 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000


Disk /dev/sdc: 21.5 GB, 21474836480 bytes
255 heads, 63 sectors/track, 2610 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000


Disk /dev/sde: 21.5 GB, 21474836480 bytes
255 heads, 63 sectors/track, 2610 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000


Disk /dev/mapper/vg0-root: 21.5 GB, 21474836480 bytes
255 heads, 63 sectors/track, 2610 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000


Disk /dev/mapper/vg0-swap: 2147 MB, 2147483648 bytes
255 heads, 63 sectors/track, 261 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000


Disk /dev/mapper/vg0-usr: 10.7 GB, 10737418240 bytes
255 heads, 63 sectors/track, 1305 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000


Disk /dev/mapper/vg0-var: 21.5 GB, 21474836480 bytes
255 heads, 63 sectors/track, 2610 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000

 

[root@localhost ~]# fdisk /dev/sdb
Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel
Building a new DOS disklabel with disk identifier 0x31eabbb3.
Changes will remain in memory only, until you decide to write them.
After that, of course, the previous content won't be recoverable.

Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite)

WARNING: DOS-compatible mode is deprecated. It's strongly recommended to
         switch off the mode (command 'c') and change display units to
         sectors (command 'u').

Command (m for help): l

 0  Empty           24  NEC DOS         81  Minix / old Lin bf  Solaris        
 1  FAT12           39  Plan 9          82  Linux swap / So c1  DRDOS/sec (FAT-
 2  XENIX root      3c  PartitionMagic  83  Linux           c4  DRDOS/sec (FAT-
 3  XENIX usr       40  Venix 80286     84  OS/2 hidden C:  c6  DRDOS/sec (FAT-
 4  FAT16 <32M      41  PPC PReP Boot   85  Linux extended  c7  Syrinx         
 5  Extended        42  SFS             86  NTFS volume set da  Non-FS data    
 6  FAT16           4d  QNX4.x          87  NTFS volume set db  CP/M / CTOS / .
 7  HPFS/NTFS       4e  QNX4.x 2nd part 88  Linux plaintext de  Dell Utility   
 8  AIX             4f  QNX4.x 3rd part 8e  Linux LVM       df  BootIt         
 9  AIX bootable    50  OnTrack DM      93  Amoeba          e1  DOS access     
 a  OS/2 Boot Manag 51  OnTrack DM6 Aux 94  Amoeba BBT      e3  DOS R/O        
 b  W95 FAT32       52  CP/M            9f  BSD/OS          e4  SpeedStor      
 c  W95 FAT32 (LBA) 53  OnTrack DM6 Aux a0  IBM Thinkpad hi eb  BeOS fs        
 e  W95 FAT16 (LBA) 54  OnTrackDM6      a5  FreeBSD         ee  GPT            
 f  W95 Ext'd (LBA) 55  EZ-Drive        a6  OpenBSD         ef  EFI (FAT-12/16/
10  OPUS            56  Golden Bow      a7  NeXTSTEP        f0  Linux/PA-RISC b
11  Hidden FAT12    5c  Priam Edisk     a8  Darwin UFS      f1  SpeedStor      
12  Compaq diagnost 61  SpeedStor       a9  NetBSD          f4  SpeedStor      
14  Hidden FAT16 <3 63  GNU HURD or Sys ab  Darwin boot     f2  DOS secondary  
16  Hidden FAT16    64  Novell Netware  af  HFS / HFS+      fb  VMware VMFS    
17  Hidden HPFS/NTF 65  Novell Netware  b7  BSDI fs         fc  VMware VMKCORE 
18  AST SmartSleep  70  DiskSecure Mult b8  BSDI swap       fd  Linux raid auto
1b  Hidden W95 FAT3 75  PC/IX           bb  Boot Wizard hid fe  LANstep        
1c  Hidden W95 FAT3 80  Old Minix       be  Solaris boot    ff  BBT            
1e  Hidden W95 FAT1

Command (m for help): t
No partition is defined yet!

Command (m for help): n
Command action
   e   extended
   p   primary partition (1-4)
p
Partition number (1-4): 
Value out of range.
Partition number (1-4): 1
First cylinder (1-2610, default 1): 
Using default value 1
Last cylinder, +cylinders or +size{K,M,G} (1-2610, default 2610): 
Using default value 2610

Command (m for help): t
Selected partition 1
Hex code (type L to list codes): fd
Changed system type of partition 1 to fd (Linux raid autodetect)

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

Calling ioctl() to re-read partition table.
Syncing disks.
[root@localhost ~]# fdisk /dev/sdc
Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel
Building a new DOS disklabel with disk identifier 0x101206b7.
Changes will remain in memory only, until you decide to write them.
After that, of course, the previous content won't be recoverable.

Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite)

WARNING: DOS-compatible mode is deprecated. It's strongly recommended to
         switch off the mode (command 'c') and change display units to
         sectors (command 'u').

Command (m for help): n
Command action
   e   extended
   p   primary partition (1-4)
1
Invalid partition number for type `1'
Command action
   e   extended
   p   primary partition (1-4)
p
Partition number (1-4): 1
First cylinder (1-2610, default 1): 
Using default value 1
Last cylinder, +cylinders or +size{K,M,G} (1-2610, default 2610): 
Using default value 2610

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

Calling ioctl() to re-read partition table.
Syncing disks.
[root@localhost ~]# fdisk /dev/sdc

WARNING: DOS-compatible mode is deprecated. It's strongly recommended to
         switch off the mode (command 'c') and change display units to
         sectors (command 'u').

Command (m for help): t
Selected partition 1
Hex code (type L to list codes): fd
Changed system type of partition 1 to fd (Linux raid autodetect)

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

Calling ioctl() to re-read partition table.
Syncing disks.
[root@localhost ~]# fdisk /dev/sdd
Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel
Building a new DOS disklabel with disk identifier 0x45a8f000.
Changes will remain in memory only, until you decide to write them.
After that, of course, the previous content won't be recoverable.

Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite)

WARNING: DOS-compatible mode is deprecated. It's strongly recommended to
         switch off the mode (command 'c') and change display units to
         sectors (command 'u').

Command (m for help): n
Command action
   e   extended
   p   primary partition (1-4)
p
Partition number (1-4): 1
First cylinder (1-2610, default 1): 
Using default value 1
Last cylinder, +cylinders or +size{K,M,G} (1-2610, default 2610): 
Using default value 2610

Command (m for help): t
Selected partition 1
Hex code (type L to list codes): fd
Changed system type of partition 1 to fd (Linux raid autodetect)

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

Calling ioctl() to re-read partition table.
Syncing disks.
[root@localhost ~]# fdisk /dev/sde
Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel
Building a new DOS disklabel with disk identifier 0x7205d563.
Changes will remain in memory only, until you decide to write them.
After that, of course, the previous content won't be recoverable.

Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite)

WARNING: DOS-compatible mode is deprecated. It's strongly recommended to
         switch off the mode (command 'c') and change display units to
         sectors (command 'u').

Command (m for help): n
Command action
   e   extended
   p   primary partition (1-4)
p
Partition number (1-4): 1
First cylinder (1-2610, default 1): 
Using default value 1
Last cylinder, +cylinders or +size{K,M,G} (1-2610, default 2610): 
Using default value 2610

Command (m for help): t
Selected partition 1
Hex code (type L to list codes): fd
Changed system type of partition 1 to fd (Linux raid autodetect)

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

Calling ioctl() to re-read partition table.
Syncing disks.
[root@localhost ~]# partx -a /dev/sdb
BLKPG: Device or resource busy
error adding partition 1
[root@localhost ~]# partx -a /dev/sdc
BLKPG: Device or resource busy
error adding partition 1
[root@localhost ~]# partx -a /dev/sdd
BLKPG: Device or resource busy
error adding partition 1
[root@localhost ~]# partx -a /dev/sde
BLKPG: Device or resource busy
error adding partition 1

[root@localhost ~]# cat /proc/mdstat
Personalities : 
unused devices: <none>

[root@localhost ~]# mdadm -C /dev/md0 -a yes -n 3 -x 1 -l 5 /dev/sd{b,c,d,e}
mdadm: /dev/sdb appears to be part of a raid array:
       level=raid0 devices=0 ctime=Thu Jan  1 08:00:00 1970
mdadm: partition table exists on /dev/sdb but will be lost or
       meaningless after creating array
mdadm: /dev/sdc appears to be part of a raid array:
       level=raid0 devices=0 ctime=Thu Jan  1 08:00:00 1970
mdadm: partition table exists on /dev/sdc but will be lost or
       meaningless after creating array
mdadm: /dev/sdd appears to be part of a raid array:
       level=raid0 devices=0 ctime=Thu Jan  1 08:00:00 1970
mdadm: partition table exists on /dev/sdd but will be lost or
       meaningless after creating array
mdadm: /dev/sde appears to be part of a raid array:
       level=raid0 devices=0 ctime=Thu Jan  1 08:00:00 1970
mdadm: partition table exists on /dev/sde but will be lost or
       meaningless after creating array
Continue creating array? yes
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md0 started.
[root@localhost ~]# cat /proc/mdstat 
Personalities : [raid6] [raid5] [raid4] 
md0 : active raid5 sdd[4] sde[3](S) sdc[1] sdb[0]
      41910272 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/2] [UU_]
      [=========>...........]  recovery = 49.2% (10325532/20955136) finish=0.8min speed=200524K/sec
      
unused devices: <none>



[root@localhost ~]# cat /proc/mdstat 
Personalities : [raid6] [raid5] [raid4] 
md0 : active raid5 sdd[4] sde[3](S) sdc[1] sdb[0]
      41910272 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/3] [UUU]
      
unused devices: <none>
[root@localhost ~]# mke2fs -t ext4 /dev/md0
mke2fs 1.41.12 (17-May-2010)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=128 blocks, Stripe width=256 blocks
2621440 inodes, 10477568 blocks
523878 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=4294967296
320 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks: 
	32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, 
	4096000, 7962624

Writing inode tables: done                            
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done

This filesystem will be automatically checked every 36 mounts or
180 days, whichever comes first.  Use tune2fs -c or -i to override.
[root@localhost ~]# mkdir /data
[root@localhost ~]# mount /dev/md0 /data

[root@localhost ~]# df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/mapper/vg0-root   20G  302M   19G   2% /
tmpfs                 491M     0  491M   0% /dev/shm
/dev/sda1             190M   36M  145M  20% /boot
/dev/mapper/vg0-usr   9.8G  2.0G  7.4G  21% /usr
/dev/mapper/vg0-var    20G  171M   19G   1% /var
/dev/md0               40G   48M   38G   1% /data

[root@localhost ~]# blkid /dev/md0
/dev/md0: UUID="b306bf28-9439-4719-902e-e71857f8d655" TYPE="ext4" 


[root@localhost ~]# vi /etc/fstab 
#
# /etc/fstab
# Created by anaconda on Sun Dec  6 09:20:03 2015
#
# 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/vg0-root    /                       ext4    defaults        1 1
UUID=385b7608-567d-4a7a-8ac8-fa3abaa9cd2e /boot                   ext4    defaults        1 2
/dev/mapper/vg0-usr     /usr                    ext4    defaults        1 2
/dev/mapper/vg0-var     /var                    ext4    defaults        1 2
/dev/mapper/vg0-swap    swap                    swap    defaults        0 0
tmpfs                   /dev/shm                tmpfs   defaults        0 0
devpts                  /dev/pts                devpts  gid=5,mode=620  0 0
sysfs                   /sys                    sysfs   defaults        0 0
proc                    /proc                   proc    defaults        0 0
UUID=b306bf28-9439-4719-902e-e71857f8d655  /data/   ext4  defaults      0 0

[root@localhost ~]# blkid /dev/md0
/dev/md0: UUID="b306bf28-9439-4719-902e-e71857f8d655" TYPE="ext4" 

[root@localhost ~]# mount -a

[root@localhost ~]# df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/mapper/vg0-root   20G  302M   19G   2% /
tmpfs                 491M     0  491M   0% /dev/shm
/dev/sda1             190M   36M  145M  20% /boot
/dev/mapper/vg0-usr   9.8G  2.0G  7.4G  21% /usr
/dev/mapper/vg0-var    20G  171M   19G   1% /var
/dev/md0               40G   48M   38G   1% /data

[root@localhost ~]# mount
/dev/mapper/vg0-root on / type ext4 (rw)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
tmpfs on /dev/shm type tmpfs (rw)
/dev/sda1 on /boot type ext4 (rw)
/dev/mapper/vg0-usr on /usr type ext4 (rw)
/dev/mapper/vg0-var on /var type ext4 (rw)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
/dev/md0 on /data type ext4 (rw)

[root@localhost ~]# mdadm -D /dev/md0
/dev/md0:
        Version : 1.2
  Creation Time : Fri Dec 18 15:51:28 2015
     Raid Level : raid5
     Array Size : 41910272 (39.97 GiB 42.92 GB)
  Used Dev Size : 20955136 (19.98 GiB 21.46 GB)
   Raid Devices : 3
  Total Devices : 4
    Persistence : Superblock is persistent

    Update Time : Fri Dec 18 15:57:50 2015
          State : clean 
 Active Devices : 3
Working Devices : 4
 Failed Devices : 0
  Spare Devices : 1

         Layout : left-symmetric
     Chunk Size : 512K

           Name : localhost.localdomain:0  (local to host localhost.localdomain)
           UUID : d0ca6d45:6aca276f:da0396f3:e487dc27
         Events : 18

    Number   Major   Minor   RaidDevice State
       0       8       16        0      active sync   /dev/sdb
       1       8       32        1      active sync   /dev/sdc
       4       8       48        2      active sync   /dev/sdd

       3       8       64        -      spare   /dev/sde

[root@localhost ~]# mdadm  /dev/md0 -f /dev/sdd
mdadm: set /dev/sdd faulty in /dev/md0
[root@localhost ~]# watch -n1 'cat /proc/mdstat'
[root@localhost ~]# mdadm -D /dev/md0
/dev/md0:
        Version : 1.2
  Creation Time : Fri Dec 18 15:51:28 2015
     Raid Level : raid5
     Array Size : 41910272 (39.97 GiB 42.92 GB)
  Used Dev Size : 20955136 (19.98 GiB 21.46 GB)
   Raid Devices : 3
  Total Devices : 4
    Persistence : Superblock is persistent

    Update Time : Fri Dec 18 16:10:56 2015
          State : clean 
 Active Devices : 3
Working Devices : 3
 Failed Devices : 1
  Spare Devices : 0

         Layout : left-symmetric
     Chunk Size : 512K

           Name : localhost.localdomain:0  (local to host localhost.localdomain)
           UUID : d0ca6d45:6aca276f:da0396f3:e487dc27
         Events : 37

    Number   Major   Minor   RaidDevice State
       0       8       16        0      active sync   /dev/sdb
       1       8       32        1      active sync   /dev/sdc
       3       8       64        2      active sync   /dev/sde

       4       8       48        -      faulty   /dev/sdd
[root@localhost ~]# mdadm  /dev/md0 -f /dev/sde
mdadm: set /dev/sde faulty in /dev/md0
[root@localhost ~]# watch -n1 'cat /proc/mdstat'
[root@localhost ~]# mdadm -D /dev/md0
/dev/md0:
        Version : 1.2
  Creation Time : Fri Dec 18 15:51:28 2015
     Raid Level : raid5
     Array Size : 41910272 (39.97 GiB 42.92 GB)
  Used Dev Size : 20955136 (19.98 GiB 21.46 GB)
   Raid Devices : 3
  Total Devices : 4
    Persistence : Superblock is persistent

    Update Time : Fri Dec 18 16:12:22 2015
          State : clean, degraded 
 Active Devices : 2
Working Devices : 2
 Failed Devices : 2
  Spare Devices : 0

         Layout : left-symmetric
     Chunk Size : 512K

           Name : localhost.localdomain:0  (local to host localhost.localdomain)
           UUID : d0ca6d45:6aca276f:da0396f3:e487dc27
         Events : 39

    Number   Major   Minor   RaidDevice State
       0       8       16        0      active sync   /dev/sdb
       1       8       32        1      active sync   /dev/sdc
       4       0        0        4      removed

       3       8       64        -      faulty   /dev/sde
       4       8       48        -      faulty   /dev/sdd

[root@localhost ~]# mdadm /dev/md0 -r /dev/sde
mdadm: hot removed /dev/sde from /dev/md0
[root@localhost ~]# mdadm /dev/md0 -r /dev/sdd
mdadm: hot removed /dev/sdd from /dev/md0

[root@localhost ~]# mdadm -D /dev/md0
/dev/md0:
        Version : 1.2
  Creation Time : Fri Dec 18 15:51:28 2015
     Raid Level : raid5
     Array Size : 41910272 (39.97 GiB 42.92 GB)
  Used Dev Size : 20955136 (19.98 GiB 21.46 GB)
   Raid Devices : 3
  Total Devices : 2
    Persistence : Superblock is persistent

    Update Time : Fri Dec 18 16:13:56 2015
          State : clean, degraded 
 Active Devices : 2
Working Devices : 2
 Failed Devices : 0
  Spare Devices : 0

         Layout : left-symmetric
     Chunk Size : 512K

           Name : localhost.localdomain:0  (local to host localhost.localdomain)
           UUID : d0ca6d45:6aca276f:da0396f3:e487dc27
         Events : 41

    Number   Major   Minor   RaidDevice State
       0       8       16        0      active sync   /dev/sdb
       1       8       32        1      active sync   /dev/sdc
       4       0        0        4      removed
       
[root@localhost ~]# mdadm /dev/md0 -a /dev/sdd
mdadm: added /dev/sdd
[root@localhost ~]# mdadm /dev/md0 -a /dev/sde
mdadm: added /dev/sde
[root@localhost ~]# mdadm -D /dev/md0
/dev/md0:
        Version : 1.2
  Creation Time : Fri Dec 18 15:51:28 2015
     Raid Level : raid5
     Array Size : 41910272 (39.97 GiB 42.92 GB)
  Used Dev Size : 20955136 (19.98 GiB 21.46 GB)
   Raid Devices : 3
  Total Devices : 4
    Persistence : Superblock is persistent

    Update Time : Fri Dec 18 16:14:24 2015
          State : clean, degraded, recovering 
 Active Devices : 2
Working Devices : 4
 Failed Devices : 0
  Spare Devices : 2

         Layout : left-symmetric
     Chunk Size : 512K

 Rebuild Status : 5% complete

           Name : localhost.localdomain:0  (local to host localhost.localdomain)
           UUID : d0ca6d45:6aca276f:da0396f3:e487dc27
         Events : 45

    Number   Major   Minor   RaidDevice State
       0       8       16        0      active sync   /dev/sdb
       1       8       32        1      active sync   /dev/sdc
       3       8       48        2      spare rebuilding   /dev/sdd

       4       8       64        -      spare   /dev/sde
[root@localhost ~]# watch -n1 'cat /proc/mdstat'