服务器软RAID和LVM的实现

Linux存储模式:
应用程序数据 <---gedit,vim等
虚拟文件系统  <---系统对下层抽象,对上层提供统一接口
文件系统驱动 <---ext3,vfat,xfs
内核驱动(硬件驱动)<---scsi_mod,sd_mod
硬件 <--- IDE,SATA,SCSI,SAS

存储介质:
ide (并口, ata, pata)
sata (串口的ata)
scsi
sas (串口scsi硬盘)
固态硬盘 (随机读写性能非常好)
flash card (随机读写性能非常好)

存储的分类
DAS(直连存储)
 存储设备功能简单,性能一般
 扩展有限

集中式存储
 SAN (Storage Area Network)
  适合IO密集型的应用,一般都是大型数据库使用。oracle
  通过光纤连接,识别为块设备
  IBM
  EMC
  HP
  DELL

NAS
  可以通过以太网或者光纤连接,设备集成文件系统
  适合cpu密集型:web,邮件
  Netapp

IpSAN(iscsi) ,gnbd

分布式存储
 mfs
 tfs <--- code.taobao.org
 gfs(google fs)

主板
    |
 IO总线
scsi适配器    
通道1(scsi总线)----------------
通道2 (scsi总线)----------------
    |  |   | | | | |  | <--- scsi id
    |   disk2 ......     disk8
    |
  高端的磁盘柜(很多磁盘)<---通过LUN识别磁盘柜里的硬盘
==================================================================

Raid
raid 0
 至少需要两个原始设备
 条带化
 带来性能的提升,IO性能提升了N倍
 不能坏点任何一个设备
raid 1
 至少需要两个原始设备
 镜像,数据是冗余保存的,至少剩下一个有效设备,数据都能访问
radi 10

raid 5
 字少需要3个原始设备
 具有条带化,又可以提供数据冗余机制
 可以坏点一个原始设备,一般都是支持热插拔

软raid命令
 mdadm 必须kenerl  > 2.4

例子1:实现raid0
原始设备:独立硬盘(才能提升性能),分区,文件

1、新建几个容量一样的分区,类型为fd

2、使用命令组装原设设备,构成raid0设备

[sda7   sda8] ===> md0 ===> 格式化、挂载

应用程序数据 <---gedit,vim等
虚拟文件系统  <---系统对下层抽象,对上层提供统一接口
文件系统驱动 <---ext3,vfat,xfs
raid软件驱动  <---
内核驱动(硬件驱动)<---scsi_mod,sd_mod
硬件 <--- IDE,SATA,SCSI,SAS

# mdadm --create /dev/md0 --level=0 --raid-devices=2 /dev/sda{7,8} ( raid0创建)
mdadm: array /dev/md0 started.

# cat /proc/mdstat
Personalities : [raid0]
md0 : active raid0 sda8[1] sda7[0]  <--- md0是由sda7,sda8组装而成,级别raid0,是一个映射设备文件
     4016000 blocks 64k chunks

# mkfs.ext3 /dev/md0

查看源设备的元数据
# mdadm -E /dev/sda8

例子2:实现raid1
# mdadm --create /dev/md0 --level=1 --raid-devices=2 /dev/sda{9,10}

例子3:实现raid10

[sda7 <--raid0--> sda8] [sda9 <---raid0---> sda10]
     md0         md1
 | raid1  |
 -------------------------
  md2 <---raid10

# mdadm --create /dev/md2 --level=1 --raid-devices=2 /dev/md{0,1}

等待初始化完毕就能使用
# watch "cat /proc/mdstat "
Every 2.0s: cat /proc/mdstat                   Tue Nov 15 14:41:18 2011

Personalities : [raid0] [raid1]
md2 : active raid1 md1[1] md0[0]
     4015936 blocks [2/2] [UU]
     [============>........]  resync = 62.1% (2497280/4015936) finish=
1.0min speed=23758K/sec
.....

格式化,挂载

验证条带化和数据镜像
# iostat -dk sda{7,8,9,10} 2

如何把组装信息保存到配置文件?有何作用
# echo "DEVICES /dev/sda9 /dev/sda10" > /etc/mdadm.conf
# mdadm --detail --scan >> /etc/mdadm.conf

如何手工再次组装设备
# mdadm -Av /dev/md0  《---读取mdadm.conf进行重新组装

没有配置文件的情况下,如何手工组装:
1)查看可能的原始设备,确定需要组装的raid设备是由哪些原始设备组成
# mdadm -E /dev/sda9
...
          UUID : 6db1465c:71f7b98d:ebafbef9:5e5e6795
    Raid Level : raid0

...
     Number   Major   Minor   RaidDevice State
this     0       8        9        0      active sync   /dev/sda9

0     0       8        9        0      active sync   /dev/sda9
  1     1       8       10        1      active sync   /dev/sda10

2) 把sda9,sda10重新组装成raid0设备
# mdadm -Av --uuid=6db1465c:71f7b98d:ebafbef9:5e5e6795 /dev/md0
....
mdadm: /dev/sda10 is identified as a member of /dev/md0, slot 1.
mdadm: /dev/sda9 is identified as a member of /dev/md0, slot 0.
mdadm: added /dev/sda10 to /dev/md0 as 1
mdadm: added /dev/sda9 to /dev/md0 as 0
mdadm: /dev/md0 has been started with 2 drives.

停止使用一个raid设备
# mdadm --stop /dev/md2
mdadm: stopped /dev/md2

删除原始设备上的关于raid元数据
# mdadm --zero-superblock --misc /dev/sda8

