阵列拆分的来龙去脉
IT 领域,尤其是 SMB 领域,许多被死记硬背下来的知识,是在 1990 年代末基于多种因素形成的。最大的几个因素是:越来越小的企业突然纷纷开始电脑化,微软已经把 Windows NT 4 做得极为稳定,从而为所有 SMB IT 提供了一个可以围绕其展开的标准基础,互联网时代终于站稳了脚跟,而微软也推出了重塑行业知识传播方式的认证与培训计划。这些因素叠加在一起,既催生了对新培训和最佳实践的需求,也引发了新思想、写作、文档、培训、最佳实践、经验法则等的大规模爆发。
在那几年里,几乎整个领域都接受了同一套不大的知识体系的培训,许多经验法则成了事实上的标准,而当时的大量知识是靠死记硬背学来,并在导师传授给学徒的循环中代代相传,这个循环把 1998 年的许多技术知识带进了 2012 年那些不容置疑、一成不变的流程之中。在当时这是有效的,因为这些做法是切合实际的,但那已是十五年前的事了,自那以来,技术、经济、用例和知识都发生了显著的变化。
对此最好的例子之一,就是微软那条著名的 SQL Server 建议:操作系统用 RAID 1、数据库文件用 RAID 5、日志再用另一个 RAID 1。这套配置几乎贯穿了该产品的整个生命周期,并且被宣传得如此深入人心,以至于它已经渗透到 SMB 领域服务器设计的几乎所有方面。操作系统用 RAID 1、数据用 RAID 5 的做法如此普遍,以至于人们往往不假思索地照搬,完全不去考虑当初为何会有这样的建议。
让我们来探究这段历史,看看为什么 R1/5/1 在 1998 年是好的,以及为什么它在今天不应再存在。请记住保持一种眼界:这些建议最初问世(早至 1995 年)与今天之间的鸿沟是巨大的。在心里回到 1995 年,想一想当时那个等量的鸿沟意味着什么。那就好比在互联网时代初期,却基于第一批 Apple ][ 拥有者的家用计算需求来给出建议!8 位家用计算机时代在 1978 年才刚刚起步。Commodore 距离推出他们的第一台家用计算机(VIC-20)还有两年,而它将经历整个 Commodore 和 Commodore Amiga 时代,并在 1995 年之前就破产消失。Apple ][+ 距离问世还有一年。人们才刚刚要开始用模拟磁带机作为存储设备。COBOL 和 Fortran 是当时仅有的几种严肃商用语言。基本上,这鸿沟大得令人难以置信。事物在变。
首先,我们需要看一看 1990 年代末存在的、催生了我们这套历史性配置的那些因素。
- 驱动器很小,非常小。一个大型数据库阵列可能也就是四块 2.1GB 的 SCSI 驱动器组成一个 R5 阵列,单个阵列上可用的存储空间仅约 6GB。奇偶校验 RAID 故障的失效域很小(相对于诸如 URE 失效率之类的因素而言)。
- 驱动器连接技术是并行且缓慢的。当时的硬盘只比今天的驱动器略慢一点,但连接技术却构成了相当大的瓶颈。当时常见的做法是拆分流量,以减少总线瓶颈。
- SCSI 驱动器技术是服务器唯一采用的技术。在服务器中使用 PATA(当时称为 IDE)是不可想象的。
- 驱动器按每 GB 计算价格昂贵,因此在保持容量的前提下,节省成本对几乎所有企业而言都是关键问题。
- 文件系统脆弱,出故障的频率比驱动器还高。
- 硬件 RAID 是必需的,而且通常只能用到 1 和 5 这些基本 RAID 级别。RAID 6 和 RAID 10 距离大多数企业能够用上还有数年之遥。RAID 0 不予考虑,因为它没有冗余。
- 存储系统很少(如果有的话)在服务器之间共享,因此访问几乎总是专属于单一的请求队列。
- 存储缓存很小,或者根本不存在,这使得驱动器的访问限制直接传导到操作系统。这意味着需要用具有不同特性的不同阵列,来应对不同的读/写或随机/顺序访问的组合。
- 驱动器故障很常见,是存储系统设计的首要关切。
- 驱动器阵列的规模常常受物理条件限制,因此阵列拆分的决策往往是出于必要,而非出于选择。
- 上述因素的综合作用意味着:对于系统中某些可以接受小容量、且访问高度顺序或写入密集的部分,RAID 1 是最佳选择;而对于另一些容量重于可靠性、且访问高度随机、读取密集的部分,RAID 5 则是最佳选择。
在最初那些建议发布以来近二十年的时间里,所有这些因素都已发生了变化。在某些情况下,这些变化是层层连锁的:从通用的 RAID 5 转向通用的 RAID 10,进而使得原本最常见的两种阵列类型 RAID 1 和 RAID 10 共享了相同的访问特性,于是根据负载类型来选用其一或另一的需要或意愿就不复存在了。
- 驱动器如今容量巨大。我们不再为把所需数据塞进驱动器而苦苦挣扎,反而通常拥有富余的容量。容量超过一 TB 的单块驱动器很常见,即便在服务器中也是如此。奇偶校验的失效域非常巨大(相对于诸如 URE 失效率之类的因素而言)。
- 驱动器连接是串行且快速的。驱动器连接不再是瓶颈。
- SATA 如今在服务器上很常见,从而以一种此前并不存在的方式,改变了 URE 的潜在风险。
- 容量如今很便宜,但性能和可靠性如今才是花钱所要关注的关键。
- 文件系统如今高度健壮,在阵列可靠性的整体图景中,文件系统故障已是“背景噪声”。
- 硬件 RAID 和软件 RAID 如今都是可选项,可用的 RAID 级别也包含众多选择,但最重要的是,RAID 10 已经无处不在、随处可得。
- 存储系统如今普遍被共享,使得顺序访问变得更不常见。
- 存储缓存如今很普遍,而且往往非常大。512MB 和 1GB 的缓存如今被视为正常,这使得 1995 年的许多阵列在今天完全可以整个装进 RAID 控制器的内存里。随着缓存相对于存储容量的快速增长,以及最近两年固态硬盘作为存储中 L2 缓存的加入,即便是一家小企业,让数据库和其他性能敏感的应用完全从缓存中运行,也并非天方夜谭。
- 驱动器故障已不常见,对存储系统设计而言无关紧要(相对于其他类型的故障而言)。
- 驱动器阵列的规模如今很少受物理条件限制。
- 如今以 RAID 1 和 RAID 10 作为主要的阵列类型,意味着为了性能调优而使用不同的阵列级别已无任何益处。
这些因素凸显了为什么 1995 年那套拆分阵列的体系在当时完全合情合理,以及为什么它在今天不再合理。OBR10,也就是今天的标准,在当时既无法获得,价格也高得令人却步。RAID 5 在 1995 年相对安全,但在今天则不然。决策过程中涉及的几乎每一个因素,在过去十七年里都发生了翻天覆地的变化,而且随着 SSD 连同自动分层、更大的缓存以及纯 SSD 存储系统变得越来越普遍,这种变化还将继续下去。
过去二十年存储设计的变迁,也凸显了 IT 所面临的危险:正如工程领域常见的那样,该领域有很大一部分人在学习基本的“经验法则”或“最佳实践”时,并不一定理解驱动这些决策的底层原理,这使得人们难以知道何时不该套用这些最佳实践,或者更为重要的是,难以认清何时这条规则已不再适用。与传统的机械工程或土木工程不同——在那些领域,新的进展和重大的因素变化在整个职业生涯中或许只会发生一次,甚至从不发生——IT 的变化仍然快到足以要求人们在一个职业生涯中对基本经验法则进行多次彻底的“重新思考”。也许不必每年一次,但每十年或更短一次几乎总是必要的。
当前从单处理转向多线程架构的变迁,是另一项类似的重大变化,要求 IT 领域彻底改变处理系统设计的方式。
