引子
晴空万里,草长莺飞。人们纷纷走出户外,感受大自然馈赠的这一段不冷不热的时光。他站在窗边,遥望街头,人群熙熙攘攘。突然想到了什么,杯子里剩下的咖啡一饮而尽,拉窗帘,关门,打开电脑,启动浏览器,输入那个在脑海中再熟悉不过的网址,动作一气呵成。紧张、兴奋。或许只有这个,或许才能填补内心的空虚和生活的迷茫。太认真了,竟然没有注意到一只手悄悄按在他的肩头,一个低沉的声音随即过来:“你在看什么呢?”
送人玫瑰,手有余香。这个时代需要分享,有交流,有碰撞,才有进步。今天我要分享的主题的是“存储设备那点事”,这句话中需要高亮的关键词是什么?是“存储”?是“设备”?都不是,是“那点”。作为一个刚进入存储行业不到两年的小学生,能力有限水平一般,全靠房贷的压力走到今天。存储涉及方方面面,受到能力和篇幅的限制,实在难以言尽。本文主要目的是让大家对存储方面有些感性的认识,没有很深入的技术细节。读者中肯定会有行业前辈、技术大牛、开源社区达人、非洲部落的酋长,都保不齐的事,有不足之处还请多多批评指教。
说到存储设备,各位有些人可能会想起这些:磁带,软盘,硬盘,U盘,以及早期街边中年妇女兜售的光盘(都买过吧?随着互联网的发展,这个行业没落了,唉!)。今天我们要说的存储设备比这些略显高级,但终究也没有脱离它们。
我有一个1TB的移动硬盘,已经差不多装满了,最近有些担忧,万一哪次不小心摔在地上,可就报废了,多年积攒的资料和回忆将付之东流,得想个办法。那位说了,为啥不存在云盘?坦诚的讲,我不太信任云盘服务商,不仅仅是局限于技术层面的不信任,谁在乎他们是不是背锅的。又有人给建议,整个RAID吧。对,我们就从RAID说起。
什么是RAID?
RAID的洋文描述是Redundant Array of Independent Disks,国语通常翻译成:独立磁盘冗余阵列。打仗亲兄弟,上阵父子兵,一个硬盘可能出现种种问题,RAID就是将一组硬盘通过各种组合,呈现出一个逻辑上的硬盘,弥补一些单个硬盘的缺陷(如IO性能,数据保护),这个逻辑上的硬盘从用户角度看来和单个硬盘使用方式几乎一样,对用户透明。
总结起来一句话:基友一生一起走,单身的痛苦不再有。
RAID的等级
RAID的等级就是硬盘以何种形式组合在一起,比如:RAID 0、RAID 1、RAID10、RAID 01、RAID 3、RAID 5、RAID 6等等,很多,相声演员可以写个贯口上台表演了,这次就挑常见的说几个。
RAID0
最简单的RAID0由两块硬盘组成,如图1所示,当用户写入数据的时候,例如数据块A,实际上是将数块A分为两个部分,分别写入Disk1和Disk2,B、C、D是同样的操作。可以看到,RAID0并没有解决前面我遇到的问题,Disk1或Disk2任何一块盘坏了,保存的数据就会丢失,数据得不到保护。当然,优点也是显然的,数据并行的写入两块盘,花费时间缩短了,理论上节省50%的时间,IO性能好。我们也可以使用更多的盘组成RAID0,那样的话数据块就会被分为更多分,并行写入多块盘,用时会更少。组成RAID0的各个硬盘地位是平等的,有任务兄弟们一起分担,没有谁的角色是特别的。
RAID1
你有我有全都有哇,哎嗨依儿呀,这就是那RAID1,不相信就往下看那。
只要2块硬盘就可以组成一个RAID1,如图2所示。RAID1的特点是用户写入的数据块会被同时写到组成RAID1的每一个硬盘,这些硬盘保存的数据一模一样。所以,其中一块硬盘损坏了,不要害怕,另外一块硬盘仍旧保存完整的数据。有人要问了:”那要是两块硬盘都坏了呢?”,朋友,咱们好好聊天行吗?本质上RAID1是在做备份,我们不也经常将电脑的文件拷贝到U盘或移动硬盘备份嘛。只不过这个备份是实时的,用户每写一个数据就立即备份。增加更多硬盘组成RAID1,也就增加备份数量,更保险,但需要花更多的钱买硬盘,当然,阿聪这样的土豪另说。
RAID3
在说RAID3之前,先往回倒个三言两语。前面的RAID0和RAID1的插图中,每个硬盘都画了一些小格子,保存A、B或A1、A2等。划分这些小格子的行为称为磁盘的条带化(striping),又是一个新名词,没办法,新的事物诞生总归要取一个名字吧。早年间,管理论坛的人叫版主,维护博客的人叫博主。现在呢,建立微信群的人叫群主,建立并维护公众号的人呢?公主?宋老师答应吗?
感受一下磁盘条带化的效果,图3所示,两个盘没有条带化,用户数据过来先写Disk1,写满Disk1之后再写Disk2,看到这样的RAID你有什么感受?既没有使得IO性能得到提升,也没有数据保护功能,然后冠冕堂皇包装成RAID。谁要是推销这个RAID,作为有素质的人,咱不能爆粗口,叫个代骂服务先骂他100块钱的。
有人问了(对,就是前面问问题的那个人):“这个例子太极端,如果我有一个很大的文件,我可以计算出6~10部分最终会保存到Disk2内,那么我就可以并行的写入1~5到Disk1,6~10到Disk2”。如果Disk1是1TB的硬盘,你的文件有多大?大于1TB,现实世界又有多少场景存在这么大的文件呢?
我们继续。图4展示了条带化之后的磁盘格式,如果说未经过条带化是以盘为单位存储的,即一个盘写满再写下一个盘。那么条带化之后,则是按照条带为单位存储的,写满一个条带之后再写下一个条带。RAID的各个盘的同样区域(偏移位置和大小确定的区域)组成了一个条带。
接着看RAID3,图5所示。Disk4是与众不同的,作为校验盘,它不保存用户数据,而是保存用户数据的校验值。Ap是A1、A2和A3的异或逻辑运算校验值。同理Bp~Dp类似。这样做的好处是:如果4块盘有一块盘坏了,我们可以从其它3块盘读出数据,再次进行异或逻辑运算,计算出损坏盘的数据,这一过程称为数据重建。
举个栗子:
假设初始A1=1,A2=0,A3=1,在存盘时候计算Ap=A1^A2^A2=1^0^1=0。
现在Disk3损坏,我们要计算A3,A3=A1^A2^Ap=1^0^0=1。得到了正确的A3!
考察一下RAID3特点,其一,可以并行的写。其二,有校验盘,允许一块盘故障。其三,特别的,如果损坏的是校验盘,不会影响此时用户的读操作。缺点也是有的,那就是用户写数据的时候,不管是向哪一个数据盘写入数据,都需要同时重写校验盘,对于写操作频繁的应用,校验盘的负载很大,成为瓶颈。
那么,对于校验数据的保存这个费时费力的工作能否均衡一下呢?不能老可一个人霍霍啊。
RAID5
RAID5没有独立的校验盘。从下图中找找Ap、Bp、Cp和Dp的位置,发现什么了吗?对,每个盘同时扮演数据盘和校验盘,校验值写入这个负载就分摊到每个盘上,前面RAID3遇到的校验盘瓶颈就不存在了。
当一块盘出现故障后,RAID将无法继续提供服务,一般情况,运维人员会更换故障盘,新盘到位后,RAID进行数据重建,借助校验算法,将丢失的数据恢复到新的盘中,然后RAID可以继续提供服务。一些系统中支持热备盘,当RAID中一块硬盘(Disk2)故障后,系统从热备盘中选择一块(Disk5),顶替故障盘角色,然后RAID立即进行数据重建,这样就最大限度的减少了RAID停止服务的时间。没错,热备盘就是备胎。
RAID5可以并行IO提升性能,数据校验起到数据保护作用,也不存在校验盘瓶颈,看起来不错。
有人问了(对,还是前面问问题的那个人):“如果同时有2块盘故障怎么把办?”
“那就用RAID6,可以容忍有2块盘故障。”
“如果同时有3块盘故障怎么把办?”
喂,代骂公司吗?我再加100块钱,马上过来骂个人。
对的,要蛋定。RAID虽然比单个硬盘有很多优势,但也不是牛逼透顶的,也有解决不了的问题,也有Hold不住的极端情况。
RAID6以及其它RAID形式就不再展开了。您可以访问这里继续深造:
https://en.wikipedia.org/wiki/Standard_RAID_levels
顺便提一下,RAID发展后期出现了RAID2.0,一个不以单个盘为RAID组成基本单位的技术。
花开两朵,各表一枝。说了这么多关于RAID的内容,对于终端用户呢?如何使用RAID呢?这是个问题。用户当然可以买几块硬盘组成一个RAID,当成“大硬盘”来使用,对于台式机还可以忍受,机箱大随便装。那么,笔记本电脑用户呢?没地方装啊。USB外接式?你很优雅的走进了星巴克,要了一杯咖啡,拿出高大上的苹果电脑,傍边的桌子上一堆硬盘,你告诉别人别碰,说是你的RAID?这是休闲呢还是摆摊呢。
这个世界上,只要有需求,哪怕变态的需求,都会有商家满足你。想强身健体,有的商家就把中药和酒混在一起,来吧,药酒,可补可补了。