例子4:实现raid5
[root@nginx ~]# mdadm --create /dev/md0 --level=5 --raid-devices=4 /dev/sd{b,c,d,e}
mdadm: /dev/sdb appears to contain an ext2fs file system
   size=2097152K  mtime=Wed Dec 31 16:00:00 1969
mdadm: /dev/sdc appears to contain an ext2fs file system
   size=2097152K  mtime=Wed Dec 31 16:00:00 1969
mdadm: /dev/sdd appears to contain an ext2fs file system
   size=2097152K  mtime=Wed Dec 31 16:00:00 1969
mdadm: /dev/sde appears to contain an ext2fs file system
   size=2097152K  mtime=Wed Dec 31 16:00:00 1969
Continue creating array? y
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md0 started.

# watch "cat /proc/mdstat"
Every 2.0s: cat /proc/mdstat                   Tue Nov 15 15:41:46 2011

Personalities : [raid0] [raid1] [raid6] [raid5] [raid4]
md0 : active raid5 sda9[3] sda8[1] sda7[0]
     4016000 blocks level 5, 64k chunk, algorithm 2 [3/2] [UU_]
     [=====>...............]  recovery = 26.2% (527572/2008000) finish
=1.4min speed=17018K/sec

等待完成

模拟raid5原始设备出故障,然后手工移出故障设备,用好的设备替换它

[root@nginx ~]# mdadm /dev/md0 --fail /dev/sdc
mdadm: set /dev/sdc faulty in /dev/md0

[root@nginx ~]# cat /proc/mdstat
Personalities : [raid6] [raid5] [raid4]
md0 : active raid5 sde[4] sdd[2] sdc[1](F) sdb[0]
     6286848 blocks super 1.2 level 5, 512k chunk, algorithm 2 [4/3] [U_UU]

unused devices: <none>

里面的数据依然可以访问

移走故障设备:
[root@nginx ~]# mdadm /dev/md0 --remove /dev/sdc
mdadm: hot removed /dev/sdc

[root@nginx ~]# cat /proc/mdstat
Personalities : [raid6] [raid5] [raid4]
md0 : active raid5 sde[4] sdd[2] sdb[0]
     6286848 blocks super 1.2 level 5, 512k chunk, algorithm 2 [4/3] [U_UU]

unused devices: <none

用新设备替换回去进行数据恢复

[root@nginx ~]#  mdadm /dev/md0 --add /dev/sdc
mdadm: added /dev/sdc
[root@nginx ~]#  watch "cat /proc/mdstat"  
Personalities : [raid6] [raid5] [raid4]
md0 : active raid5 sde[4] sdd[2] sdc[1] sdb[0]
     6286848 blocks super 1.2 level 5, 512k chunk, algorithm 2 [4/4] [UUUU]

===================================

lvm

pv 物理卷 带有逻辑卷元数据的物理设备:分区、硬盘、镜像文件、raid设备等

vg 卷组  由多个物理卷组成,容量是所有物理卷的累计,提供容量的存储池

lv 逻辑卷 真正操作的对象,对它进行格式化、挂载

盘碟  硬盘  分区

pv \  / lv
 vg
pv /  \ lv

动态调整容量、条带化、镜像、快照

例子1:创建逻辑卷

1、pv
# pvcreate /dev/sda7 /dev/sda8

# pvs
 PV         VG   Fmt  Attr PSize PFree
 /dev/sda7       lvm2 --   1.92G 1.92G
 /dev/sda8       lvm2 --   1.92G 1.92G

# pvdisplay
2、vg
# vgcreate mysql-vg /dev/sda7
 Volume group "mysql-vg" successfully created

# vgs
 VG       #PV #LV #SN Attr   VSize VFree
 mysql-vg   1   0   0 wz--n- 1.91G 1.91G

# vgdisplay

# vgextend mysql-vg /dev/sda8  《---增加pv到vg中,进行扩容
 Volume group "mysql-vg" successfully extended

# vgs
 VG       #PV #LV #SN Attr   VSize VFree
 mysql-vg   2   0   0 wz--n- 3.83G 3.83G

3、lv
# lvcreate -n mysql-lv -L 1G mysql-vg
 Logical volume "mysql-lv" created

# lvs
 LV       VG       Attr   LSize Origin Snap%  Move Log Copy%  Convert
 mysql-lv mysql-vg -wi-a- 1.00G

# lvdisplay

# ll /dev/mysql-vg/mysql-lv
lrwxrwxrwx 1 root root 31 11-15 16:27 /dev/mysql-vg/mysql-lv -> /dev/mapper/mysql--vg-mysql--lv

# mkfs.ext3 /dev/mysql-vg/mysql-lv

例子2:如何在线调整lv的容量
一. 增加容量
#vgcreate mysql-vg /dev/sda7
#lvcreate -n mysql-lv -L 1G mysql-vg
#mkfs.ext3 /dev/mysql-vg/mysql-lv
# mount /dev/mysql-vg/mysql-lv  /mnt
# lvextend -L 2G /dev/mysql-vg/mysql-lv  《---逻辑卷是正在挂载使用
# resize2fs /dev/mysql-vg/mysql-lv

# df -h
文件系统              容量  已用 可用 已用% 挂载点
/dev/sda2              39G   27G   11G  73% /
/dev/sda1             190M  169M   12M  94% /boot
tmpfs                1009M     0 1009M   0% /dev/shm
/dev/sda5              94G   61G   29G  68% /vmware
/dev/sda6              46G   23G   21G  53% /soft
/dev/mapper/mysql--vg-mysql--lv
                     2.0G   34M  1.9G   2% /mnt
二、裁减容量

前提:确保裁减后容量要不原来设备已用的容量要大

