简单梳理RAID算法
接触raid也算有段时间了,其实对于raid,自己也利用空闲时间尝试过一些东西,raid缓存掉电保护,实现一个简单的raid模块。前者,看过一些技术文章和论文,写过些代码,后来不知道怎么搞就停了,后者,bug很多。总结下来,感觉现在自己还是tai cai。以后必继续搞起,哈哈,先把牛皮吹出去!
raid文档公司要求也写过一些,至于本篇,先前写了个PPT,本来是要搞一个公司内部raid的简单培训不了了之了,下面主要就是贴到一些ppt截图。见谅,无干水文一篇,目前我想着开个有关linux系统的博客专栏,发现要有15篇原创技术blog,这篇就先用来顶了,以后有机会补充分享有关raid的东西!
什么是RAID?如上图可知RAID所处Linux-IO协议栈的位置,介于通用块层与IO调度层,作为Block I/O layer其中的一个功能拓展模块,正常数据流通不必要经过RAID层。既然是Linux-IO栈中的拓展模块,必定服务于数据IO,其功能:对于要从文件系统下发至实际磁盘的bio来说,它相当于做了一层IO过滤。RAID实现获取和处理bio数据的接口,并实现将RAID阵列以标准块设备的形式提供给Applictions访问,用户也可基于可视化的阵列通过格式化Block-based文件系统使用,如:xfs、ext4以及btrfs等。而对于RAID组件?采取组件方式方便了阵列管理和功能扩展,有个比喻很恰当:面向对象思想,md相当于基类,而raid5(或raid4、raid6等)类似于子类,在继承了基类属性及方法的同时又实现了私有方法,解决业务逻辑。
P+Q算法伪代码:
<1>、生成正反对数列表
/*MOD_NUM: 2^(w)
* w MOD_NUM Polynomials T_mod_num
* w=4 2^4=16 2^4 + 2^1 + 1 = 19
* w=8 2^8=256 2^8 + 2^4 + 2^3 + 2^2 + 1 = 285
* w=16 2^16=65536 2^16 + 2^12 + 2^3 + 2 + 1 = 69643
* w=32 2^32=... 2^32 + x^22 + x^2 + x + 1 = ...
* ...
**/
TEMP_FILOG_data
FILOG[0]=1
FOR i=0 to MOD_NUM-1
TEMP_FILOG_data =FLOG[i-1]*2
If FLOG & MOD_NUM
FLOG^=T_mod_num
FILOG[i] = TEMP_FILOG_data
FLOG[FILOG[i]] = i
<2>、查表编码
example: FOR a stripe_head
查表乘编码:
RETURN FILOG[(log[A]+log[B]) % (MOD_NUM-1)]
查表除编码:
RETURN FILOG[(log[A]-log[B]] + (MOD_NUM-1)) % (MOD_NUM-1)]
P+Q简单测试代码可移步github:非原创
https://github.com/Jeoos/jecortech/tree/master/Raid6_PQ/alg_02/alg_256