原文地址,机器+人工翻译。

作者:史蒂夫洛克伦

在各种Hadoop的邮件列表中反复出现的问题是:“为什么Hadoop倾向于使用一组分离的磁盘,而不是将这些磁盘组成RAID-0阵列再使用?”

这是关于时间和雪花。

JBOD和RAID-0的诱惑

在Hadoop集群,我们建议以一种已知的,蔑称为“JBOD”(Just a Box of Disks)的配置来分别对待每个磁盘。这种情况下操作系统看到的就是一块块裸盘。

相比之下,RAID-0无冗余,并有如下优点:

  • 小文件访问拥有高IO
  • 大量数据访问可以获得更高的带宽 - 特别是写操作(raid 0是2块盘同时写,每块盘写一半数据,所以带宽近似翻倍)
  • 避免单盘数据访问量过大造成的热点过载

RAID-0的数据分布在各个磁盘。当数据写入时,它被划分成小的块(64KB或以上)。所有块数据并行写入磁盘,数据块无备份。当读回数据,所有的块可以再次同时从所有磁盘读取。这样做的结果是,你的磁盘带宽与阵列的尺寸会增加。如果你将八个磁盘安装成RAID-0,那么理论最大写和读带宽比单个磁盘快八倍。

随着磁盘控制器内置到现代服务器,RAID-0变成了一个可选项:为什么不打开呢?

可靠性

但可靠性是一个问题。

磁盘越来越慢,原因是他们的越来越老旧,开始出现读取错误,一单出现错误就需要重试读取盘片的数据。磁盘变慢了也许是你应该考虑更换该磁盘的警告标志。

如果Hadoop配置的是JBOD,您可以卸载(umount)磁盘; 该服务器上的Datanode的会注意到该磁盘丢了,并通知Namenode该盘的数据需要重新复制。但如果你配置的是RAID-0磁盘,在该磁盘中的所有数据都丢失了 - 你需要添加一块磁盘以恢复原来的磁盘阵列,然后重新格式化所有磁盘,Datanode启动的时候也没有存储任何数据。当然随着时间的推移它会通过再平衡(reblance)或者跑作业来重新获得数据。

任一块磁盘故障了,都需要做上面的事情。磁盘越多,故障越频繁。

不过别怕 - 磁盘故障很少发生。根据谷歌2007年的论文Failure Trends in a Large Disk Drive Population,报告说,在他们的数据中心,第一年磁盘的坏盘率是1.7%,但第三年磁盘的坏盘率达到了8.6%。大约9%不是一个好数字。回到刚刚假想的八磁盘服务器,每个磁盘运行一年的概率将是:

1 - 0.086 = 0.914

所有的磁盘都能运行一年的的概率就变成了:

0.914 ^ 8 = 0.487

如果这些谷歌的数据跟你的服务器磁质量差不多 - 而不是因为一个非常糟糕的批次 - 到了第三年,大约一半的数据节点将失去他们的所有数据,并需要重建。如果您用的是最新的十二盘服务器,事情会变得更糟。

Hadoop通过跨服务器复制数据来提供可靠性:如果一个HDFS数据块的一个副本(64MB或者更大)丢失或损坏,通常还在其他地方还有两份拷贝可供恢复。

只有现在,由于一个服务器中的所有数据都丢失了,需要恢复的数据量随着服务器的磁盘数量会线性增加 - 并且服务器故障的概率也会增加。之前,一块可能发生故障的三年级磁盘的故障率是0.914%,待恢复的数据量跟磁盘大小差不多,基本1-3TB。但现在8个磁盘集群将不得不传输8-24 TB的数据,并故障率高了八倍。这就需要注意了。

如果你确实想使用RAID-0存储,将八块硬盘配置为4对RAID-0存储风险要小的多。IO性能会比单盘高一倍,但故障率不高,并且恢复数据的费用也很降低。

磁盘故障是你不想使用RAID-0存储的第一个原因 - 现在我们再来说说第二个原因。

每个磁盘是一个独特的雪花

Hadoop的工作性能取决于磁盘带宽,尤其是读取带宽。

RAID-0存储的磁盘访问速度是由最慢的那块磁盘决定的。RAID-0认为所有磁盘的速度是一样的。

2011年论文, Disks Are Like Snowflakes: No Two Are Alike,测试了现代磁盘驱动器的性能,并发现磁盘的IO率上下浮动有20%,即使他们都写入到硬盘的同一个位置。这是因为,最新的制造过程中生产的磁盘具有不同的表面特性 - 磁盘存储数据的密度也就不一样了。制造商没有限制磁盘最高只能支持测试出来的最低性能,也没有放弃最慢的磁盘,而是使用了一种自适应分区技术(Adaptive Zoning)。新制造的磁盘被校准到它们能支持的性能,并且控制器配置驱动,让磁盘在每个区域运行该区域能支持的最高速率。

这很微妙 - 磁盘制造商没怎么宣传过这个。现代CPU是按照速度来“分级“的 - 但这些是公开的,并且你需要为更快的那部分付钱。但在这里,磁盘的速度不同,你只好希望你的部分是最快的。在论文的作者的实验里,某些磁盘的传输性能可以达到105MB/s的速度,实际范围为90-111 MB/s。

如果您有八个磁盘,从第一天开始有些磁盘就会比别的磁盘快。从你把慢硬盘换上去的第一天开始,RAID-0就会以这块最慢的磁盘的速度来传输。

这是第二个我们不建议您把服务器配置为一体的大型RAID-0阵列的原因。

总结

RAID-0存储似乎会提高磁盘I/O时间,但它会按阵列中最慢的磁盘的速率来传递数据 - 磁盘阵列的速度可以有高达20%的差距。当一个磁盘最终故障了,服务器上的所有数据都会丢失,迫使你重新格式化所有磁盘并等待HDFS重新填充新的数据服务器。

  1. 我们所有的工作节点都用JBOD存储 - 我们建议我们的客户也这样做。
  2. 如果有人坚持使用RAID-0存储,那么至少配置成磁盘对(pairs of disks) - 降低故障发生的风险,并降低故障的成本。

更新:单驱动器RAID-0

有人问我们RAID-0和单驱动器怎么样 - 所以我们想澄清这一点:如果你配置的每个驱动器作为一个单独的RAID-0卷,Hadoop也可以工作得很好。

有两种情况会造成这种配置:一是有的磁盘控制器希望所有盘都做RAID(不支持JBOD,比如LSI SAS2308),二是控制器支持JBOD和RAID,但你将两块盘配置成了RAID-1。为什么有人会将两块盘做成RAID-1(镜像模式)?如果你将OS装到这块RAID-1卷上,即使有磁盘故障,也OS不会挂。但在非常大的超过500个节点的集群中不会这么做,因为有足够的备用服务器。在小集群上,将OS装到RAID-1卷上,可以将服务器故障从一个严重问题(重新复制服务器的所有数据,需要在几个小时内拿到新磁盘)降级为一个普通任务(拿到一块用来更换的磁盘,找机会swap进去就好了)。

RAID-0的两个问题:磁盘故障导致的数据复制量放大问题,慢速硬盘导致的性能问题,都会随着磁盘数量增多而变的更加严重。使用单磁盘,如果磁盘控制器认为它是JBOD驱动器,你会得到跟物理磁盘相同数量的盘。