ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

基本存储、存储堆栈与NAS的维度错位与选型指南

基本存储、存储堆栈与NAS的维度错位与选型指南 1. 三个名词的维度错位它们为什么总被放在一起比较很多刚接触存储的人第一次看到这个标题都会愣一下这三个概念真的能放在一起对比吗说实话我第一次被客户问到“基本存储和网络附加存储到底哪个好”的时候也差点被绕进去。因为这个问题本身问得就有问题——不是不能比而是你得先弄清楚它们各自站在哪一层。先给结论基本存储说的是存储设备在操作系统里的呈现形态存储堆栈说的是数据从应用程序到物理磁盘之间经过的完整链路网络附加存储说的是存储资源的对外服务方式。三条线压根不在同一维度上。硬要放在一起比就像问“面包、烘焙流程和便利店哪个更好”——能答出来才怪。但为什么它们又总被凑到一起因为在实际做技术选型的时候这三样东西确实是同时摆在你面前的。你给一台服务器配存储要考虑用什么盘基本存储的范畴要评估文件系统和卷管理层的配置存储堆栈的范畴还要决定数据要不要通过网络共享给其他机器用网络附加存储的范畴。换句话讲这三个词背后对应的是三种不同的决策而不是同一种决策的三个选项。这就是很多人天天看概念、看对比到了真机房还是一头雾水的根源。1.1 三个概念的真实层位要讲清楚这件事我习惯把存储体系画成一个三明治从上到下分别是服务层、编排层、物理层。基本存储属于最底层的物理呈现。在Linux里你看到的/dev/sda、/dev/nvme0n1在Windows里看到的“磁盘0”“磁盘1”在云环境里挂载的云硬盘这些统统是基本存储的范畴。它们的共同点是操作系统把它们当成一块能读能写的块设备至于这块盘里存了什么文件、哪些块属于哪个文件操作系统自己也不清楚得靠上面的模块记录。我们常说的SATA盘、SAS盘、NVMe SSD也是基本存储的载体。存储堆栈属于中间的编排层。它指的是从应用程序发起读写请求到数据真正落到物理磁盘上这一路上经过的所有软件模块的组合。文件系统ext4、XFS、NTFS、卷管理LVM、RAID、I/O调度器、设备驱动全部属于这条链路上的组件。存储堆栈本质上是一个“管道”你写了一个字节进去要经过它层层处理才能变成磁盘上的一个扇区。网络附加存储属于顶层的服务层。NAS设备本质上是一台专门提供文件共享的服务器它内部可能也用了硬盘、也跑了文件系统但它对外暴露的不是一块裸盘而是一个带路径的文件目录接口比如NFS导出点或SMB共享目录。你用mount -t nfs把远端目录挂到本地看到的是文件和文件夹而不是/dev/sdX。NAS的定位是“我把存储服务打包好通过网络交给你用”基本存储的定位是“我给你一块盘剩下的你自己搞定”。这里有个容易被忽略的关键判断块存储解决的是“字节如何落盘”文件系统解决的是“数据如何编排”NAS解决的是“多人如何共享访问”。三者关注的问题根本不是同一个自然谈不上谁替代谁。1.2 SAN那个常被拖出来“陪跑”的第四者既然聊到网络化的存储就得顺带把SAN也带出来说一句因为很多混乱就是这么来的。SAN存储区域网络走的是FC协议或者iSCSI协议它把存储端的块设备通过网络呈现给服务器。你在服务器上看到的是一个LUN格式化成文件系统之后才能用——从操作系统的视角看它跟本地接的一块磁盘没有任何区别只是背后多了个网络传输的过程。现在再回头看那三个词基本存储偏重“本地形态”NAS偏重“文件共享”SAN偏重“网络化的块设备”。所以严格讲如果要对比“本地块存储 VS 网络块存储 VS 网络文件存储”那对应关系应该是DAS、SAN、NAS三类。而标题里写的“基本存储 VS 存储堆栈 VS 网络附加存储”其实是把一个底层概念、一个中间层概念、一个顶层服务概念硬凑成了一桌。知道原委之后下面我按从底到顶的顺序把每个部分单独拆开讲透。这样你以后再遇到类似问题就不会被任何一张对比表带偏了。2. 基本存储的本质操作系统里那块“看不见逻辑”的盘“基本存储”这个说法其实挺口语化的业内更常见的叫法是内部存储或DAS直接附加存储。更技术一点的说法叫块存储——因为这种设备以“块”为最小寻址单位每次我给你一个块号你把那一块的数据交给我。这个概念是整个存储体系的地基地面以上的房子怎么盖完全取决于地基是什么材料。2.1 说人话的“一块裸盘”块存储设备在操作系统里是什么样拿一台普通的Linux服务器举例插上一块SATA盘系统里就会出现一个/dev/sda。这时候你对着/dev/sda做dd可以按字节把数据写进去你也可以用fdisk对它分区然后格式化。但是请注意如果不做格式化这块盘对操作系统而言就是一堆“能读能写的扇区”没有任何文件和目录的概念。扇区是老式512字节新盘很多已经是4K字节。文件系统层把“一堆扇区”和“一堆文件”之间建立起了映射这就是存储堆栈要做的事情。那“基本”体现在哪体现在它没有任何“智能”。块设备不认文件名、不认文件类型、不做权限管理。它只认三件事读这个块地址、写这个块地址、给我这个块地址的数据。这也是为什么数据库这类软件特别青睐块存储——数据库本身已经有了一套完整的文件和缓存管理机制它不需要文件系统帮它做太多事反而希望底层的读写路径越短、越确定越好。数据库要的就是一块性能稳定、行为简单的盘。常见的基本存储协议差异比较大我整理了一个简单的对照表协议类型常见位置典型速率范围主要特点SATA家用盘、入门级服务器单盘读写600MB/s左右成本低深度队列性能一般SAS企业级机械盘/SSD单盘带宽更高支持双端口可靠性高支持多路径冗余NVMe数据中心SSD单盘可达3GB/s以上甚至更高延迟极低队列深度深核心应用首选这个表不是用来背的是帮你看明白一件事基本存储的选择关键不是“哪个协议好”而是“你的应用到底吃不吃得下这个性能”。家用NAS里塞几块SATA机械盘完全够用但生产数据库主机的数据盘基本不会有人用SATA接口理由后面再说。2.2 数据库为什么“死磕”块存储我见过很多创业团队刚开始图省事把数据库的数据文件直接放到NAS共享目录里结果上线第一天晚上就跑不动了日志里全是“sync timeout”“connection reset”。这不是NAS产品本身不行而是访问模型完全不匹配。数据库的读写有几个鲜明特征随机I/O多、单次请求数据量小、对延迟特别敏感。一块NVMe SSD的随机读延迟大概能做到几十微秒到一百微秒级别而同样一个随机读请求走一遍NAS网络加协议栈延迟大概率会跳到几百微秒甚至毫秒级别。数据库里有大量小事务每条事务都要做几次同步写同步意味着必须等数据真正落盘之后才能告诉客户端“我成功了”。在这种场景下每多一毫秒延迟吞吐量就要打折一大截。还有一点数据库往往有自己的缓存池、日志机制、崩溃恢复机制。这些东西在设计时默认底层是一块可靠的本地块设备某些优化甚至会让应用直接绕过操作系统的缓存使用O_DIRECT直通模式读写。NAS的文件共享协议天然带锁定和缓存语义这套机制跟数据库的“我就要直接往这块盘上写”的需求是拧巴的。所以在主流生产环境里数据库数据文件放在本地块存储或者SAN上是约定俗成的做法也确实是更稳妥的做法。2.3 衡量基本存储的三大指标选块存储的时候厂商宣传满天飞但核心就三个指标IOPS、延迟、吞吐。IOPS代表每秒能完成多少次输入输出操作衡量的是“小请求处理能力”。数据库日志盘的随机写IOPS比机械盘时代的几十几百到NVMe时代的几万几十万差距不是一个量级。延迟代表单次请求从发出到完成的时间衡量的是“快不快”对在线交易类应用来说比IOPS更关键。吞吐代表单位时间能搬多少数据主要影响视频处理、大数据分析这类顺序读写的场景。我见过不少人在选型时只看“容量”和“价格”觉得“能用就行”。结果磁盘满了才发现性能断崖式下跌或者数据库高峰期IOPS耗尽导致雪崩。我的建议很简单先明确你的核心负载到底是随机小I/O还是顺序大I/O再去看磁盘对应的指标。随机小I/O多优先看IOPS和延迟顺序大I/O多优先看吞吐和容量成本。另外SSD剩余空间低于30%以后性能会明显下降机械盘碎片化严重之后随机性能也会劣化这些都是选型时就要留出来的余量。3. 存储堆栈从字节到磁盘之间隔着多少层如果说基本存储是地基那么存储堆栈就是从地基到业务之间那一整套水管电路。很多人遇到存储性能问题第一反应是“盘子不行”其实很多时候锅根本不在硬盘上而在中间某一层软件。3.1 一次写请求在Linux上走了多远我拿Linux上最常见的路径来举个例子你在应用里调用write(fd, buf, 4096)写4KB数据走到物理SSD之间大概要过这几关第一关是虚拟文件系统层。Linux的VFS把各种不同文件系统统一成一套接口不管你底层是ext4还是XFS应用看到的write()行为是一致的。VFS会先判断数据能不能落在页缓存page cache里这一层处理不当就会出现“明明程序写了但落盘慢”的现象。第二关是具体的文件系统。ext4或XFS要决定这4KB数据应该映射到磁盘的哪些块还要维护元数据和日志。写日志文件journal是保证崩溃安全的机制日志在存储堆栈里又会产生额外一次写量。很多看起来“写放大”的冤枉开支往往就是日志和元数据更新带来的。第三关是块设备层。文件系统把逻辑块映射成物理块之后提交给块设备层生成一个bio请求进入I/O调度器排队。调度器的算法会影响请求合并和优先级比如老内核的CFQ适合机械盘SSD时代默认的mq-deadline和none各有侧重。第四关是设备驱动和控制器。NVMe驱动通过PCIe队列把请求交给SSD控制器SSD内部的FTL层再把逻辑块翻译到物理NAND地址这个过程还伴随垃圾回收和磨损均衡。所以你在操作系统里看到的“某块扇区写完了”在SSD内部可能已经经过了完全不同的物理位置。这一整套就是存储堆栈。理解这层链路的最大价值在于当你看到iostat里那个设备util很高不代表就是设备坏了你要一层层往上怀疑是不是应用写得太频繁是不是文件系统日志配置不合理是不是I/O调度排队太严重这些判断没有堆栈知识根本做不出来。3.2 堆栈里的可插拔组件RAID、LVM与文件系统存储堆栈不是固定的它更像一个乐高积木台你可以按需插入组件。RAID是经典的堆栈组件。它位于多块物理盘之上把若干块盘组合成一个逻辑卷。RAID1做镜像保数据RAID5/6用校验腾出容量RAID0纯粹堆性能但别谈安全。RAID之外还有卷管理LVM它在物理分区和文件系统之间再插一层让你可以动态扩缩容、做快照。很多人在刚接触LVM时觉得“多此一举”直到某天发现分区不够大又不想停机重新分区才意识到这个抽层设计有多值钱。文件系统的选择也是堆栈里的关键决策。ext4成熟稳定xfs在高并发大文件场景表现更好btrfs能原生做快照和校验但如果折腾坏了数据修复成本也不低。没有绝对最优的文件系统关键看你的场景数据库目录追求稳定低延迟常用ext4或xfs容器和虚拟机镜像存储要看是否配合统一的存储驱动海量小文件场景各有各的坑。堆栈组件插得越多功能越强但性能损耗和排错难度也在同步上升。我见过有人为了“安全”每层都加一个缓存结果同一份数据在内存、文件系统缓存、RAID卡缓存、SSD缓存里被复制了好几遍一旦出现故障反而说不清哪份是准的。存储堆栈的设计哲学应该是“够用就好别给不需要的层买单”。3.3 一次“磁盘慢”问题的完整排查链路这里分享一个很典型的案例步骤和结论都是日常运维里特别常见的东西。某台服务器上的应用半夜频繁报写入超时iostat -x 1一看两块数据盘的util超过95%。第一反应是SSD老化但把日志盘换掉之后问题依旧。后来往堆栈上层翻发现应用的日志文件也写在同一块盘上而且写得很凶每秒钟几百条日志。日志和数据共用同一个盘高峰期I/O排队严重把延迟整体拖上去了。排查过程大概是这样的free -h看到可用内存充足排除整体内存不足导致频繁刷脏页的可能。iostat -x 1确认不是某一瞬间的峰值而是持续性100%利用率。iotop看到两个进程在抢I/O排名靠前的日志进程占用最多。strace -p跟日志进程看到大量write()系统调用阻塞。查SSD型号和剩余寿命剩余寿命正常排除硬件老化。调整方案日志从数据盘迁走放到单独的低成本存储上数据盘挂载参数加上noatime减少额外的元数据写入如果日志用彻底一点可以轮转压缩后再落盘。这件事说明一个很关键的道理存储慢不一定是存储本身慢util爆表只是表象堆栈里任何一层不合理都会导致这个结果。所以我后来养成了一个习惯遇到I/O问题先不用急着换硬件iostat、iotop、strace三件套先走一遍定位问题在用户态、内核态还是设备层再对症下药。如果要做基准验证fio基本是标配。写一个随机读配置直接避开文件系统缓存往下打块设备就能看出盘的真实裸能力再配合文件系统层面的测试能对比出堆栈各层引入的损耗。两者一对比问题出在哪一层就基本清楚了。3.4 值得改的几个“顺手”参数存储堆栈调优不需要每次都重装系统有几个参数属于“发现不对就顺手改一下”的类型。一个是挂载参数。noatime能减少每次读文件时更新时间戳造成的写I/O对绝大多数应用是正向收益。barrier或nobarrier和日志保序有关机械盘时代常纠结这个现代文件系统默认的保序逻辑其实更科学不建议乱关。一个是I/O调度器。NVMe SSD上建议用none直通因为调度器在NVMe上更多是浪费时间SATA SSD和机械盘则要看队列深度和并发情况通常用mq-deadline或bfq会更合理。改调度器在现代内核里可以动态改不需要重启试完不合适再改回来就行。还有一个是readahead预读参数。机械盘顺序读场景增大预读窗口能明显提升吞吐但在随机读密集的数据库场景过大的预读反而会造成多余读取。理解了堆栈参数的因果逻辑你会发现很多“玄学”其实是可以推出来的。4. 网络附加存储把文件服务搬到网络另一端聊完地基和管道终于到最有“烟火气”的上层了。NAS在中小团队、办公环境、家用的出场率极高因为它特别符合普通人的存储心智把一台机器做成一个“网上邻居”大家都能存取文件像用本地文件夹一样方便。4.1 NAS到底做了什么网络附加存储的核心不是“存储”而是“共享”。一台NAS设备内部通常由三件事构成一个可用的存储后端可能是几块硬盘做的RAID组、一个精简的操作系统环境、以及对外提供文件服务的协议软件。它对外暴露的界面是NFS导出目录或者SMB共享文件夹而不是一块一块的裸盘。共享带来的最大价值是“多人协作的数据一致性”。团队五个人同时编辑同一个项目文档文件锁和协议级的缓存一致性由NAS统一维护大家在同一个文件目录体系里干活避免了各自下载、各自保存、最后不知道谁覆盖了谁的悲剧。这在影视后期、设计协作、代码仓库、办公室文档共享等场景里是刚需。哪怕放在家庭环境一台NAS把全家人的照片、视频集中存储再挂个备份任务也比每个人都插移动硬盘找人拷来拷去强得多。从运维角度讲NAS也把存储的管理职责从客户端剥离了。客户端机器重装、淘汰、更换数据不落在本地上层应用只需要重新挂载目录就能恢复访问。对规模不大、没有专职存储管理员的小团队来说这是非常务实的选择。4.2 NAS天生不擅长的事NAS虽然香但它有两个先天的不足网络链路开销和协议复杂性。这两个不足直接导致它在某些负载上表现很差。网络开销主要由两部分构成一个是网络本身的时延和抖动另一个是协议层的处理消耗。客户端每做一次文件操作都要通过网络把请求发给NAS服务端服务端解析协议、访问本地文件系统、再把响应传回来。即使走万兆内网这个往返延迟也比直接在本地盘上操作高一个数量级。对几十上百个并发用户的普通办公文档访问这个延迟根本感知不到但对数据库事务日志、高并发小文件随机读写这类应用这个额外延迟是致命的。协议复杂性带来的另一个问题是锁机制。SMB和NFS都实现了不同粒度的文件锁这保证了多用户共享时的数据安全但锁在分布式环境下很容易引发性能瓶颈。多个客户端同时争抢同一批文件的写权限时锁等待会迅速放大延迟。所以我在选型时有一条很明确的原则凡是数据库数据文件、元数据服务这类对延迟和一致性要求极高的场景绝对不放到NAS上凡是多人协作、文件共享、备份归档这类场景NAS反而是最优解。4.3 让NAS发挥价值的关键配置NAS上手容易用好却有不少门道。第一件值得做的事是正确选协议。纯Linux环境用NFS更简单直接Windows环境SMB是原生语言混合环境用SMB3.0的多通道特性往往体验更均衡。不要图省事全用NFS也不要为了兼容“什么都能访问”而把SMB权限设得太宽。第二件值得做的事是网络层面的保障。NAS走网络网络的稳定性直接决定NAS的体验。交换机和网卡支持的话尽量上万兆或者至少2.5G网口如果做不到至少要把NAS的接入交换机保持在一个不易拥塞的独立广播域里。客户端挂载时开启TCP协议栈的参数优化比如增加读、写缓冲和连接复用也能明显减少小文件操作时“每个文件都要握手一次”的开销。第三件值得做的事是存储后端的布局。NAS后端多块硬盘做RAID时不要把所有类型的业务都塞进同一个共享目录。顺序读写的视频素材和大量碎文件的家目录I/O特征完全不同最好分开目录、分开物理盘组否则NAS长期运行后性能会互相拖累。顺带说一句NAS作为备份目标是非常合适的用法备份任务本身是大块顺序写对网络和存储的利用效率都高。5. 选型判断框架从真实场景反推该买哪种存储讲清楚三个概念的差异之后最后一步是给出一套能落地的选择方法。我这些年做技术方案有个感受选型这件事不怕慢就怕不问对问题就开始堆配置。存储选型尤其如此因为存储一旦落地后期迁移成本极高。5.1 选型第一问数据是给一个人用还是给很多人用所有存储选型问题都可以归结到第一个核心问题这份数据最终需要同时供多少台机器、多少个人访问如果答案是“单台服务器自己用”那基本存储就是天然选项。本地SATA盘、SAS盘、NVMe盘按性能需求选就是。加上RAID或者LVM做冗余和灵活性这个组合简单、可靠、性能可控而且排错链路短。如果答案是“多台机器同时要访问同一份文件”NAS就是最自然的选择。共享目录、文件锁、多客户端挂载一件全套。NFS/SMB设计之初就是为了解决这个问题。如果答案是“多台机器里的多个程序要共享访问但每个程序对延迟和一致性要求极高”那就该考虑SAN或分布式块存储了。这时选择的是“网络化的块存储”而不是网络文件共享——严格来说它已经不是NAS属于另一个赛道了。我遇到过很多次的情况是原本该用NAS的场景被硬塞了基本存储的方案或者数据库用了NAS方案最后性能出了问题被运维天天加班。前者根源是不理解共享的价值后者根源是不理解延迟的代价。5.2 三大维度的对比清单把基本存储、存储堆栈、NAS放回到它们各自的位置之后横向对比其实看的是这么几个维度对比维度基本存储块存储/DAS存储堆栈网络附加存储NAS本质存储设备形态软件分层结构存储服务形态对外形态/dev/sdX、裸设备、LUN文件系统、卷、RAID组合NFS/SMB共享目录共享能力默认单机访问共享需要额外层与共享无关是内部机制天生多客户端共享性能上限单机接口上限最低延迟取决于每一层叠加的损耗受网络和协议开销限制典型协议SATA、SAS、NVMe、iSCSIext4、XFS、LVM、RAIDNFS、SMB适合场景数据库主机、本地系统盘、虚拟化数据盘需要扩展性、快照、动态卷的服务器环境文档共享、备份归档、媒体素材库成本特征单盘成本直观性能越高越贵软件层成本低排错时间成本高设备整体成本低交付最快这张表的价值不在于背下来而在于帮你意识到它们压根不在同一列。基本存储决定“数据物理解体长什么样”存储堆栈决定“操作系统怎么高效使用它”NAS决定“数据怎么分享给别人”。你做选型的时候通常要同时回答这三个问题而不是三选一。5.3 三个真实的选型场景再举三个具体场景对应回到标题里的对比关系。第一个场景给一台生产MySQL主机配存储。我的结论是本地NVMe基本存储辅以RAID1镜像保证单盘故障不丢数据。为什么不用NAS因为每个事务提交都要等待同步落盘NAS的网络延迟会把数据库性能拖垮。为什么不需要复杂的存储堆栈数据库自己管理数据文件文件系统用ext4或者xfs就够LVM按需再加。第二个场景一个十人团队需要共享项目管理文档和交付素材。我的结论是搞一台NASSMB共享目录挂载到每个人电脑上。为什么不用基本存储因为数据流动太频繁今天这台改明天那台用本地盘只会让协作流程变成“到处传文件、版本混乱”。工具的价值是服务流程NAS把共享沟通的成本降到了最低。第三个场景一组虚拟化服务器要跑几十台虚拟机。这个场景比较讲究虚拟机镜像文件放本地基本存储单点有风险全部放NAS性能又不满足。更常见的做法是在每台物理机内放NVMe基本存储通过超融合或分布式存储软件层把它聚合成一个共享存储池让虚拟机可以热迁移。这个方案里既有基本存储的硬件又有分布式存储堆栈的软件没有单独的NAS设备。你看三种概念在这里同时出现但各司其职。5.4 超融合与分布式存储超出三者的延伸最后稍微推一步现在数据规模一大单纯的本地盘或单一NAS都不够用了业界普遍走向分布式存储或超融合架构。超融合的核心思路是把计算和存储揉在一个节点里让每个节点的本地盘通过软件组成一个共享的存储资源池——Horizon、VMware vSAN、Ceph这类方案都属于这个路子。你在物理层用的是基本存储资源池层实现的是存储堆栈的扩展和动态调度对外提供的形态既可以是块设备RBD、iSCSI也可以是文件系统接口CephFS。这个方向对中小规模用户特别友好因为它不需要专门买一台昂贵的存储阵列用几台普通服务器加SSD就能搭建出具有一定冗余和在线扩展能力的存储底座。但代价是架构复杂度和排错难度显著上升组件多、网络耦合强、故障域划分要仔细。如果你现在只是几百GB到一两个TB的存储需求老老实实从基本存储和NAS起步更划算到了数据量几十TB、且需要不停机扩容的阶段再评估分布式方案也不迟。我的个人建议是把标题里的三个词当成三张地图而不是三个商品。选型的时候先识别自己手里的事落在哪张地图上单机应用看基本存储多机共享看NAS性能敏感的共享看分布式块存储每一层的选择都各有各的坑。把访问模型想清楚比记住任何一张对比表都重要。
返回列表