有没有怼一个班硬盘一起上,你会怎么设计呢?

有没有怼一个班硬盘一起上,你会怎么设计呢?

最新res7532022-09-22 5:08:2590A+A-

我们使用的计算机全称是电子计算机,前面加上“电子”二字,意思是整个计算机中的核心部件基本上都是由电子单元组成的。但机械硬盘是个特殊的例外,它更多的是用机械技术制造的产品。带有机械技术基因的磁盘在放入计算机,特别是应用于服务器领域时,暴露出机械技术的两个严重问题:

为了保证服务器的稳定高速运行,必须解决硬盘出身的这两个缺陷。

多个硬盘驱动器连接

问题简单明了,我们要解决速度慢和容易损坏两个问题。当然,一个士兵打架是不够的,所以我们想到了上一个班,把多个硬盘放在一起。但问题是,如果给你N块硬盘,让你想出一个技术方案,你会怎么设计?

第一种解决方案是将一个文件分成 N 块,每块在不同的硬盘上进行哈希处理。这样,在读取文件的时候,N块硬盘就可以一起工作,从而达到读取速度提升到N倍的效果,也就是RAID 0。

固态硬盘拷贝速度越来越慢_移动wifi上传速度特别慢_拷贝到移动硬盘速度慢

图 1 Raid 0 方案

但是,这种方案并没有解决容易失效的问题。硬盘的任何故障都会导致存储系统的故障。

第二种解决方案是仍然对文件进行分片,但所有分片都存储在一个硬盘上,其他硬盘只存储副本。这样既提高了硬盘的访问速度,又解决了坏的问题。如果任何硬盘坏了,存储系统可以正常使用,但速度会有所降低。

移动wifi上传速度特别慢_固态硬盘拷贝速度越来越慢_拷贝到移动硬盘速度慢

图2 Raid 1 方案

但是,这种方案带来了一个新的问题,就是实施成本有点高。如果我们想用256G的硬盘实现512G的存储容量,至少需要4块硬盘才能实现。

有没有妥协的解决方案?是的,而且很多。我们这里只提一下,最常见的raid5 RAID 5也需要对文件进行分片,但不会备份存储的数据,而是会存储一个单独的校验数据分片。如果文件被划分为 A1 A2 A3,则需要将奇偶校验切片保存到另一个磁盘。这样无论是A1、A2还是A3丢失,都可以根据另外两块和验证块来合成。它不仅保证了数据的安全,而且只使用一个磁盘进行冗余存储。

移动wifi上传速度特别慢_拷贝到移动硬盘速度慢_固态硬盘拷贝速度越来越慢

图3 Raid5方案

如果我们有8块256GB的硬盘拷贝到移动硬盘速度慢,那么RAID5方案下的磁盘阵列从用户的角度来看有7*256GB的可用存储空间,只是“浪费”了一个磁盘空间,所以RAID5目前被广泛使用~~

RAID卡缓存

硬盘的延迟是毫秒级的。高速硬盘即使并行化,也只能提升数倍,无法提升一个数量级。与CPU内存的纳秒级运行频率相比,还是太慢了。在计算机世界中,没有缓存解决不了的速度问题,如果有,就再加一层。现代磁盘基本上也有缓存。此外,在一些较新的RAID卡中,硬件开发者们都想出了一层“内存”,他们还自带了一块电池,这就是RAID卡缓存。我们来看看几款主流RAID卡的配置:

以服务器出镜率比较高的H730和H730P为例,它们分别有1G和2G的缓存卡,自带电池。电池的作用是在发现主机意外断电时,快速将缓存中的数据写回磁盘。写入方面,一般操作系统都是对这个RAID卡进行写入,所以速度很快。读也是一样,只要缓存里有,就不会透传到磁盘的机械轴上。

