Linux下软Raid1扩容方案

系统下的RAID1结构

通过命令:

mdadm -D /dev/md0

可以看到raid1由/dev/sdb1和/dev/sdc1两块硬盘分区组成,并且状态为"active sync"。

通过查看/proc/mdstat文件也可以知道/dev/md0由哪些分区组成raid1。

改造为RAID0+1

由于硬盘空间不足,所以要对raid1进行扩容。

主要思想就是把一块更大的硬盘换取raid1上的其中一块硬盘,然后等raid1同步数据,然后再把一块更大的硬盘换取raid1上的另一块小硬盘,就可以达到扩容的效果了。

由于大硬盘比较贵,放弃小硬盘双比较浪费,所以把两个以上的小硬盘组成raid0,这样就变成了一块容量大的硬盘,而且存储速度还比较快。

创建RAID0结构

先用fdisk对两块新硬盘/dev/sdd和/dev/sde进行分别分区为/dev/sdd1和/dev/sde1。

然后运行以下命令创建raid0:

mdadm --create /dev/md1 --level=0 --raid-devices=2 /dev/sdd1 /dev/sde1

参数说明:
--create:表示创建。
/dev/md1:为raid0的设备名,md后的数据可以随便定义。
--level=0:设置raid的级别,这里级别为0。
--raid-devices=2:设置raid的设备数,我们用两块硬盘组成raid0,所以这里为2。
/dev/sdd1 /dev/sde1:这里为组成raid0的设备,跟--raid-devices的数量有关。

创建完后可通过命令:

mdadm -D /dev/md1

看看/dev/md1的raid0是否正常工作。也可查看/proc/mdstat文件是否已经有md1的信息。

最后修改文件/etc/mdadm/mdadm.conf,把新建的raid0加上去,确保开机启动:

ARRAY /dev/md1 UUID=7c60c049:57d60814:bd9a77f1:57e49c5b #UUID可能过mdadm -D /dev/md1查看

替换RAID1中的硬盘

我们先通过命令:

mdadm --manage /dev/md0 -f /dev/sdc1

把/dev/sdc1停掉,然后再通过以下命令把sdc1从raid1中移除,并把/dev/md1加上去:

mdadm --manage /dev/md0 -a /dev/md1 -r /dev/sdc1

然后等待同步,可通过命令:

mdadm -D /dev/md1

查看/dev/md1的状态是否变为"active sync",即代表同步完成。

同步完成后,就可以把剩下的/dev/sdb1也移除,换成raid0的设备了:

mdadm --manage /dev/md0 -f /dev/sdb1 #模拟/dev/sdb1出错
mdadm --manage /dev/md0 -r /dev/sdb1 #移除/dev/sdb1
mdadm --create /dev/md2 --level=0 --raid-devices=2 /dev/sdb1 /dev/sdc1 #把sdb1和sdc1组成raid0
mdadm --manage /dev/md0 -a /dev/md2 #把raid0的md2添加到raid1的md0上

改变RAID1的容量

等md1和md2同步完成之后,就可以改变md0的容量了:

mdadm -G /dev/md0 --size=max
resize2fs /dev/md0

到此,raid1的扩容就完成了。

改造为LVM+RAID1

上面介绍了raid0+1,即把两个raid0组成一个raid1。但这种结构有个缺点,就是以后使用中,raid0结构的盘容量满了,这就需要重新找新的硬盘重组raid0结构,但重组raid0结构数据都会丢失,所以加入到raid1后又要进行数据同步,如果数据量大,这是很费时间的。

基于以上的考虑,为了在以后扩容的时候不用重新同步数据,所以考虑用LVM代替raid0。

什么是LVM

LVM 的全名是 Logical Volume Manager,中文可以翻译为逻辑捲轴管理員。之所以称为『捲轴』可能是因为可以将 filesystem 像捲轴一樣伸长或缩短之故吧!LVM 的作法是将几个实体的 partitions (或 disk) 透过软体组合成为一块看起来是独立的大磁碟 (VG) ,然后将这块大磁碟再经过分割成為可使用分割槽 (LV), 最终就能夠挂载使用了。但是为什么这样的系统可以進行 filesystem 的扩充或缩小呢?其实与一个称为 PE 的项目有关! 底下我們就得要针对这几个项目来好好聊聊!