1、取消挂载,停止使用
# umount /dev/mapper/mysql--vg-mysql--lv

2、手工检测文件系统是否有错

# fsck -f /dev/mysql-vg/mysql-lv

3、调整文件系统的容量
# resize2fs  /dev/mysql-vg/mysql-lv 1.50G
4、裁减容量
# lvreduce -L 1.50G /dev/mysql-vg/mysql-lv
 WARNING: Reducing active logical volume to 1.51 GB
 THIS MAY DESTROY YOUR DATA (filesystem etc.)
Do you really want to reduce mysql-lv? [y/n]: y
 Reducing logical volume mysql-lv to 1.51 GB
 Logical volume mysql-lv successfully resized

# lvs
 LV       VG       Attr   LSize Origin Snap%  Move Log Copy%  Convert
 mysql-lv mysql-vg -wi-a- 1.51G

5、再次检查文件系统

-------------------------------------------------------------------------------
例子1:实现LVM条带化
# pvs
 PV         VG       Fmt  Attr PSize PFree  
 /dev/sda7  mysql-vg lvm2 a-   1.91G 936.00M
 /dev/sda8  mysql-vg lvm2 a-   1.91G   1.91G

创建:
# lvcreate -L 300M -n webroot -i 2 mysql-vg
 Using default stripesize 64.00 KB
 Rounding size (75 extents) up to stripe boundary size (76 extents)
 Logical volume "webroot" created

# pvs
 PV         VG       Fmt  Attr PSize PFree  
 /dev/sda7  mysql-vg lvm2 a-   1.91G 784.00M
 /dev/sda8  mysql-vg lvm2 a-   1.91G   1.77G

验证
# iostat -dk sda7 sda8 2

例子2:实现lvm镜像

# lvcreate -L 500M -n uplv -m 1 mysql-vg
 Logical volume "uplv" created

-m 1 把数据保存到一个原始设备,明且镜像保存到另外一个原始设备。
 至少需要三个原始设备,其中还有一个保存镜像日志

删除逻辑卷
# lvremove /dev/mysql-vg/uplv

例子3:实现lvm快照

快照卷不支持镜像lv

对一个普通的lv建立快照

# lvcreate -L 100M -n mysql-lv-sp -s /dev/mysql-vg/mysql-lv
 Logical volume "mysql-lv-sp" created

挂载,看到的数据和mysql-lv是一样
# mount /dev/mysql-vg/mysql-lv-sp  /mnt/mysql-lv-sp/

根据快照原理,一般用于快速备份。

例子:使用快照卷实现mysql的"热"备份

前提:mysql数据文件保存在逻辑卷

锁表
mysql> flush tables with read lock;
创建快照
解锁
mysql> unlock tables;

挂载快照卷,拷贝数据到备份目录

# lvcreate -L 100M -n mysql-lv-sp -s /dev/mysql-vg/mysql-lv
 Logical volume "mysql-lv-sp" created

==========================================

实现iSCSI

硬盘 ------数据总线------主机 <---直连存储
硬盘 ------FC网络-------主机  <--- SAN
硬盘 ----Internet(tcp/ip)---主机 <--- IPSAN
tartget   Initiator
 tcp/ip协议头[  scsi协议数据  ]

一、实现iscsi的target (模拟存储的服务器)

# yum install scsi-target-utils -y

# vim /etc/tgt/targets.conf

# vim /etc/tgt/targets.conf
<target iqn.2011-11.com.upl:webroot>
       backing-store /dev/sda5
</target>

# service tgtd start

# tgtadm --lld iscsi --op show --mode target
Target 1: iqn.2011-11.com.upl:webroot
   System information:
       Driver: iscsi
       State: ready
   I_T nexus information:
   LUN information:
       LUN: 0
           Type: controller
           SCSI ID: deadbeaf1:0
           SCSI SN: beaf10
           Size: 0 MB
           Online: Yes
           Removable media: No
           Backing store: No backing store
       LUN: 1
           Type: disk
           SCSI ID: deadbeaf1:1
           SCSI SN: beaf11
           Size: 2056 MB
           Online: Yes
           Removable media: No
           Backing store: /dev/sda5
   Account information:
   ACL information:
       ALL

二、配置iscsi的Initiator(iscsi客户端,需要连接使用iscsi存储)

# yum install iscsi-initiator-utils

# service iscsid start  <---真正客户端服务进程
# service iscsi start  <---一个脚本。能够自动实现登录target

首先发现target
# iscsiadm -m discovery -p 1.1.1.128 -t st
1.1.1.128:3260,1 iqn.2011-11.com.upl:webroot

登录target
# iscsiadm -m node -T iqn.2011-11.com.upl:webroot -p 1.1.1.128 -l

验证,多了一个硬盘
# fdisk -l

格式化成ext3,然后存放一些文件。
# mkfs.ext3 /dev/sdb1

客户端只要曾经发现过target,重启iscsi服务就会自动登录该target
# service iscsi restart

例子2:实现另外一个带有访问控制的target

# vim /etc/tgt/targets.conf
<target iqn.2011-11.com.upl:qdisk>
       backing-store /dev/sda6
       incominguser tom 123456
       initiator-address 1.1.1.129
       initiator-address 1.1.2.129
</target>

重启target最好保证没有客户端(发起方)正在连接存储

# service tgtd stop
# service tgtd start

# tgtadm --lld iscsi --op show --mode target
....

客户端:
# vim /etc/iscsi/iscsid.conf
node.session.auth.authmethod = CHAP
node.session.auth.username = tom
node.session.auth.password = 123456

# service iscsid restart

# iscsiadm -m discovery -t st -p 1.1.1.128
# iscsiadm -m node -T iqn.2011-11.com.upl:qdisk -l

取消登录
# iscsiadmin -m node -u  <---取消全部
-T iqn.2011-11.com.upl:qdisk 取消具体某个target的登录
如果想启动iscsi服务时候不会自动登录,就必须删掉该target的记录
# iscsiadmin -m node --op delete -T iqn.2011-11.com.upl:qdisk

# iscsiadm -m session
tcp: [13] 1.1.1.128:3260,1 iqn.2011-11.com.upl:qdisk

# iscsiadm -m node -T iqn.2011-11.com.upl:webroot -l <---没密码的target一样可以登录
# iscsiadm -m session
tcp: [13] 1.1.1.128:3260,1 iqn.2011-11.com.upl:qdisk
tcp: [14] 1.1.1.128:3260,1 iqn.2011-11.com.upl:webroot

思考:
登录顺序不一样,本地fdisk -l看到的设备名字就不一样。设备的命名混乱会出现什么严重后果?如何解决?
挂载的时候,设备路径名字不固定,挂载会出错。
解决: udev设备管理模块、多路径multipath

如果多个客户端同时连接同一个target,该target被格式化成ext3,多个节点同时使用这个文件系统会导致什么严重后果?
文件系统损坏,整个分区的数据就可能丢失。
原因:虽然物理上该设备允许多个节点同时去连接和使用,但是该设备上使用的文件系统ext3是一个单机文件系统(只允许一个节点去使用)。
解决:使用集群文件系统gfs,ocfs.

例子3:使用udev管理设备
Linux内核专门用于管理系统各种硬件设备,并且对其进行重名,生成设备文件。管理员可以通过自定义规则文件来干预udev对设备的命名。

主配置文件:
/etc/udev/udev.conf

规则文件目录:
/etc/udev/rules.d/

对某个硬盘生成自定义的设备文件:
KERNEL=="sd[a-z]",SUBSYSTEM=="block",SYSFS{size}=="11020527",SYMLINK="iscsi_qdisk"

# udevtest /block/sde
...
udev_node_add: creating symlink '/dev/iscsi_qdisk' to 'sde'
...

重启udev服务或重启udev服务,让规则百分百生效
# start_udev

# vim /etc/udev/rules.d/60-net.rules
ACTION=="add",SUBSYSTEM=="net",SYSFS{address}=="00:0c:29:0a:61:ac",NAME="eth8"

解决iscsi设备命名问题
# cp 55-iscsi.rules /etc/udev/rules.d/
# mkdir /etc/udev/scripts/
# cp iscsidev.sh  /etc/udev/scripts/iscsidev.sh
# chmod 755 /etc/udev/scripts/iscsidev.sh

# service iscsi restart
验证:
# ls /dev/iscsi/webroot/ -l
总计 0
lrwxrwxrwx 1 root root  9 11-23 16:09 part -> ../../sdc
lrwxrwxrwx 1 root root 10 11-23 16:09 part1 -> ../../sdc1

------------------------------------------------------------------------

Linux存储模式:
应用程序数据 <---gedit,vim等
虚拟文件系统  <---系统对下层抽象,对上层提供统一接口
文件系统驱动 <---ext3,vfat,xfs
内核驱动(硬件驱动)<---scsi_mod,sd_mod
硬件 <--- IDE,SATA,SCSI,SAS

存储介质:
ide (并口, ata, pata)
sata (串口的ata)
scsi
sas (串口scsi硬盘)
固态硬盘 (随机读写性能非常好)
flash card (随机读写性能非常好)

存储的分类
DAS(直连存储)
 存储设备功能简单,性能一般
 扩展有限

集中式存储
 SAN (Storage Area Network)
  适合IO密集型的应用,一般都是大型数据库使用。oracle
  通过光纤连接,识别为块设备
  IBM
  EMC
  HP
  DELL

NAS
  可以通过以太网或者光纤连接,设备集成文件系统
  适合cpu密集型:web,邮件
  Netapp

IpSAN(iscsi) ,gnbd

分布式存储
 mfs
 tfs <--- code.taobao.org
 gfs(google fs)

主板
    |
 IO总线
scsi适配器    
通道1(scsi总线)----------------
通道2 (scsi总线)----------------
    |  |   | | | | |  | <--- scsi id
    |   disk2 ......     disk8
    |
  高端的磁盘柜(很多磁盘)<---通过LUN识别磁盘柜里的硬盘
==================================================================

Raid
raid 0
 至少需要两个原始设备
 条带化
 带来性能的提升,IO性能提升了N倍
 不能坏点任何一个设备
raid 1
 至少需要两个原始设备
 镜像,数据是冗余保存的,至少剩下一个有效设备,数据都能访问
radi 10

raid 5
 字少需要3个原始设备
 具有条带化,又可以提供数据冗余机制
 可以坏点一个原始设备,一般都是支持热插拔

软raid命令
 mdadm 必须kenerl  > 2.4

例子1:实现raid0
原始设备:独立硬盘(才能提升性能),分区,文件

1、新建几个容量一样的分区,类型为fd

2、使用命令组装原设设备,构成raid0设备

[sda7   sda8] ===> md0 ===> 格式化、挂载

应用程序数据 <---gedit,vim等
虚拟文件系统  <---系统对下层抽象,对上层提供统一接口
文件系统驱动 <---ext3,vfat,xfs
raid软件驱动  <---
内核驱动(硬件驱动)<---scsi_mod,sd_mod
硬件 <--- IDE,SATA,SCSI,SAS

# mdadm --create /dev/md0 --level=0 --raid-devices=2 /dev/sda{7,8} ( raid0创建)
mdadm: array /dev/md0 started.

# cat /proc/mdstat
Personalities : [raid0]
md0 : active raid0 sda8[1] sda7[0]  <--- md0是由sda7,sda8组装而成,级别raid0,是一个映射设备文件
     4016000 blocks 64k chunks

# mkfs.ext3 /dev/md0

查看源设备的元数据
# mdadm -E /dev/sda8

例子2:实现raid1
# mdadm --create /dev/md0 --level=1 --raid-devices=2 /dev/sda{9,10}

例子3:实现raid10

[sda7 <--raid0--> sda8] [sda9 <---raid0---> sda10]
     md0         md1
 | raid1  |
 -------------------------
  md2 <---raid10

# mdadm --create /dev/md2 --level=1 --raid-devices=2 /dev/md{0,1}

等待初始化完毕就能使用
# watch "cat /proc/mdstat "
Every 2.0s: cat /proc/mdstat                   Tue Nov 15 14:41:18 2011

Personalities : [raid0] [raid1]
md2 : active raid1 md1[1] md0[0]
     4015936 blocks [2/2] [UU]
     [============>........]  resync = 62.1% (2497280/4015936) finish=
1.0min speed=23758K/sec
.....

格式化,挂载

验证条带化和数据镜像
# iostat -dk sda{7,8,9,10} 2

如何把组装信息保存到配置文件?有何作用
# echo "DEVICES /dev/sda9 /dev/sda10" > /etc/mdadm.conf
# mdadm --detail --scan >> /etc/mdadm.conf

如何手工再次组装设备
# mdadm -Av /dev/md0  《---读取mdadm.conf进行重新组装

没有配置文件的情况下,如何手工组装:
1)查看可能的原始设备,确定需要组装的raid设备是由哪些原始设备组成
# mdadm -E /dev/sda9
...
          UUID : 6db1465c:71f7b98d:ebafbef9:5e5e6795
    Raid Level : raid0

...
     Number   Major   Minor   RaidDevice State
this     0       8        9        0      active sync   /dev/sda9

0     0       8        9        0      active sync   /dev/sda9
  1     1       8       10        1      active sync   /dev/sda10

2) 把sda9,sda10重新组装成raid0设备
# mdadm -Av --uuid=6db1465c:71f7b98d:ebafbef9:5e5e6795 /dev/md0
....
mdadm: /dev/sda10 is identified as a member of /dev/md0, slot 1.
mdadm: /dev/sda9 is identified as a member of /dev/md0, slot 0.
mdadm: added /dev/sda10 to /dev/md0 as 1
mdadm: added /dev/sda9 to /dev/md0 as 0
mdadm: /dev/md0 has been started with 2 drives.

停止使用一个raid设备
# mdadm --stop /dev/md2
mdadm: stopped /dev/md2

删除原始设备上的关于raid元数据
# mdadm --zero-superblock --misc /dev/sda8

例子4:实现raid5
[root@nginx ~]# mdadm --create /dev/md0 --level=5 --raid-devices=4 /dev/sd{b,c,d,e}
mdadm: /dev/sdb appears to contain an ext2fs file system
   size=2097152K  mtime=Wed Dec 31 16:00:00 1969
mdadm: /dev/sdc appears to contain an ext2fs file system
   size=2097152K  mtime=Wed Dec 31 16:00:00 1969
mdadm: /dev/sdd appears to contain an ext2fs file system
   size=2097152K  mtime=Wed Dec 31 16:00:00 1969
mdadm: /dev/sde appears to contain an ext2fs file system
   size=2097152K  mtime=Wed Dec 31 16:00:00 1969
Continue creating array? y
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md0 started.

# watch "cat /proc/mdstat"
Every 2.0s: cat /proc/mdstat                   Tue Nov 15 15:41:46 2011

Personalities : [raid0] [raid1] [raid6] [raid5] [raid4]
md0 : active raid5 sda9[3] sda8[1] sda7[0]
     4016000 blocks level 5, 64k chunk, algorithm 2 [3/2] [UU_]
     [=====>...............]  recovery = 26.2% (527572/2008000) finish
=1.4min speed=17018K/sec

等待完成

模拟raid5原始设备出故障,然后手工移出故障设备,用好的设备替换它

[root@nginx ~]# mdadm /dev/md0 --fail /dev/sdc
mdadm: set /dev/sdc faulty in /dev/md0

[root@nginx ~]# cat /proc/mdstat
Personalities : [raid6] [raid5] [raid4]
md0 : active raid5 sde[4] sdd[2] sdc[1](F) sdb[0]
     6286848 blocks super 1.2 level 5, 512k chunk, algorithm 2 [4/3] [U_UU]

unused devices: <none>

里面的数据依然可以访问

移走故障设备:
[root@nginx ~]# mdadm /dev/md0 --remove /dev/sdc
mdadm: hot removed /dev/sdc

[root@nginx ~]# cat /proc/mdstat
Personalities : [raid6] [raid5] [raid4]
md0 : active raid5 sde[4] sdd[2] sdb[0]
     6286848 blocks super 1.2 level 5, 512k chunk, algorithm 2 [4/3] [U_UU]

unused devices: <none

用新设备替换回去进行数据恢复

[root@nginx ~]#  mdadm /dev/md0 --add /dev/sdc
mdadm: added /dev/sdc
[root@nginx ~]#  watch "cat /proc/mdstat"  
Personalities : [raid6] [raid5] [raid4]
md0 : active raid5 sde[4] sdd[2] sdc[1] sdb[0]
     6286848 blocks super 1.2 level 5, 512k chunk, algorithm 2 [4/4] [UUUU]

