Ironic自定义组数据盘RAID

这个特性是在以前公司负责详细设计开发的,面试了这么久工作还没着落,靠着回忆将部分细节记录分享下。

RAID详细定义见https://zh.wikipedia.org/wiki/RAID

整个流程如图:
Screen Shot 2019-06-30 at 02.35.33.png

运维人员在裸金属服务器入云后将部分硬盘所在槽位作为系统盘标记更新到ironic node的extra字段中,另一些有硬盘的槽位作为数据盘提供给用户自定义组建RAID盘。其实像不同的flavor规格定义里已经添加了描述,console数据盘选择时就是根据flavor的定义展示的。形如:2 * 600GB SAS System Disk RAID 1 + 12 * 10TB SATA 加号前面指的系统盘,后面是数据盘。

  1. Console端用户选择一个或多个硬盘、前端JS根据不同RAID level所需硬盘数量规则来显示可选择的RAID level. 向组合API提交前js会再次检验。

  2. 组合API将提交的数据根据与后端的约定格式拼装类似:

    单盘JBOD:即传的JBOD
    单盘RAID0:即传的0
    RAID组合:r1x10T SASx2+r5x10T SASx3+r6x10T SASx6
    对于第三种组合API会进一步根据flavor中数据盘类型、数量校验,约束全部数据硬盘组合,不存在即有组合又有单盘RAID0或JBOD.

  3. 这里有级联被级联的架构,也有资料可以看https://wiki.openstack.org/wiki/OpenStack_cascading_solution。
    通过nova api传递给ironic, ironic更新node的extra 特定字段,在pxe后通过minios读取ironic-conductor传递的配置信息。

  4. 在mini OS层面,使用的软件包为MegaRAID Storage Manager,利用Storcli命令来设置RAID信息,因为该厂商大部分服务器都安装的LSI SAS3108RAID卡。
    先对所有盘解除RAID,再将系统盘组RAID,打开JBOD。再根据配置决定是否组数据盘RAID,
    如果是单盘RAIDO,则关闭JBOD,设置RAID0
    如果是单盘JBOD,则结束
    其它情况解析传入的数据格式,通过正则匹配拿到raid类型、盘大小、盘类型、数量。这里写了个算法通过上述条件选择数据盘,期中根据10T SAS这样的描述找到实际大小换算后与10T相近的SATA盘,拿到它们的槽位号,再用storcli64进行set。

华为官方有详细的操作指令指导https://support.huawei.com/enterprise/zh/doc/EDOC1000004345/a728791a
这里列几个用到的。
查询RAID组信息
storcli64 /ccontroller_id show

创建RAID
storcli64 /ccontroller_id add vd rlevel size=capacity drives=enclosure_id:slot_id | enclosure_id:startid-endid,enclosure_id:slot_id | enclosure_id:startid-endid [pdperarray=pdperarray]

删除RAID
storcli64 /ccontroller_id/vraid_id del

设置直通盘
storcli64 /ccontroller_id set jbod=state
storcli64 /ccontroller_id/eenclosure_id/sslot_id set JBOD