Physical Volume, PV, 实体捲轴

我们实际的 partition 需要调整系统识别码 (system ID) 成为 8e (LVM 的识別码),然后再经过 pvcreate 的指令将他转成 LVM 最底层的实体捲轴 (PV) ,之后才能夠将這些 PV 加以利用! 调整 system ID 的方是就是透过 fdisk!

Volume Group, VG, 捲轴群组

所谓的 LVM 大磁碟就是将许多 PV 整合成这個 VG 的东西!所以 VG 就是 LVM 组合起来的大磁碟!這么想就好了。 那么这個大磁碟最大可以到多少容量呢?這与底下要说明的 PE 有关喔~因为每个 VG 最多仅能包含 65534 个 PE 而已。 如果使用 LVM 预设的参数,则一个 VG 最大可达 256GB 的容量!(参考底下的 PE 說明)

Physical Extend, PE, 实体延伸区块

LVM 预设使用 4MB 的 PE 區塊,而 LVM 的 VG 最多仅能含有 65534 个 PE ,因此预设的 LVM VG 会有 4M*65534/(1024M/G)=256G。 这个 PE 是整个 LVM 最小的储存区块,也就是说,其实我们的档案资料都是藉由写入 PE 來处理的。 簡單的說,這個 PE 就有点像文件系统里面的 block 大小。 这样说应该就比较好理解了吧?所以调整 PE 会影响到 VG 的最大容量!

Logical Volume, LV, 逻辑捲轴

最终的 VG 还会被切成 LV,这个 LV 就是最后可以被格式化使用的类似分割槽的东西!那么 LV 是否可以随意指定大小呢? 当然不可以!既然 PE 是整个 LVM 的最小储存单位,那么 LV 的大小就与在此 LV 內的 PE 总数有关。 为了方便使用者利用 LVM 来管理其系统,因此 LV 的裝置文件名通常指定为『 /dev/vgname/lvname 』的样式!

此外,我們刚刚有谈到 LVM 可弹性的变更 filesystem 的容量,那是如何办到的?其实他就是透过『交换 PE 』来进行资料转换, 将原本 LV 內的 PE 移转到其他设备中以降低 LV 容量,或将其他设备的 PE 加到此 LV 中以加大容量! VG、LV 与 PE 的关系有点像下图:

Linux下软Raid1扩容方案

如上图所示,VG 內的 PE 会分给虚线部分的 LV,如果未来这个 VG 要扩充的話,加上其他的 PV 即可。 而最重要的 LV 如果要扩充的话,也是透过加入 VG 內沒有使用到的 PE 來扩充的!

制作流程

透过 PV, VG, LV 的规划之后,再利用 mkfs 就可以将你的 LV 格式化成为可以利用的文件系统了!而且这个文件系统的容量在未来还能夠進行扩充或减少, 而且里面的资料还不会被影响!实在是很方便,那制作方面要如何进行呢?很简单! 整个流程由基础到最终的结果可以这样看:

Linux下软Raid1扩容方案

如此一来,我们就可以利用 LV 这个玩意来进行系统的挂载了。不过,你应该要觉得奇怪的是, 那么我的资料写入这个 LV 时,到底他是怎么写入硬盘当中的?其实,依据写入机制的不同,而有两种方式:

1.线性模式 (linear):假如我将 /dev/hda1, /dev/hdb1 这两个 partition 加入到 VG 当中,並且整个 VG 只有一个 LV 时,那么所谓的线性模式就是:当 /dev/hda1 的容量用完之后,/dev/hdb1 的硬盘才会被使用到, 这也是我们所建议的模式。

2.交错模式 (triped):那什么是交错模式?很简单啊,就是我将一笔资料拆成两部分,分別写入 /dev/hda1 与 /dev/hdb1 的意思,感觉上有点像 RAID 0!如此一来,一份资料用两颗硬盘来写入,理论上,读写的效能会比较好。

