Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2008099
  • 博文数量: 593
  • 博客积分: 20034
  • 博客等级: 上将
  • 技术积分: 6779
  • 用 户 组: 普通用户
  • 注册时间: 2006-02-06 14:07
文章分类

全部博文(593)

文章存档

2016年(1)

2011年(101)

2010年(80)

2009年(10)

2008年(102)

2007年(16)

2006年(283)

我的朋友

分类: LINUX

2008-11-13 01:35:42

有这样一个需求:为内部网络的 PC 提供共享存储、备份,没有太强的读写压力,资金投入也有限,但需要够安全,而且为逐渐增长的数据量考虑,需要扩容方便。
于是,打算通过 mdadm 和 LVM 来实现。用这样的硬件:内部空间够大,电源够强劲,扇热要好,支持多个 SATA 接口的塔式机。
为了不浪费空间,用一块小硬盘装系统,比如一块 20G 的 IDE 硬盘。3块别的老 PC 上拆下来 80G SATA 硬盘。

在 VMware 上模拟了一下。因为需要模拟 SATA 硬盘,建立虚拟机时用了 SCSI 硬盘。要选择 RedHat Enterprise 版才能支持 SCSI 硬盘。
使用 VMware-gsx-server-3.2.1 发现在较大的(试验了 160G/250G)虚拟硬盘上的 RAID5 recovery 到尾声时会死机,重启后又要从头再来,但依然会死机,周而复始。换成 VMware-server-1.0.3 后就没有问题了。
在 hda 安装了 CentOS 5.1 ,最小化安装。安装过程没有对 sda, sdb, sdc 进行分区。

用 mdadm 创建 RAID
# mdadm -C /dev/md0 -l5 -n3 -c128 /dev/sd[a,b,c]
参数所代表的意思可以用 man mdadm 查看。
基本命令
# mdadm -A /dev/md0 #启动阵列
# mdadm -S /dev/md0 #停止阵列(停止前必须先 umount)
# mdadm -D /dev/md0 #显示阵列详细信息

# watch "cat /proc/mdstat"
可以看到 RAID 的 recovery 过程。
此时 RAID 已经可以使用了。

LVM 初始化
# vgscan
创建 PV
# pvcreate /dev/md0
创建 VG
# vgcreate vga /dev/md0
创建 LV
# lvcreate -l 40959 -n lv1 vga
在 LV 上建立文件系统
# mkfs -t ext3 -L /data /dev/vga/lv1
挂载
# mkdir /data
# mount -t ext3 -o defaults /dev/vga/lv1 /data
测试
# cd /data
# dd if=/dev/zero of=test bs=1024k count=1k
# dd if=test of=/dev/null

recovery 结束后,生成 /etc/mdadm.conf 文件,在系统重启后自动启用 RAID
# mdadm -Ds > /etc/mdadm.conf
编辑 /etc/mdadm.conf 文件,在顶部加入如下一行:
DEVICE /dev/sd*

在 /etc/fstab 尾部加入一行
LABEL=/data /data ext3 defaults 0 0
重启后自动挂载。

接着,模拟这样一种状况:为了扩容,要给 RAID 加入一块硬盘。
关机,给 VM 添加一块 80G 的 SCSI 硬盘后启动。
给 RAID 添加硬盘
# mdadm /dev/md0 -a /dev/sdd
此时,新添加的硬盘会被作为 spare
把 RAID 设备设置为4个,使用新硬盘
# mdadm -G /dev/md0 -n4
扩充 PV
# pvresize /dev/md0
扩充 LV
# lvextend -l +20480 /dev/vga/lv1
扩大文件系统大小
# resize2fs /dev/vga/lv1
此命令可在 mount 时操作。并且同时 dd 模拟写入和读取文件,除了速度变慢,没有发现异常。

再来模拟这样一种情况:空间又被用完了,需要更大的存储空间,再找来3块 160G 的硬盘扩容。为了安全,还是把这三块硬盘组成 RAID5 。
关机,给 VM 添加三块 160G 的 SCSI 硬盘后启动。
CentOS5(RHEL5) 使用了 udev 来管理系统设备文件名,/dev 目录下只有 md0,需要手动建立 RAID 设备。
# mknod /dev/md1 b 9 1
# chown root:disk /dev/md1
# chmod 640 /dev/md1
为了在重启后能自动创建 md1 ,还需如下设置
# mkdir /etc/udev/devices
# cp -a /dev/md1 /etc/udev/devices/

建立 RAID
# mdadm -C /dev/md1 -l5 -n3 -c128 /dev/sd[e,f,g]

创建 PV
# pvcreate /dev/md1
扩充 VG
# vgextend vga /dev/md1
扩充 LV
# lvextend -l +81919 /dev/vga/lv1
扩充分区大小:
# resize2fs /dev/vga/lv1
此间,继续使用 dd 模拟读写,没有问题。
把第二个 RAID 的配置也写入配置文件
# mdadm -Ds | grep md1 >> /etc/mdadm.conf

