服务器软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]

md0md1

|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

tartgetInitiator

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

————————————————————————

本文出自 “吕布天下” 博客,请务必保留此出处

有人说,幸福是一种人生的感悟,一种个人的体验。

服务器软RAID和LVM的实现

相关文章:

你感兴趣的文章:

标签云: