好文档就是一把金锄头!
欢迎来到金锄头文库![会员中心]
电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

RAID子系统分析与实现.docx

12页
  • 卖家[上传人]:gg****m
  • 文档编号:226994597
  • 上传时间:2021-12-19
  • 文档格式:DOCX
  • 文档大小:158.12KB
  • / 12 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • RAID子系统分析与实现1概述本质上来讲,RAID就是模拟一个scsi磁盘,它接收上层Initiator发来的命令,然后将 命令分割成更小的”子命令”,再发给具体的磁盘,等这些子命令都执行完成后,再向上层的 Initiator返回执行结果所有的命令都是异步处理的,也就是说,从Initiator来的命令都会 存放到自己的一个队列中,这样,RAID同时可以处理更多的命令而不需要Initiator层去等 待,当命令完成时,会通过回调机制告诉Initiator命令的完成1.1基本术语先约定以下术语Partition分区一般是指磁盘的一部分,在组建一个RAID时,可以只用磁盘的一 部分而不是整个磁盘但在实际使用过程中,创建RAID时一般都是使用 整个磁盘,我们的RAID模块支持只使用磁盘的一部分(分区)来创建 RAIDoRAID指使用Partition来构成的一个行列相间矩阵Row包含连续条带(stripe)的一组磁盘StripeUnit条带单元,有时也称为chunk,是构成条带的基本单位假设条带单元大小是32k,那么数据存放顺序就是diskO放32k, diski 放32k,这样顺序存放,直至条带结束再返回下一个条带继续存放。

      Stripe跨一个row的一组条带单元Good指RAID状态良好,可以正常提供服务Degraded在一个RAID5阵列中,有一块盘坏掉,这时RAID能够提供服务,但是 它不能提供容错,这种状态称为降级Dead当一个RAID5阵列有两块盘坏掉时,它将不能提供服务,也不能修复, 称为dead状态一个stripe有最大限制,比如最大16块盘做一个row,那么当创建一个32块盘的raid 时,就会分成两个rowo下图描述前面介绍的这些概念Rowr 00L 1r 2/防121415I161718303132483349345046624763StripeUnit1.2 RAID命令处理RAID对命令的处理都是按照stripe来处理的,stripe再拆分成StripeUnit发给磁盘处理下面以5个磁盘组成的RAIDO为例,假设StripeUnit大小为20hDisk Disk Disk Disk DiskStripe 10hStripe 11hStripe 12hStripe 13hStripe 14hStripe Unit = 20hOffset = 14hOffset = 8hExample Reading Blocks AF4h ・ C48h參片"WWW现在要从AF4h开始的地方读取154h个块,那么StripeSizelnBlocks = StripeUnitSizelnBlocks*NumDisks=20h*5=A0hStartStripe = StartBlock / StripeSizelnBlocks = AF4h / AOh = 11hStartOffset = StartBlock % StripeUnitSizelnBlocks = AF4h % 20h = 14h那么,起始地址在disk2上的开始地址就是StartBlock(disk2) = 20h * 11h + 14h = 234h需要在disk2上访问的块个数为NumBlocks (disk2) = 20h - 14h = Ch即向disk2发出一个scsi命令,开始地址为234h,大小为Ch个块。

      1.3 RAID5处理方式在对RAID5的校验方式上通常存在着不同的格式,我们采取的是称作“右循环异步” 的方式如下图Pi磁1Disk 2DisksStripe QPODOD1G2Stripe 1gP104Dstripe 2D7P2D8Stripe 3□10D11P3Stripe: 4P4□12DI 3014=•**・:•w所谓”循环方向”,是指RAID中的校验块走向,分为左循环和右循环两种左循环是指stripeO的校验块位于阵列中最后一个磁盘上的0号块,stripl校验块位于 倒数第2块盘的1号块……,以此类推,等完成一个整循环后,又从最后一块盘重新开始 因其方向看起来像由右向左旋转而下,因此称为左循环,也称作backward.右循环正好与此相反,右循环也称作forward.两种方式如下图所示所谓“异步”和“同步”,是指数据块的写入方式异步”是指当写满一个条带需要转入下一个条带写入时,直接回到0号盘进行写入 也就是每个stripe内都是由低号盘开始写入,写满一个块后转向高号盘继续写入,这种方式 不考虑校验块的位置,称为异步同步”则是在写满一个条带,需要将数据写入下一个条带时,先判断下一个条带的校 验块位于哪个磁盘,然后将数据写入校验块所在磁盘的下一个磁盘,写满一个数据块后转向 高号盘,直至该stripe内编号最大的数据块写满后,再回到同条带内的0号盘写入,直至本 条带内的校验块所在的磁盘的前一个磁盘。

      DiskODisfclDisk 2Qtak3DiskODisklDMk 2DM 3StripjeQiDOD1D2POStrip 0DOD1ID2PO.^ripje 18D4P1Stripe!D4D5P1Stripje2P2StripesQBP2D6Stripe aP3Strips 3:P3Stripe*P4Strips 4P4JU!■V.2实现RAID部分代码实现为以下几个文件rt_raid.c:包括raid模块的初始化,raid数据命令,管理命令线程处理函数的实现等rt_raid5.c:具体的命令处理,包括通用的raid读写命令处理以及raid5, 6相关的读写函数rt_meth.c: stripe 的读写校验方法实现,每个raid命令都是拆分成若干stripe,每个 stripe又拆分成若干disk command,这个文件实现了大部分stripe相关的读写命令和回调 函数rbucket.c: stripe lock 实现文件raidmang.c: raid命令行管理文件,SES函数处理等,也作为GUI管理的接口2.1数据命令处理RAID模块具有双重身份,一方面,它接收来自像FibreChannel Initiator, frcache这样 的Initiator发过来的命令,这时候,它就是一个target□它有自己的一个kbuf队列,那些 Initiator只是尽量把读写命令放到target的kbuf队列里面就行了。

      然后,raid target从自己的kbuf拿出命令,构造出rcmd,拆分成一个个小的了命令, 再发送给磁盘处理,这时候,自己又是一个Initiator,而磁盘就是target T如下图LEGENDoOStructureQueueDisk DeviceDisk Device=KaOS command=Thread0Raid模块取出自己队列中的kbuf是依靠框架来实现的,即是在IDLE线程里面调用kaos_DeviceScan,这个函数再调用 raid 的 raid_DeviceScan 函数po8_0neLoopIkaos_DwiC9Scanlvm_DeviceScan raid_DeviceScanIDLE ThreadCache%”*rai^__^r^OmdRND分咅 njd_startDataXfbrCmdnid_StartCmd一 raid_R9startStripes "IGet needed stripe, and do nkLDoStripe^U ROPS fun一个kbuf命令和一个rcmd命令是 对应的这里假设有一个raid5的写命令,这个写命令跨越2个条带如下图Kbuf和raid command互相都包含了对方的指针,它们一一对应。

      一个raid command有一个stripe的队列,本例子中是2个stripe□每个stripe里面的黑点表示的是指向一个buf的指针因为在一个raid5写操作中,会有一个读算校验・>写 入的过程这个过程raid模块会产生新的kbuf命令,发送给磁盘target去整个过程比较复杂,下面给出一个大体的函数调用关系图Initiator-Target模型提供一个自动调用的框架,在IDLE线程中,自动扫描系统中每个 target,让该target能够从自己的队列中取出kbuf进行处理对于raid target来说,它取到一个kbuf命令,将其拆分,做一系列诸如条带处理等动 作后,就又变成一个raid Initiator,构造一些子kbuf,将这些kbuf发送给对应的磁盘target在IDLE线程中,当扫描到磁盘target队列中有命令时,就调用磁盘的dm_DiskScan 函数,磁盘target会将这些命令变成物理读写命令交给磁盘驱动去处理当磁盘读写命令完 成后,就会产生中断,这时候在中断里面会调用kbuf_Done函数,该函数再调用 target_CmdDone= target_CmdDone 一方面调用target的done函数来通知target释放必要的资源,另一 方面调用init_IODone函数通知Initiator,对应的kbuf命令已经执行完了。

      函数调用关系图Disk (Target)IDLE Thread Raid (Target) Raid (Init)poH_OneLoopf^-DwlceScan ■nk^PamCmdraM_S^rtDataXfBfCmdraidjStartCmdrakLfiostaftStripesj ..........—> nid_DoStripeini lOStart 」一〜一二 dm_DiskScan:发送蛉磁^\数据传鮫后调用I kbuf^DonBini_ioDpn^ (Raiif_fODotTe)ompMaI target_CnJdDcne taryolp^cfnd_dono()Ttarget^CrndDonB+十 targBt.p^cmd_dom()InlUODono2.2配置管理命令处理RAID管理命令可以分为两种,一种是阻塞处理的,另一种是非阻塞处理的阻塞处理 的命令一般是处理时间比较短,可以马上完成的,而非阻塞处理的命令一般是很难在短时间 内处理完成,比如raid的重建等,都需要比较长的时间RAID管理命令通过SES协议封装,下发到raid管理层.SES线程专门负责对SES命令的处理,它不断的从自己的消息队列里面提取出ses命 令,调用ses_ParseScsiCmd函数进彳亍处理。

      对于非阻塞式命令,如raid的重建,在。

      点击阅读更多内容
      关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
      手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
      ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.