模拟设备损坏的情况
将 /dev/sdb 标记为已损坏的设备
# mdadm /dev/md0 -f /dev/sdb
移除损坏的设备
# mdadm /dev/md0 -r /dev/sdb
此时可用 dd 模拟读写。
更换设备并重新添加到 RAID 中
# mdadm /dev/md0 -a /dev/sdb
会重新 recovery ,同样,可以 dd 模拟下读写。

如果发现缺失某个设备后 RAID 不能启动,可以使用剩余设备启动 RAID
# mdadm -A --run /dev/md1 /dev/sde /dev/sdf

此后又再给 md1 添加了一块硬盘 sdh 进行相应测试,还是正常的。

特殊情况,去掉一个 PV
# umount /data
# resize2fs -f /dev/vga/lv1 240G
# lvreduce -l -81919 /dev/vga/lv1
# vgreduce vga /dev/md1
不建议在生产系统上减小 LV
这本来是想用来试验大 PV 替换小 PV 的,但为了安全,还是把老 LV 的数据复制到新的 LV 后再做打算。

有了更大的硬盘(250G*4, VMware 只能创建小于 256G 的虚拟硬盘)用来扩容,为了留出机箱空间并降低电力消耗,需要把老硬盘上的数据转移到新硬盘。
先用新硬盘组成的 RAID5
# mknod /dev/md2 b 9 2
# chown root:disk /dev/md2
# chmod 640 /dev/md2
# cp -a /dev/md2 /etc/udev/devices/
# mdadm -C /dev/md2 -l5 -n4 -c128 /dev/sd[i,j,k,l]
# mdadm -Ds | grep md2 >> /etc/mdadm.conf

依然使用 LVM
# pvcreate /dev/md2
# vgcreate vg0 /dev/md2
# lvcreate -l 191999 -n lv1 vg0
# mkfs -t ext3 /dev/vg0/lv1

把 /dev/vg0/lv1 挂载上后便可以复制数据了,cp, rsync 都行。

当有大量小文件时,用 dd 复制,并把块设置的大些,速度会非常快。
为保证数据同步,先卸载
# umount /data
然后复制
# dd if=/dev/vga/lv1 of=/dev/vg0/lv1 bs=16MB
用 dd 复制还可以跳过 mkfs 的过程。
在 VMware 中,就算没有使用预分配空间的磁盘模式,也会进行完全复制填满磁盘空间。可以在复制开始一会儿后就结束 dd 进程,节约空间和时间。

挂载,检查一下数据完整性
# mount -t ext3 -o defaults /dev/vg0/lv1 /mnt

用 dd 复制会把新的 LV 容量变成和老的一样大,需要调整容量
# resize2fs /dev/vg0/lv1

没有问题的话,就修改 LV 卷标,以便系统重启后能挂载新的 LV
# e2label /dev/vga/lv1 /backup
# e2label /dev/vg0/lv1 /data

如果要把老的 LV 转移到另外的机器上,需要备份 LVM 卷组信息以及 mdadm 的配置
先查看一下 /etc/lvm/backup/vga 是否存在,没有的话就创建备份
# vgcfgbackup
把 /etc/lvm/backup/vga 和 /etc/mdadm.conf 备份到远程主机上。
这还可以用于恢复存储服务器操作系统崩溃而导致的 LVM 不可用。比如 hda 损坏了。

重装系统时,千万不要对 sd* 进行操作—重建分区表,这会导致 LVM 信息的丢失。
在真实设备上操作时,为了安全,可以先安装完系统再给硬盘通电。

先恢复 RAID
把 mdadm.conf 恢复到新系统的 /etc 目录下,启动 RAID
# mdadm -A /dev/md0
# mdadm -A /dev/md1
再恢复 LVM
# vgcfgrestore -f vga vga
第一个 vga 是备份的文件名,第二个是要还原的 Volume Group Name 。如果 vga 这个卷组名被占用了,需要重命名。
# vgscan
# pvscan
然后启动 VG
# vgchange -a y vga
再扫描 LV
# lvscan
恢复完成,可以挂载并使用了。

至此,VMware 试验完成,可在真实硬件设备上试验了。






mdadm 使用参考

mdadm是linux下用于管理软件 raid 的工具

以下内容来自 manpage 页:

基本语法 : mdadm [mode] [options]

[mode] 有7种:

Assemble:将以前定义的某个阵列加入当前在用阵列。

Build:Build a legacy array ,每个device 没有 superblocks

Create:创建一个新的阵列,每个device 具有 superblocks

Manage: 管理阵列,比如 add 或 remove

Misc:允许单独对阵列中的某个 device 做操作,比如抹去superblocks 或 终止在用的阵列。

Follow or Monitor:监控 raid 1,4,5,6 和 multipath 的状态

Grow:改变raid 容量或 阵列中的 device 数目

可用的 [options]:

-A, --assemble:加入一个以前定义的阵列