===================================

lvm

pv 物理卷 带有逻辑卷元数据的物理设备:分区、硬盘、镜像文件、raid设备等

vg 卷组  由多个物理卷组成,容量是所有物理卷的累计,提供容量的存储池

lv 逻辑卷 真正操作的对象,对它进行格式化、挂载

盘碟  硬盘  分区

pv \  / lv
 vg
pv /  \ lv

动态调整容量、条带化、镜像、快照

例子1:创建逻辑卷

1、pv
# pvcreate /dev/sda7 /dev/sda8

# pvs
 PV         VG   Fmt  Attr PSize PFree
 /dev/sda7       lvm2 --   1.92G 1.92G
 /dev/sda8       lvm2 --   1.92G 1.92G

# pvdisplay
2、vg
# vgcreate mysql-vg /dev/sda7
 Volume group "mysql-vg" successfully created

# vgs
 VG       #PV #LV #SN Attr   VSize VFree
 mysql-vg   1   0   0 wz--n- 1.91G 1.91G

# vgdisplay

# vgextend mysql-vg /dev/sda8  《---增加pv到vg中,进行扩容
 Volume group "mysql-vg" successfully extended

# vgs
 VG       #PV #LV #SN Attr   VSize VFree
 mysql-vg   2   0   0 wz--n- 3.83G 3.83G

3、lv
# lvcreate -n mysql-lv -L 1G mysql-vg
 Logical volume "mysql-lv" created

# lvs
 LV       VG       Attr   LSize Origin Snap%  Move Log Copy%  Convert
 mysql-lv mysql-vg -wi-a- 1.00G

# lvdisplay

# ll /dev/mysql-vg/mysql-lv
lrwxrwxrwx 1 root root 31 11-15 16:27 /dev/mysql-vg/mysql-lv -> /dev/mapper/mysql--vg-mysql--lv

# mkfs.ext3 /dev/mysql-vg/mysql-lv

例子2:如何在线调整lv的容量
一. 增加容量
#vgcreate mysql-vg /dev/sda7
#lvcreate -n mysql-lv -L 1G mysql-vg
#mkfs.ext3 /dev/mysql-vg/mysql-lv
# mount /dev/mysql-vg/mysql-lv  /mnt
# lvextend -L 2G /dev/mysql-vg/mysql-lv  《---逻辑卷是正在挂载使用
# resize2fs /dev/mysql-vg/mysql-lv

# df -h
文件系统              容量  已用 可用 已用% 挂载点
/dev/sda2              39G   27G   11G  73% /
/dev/sda1             190M  169M   12M  94% /boot
tmpfs                1009M     0 1009M   0% /dev/shm
/dev/sda5              94G   61G   29G  68% /vmware
/dev/sda6              46G   23G   21G  53% /soft
/dev/mapper/mysql--vg-mysql--lv
                     2.0G   34M  1.9G   2% /mnt
二、裁减容量

前提:确保裁减后容量要不原来设备已用的容量要大

1、取消挂载,停止使用
# umount /dev/mapper/mysql--vg-mysql--lv

2、手工检测文件系统是否有错

# fsck -f /dev/mysql-vg/mysql-lv

3、调整文件系统的容量
# resize2fs  /dev/mysql-vg/mysql-lv 1.50G
4、裁减容量
# lvreduce -L 1.50G /dev/mysql-vg/mysql-lv
 WARNING: Reducing active logical volume to 1.51 GB
 THIS MAY DESTROY YOUR DATA (filesystem etc.)
Do you really want to reduce mysql-lv? [y/n]: y
 Reducing logical volume mysql-lv to 1.51 GB
 Logical volume mysql-lv successfully resized

# lvs
 LV       VG       Attr   LSize Origin Snap%  Move Log Copy%  Convert
 mysql-lv mysql-vg -wi-a- 1.51G

5、再次检查文件系统

-------------------------------------------------------------------------------
例子1:实现LVM条带化
# pvs
 PV         VG       Fmt  Attr PSize PFree  
 /dev/sda7  mysql-vg lvm2 a-   1.91G 936.00M
 /dev/sda8  mysql-vg lvm2 a-   1.91G   1.91G

创建:
# lvcreate -L 300M -n webroot -i 2 mysql-vg
 Using default stripesize 64.00 KB
 Rounding size (75 extents) up to stripe boundary size (76 extents)
 Logical volume "webroot" created

# pvs
 PV         VG       Fmt  Attr PSize PFree  
 /dev/sda7  mysql-vg lvm2 a-   1.91G 784.00M
 /dev/sda8  mysql-vg lvm2 a-   1.91G   1.77G

验证
# iostat -dk sda7 sda8 2

例子2:实现lvm镜像

# lvcreate -L 500M -n uplv -m 1 mysql-vg
 Logical volume "uplv" created

-m 1 把数据保存到一个原始设备,明且镜像保存到另外一个原始设备。
 至少需要三个原始设备,其中还有一个保存镜像日志

删除逻辑卷
# lvremove /dev/mysql-vg/uplv

例子3:实现lvm快照

快照卷不支持镜像lv

对一个普通的lv建立快照

# lvcreate -L 100M -n mysql-lv-sp -s /dev/mysql-vg/mysql-lv
 Logical volume "mysql-lv-sp" created

挂载,看到的数据和mysql-lv是一样
# mount /dev/mysql-vg/mysql-lv-sp  /mnt/mysql-lv-sp/

根据快照原理,一般用于快速备份。

例子:使用快照卷实现mysql的"热"备份

前提:mysql数据文件保存在逻辑卷

