创立于 2008 年 · 数字版 · 2026年6月15日

SMB IT Journal

面向小型企业的信息技术资源

中文
存储

对比 SAN 与 NAS

近年来我所见到的最大困惑之一,便是 NAS 与 SAN 之间的混淆。理解二者各自是什么,将大大有助于理解它们在何处有用、何处适用。

我们的首要任务是剥离营销术语,转向技术性的表述。NAS 代表网络附加存储(Network Attached Storage),但它的含义并不完全如此;而 SAN 代表存储区域网络(Storage Area Network),但通常用来指代 SAN 设备本身,而非网络本身。在其最严格的形式下,SAN 是指任何专用于存储流量的网络,但在现实世界中,它通常并非如此使用。在本文中,我们要谈的是 NAS 和 SAN 设备以及它们之间的对比,因此我们不会采用那种把网络而非设备包含在内的定义。实际上,NAS 和 SAN 都是营销术语,也正因如此,它们的边界都有些模糊。它们足够精确,可用于正常的技术对话,只要各方都清楚它们的含义即可;但在讨论它们的含义时,我们应当剥离那些听起来很酷的名称,坚持使用最具技术性的描述。这两个术语在营销语境中使用时,都是用来暗示它们是某种已被“设备化(appliancized)”的技术,这使得这些术语的使用平添了不必要的复杂,却并没有更有用。

因此,我们的首要任务是界定这两个名称在设备语境下的含义。两种设备都是存储服务器,简单明了,只不过是把存储对外暴露的两种不同方式而已。

二者中较为简单的是 SAN,它本质上是一种块存储设备。任何将其存储以块设备形式对外暴露的设备都归入此类,并且可以根据用途互换使用。块存储设备包括外置硬盘、DAS(直连存储,Direct Attach Storage)和 SAN。所有这些其实是同一种东西。当我们把它接到台式机上时,称之为外置硬盘。当我们把它接到服务器上时,称之为 DAS。当我们在设备与最终消费该存储的设备之间加入某种网络(通常是交换机)时,就称之为 SAN。这些设备之间并无技术上的差异。传统的 SAN 可以直接连接到台式机上,像外置硬盘一样使用。外置硬盘也可以接到交换机上,供网络中的多台设备使用。存储设备与使用它的系统之间的接口就是块。块存储常见的协议包括 iSCSI、Fibre Channel、SAS、eSATA、USB、Thunderbolt、IEEE1394(即 Firewire)、以太网光纤通道(FCoE)和以太网 ATA(AoE)。连接到块存储设备的设备,始终只会看到以磁盘驱动器形式呈现的存储,仅此而已。

NAS,也被称为“filer”,是一种文件存储设备。这意味着它将其存储以网络文件系统的形式对外暴露。因此,任何连接到此存储的设备看到的不是磁盘驱动器,而是一个可挂载的文件系统。当 NAS 没有被打包成一个设备(appliance)时,我们干脆称它为文件服务器,而几乎所有计算设备,从台式机到服务器,都内置了某种程度的此项功能。文件存储设备常见的协议包括 NFS、SMB / CIFS 和 AFP。不过还有许多其他协议,从技术上讲,也存在一些特殊情况下的文件存储协议,例如 FTP 和 HTTP,它们同样应当算在内。举一个极端的例子,传统的 Web 服务器就是一种非常专门化的文件存储设备。

区分块存储设备和文件存储设备的,是它们向外界呈现的接口类型,或者换一种思路来看,是服务器设备与客户端设备之间的分界点在存储栈中处于何处。

如今,存储设备从同一台设备同时提供块存储和文件存储已变得极为常见。这样做的系统被称为统一存储(unified storage)。在统一存储中,你能说它表现为块存储还是文件存储设备(即通俗说法中的 SAN 或 NAS)抑或两者兼具,取决于你为该设备配置的行为,而非取决于你所购买的产品。这一点很重要,因为它有力地说明了:这纯粹是协议或接口层面的区别,而非容量、能力、可靠性、性能、功能等方面的区别。