-B, --build:Build a legacy array without superblocks.

-C, --create:创建一个新的阵列

-Q, --query:查看一个device,判断它为一个 md device 或是 一个 md 阵列的一部分

-D, --detail:打印一个或多个 md device 的详细信息

-E, --examine:打印 device 上的 md superblock 的内容

-F, --follow, --monitor:选择 Monitor 模式

-G, --grow:改变在用阵列的大小或形态

-h, --help:帮助信息,用在以上选项后,则显示该选项信息

--help-options

-V, --version

-v, --verbose:显示细节

-b, --brief:较少的细节。用于 --detail 和 --examine 选项

-f, --force

-c, --config= :指定配置文件,缺省为 /etc/mdadm/mdadm.conf

-s, --scan:扫描配置文件或 /proc/mdstat以搜寻丢失的信息。配置文件/etc/mdadm/mdadm.conf

create 或 build 使用的选项:

-c, --chunk=:Specify chunk size of kibibytes. 缺省为 64.

--rounding=: Specify rounding factor for linear array (==chunk size)

-l, --level=:设定 raid level.

--create可用:linear, raid0, 0, stripe, raid1,1, mirror, raid4, 4, raid5, 5, raid6, 6, multipath, mp.

--build可用:linear, raid0, 0, stripe.

-p, --parity=:设定 raid5 的奇偶校验规则:eft-asymmetric, left-symmetric, right-asymmetric, right-symmetric, la, ra, ls, rs.缺省为left-symmetric

--layout=:类似于--parity

-n, --raid-devices=:指定阵列中可用 device 数目,这个数目只能由 --grow 修改

-x, --spare-devices=:指定初始阵列的富余device 数目

-z, --size=:组建RAID1/4/5/6后从每个device获取的空间总数

--assume-clean:目前仅用于 --build 选项

-R, --run:阵列中的某一部分出现在其他阵列或文件系统中时,mdadm会确认该阵列。此选项将不作确认。

-f, --force:通常mdadm不允许只用一个device 创建阵列,而且创建raid5时会使用一个device作为missing drive。此选项正相反。

-a, --auto{=no,yes,md,mdp,part,p}{NN}:







继续上卖面的话题,还是mdadm的使用。之前,我们一直都是用mdadm创建RAID阵列。其实,mdadm还有一个选项:multipath。它可以实现硬件支持的多I/O路径指向单SCSI LUNs的功能,用于创建多路径访问的磁盘设备。
一、原理
 多路径存储是为了实现当有硬件损坏或单个SCSI LUNs饱和时,仍可以对数据进行访问。要实现multipath,前提是必须有对应的硬件支持。
 举个例:我们有一个光纤盘柜,主机通过2块HBA卡通过光纤交换机连接到盘柜上,通过配置光纤交换机实现这样的结果:

引用
/dev/sdb-
            |--光纤交换机--200G(盘柜上的同一个空间)
/dev/sdc-

 也就是说,在系统中是看到虽然是分别看到sdb和sdc,但其实他们都是通过光纤交换机,指向同一个盘柜空间。只是访问的路径不同而已。
 有了上述的硬件支持,我们就可以通过mdadm进行配置了。

二、创建
mdadm -C /dev/md0 --level=multipath --raid-devices=2 /dev/sd[bc]1

--level=multipath,会告诉linux内核的md层,在出现I/O路径故障的时候,选择新的访问路径。
echo DEVICE /dev/sd[bc]1 >> /etc/mdadm.conf
mdadm --detail --scan >> /etc/mdadm.conf

修改/etc/mdadm.conf文件,方便以后识别。
mdadm --detail /dev/md0
/dev/md0:
Version : 00.90.01
Creation Time : Wed Jun 14 14:58:54 2006
Raid Level : multipath
Array Size : 1044096 (1019.63 MiB 1069.15 MB)
Raid Devices : 1
Total Devices : 2
Preferred Minor : 0
Persistence : Superblock is persistent

Update Time : Wed Jun 14 15:44:59 2006
State : clean
Active Devices : 1
Working Devices : 2
Failed Devices : 0
Spare Devices : 1

   Number   Major   Minor   RaidDevice State
      0       8       49        0      active sync   /dev/sdb1
      1       8       17        1      spare   /dev/sdc1
          UUID : 8aca2297:510fe735:0b224387:33e20925
        Events : 0.1

※请注意差别。看上去这些命令和建立RAID1很像。但其实有很大差别:在做RAID时,每个sd设备号都是代表不同的物理磁盘;但在做Multipath时,使用到的sd设备号都是指向相同的公用磁盘驱动器。

三、代替
 今后,我们通过访问/dev/md0,即可对公用的SCSI LUN进行访问,Linux内核会通过每个路径检测到共享的驱动器。当出现硬件故障,或但SCSI LUNs饱和时,即会切换到另一条链路进行访问。
 该方法可替代未能实现failover的HBA卡驱动问题。
阅读(721) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~