锁表
mysql> flush tables with read lock;
创建快照
解锁
mysql> unlock tables;

挂载快照卷,拷贝数据到备份目录

# lvcreate -L 100M -n mysql-lv-sp -s /dev/mysql-vg/mysql-lv
 Logical volume "mysql-lv-sp" created

==========================================

实现iSCSI

硬盘 ------数据总线------主机 <---直连存储
硬盘 ------FC网络-------主机  <--- SAN
硬盘 ----Internet(tcp/ip)---主机 <--- IPSAN
tartget   Initiator
 tcp/ip协议头[  scsi协议数据  ]

一、实现iscsi的target (模拟存储的服务器)

# yum install scsi-target-utils -y

# vim /etc/tgt/targets.conf

# vim /etc/tgt/targets.conf
<target iqn.2011-11.com.upl:webroot>
       backing-store /dev/sda5
</target>

# service tgtd start

# tgtadm --lld iscsi --op show --mode target
Target 1: iqn.2011-11.com.upl:webroot
   System information:
       Driver: iscsi
       State: ready
   I_T nexus information:
   LUN information:
       LUN: 0
           Type: controller
           SCSI ID: deadbeaf1:0
           SCSI SN: beaf10
           Size: 0 MB
           Online: Yes
           Removable media: No
           Backing store: No backing store
       LUN: 1
           Type: disk
           SCSI ID: deadbeaf1:1
           SCSI SN: beaf11
           Size: 2056 MB
           Online: Yes
           Removable media: No
           Backing store: /dev/sda5
   Account information:
   ACL information:
       ALL

二、配置iscsi的Initiator(iscsi客户端,需要连接使用iscsi存储)

# yum install iscsi-initiator-utils

# service iscsid start  <---真正客户端服务进程
# service iscsi start  <---一个脚本。能够自动实现登录target

首先发现target
# iscsiadm -m discovery -p 1.1.1.128 -t st
1.1.1.128:3260,1 iqn.2011-11.com.upl:webroot

登录target
# iscsiadm -m node -T iqn.2011-11.com.upl:webroot -p 1.1.1.128 -l

验证,多了一个硬盘
# fdisk -l

格式化成ext3,然后存放一些文件。
# mkfs.ext3 /dev/sdb1

客户端只要曾经发现过target,重启iscsi服务就会自动登录该target
# service iscsi restart

例子2:实现另外一个带有访问控制的target

# vim /etc/tgt/targets.conf
<target iqn.2011-11.com.upl:qdisk>
       backing-store /dev/sda6
       incominguser tom 123456
       initiator-address 1.1.1.129
       initiator-address 1.1.2.129
</target>

重启target最好保证没有客户端(发起方)正在连接存储

# service tgtd stop
# service tgtd start

# tgtadm --lld iscsi --op show --mode target
....

客户端:
# vim /etc/iscsi/iscsid.conf
node.session.auth.authmethod = CHAP
node.session.auth.username = tom
node.session.auth.password = 123456

# service iscsid restart

# iscsiadm -m discovery -t st -p 1.1.1.128
# iscsiadm -m node -T iqn.2011-11.com.upl:qdisk -l

取消登录
# iscsiadmin -m node -u  <---取消全部
-T iqn.2011-11.com.upl:qdisk 取消具体某个target的登录
如果想启动iscsi服务时候不会自动登录,就必须删掉该target的记录
# iscsiadmin -m node --op delete -T iqn.2011-11.com.upl:qdisk

# iscsiadm -m session
tcp: [13] 1.1.1.128:3260,1 iqn.2011-11.com.upl:qdisk

# iscsiadm -m node -T iqn.2011-11.com.upl:webroot -l <---没密码的target一样可以登录
# iscsiadm -m session
tcp: [13] 1.1.1.128:3260,1 iqn.2011-11.com.upl:qdisk
tcp: [14] 1.1.1.128:3260,1 iqn.2011-11.com.upl:webroot

思考:
登录顺序不一样,本地fdisk -l看到的设备名字就不一样。设备的命名混乱会出现什么严重后果?如何解决?
挂载的时候,设备路径名字不固定,挂载会出错。
解决: udev设备管理模块、多路径multipath

如果多个客户端同时连接同一个target,该target被格式化成ext3,多个节点同时使用这个文件系统会导致什么严重后果?
文件系统损坏,整个分区的数据就可能丢失。
原因:虽然物理上该设备允许多个节点同时去连接和使用,但是该设备上使用的文件系统ext3是一个单机文件系统(只允许一个节点去使用)。
解决:使用集群文件系统gfs,ocfs.

例子3:使用udev管理设备
Linux内核专门用于管理系统各种硬件设备,并且对其进行重名,生成设备文件。管理员可以通过自定义规则文件来干预udev对设备的命名。

主配置文件:
/etc/udev/udev.conf

规则文件目录:
/etc/udev/rules.d/

对某个硬盘生成自定义的设备文件:
KERNEL=="sd[a-z]",SUBSYSTEM=="block",SYSFS{size}=="11020527",SYMLINK="iscsi_qdisk"

# udevtest /block/sde
...
udev_node_add: creating symlink '/dev/iscsi_qdisk' to 'sde'
...

重启udev服务或重启udev服务,让规则百分百生效
# start_udev

# vim /etc/udev/rules.d/60-net.rules
ACTION=="add",SUBSYSTEM=="net",SYSFS{address}=="00:0c:29:0a:61:ac",NAME="eth8"

解决iscsi设备命名问题
# cp 55-iscsi.rules /etc/udev/rules.d/
# mkdir /etc/udev/scripts/
# cp iscsidev.sh  /etc/udev/scripts/iscsidev.sh
# chmod 755 /etc/udev/scripts/iscsidev.sh