两类设备都有选择(但并非强制要求)在它们将存储移交给外界的“分界点”之下提供扩展功能。两者都可以、也可以不提供 RAID、逻辑卷管理、监控等。文件存储(NAS)还可以提供文件系统层面的功能,例如 Windows NTFS ACL。

块存储的关键优势在于,连接到它的系统有机会像操作传统磁盘驱动器那样去操纵该存储系统。这意味着 RAID 和逻辑卷管理(它们可能在存储设备这个“黑盒子”中已经做过一遍)如有需要,现在可以在更高的层面上再做一遍。客户端设备并不知道它所看到的是哪种设备,只知道它表现为一个磁盘驱动器。因此,你可以选择信任它(例如,假定它具备足够等级的 RAID),也可以将多个块存储设备组合在一起做成 RAID,就好像它们是普通的本地磁盘一样。这种做法极为罕见,但却是一个有趣的选项,并且确实有一些产品就是为这种用法而设计的。

更常见的做法是,在设备暴露出来的块存储之上施加逻辑卷管理,例如 Linux LVM、Solaris ZFS 或 Windows 动态磁盘,然后再在其之上部署文件系统。这一点需要牢记:对于块存储设备而言,文件系统是由客户端设备创建和管理的,而非由存储设备创建和管理。存储设备对它所呈现的块存储如何被使用一无所知,全然不顾,并允许最终用户以他们认为合适的任何方式、完全自主地加以使用。这甚至可以延伸到这样的程度:你可以将块存储设备串联起来,让一个设备为下一个设备提供存储,再将其组合成(也许是)RAID 组–块存储设备可以或多或少地无限层叠。

与之相对,文件存储设备包含了存储中所有属于块的部分,因此任何进行 RAID、逻辑卷管理和监控的机会都必须由文件存储设备来处理。然后,在块存储之上施加文件系统。常见的会是 Linux 的 EXT4、FreeBSD 和 Solaris 的 ZFS、Windows NTFS,但 WAFL、XFS、JFS、BtrFS、UFS 等其他文件系统当然也是可能的。数据将存储在这个文件系统上。要把这些数据与外界共享,则使用网络文件系统(也称为分布式文件系统),它提供一个具备网络能力的文件系统接口–NFS、SMB 和 AFP 是最常见的,但与任何协议家族一样,也存在众多特殊情况和小众的可能性。

一台想要使用文件存储设备上存储的远程设备,通过网络看到它的方式,与看到本地文件系统的方式相同,并且能够以完全一致的方式将其挂载。这使得文件存储对最终消费者来说尤其易用且直观,因为它在各个方面都非常自然。我们每天都在日常桌面计算中使用网络文件系统。例如,当我们在 Windows 中“映射一个驱动器”时,我们用的就是网络文件系统。

块存储与文件存储之间必须加以区分的一个关键差异是:虽然两者都有可能置于网络上并允许多台客户端机器连接到它们,但只有文件存储设备才具备仲裁这种访问的能力。这一点非常重要,绝不能轻描淡写地一带而过。

块存储表现为一个磁盘驱动器。如果你只是把一个磁盘驱动器同时接到两台或更多台计算机上,你可以想象会发生什么–每一台都对其他的一无所知,都不会察觉到有新文件被创建、其他文件被改动,而这些系统会迅速开始相互覆盖。如果你的文件系统在所有节点上都是只读的,这就不成问题。但只要有任何一个系统在写入或更改数据,其他系统就会出问题。这通常会很快导致数据损坏,一般在几分钟的量级。要看到这种情形的极端表现,不妨设想让两三个客户端系统都以为自己对某个磁盘驱动器拥有独占访问权,并让它们同时对其进行碎片整理。驱动器上的所有数据会在几秒钟内被搅得一团糟。