还有一点我想补充的是,在文件相关函数中设置DIRECT I/O只能绕过操作系统本身的Page Cache,而RAID卡中的缓存对于Linux来说可以看成是一个黑匣子。换句话说,操作系统不知道RAID卡是从缓存中吐出数据还是实际从硬盘中读取数据。

亲身审查您的 RAID 配置

了解了raid的基本原理后,我们就可以实际查看机器上的raid情况了。这是我手头的服务器示例。通过cat /proc/scsi/scsi,我们可以查看raid卡的型号

Host: scsi10 Channel: 02 Id: 01 Lun: 00
  Vendor: DELL     Model: PERC H730 Mini   Rev: 4.27
  Type:   Direct-Access                    ANSI  SCSI revision: 05

可以看到我的服务器raid卡用的是PERC H730,这个RAID卡有1G缓存和电池。

看看我们的硬盘阵列

# /opt/MegaRAID/MegaCli/MegaCli64  -LDInfo -Lall -aALL
Virtual Drive: 1 (Target Id: 1)
Name                :
RAID Level          : Primary-5, Secondary-0, RAID Level Qualifier-3
Size                : 1.633 TB
Sector Size         : 512
Is VD emulated      : No
Parity Size         : 278.875 GB
State               : Optimal
Strip Size          : 128 KB
Number Of Drives    : 7
Span Depth          : 1

RAID Level 列表示当前 RAID 组的 RAIN 级别。在下面进行比较

如您所见拷贝到移动硬盘速度慢,本地 RAID 级别为 RAID5。

另外,Strip Size称为条带大小,我机器上的配置是128KB。如果有一个 512KB 的文件,它将被分成 4 个条带,每个条带 128KB。这些条纹可能分散在不同的磁盘上。如果一次读取,多个硬盘可以一起旋转机械轴,读取速度将提高数倍。但是需要注意的是,如果文件小于这个条带大小并且小于128K,那么RAID下的多个硬盘对文件的读取时间没有帮助。

继续查看组成 RAID 的所有磁盘的状态

#/opt/MegaRAID/MegaCli/MegaCli64 -PDList -aALL
......
Drive's position: DiskGroup: 1, Span: 0, Arm: 0
Device Id: 1
...
Raw Size: 279.396 GB [0x22ecb25c Sectors]
Non Coerced Size: 278.896 GB [0x22dcb25c Sectors]
Coerced Size: 278.875 GB [0x22dc0000 Sectors]
Sector Size:  512
Logical Sector Size:  512
Physical Sector Size:  512
Inquiry Data: SEAGATE ST300MM0008     TT31S42310JR
...
...
...
Drive's position: DiskGroup: 1, Span: 0, Arm: 6
Device Id: 7
Raw Size: 279.396 GB [0x22ecb25c Sectors]
Non Coerced Size: 278.896 GB [0x22dcb25c Sectors]
Coerced Size: 278.875 GB [0x22dc0000 Sectors]

可以看出共有7块硬盘属于DiskGroup 1,每块大小约为278GB。6个磁盘的总容量约为1.6T。确实只“浪费”了一块硬盘的容量来保证数据安全!

此外,查询数据还显示了硬盘的制造商和型号。这些磁盘是希捷的300G机械硬盘,经过谷歌查询,其转速为每分钟10000转。

本文的部分

与机械技术和电子技术相比,稳定性差很多。因此,来自机械背景的硬盘驱动器运行缓慢且容易损坏。为了解决这个问题,RAID技术应运而生。安全性由一定数量的冗余原始存储或验证数据提供。通过添加带有电子基因的缓存,合理调度磁盘的机械轴,提高磁盘IO的读写速度。在 Linux 下,您可以使用 MegaCli 工具来检查您的 RAID 组情况。强烈建议您实际检查一下!

关注知乎专栏“内功修炼发展”或搜索微信公众号kfngxl获取更多知识!

点击这里复制本文地址

威鹰网 © All Rights Reserved.  Copyright Your WebSite.Some Rights Reserved.