# service iscsi restart
验证:
# ls /dev/iscsi/webroot/ -l
总计 0
lrwxrwxrwx 1 root root  9 11-23 16:09 part -> ../../sdc
lrwxrwxrwx 1 root root 10 11-23 16:09 part1 -> ../../sdc1

------------------------------------------------------------------------

转载于:https://blog.51cto.com/2364821/1262249

服务器软RAID和LVM的实现相关推荐

  1. linux 软raid和lvm,lvm逻辑卷管理和软Raid设置

    一.LVM逻辑卷管理 1. 定义 将多个物理分区/磁盘从逻辑上组合成一个更大的整体,从其中划分出不同的逻辑分区,逻辑分区的大小可以根据需求扩大和缩减 2. LVM概念 PV:物理卷 VG:卷组(可以包 ...

  2. 软Raid5,LVM,3T大硬盘纠缠操作的问题

    新服务器,4块3T大硬盘,软Raid5 组建 加上LVM分区各种一通操作... 悲催的是经过4天的软raid rebuild,最终状态给我FAIL了,当看到raid的state[ State : cl ...

  3. linux 系统修复 启动盘,linux服务器系统盘坏且系统盘为软raid的修复方法

    1 需要换新盘的情况 1.1 一块盘grub损坏修复(可通过另一块盘进入系统的情况) 更换硬盘的方式,可以热插拔,也可以服务器断电后更换,但如果是热插拔,可能会导致盘符变更.坏了一块硬盘的情况下,软r ...

  4. bcache / 如何使用bcache构建LVM,软RAID / 如何优化bcache

    bcache / 如何使用bcache构建LVM,软RAID / 如何优化bcache 作者 digoal 日期 2016-09-19 标签 bcache , mdadm , lvm2 , 软RAID ...

  5. hpg9服务器系统安装2012,如何在HPdl380Gen9服务器上安装Redhat7.2并配置软RAID

    1 文档编写目的 在<如何为服务器硬盘配置RAID或JBOD模式>一文中提到,单张RAID卡无法同时启用RAID模式和JBOD模式,即无法混合管理,如果RAID卡为所有硬盘配置了JBOD模 ...

  6. 文件服务器的配置与管理(2) 实现软RAID

    RAID技术按实现方式不同分为软RAID和硬RAID.软RAID的所有功能都是由操作系统与CPU来完成,因而效率比较低:硬RAID具备专门的硬件控制/处理芯片和I/O处理芯片,所提供的功能和性能都要比 ...

  7. 硬盘、服务器、RAID磁盘阵列

    一.硬盘 1.1 什么是硬盘? 硬盘是计算机最主要的存储设备,是存储数据的地方 硬盘一般是2.5寸和3.5寸,2.5存硬盘一般用于笔记本电脑和移动硬盘上,3.5存的一般用于服务器和台式机. 1.2 硬 ...

  8. 软RAID 0的技术概要及实现 v0.1b

    原贴:http://www.linuxsir.org/main/?q=node/279 软RAID 0的技术概要及实现 v0.1b (正在修订之中) 作者:北南南北 来自:LinuxSir.Org 摘 ...

  9. RAID及软RAID的实现,包括各级别RAID的原理及各级别RAID的实现

    计算机内部的核心部件 对于计算机来讲,核心部件有cpu 内存其中:cpu从内存中取得数据从而进行运算,由于内存是易失性设备,若是做成非易失性设备,代价是非常高昂的.但是由于cpu内部具有各级缓存,寄存 ...

最新文章

  1. 了解EOS看这一篇就够了一、团队二、技术三、项目进度四、争议和风险五、展望
  2. 前端图片上坐标连线_平面上三角形“四心”的解析建模
  3. 每日一皮:修Bug的真实情况...
  4. 整理前端css/js/jq常见问题及解决方法(3)
  5. java代码连接数据库
  6. 文科生的数据分析:亲测有效,真香!!!
  7. 用shell打印下面这句话中字母数小于6的单词
  8. mysql在window的使用记录
  9. 如何处理Long类型精度丢失问题?
  10. 转 lucene3搜索引擎,索引建立搜索排序分页高亮显示, IKAnalyzer分词
  11. Eclipse、MyEclipse 快捷键
  12. latex 论文模板
  13. js读取excel数据
  14. linux服务网卡速率查看,linux 下查看网卡工作速率
  15. 三星note10 android q,【极光ROM】-【三星NOTE10/NOTE10+/5G N97XX-9825】-【V5.0 Android-Q-TE9】...
  16. 下载网页中的视频的两种方法
  17. 7、微信小程序-wxs脚本
  18. 论文总结之任务型对话NLU
  19. CNN 卷积神经网络-- 残差计算
  20. NASM汇编语言与计算机系统10-中断向量表0号中断(cli/sti/iret/hlt)

热门文章

  1. 自制Ghost XP SP3 启动光盘(二)
  2. MS SQL入门基础:创建和使用图表
  3. 「万字干货」高并发系统分析与大型互联网架构介绍
  4. Laravel大型项目系列教程(五)之文章和标签管理
  5. laravel大型项目系列教程(四)之显示文章列表和用户修改文章
  6. linux怎么锁定test用户,用户被锁定不影响JOB的运行
  7. java切面类整合_自定义注解+面向切面整合的日志记录模块(一)
  8. 飚王硬盘盒怎么样_ORICO M.2固态移动硬盘盒众测分享:移动存储也高速
  9. MySQL高级 - 存储引擎 - 概述
  10. RabbitMQ Fanout