另一方面,文件存储设备具备天然的仲裁机制,因为网络文件系统会处理对真实文件系统进行访问的通信,而文件系统就其本质而言天生就是多用户的。因此,如果连接到文件存储设备的某个系统做了一处更改,所有系统都会立即知晓这一更改,并且不会“互相踩脚”。即便它们试图这样做,文件存储设备的文件系统也会仲裁访问、拥有最终决定权,并且不会让这种情况发生。这使得共享数据对最终用户而言变得轻松且透明。(我在此使用“最终用户”一词,是把系统管理员也包含在内的。)

这并不意味着没有办法从块设备共享存储,只是其仲裁无法由块存储设备本身来处理。块存储设备可以通过所谓的集群文件系统(clustered file system)而变得“可共享”。这类文件系统起源于早年间,那时服务器集群共享存储资源的方式是:两台服务器分别连接在同一根 SCSI 电缆两端的 SCSI 控制器上,而共享的驱动器则接在电缆中间。这些服务器之间唯一能够通信的途径就是文件系统本身,于是人们开发出特殊的集群文件系统,使得设备之间能够通过文件系统本身进行通信,将一方所做的更改告知另一方。这实际上运行得出奇地好,但集群文件系统相对并不常见,在传统服务器领域中,Red Hat 的 GFS 和 Oracle 的 OCFS 是其中最为人所熟知的几种,而出现晚得多的 VMWare VMFS 则因其用于虚拟化存储而变得极为知名。普通用户,包括系统管理员,可能无法使用集群文件系统,或者有不允许使用它们的需求。同样需要重点指出的是,与文件存储设备不同,这里的仲裁是通过信任、而非通过强制来处理的。对于文件存储设备而言,设备本身处理访问仲裁,无从绕过。而对于使用集群文件系统的块存储设备,任何连接到该存储的设备都可以无视集群文件系统,干脆绕过这种被动的仲裁–这极其简单,以至于通常会在无意中就发生。它可能在挂载文件系统并指定了错误的文件系统类型时发生,也可能由于某个驱动器行为异常或任何恶意操作而发生。因此,在网络层面的访问安全对于保护块级存储至关重要。

这里所揭示的底层概念是:块存储设备是“笨”设备(可以想象成被美化了的磁盘驱动器),而文件存储设备是“聪明”设备(可以想象成传统的服务器)。文件存储设备必须包含一台完整可用的“计算机”,具备 CPU、内存、存储、文件系统和网络。块存储设备可以包含这些东西,但并非必须。在其最简单的形态下,块存储设备可以仅仅是一块带有 USB 或以太网适配器的磁盘驱动器。实际上,块存储设备只是一个 RAID 控制器外加以太网或 Fiber Channel 适配器,这种情况也并不罕见。

无论是块存储设备还是文件存储设备,我们都可以向下缩减为极其简单的设备,也可以向上扩展为庞大的“主机级(mainframe class)”超高可用系统。两者都可以是快的,也可以是慢的。没有谁更好或更差,没有谁更高端或更低端,没有谁更具或更不具企业级属性–它们是不同的,并且大体上服务于不同的用途。而且二者都可能具备、也可能不具备一些高级功能。挑战在于要知道哪一种适合哪一项工作。

我喜欢把块存储协议想象成一个“标准输出(standard out)”流,很像在命令行上那样。因此,任何存储“管线(pipeline)”的最底层始终是一个块设备,并且可以存在众多块设备或变换,每一个都像管道一样依次连接,只要其输出仍然是块存储协议即可。我们只有在施加文件系统时才终结这条链路。通过这种方式,硬件 RAID、网络 RAID、逻辑卷管理等都可以按需以多种组合方式加以施加。块存储真正而言不仅仅是一块块数据,更是构建存储系统的“积木块”。

一个非常有趣的点是:由于块存储设备可以被串联,又由于网络存储设备必须接受块存储作为它们的“输入”,所以用一个块存储设备(SAN)作为文件存储设备(NAS)的后端存储,实际上相当常见,尤其是在高端系统中。它们可以共存于单一机箱之内,也可以在网络上协同工作。

标签nas san

广告

SMB IT Journal — the IT resource for small business