基本上,LVM 最主要的用处是在实现一个可以弹性调整容量的文件系統上, 而不是在建立一个效能为主的硬盘上,所以,我们应该利用的是 LVM 可以弹性管理整个 partition 大小的用途上,而不是着眼在效能上的。因此, LVM 预设的读写模式是线性模式! 如果你使用 triped 模式,要注意,当任何一个 partition 『归天』时,所有的资料都会『损毁』的! 所以,不是很适合使用这种模式啦!如果要强调效能与备份,那么就直接使用 RAID 即可, 不需要用到 LVM !

创建LVM

假设现在还是/dev/sdb1跟/dev/sdc1组成raid1,有两块新硬盘/dev/sdd和/dev/sde,用fdisk分别对这两块新硬盘进行分区为/dev/sdd1和/dev/sde1,并且system id为8e。

创建PV

用以下命令对sdd1跟sde1分区创建PV:

pvcreate /dev/sdd1 /dev/sde1

然后用pvscan命令查看是否创建成功。用pvdisplay可以查看更详细的信息。

创建VG

用以下命令把sdd1和sde1变成一个VG:

vgcreate -s 16M jobcnvg /dev/sdd1 /dev/sde1

参数说明:
-s 16M:为PE的大小,这就决定这个VG的最大容量为16M*65534/1024=1T,这个值以后可以通过vgchange来更改。
jobcnvg:为VG的名字,可以随便取。
/dev/sdd1 /dev/sde1:要加入的设备。

然后用vgscan命令查看是否创建成功。用vgdisplay可以查看详细信息。

创建LV

通过以下命令,把上面创建的jobcnvg,分出一个LV:

lvcreate -l 356 -n jobcnlv jobcnvg

参数说明:
-l 356:是PE的个数,用vgdisplay可以看到jobcnvg的"Free  PE"数量。
-n jobcnlv:是LV的名字,可以随便取。
jobcnvg:VG的名字。

然后用lvscan命令查看是否创建成功。用lvdisplay可以查看详细信息。

格式化LV

通过以上步骤,LVM就创建完成了,如果需要挂载使用,就得格式化:

mkfs -t ext3 /dev/jobcnvg/jobcnlv

LV扩容

增加一块硬盘/dev/sdf,通过fdisk把它格式化为/dev/sdf1,system id为8e。

创建PV:

pvcreate /dev/sdf1

扩充VG:

vgextend jobcnvg /dev/sdf1

扩大LV:

lvresize -l +179 /dev/vbirdvg/vbirdlv

参数说明:
-l +179:增加的PE数量,+号表示增加,-号表示减少,无符号表示设定为多少。

resize2fs /dev/vbirdvg/vbirdlv

替换RAID1中的硬盘

替换raid1中的硬盘可参考raid0+1中的替换硬盘,把换出来的硬盘再建成/dev/jobcnvg1/jobcnlv1再放上去,就组成了LVM+RAID1的结构了。

对LVM+RAID1中的LVM扩容

由于扩容的时候LV是不能被占用的,所以这里有两种方法对LV进行扩容。

方案1

先停掉RAID1的服务:

mdadm -S /dev/md0

然后把/dev/jobcnvg/jobcnlv和/dev/jobcnvg1/jobcnlv1进行扩容。

然后再启动RAID1的服务:

mdadm -A /dev/md0

方案2

不用停掉RAID1的服务,先把其中一块LVM移出RAID1:

mdadm -f /dev/md0 /dev/jobcnvg/jobcnlv
mdadm -r /dev/md0 /dev/jobcnvg/jobcnlv

对jobcnlv进行扩容后,再接上去:

mdadm --add /dev/md0 /dev/jobcnvg/jobcnlv

同理把jobcnlv1也按以上步骤扩容。

最后

无论用哪种方案,扩容后,都要把RAID1的容量更新:

resize2fs /dev/md0

相关推荐