存储管理

最近,完成了存储管理模块的开发,对此做一些记录与大家分享。

环境:RAID卡,MegaCli管理工具,Centos 7.2


一、物理磁盘模块


物理磁盘模块,设计了info, allinfo, canbeused, sethotspare, unsethotspare, init, initstop 7个接口。
canbeused接口会过滤出空闲且状态良好的磁盘用以创建RAID使用。
命令 MegaCli64 -PDInfo -PhysDrv[enclosure_id: slot_number] -a0能够获取到磁盘的序列号、容量、型号、温度、状态等信息。 
通过处理 MegaCli64 -CfgDsply -a0 | grep -E 'Virtual Drive:|Slot Number' 结果,获取当前磁盘所属的RAID。
磁盘初始化,MegaCli64 -PDClear -Start -PhysDrv[enclosure_id: slot_number] -a0 
设置热备盘,MegaCli64 -PDHSP -Set -PhysDrv[enclosure_id: slot_number] -a0

二、RAID模块

RAID模块,设计了create, info, allinfo, canbeused, delete, config, reconstruct 7个接口。
1. 创建RAID接口,需要RAID名称、级别、用以创建RAID的磁盘的槽位号列表、条带大小。
MegaCli64 -CfgLdAdd -r5[0:0, 0:1, 0:2] strpsz512KB -a0   其中5为RAID级别,0:0-->enclosure_id:slot_number,条带大小为512KB
MegaCli64 -LDSetProp -Name raid00 -L0 -a0  其中raid00为RAID名称,L0中的0表示RAID的ID
2. info接口,根据RAID的ID获取该RAID的名称、级别、包括的磁盘、状态、容量大小、重建进度、条带大小、卷组容量,卷组可用空间。
3. allinfo接口,获取所有RAID的信息
4. canbeused接口,选择能够用来创建逻辑卷的RAID
5. delete接口,根据RAID ID删除对应的RAID,这里规定当RAID上存在逻辑卷时,则无法删除
6. config接口,用于RAID扩容与降级的RAID的重建
MegaCli64 -LDRecon -Start -r5 -Add -PhysDrv[0:0] -L0 -a0  对ID为0的RAID添加磁盘[0:0]进行重建
7. reconstruct接口,其功能与config接口类似。






当RAID处于重建中时,不允许进行配置与删除操作。

三、逻辑卷模块

逻辑卷模块设计了create, info, allinfo, config, delete 5个接口。
1. create接口,需要参数包括逻辑卷名称、逻辑卷类型、用于创建该逻辑卷的RAID ID、逻辑卷容量
创建逻辑卷同时会完成格式化,挂载目录,并将挂载信息写入/etc/fstab中的操作,这里要格外注意,/etc/fstab中写入的信息有误时,会导致系统下次不能成功启动。
创建逻辑卷之前,首先判断所属RAID是否已经分区并创建pv与vg,接着判断逻辑卷容量的大小与vg可用空间的大小是否相符,最后通过lvcreate创建逻辑卷。
lvcreate命令操作很快,采用同步的方式获取响应;比较耗时的操作在于对创建好的逻辑卷进行格式化,并挂载目录。一个7TB的逻辑卷格式化操作大约要8分钟,这里采用异步的方式获取逻辑卷的格式化与挂载目录的操作响应。
2. info接口,获取逻辑卷的信息;包括:名称、总容量、可用容量、已使用容量的百分比、类型、所属RAID、状态、所属卷组容量、所属卷组可用容量、是否存在RAID重建
3. allinfo接口,获取所有逻辑卷的信息
4. config接口,需要参数包括:逻辑卷名称、更改的名称、配置后的容量、链接的数据源;这里限制配置后的容量不小于逻辑卷当前的容量,链接数据源指将数据源目录中的数据迁移至此逻辑卷所挂载的目录,并在数据源的位置创建软链接指向该目录。
5. delete接口,删除逻辑卷,这里暂且限制当逻辑卷已链接数据源后,就不允许对此进行删除操作





四、问题与思考

1. 存在RAID重建时,执行MegaCli命令出现卡顿现象,造成接口响应时间过长
引入缓存策略优化上述问题,以RAID重建中获取所有RAID的列表信息为例说明。接口响应时间过长的原因是底层MegaCli命令出现卡顿现象,首先会想如何不让底层命令执行卡顿呢?提升硬件资源如RAID卡性能解决卡顿现象,当然这不属于编码层面的优化了。进一步思考,既然MegaCli命令会出现卡顿,那能不能在有RAID重建的情况下尽可能少的执行MegaCli命令获取想要的信息呢。基于这一层的思考,引入了缓存策略,RAID将要重建之前缓存一部分数据;这样在RAID重建时,仅需要实时获取RAID重建的进度这一信息即可。此外,引入缓存策略固然性能会有提升,但对于何时使用缓存,何时更新缓存这个问题要想清楚。

2. 盘符飘逸问题
重新启动机器,系统上面的RAID对应的盘符信息有时会发生飘逸,如/dev/sda  --> /dev/sdc,如果发生飘逸,则对RAID进行分区操作会出现错误。
这里是通过寻找lsscsi输出中的设备序号如[0:2:0:0]与RAID的一一对应的关系,进一步获取RAID的盘符信息。不管每次系统重启造成的RAID在Linux系统中对应的盘符信息如何发生变化,RAID对应的设备序号是一直不变的,因此通过设备序号找到RAID,进而找到RAID对应的盘符 。

3. 耗时的命令造成接口响应时间很长
比如对逻辑卷进行格式化的操作,逻辑卷的容量越大,所需的时间则会越长。这里采用异步的方式处理。


五、总结

磁盘,RAID,逻辑卷开发的难度远远超出了自己的想象,自己也在不断学习与研究这一块的知识。同时希望与大家多多交流。



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值