存储圈里有句话:搞不清 DAS、NAS、SAN 的区别,机房里的线你都不敢随便拔。这话听着糙,但确实是我带过几个新人之后最深的感触。很多人刚接触存储的时候,看到机柜里一堆盘柜、交换机、光纤模块,脑子里第一反应是“这不都是存数据的吗,能有多大差别”。结果真到选型或者排障的时候,DAS 和 SAN 混着叫,NAS 和文件服务器当成一回事,IP-SAN 和 FC-SAN 的线插反了还在那儿查配置。这篇内容我就围绕 DAS、NAS、IP-SAN、FC-SAN 这四种最主流的存储形态,把它们的底层逻辑、适用场景、实操配置和踩坑经验一次讲透。不管你是刚入行的运维、正在做存储选型的架构岗,还是想搞清楚机房那堆设备到底在干嘛的技术爱好者,看完至少能做到:别人报一个存储方案,你脑子里能立刻浮现出它的拓扑长什么样、瓶颈可能在哪、什么场景下不该用它。
1. 四种存储形态的整体设计与选型逻辑
1.1 先搞清楚一个核心问题:存储到底在解决什么
很多人一上来就背概念,DAS 是直连、NAS 是网络附加、SAN 是存储区域网络,背完还是不会选。我的建议是先退一步,想明白存储这件事本质上在解决三个矛盾:容量和性能的矛盾、共享和隔离的矛盾、成本和可靠性的矛盾。你把这三点想清楚,四种形态的定位自然就出来了。
DAS 是最原始的形态,硬盘直接挂在服务器上,走 SATA、SAS 或者 NVMe 通道。它的设计哲学是“独占”——一块盘只服务一台主机,简单、直接、延迟最低。但问题也在这,容量没法共享,一台机器满了另一台还空着,你只能干瞪眼。NAS 的出现就是为了解决共享问题,它把存储做成一个独立的文件服务器,通过 NFS 或 SMB 协议对外提供文件级访问,多台主机可以同时读写同一个目录。SAN 则走了另一条路,它不提供文件,而是提供“块设备”——对服务器来说,SAN 里的 LUN 就像一块本地硬盘一样,你可以往上装文件系统、建数据库。IP-SAN 和 FC-SAN 是 SAN 的两种实现方式,区别在于底层传输走的是以太网还是光纤通道。
这里有个特别容易混淆的点我得提前说清楚:NAS 是文件级(file-level),SAN 是块级(block-level)。这个区别不是学术概念,它直接决定了你的应用能不能用。比如你要跑 Oracle 数据库,数据库自己管理块设备,那你必须给它块存储,NAS 的文件锁机制会让数据库性能崩掉;反过来,你要做多台 Web 服务器的共享上传目录,那 NAS 就是天然合适的,用 SAN 你得自己在上层做集群文件系统,复杂度陡增。
1.2 四种形态的拓扑差异与选型对照
我把四种形态的关键维度整理成一张表,这张表我在实际选型沟通时经常直接拿出来用,比讲半天概念管用。
| 维度 | DAS | NAS | IP-SAN | FC-SAN |
|---|---|---|---|---|
| 访问粒度 | 块级 | 文件级 | 块级 | 块级 |
| 传输介质 | SAS/SATA/NVMe 直连 | 以太网 | 以太网 | 光纤通道 |
| 典型协议 | SCSI/ATA/NVMe | NFS/SMB | iSCSI | FCP |
| 共享能力 | 不支持(单机独占) | 多主机共享文件 | 多主机共享块(需集群文件系统) | 同 IP-SAN |
| 典型延迟 | 最低(微秒级) | 毫秒级 | 毫秒级 | 亚毫秒级 |
| 成本 | 最低 | 中 | 中低 | 高 |
| 扩展性 | 差(受限于单机槽位) | 好 | 好 | 好 |
| 典型场景 | 单机数据库、本地盘 | 文件共享、备份归档 | 中小型虚拟化、容灾 | 核心数据库、高IOPS业务 |
这张表里我最想强调的是“访问粒度”和“共享能力”这两行。很多人选型的失误就出在这——看到 NAS 便宜又能共享,就想把所有业务往上搬,结果数据库跑上去直接卡死。记住一个原则:应用自己管块的,给它块存储;应用要共享文件的,给它文件存储。这条原则能帮你避开八成以上的选型错误。
1.3 为什么不是越贵越好:成本与性能的平衡点
FC-SAN 贵,这是共识,但贵在哪、什么时候值得贵,很多人说不清楚。FC-SAN 的成本大头在三块:光纤交换机、HBA 卡、光模块和线缆。一套双活 FC-SAN,两台光纤交换机做冗余,每台服务器两块 HBA 卡,加上盘柜和授权,预算很容易冲到几十万。而同样容量的 IP-SAN,用万兆以太网加普通网卡加 iSCSI 发起端,成本可能只有三分之一甚至更低。
那 FC-SAN 的价值在哪?在于它的确定性和低延迟。光纤通道协议本身是为存储流量设计的,丢包率极低,延迟稳定在亚毫秒级,而且它和以太网物理隔离,业务网络的广播风暴、拥塞不会波及存储。对于核心交易数据库、高频读写的小块 IO 场景,这个确定性值那个钱。但如果你的业务是视频监控存储、文件归档、中小型虚拟化集群,IP-SAN 甚至 NAS 完全够用,硬上 FC-SAN 就是浪费预算。
我个人的经验判断标准是这样的:单台主机对存储的 IOPS 需求稳定超过 5 万、且对延迟抖动敏感(比如要求 P99 延迟低于 1ms),才认真考虑 FC-SAN;否则优先 IP-SAN。这个阈值不是绝对的,但能帮你快速做初筛。
2. 核心细节解析与实操要点
2.1 DAS 的隐藏价值与被低估的场景
DAS 经常被当成“过时技术”,我觉得这是误解。DAS 的核心优势是延迟和成本,这两个优势在特定场景下无可替代。比如单机跑一个对 IO 极度敏感的缓存服务或者本地数据库,数据就在主板直连的 NVMe 盘上,延迟能压到几十微秒,这是任何网络存储都给不了的。再比如边缘计算节点,一台设备放在现场,没有条件部署独立的存储网络,DAS 就是唯一合理的选择。
DAS 的实操要点主要在 RAID 配置和盘位规划上。我见过太多人把 DAS 当成“插上盘就能用”,结果单盘故障直接丢数据。DAS 本身不提供冗余,冗余要靠 RAID 卡或者软 RAID 来做。常见的 RAID 级别选择我整理如下:
| RAID 级别 | 最少盘数 | 容错能力 | 空间利用率 | 适用场景 |
|---|---|---|---|---|
| RAID 0 | 2 | 无 | 100% | 临时数据、可重建的缓存 |
| RAID 1 | 2 | 坏1块 | 50% | 系统盘、小容量高可靠 |
| RAID 5 | 3 | 坏1块 | (n-1)/n | 读多写少的通用场景 |
| RAID 6 | 4 | 坏2块 | (n-2)/n | 大容量盘、重建风险高的场景 |
| RAID 10 | 4 | 每组坏1块 | 50% | 写密集、高IOPS场景 |
这里有个实操细节值得展开:大容量机械盘(比如单盘 16TB 以上)做 RAID 5 是有风险的,因为重建时间可能长达十几个小时甚至更久,重建期间再坏一块盘就全没了。所以大容量盘我一般建议 RAID 6 或者 RAID 10。另外 RAID 卡要有电池或者超级电容保护写缓存,否则突然断电时缓存里的数据会丢,这个细节在采购时一定要确认,很多低端 RAID 卡是不带缓存保护的。
注意:DAS 的盘位扩展受限于机箱和 RAID 卡端口数,规划时至少预留 20% 的空盘位,否则后期扩容只能换整机。
2.2 NAS 的协议选择:NFS 与 SMB 的门道
NAS 看起来简单,无非是插上网线、建个共享目录,但 NFS 和 SMB 这两个协议的选择和调优,坑一点都不少。NFS 主要用于 Linux/Unix 环境,SMB 主要用于 Windows 环境,这是基本认知,但实际部署时远不止这么简单。
先说 NFS。NFS 有 v3、v4.0、v4.1、v4.2 几个版本,差异很大。v3 是无状态协议,服务端重启客户端基本无感,但性能和安全性较弱;v4.1 引入了并行访问(pNFS),多客户端并发读写同一文件时性能提升明显;v4.2 增加了服务端复制等特性。我在实际部署中,只要客户端支持,一律上 NFS v4.1 以上,因为它的锁机制和并发性能比 v3 好太多。挂载参数上,rsize和wsize建议设到 1MB(1048576),nconnect参数(Linux 5.3+ 支持)可以建立多条连接提升吞吐,这个参数很多人不知道,实测在万兆环境下能把单客户端吞吐提升 2 到 3 倍。
# NFS v4.1 挂载示例,nconnect 建立 4 条连接 mount -t nfs -o vers=4.1,rsize=1048576,wsize=1048576,nconnect=4,hard,timeo=600 \ 192.168.1.100:/export/data /mnt/nasSMB 这边,版本选择同样重要。SMB 3.0 以后支持多通道(multichannel)和 SMB Direct(RDMA),多通道能让单客户端聚合多块网卡的带宽。Windows 客户端默认就支持,Linux 端用 cifs-utils 挂载时要注意指定vers=3.0或更高。另外 SMB 的权限模型比 NFS 复杂,涉及共享权限和 NTFS 权限两层,经常出现“共享权限给了但文件还是访问不了”的情况,排查时一定要两层都看。
提示:NAS 的性能瓶颈往往不在盘上,而在网络和协议栈。千兆环境单客户端顺序读写撑死 110MB/s 左右,想跑满多盘阵列的带宽,万兆网卡和交换机是前提。
2.3 IP-SAN 的 iSCSI 配置与多路径
IP-SAN 的核心是 iSCSI 协议,它把 SCSI 命令封装进 TCP/IP 包,通过以太网传输。对服务器来说,iSCSI 目标端(target)提供的 LUN 就是一块本地磁盘,你在上面建分区、格式化、挂载,和本地盘操作完全一样。
iSCSI 部署的关键在发起端(initiator)和目标端(target)的配置,以及多路径(multipath)的设置。多路径是 IP-SAN 高可用的核心,服务器通过两块网卡、两条链路访问同一个 LUN,任何一条链路故障都不影响业务,同时还能做负载均衡。Linux 下用multipath-tools来管理,配置文件/etc/multipath.conf里要正确设置path_grouping_policy,常用的是failover(主备)和multibus(全活)。
# 查看多路径设备状态 multipath -ll # 典型输出中 sda 和 sdb 是同一 LUN 的两条路径 # mpatha (3600...) dm-0 # ├── sda [active][ready] # └── sdb [active][ready]配置 iSCSI 发起端时,/etc/iscsi/iscsid.conf里的几个参数值得调:node.session.timeo.replacement_timeout控制链路断开后多久切换路径,默认 120 秒太长,我一般调到 15 到 30 秒;node.session.cmds_max和node.session.queue_depth影响并发命令数,高 IOPS 场景可以适当调大。目标端这边,如果用的是软件 target(比如 LIO),要注意每个 LUN 的emulate_tpu和emulate_caw参数,某些老应用对这两个 SCSI 命令有依赖,不开会报错。
IP-SAN 最大的坑是网络。iSCSI 流量和业务流量跑在同一个网络上,一旦业务网络出现广播风暴或者大流量传输,存储 IO 立刻受影响。所以生产环境我强烈建议 iSCSI 走独立的 VLAN 甚至独立的物理交换机,并且开启巨帧(Jumbo Frame,MTU 9000)。巨帧能显著降低 CPU 开销和包处理延迟,但要求链路上所有设备(网卡、交换机、目标端)MTU 一致,有一个不匹配就会出问题,这是排查 IP-SAN 性能问题时第一个要确认的点。
2.4 FC-SAN 的 zoning 与链路规划
FC-SAN 的配置门槛比 IP-SAN 高,核心难点在光纤交换机的 zoning(分区)配置。Zoning 的作用是把交换机端口划分成逻辑组,只有同一 zone 内的端口才能互相通信,这既是安全隔离,也是流量隔离。Zoning 配错了,服务器要么看不到存储,要么看到不该看到的 LUN,是 FC-SAN 部署中最常见的故障源。
Zoning 有两种方式:基于端口(port zoning)和基于 WWN(WWN zoning)。基于端口的方式配置简单,但换端口就要改配置;基于 WWN 的方式更灵活,设备换端口不用改 zone,但需要准确记录每块 HBA 卡的 WWN。生产环境我推荐 WWN zoning,配合单启动器单目标(single-initiator single-target)的 zone 设计,每个 zone 里只有一块 HBA 和一个存储端口,这样故障域最小,排障也最清晰。
FC-SAN 的链路规划要注意两点:一是双 Fabric 冗余,两台光纤交换机独立组网,服务器双 HBA 分别接入两个 Fabric,任何一台交换机故障业务不中断;二是速率匹配,HBA、交换机端口、存储端口三者的速率要一致,现在主流是 16G 或 32G FC,混插不同速率的端口会自动协商到低速,但有些老设备协商会出问题,规划时尽量统一。
注意:FC-SAN 的 HBA 卡驱动和固件版本要匹配,版本不匹配可能导致链路频繁闪断,上线前务必核对厂商的兼容性矩阵。
3. 实操过程与核心环节实现
3.1 从零搭建一套 IP-SAN 的完整流程
我拿一套典型的中小型虚拟化 IP-SAN 环境来演示,拓扑是:一台双控存储阵列,两块万兆网卡做 bond;两台服务器,各两块万兆网卡;一台万兆交换机。目标是给两台服务器提供共享块存储,跑虚拟化集群。
第一步是网络规划。存储阵列的两个控制器各出一个万兆口,分别接到交换机的两个不同端口;每台服务器两块万兆口,也分别接交换机。IP 规划上,存储和服务器放在同一个存储专用网段,比如 10.10.10.0/24,存储控制器 A 用 10.10.10.11,控制器 B 用 10.10.10.12,服务器 A 两块网卡 10.10.10.21 和 10.10.10.22,服务器 B 类似。注意这里不做 bond,因为 iSCSI 多路径需要看到两条独立路径,做 bond 反而会把两条路径合成一条,失去冗余意义。这是很多人会犯的错,以为网卡绑定越多越好,实际上 iSCSI 场景下多路径比 bond 更合适。
第二步是存储端配置。登录存储管理界面,创建主机组,把两台服务器的 iSCSI 发起端 IQN 加进去。IQN 的格式类似iqn.2024-01.com.example:server01,每台服务器唯一。然后创建 LUN,比如 2TB 一个,映射给主机组。再配置目标端门户(target portal),把两个控制器的 IP 都加上,这样服务器才能发现两条路径。
第三步是服务器端配置。先装iscsi-initiator-utils和device-mapper-multipath,启动iscsid服务,用iscsiadm发现并登录目标。
# 发现目标 iscsiadm -m discovery -t sendtargets -p 10.10.10.11 # 登录所有发现的目标 iscsiadm -m node -L all # 确认会话建立 iscsiadm -m session -P 3第四步是多路径配置。编辑/etc/multipath.conf,关键配置如下:
defaults { user_friendly_names yes path_grouping_policy multibus failback immediate no_path_retry 30 }multibus策略下所有路径都参与负载均衡,failback immediate让故障路径恢复后立即切回。配好后重启 multipathd,用multipath -ll确认两条路径都是 active ready 状态。
第五步是文件系统和集群配置。虚拟化场景一般用 LVM 加集群文件系统(比如 GFS2 或 OCFS2),或者直接用虚拟化平台自带的集群存储管理。这里要注意,普通 ext4 或 xfs 不能多主机同时挂载同一个块设备,会损坏文件系统,必须用集群文件系统或者由虚拟化平台统一管理。
3.2 FC-SAN 的 zoning 配置实操记录
FC-SAN 这边我用一台光纤交换机的命令行来演示 zoning 配置。假设服务器 HBA 的 WWN 是10:00:00:00:c9:12:34:56,存储端口 A 的 WWN 是20:00:00:00:c9:ab:cd:ef,我们要建一个 zone 把这两个端口放进去。
# 登录光纤交换机(以常见 CLI 为例) # 创建别名,方便管理 alicreate "server01_hba0", "10:00:00:00:c9:12:34:56" alicreate "storage_ctrlA_sp0", "20:00:00:00:c9:ab:cd:ef" # 创建 zone zonecreate "zone_server01_ctrlA", "server01_hba0;storage_ctrlA_sp0" # 创建 cfg 并激活 cfgcreate "cfg_production", "zone_server01_ctrlA" cfgenable "cfg_production" # 确认配置生效 cfgshow配置完成后,在服务器上重新扫描 SCSI 总线,就能看到新的 LUN:
# 重新扫描 FC HBA echo "- - -" > /sys/class/scsi_host/host0/scan # 或者用 rescan-scsi-bus.sh 脚本 rescan-scsi-bus.sh -a这里有个实操细节:zoning 激活后,服务器不一定立刻看到 LUN,需要重新扫描。如果扫描后还是看不到,按这个顺序排查:先确认 HBA 卡链路状态(cat /sys/class/fc_host/host0/port_state应该是 Online),再确认交换机端口状态(portshow看端口是否 Online),最后确认存储端 LUN 映射是否包含这块 HBA 的 WWN。这个排查顺序能帮你快速定位问题出在哪一层。
3.3 性能验证:怎么确认存储真的跑起来了
配置完不等于能用,一定要做性能验证。我常用的工具是fio,它能模拟各种 IO 模式,测出真实的 IOPS 和延迟。下面是一个随机读写的测试示例:
# 4K 随机读写,队列深度 32,跑 60 秒 fio --name=randrw --ioengine=libaio --direct=1 --rw=randrw \ --bs=4k --numjobs=4 --iodepth=32 --size=4G --runtime=60 \ --group_reporting --filename=/dev/mapper/mpatha测试时要注意几点:direct=1绕过系统缓存,测的是真实存储性能;numjobs和iodepth的乘积是总队列深度,要根据实际业务并发来设;测试前确认设备上没有生产数据,因为这是破坏性写入。测出来的结果和预期对比,如果 IP-SAN 在万兆环境下 4K 随机读 IOPS 只有几千,那肯定有问题,先查网络 MTU 和交换机端口是否有丢包。
4. 常见问题与排查技巧实录
4.1 存储故障排查速查表
我把这些年遇到的典型问题整理成一张速查表,按现象、可能原因、排查动作来组织,实际排障时按这个顺序走,能省不少时间。
| 现象 | 可能原因 | 排查动作 |
|---|---|---|
| NAS 挂载后读写极慢 | 网络协商到百兆/千兆,或 MTU 不匹配 | ethtool看速率,ping -M do -s 8972测巨帧 |
| iSCSI 登录失败 | 目标端门户 IP 不通,或 CHAP 认证错误 | iscsiadm -m discovery测试,核对 CHAP 配置 |
| 多路径只有一条 active | 另一条链路网络不通,或 multipath 配置错误 | multipath -ll看路径状态,查交换机端口 |
| FC 服务器看不到 LUN | zoning 未激活,或 LUN 映射未包含该 WWN | cfgshow确认 zone,存储端核对映射 |
| 存储性能突然下降 | 链路闪断、盘故障重建、或网络拥塞 | 查交换机端口错误计数,查存储告警日志 |
| 集群文件系统挂载失败 | 多主机同时挂载普通文件系统 | 确认使用集群文件系统,检查锁服务 |
这张表里我特别想说的是“存储性能突然下降”这一条。存储性能问题最怕的是没有基线,你不知道正常是什么样,就没法判断现在是不是异常。所以我的习惯是上线时跑一遍 fio 记录基线数据,后面出问题一对比就知道差多少。另外交换机端口的错误计数(CRC 错误、丢包)是排查物理链路问题的金指标,show interface一看便知。
4.2 几个踩过的坑和独家经验
第一个坑是巨帧配置不一致。有次 IP-SAN 性能死活上不去,查了半天发现服务器网卡 MTU 设了 9000,但交换机端口还是默认 1500,大包被分片,性能反而比不开巨帧还差。教训是:开巨帧必须全链路统一,而且要用ping -M do -s 8972逐跳验证,别只看配置文件。
第二个坑是 FC-SAN 的 HBA 固件版本。有套环境链路频繁闪断,日志里全是链路重置记录,最后查出来是 HBA 固件和交换机固件版本不兼容。FC 设备对版本匹配比以太网敏感得多,上线前一定要查厂商的互操作性矩阵,别嫌麻烦。
第三个坑是 NAS 的 NFS 锁问题。有次应用报“文件被锁定无法写入”,查了半天是 NFS v3 的锁服务(lockd)和防火墙冲突,锁请求被拦了。后来统一升级到 NFS v4.1,锁机制内置在协议里,不再依赖独立的锁服务,问题消失。这也是我推荐 NFS v4.1 以上的实际原因之一。
提示:所有存储配置变更前,先在测试环境验证,尤其是 zoning 和 multipath 这类影响链路的配置,生产环境直接改风险极高。
4.3 容量规划与扩容的实操建议
容量规划是存储里最容易被忽视又最容易出事的环节。我的经验是三个数字要盯住:当前使用率、增长率、扩容周期。使用率超过 70% 就该启动扩容评估,超过 80% 必须动手,别等到 90% 才着急,因为扩容本身需要时间,采购、上架、配置、数据均衡,一套流程走下来一两周很正常。
扩容方式上,DAS 只能加盘或者换整机,灵活性最差;NAS 和 SAN 一般支持在线加盘扩容,但要注意 RAID 组的扩展限制,有些 RAID 卡不支持在线扩容,或者扩容后需要手动触发重建。LUN 扩容后,上层文件系统也要相应扩展,Linux 下 ext4 用resize2fs,xfs 用xfs_growfs,而且要先扩 LUN 再扩文件系统,顺序不能反。
还有个细节是精简配置(thin provisioning)。很多存储支持 LUN 精简配置,创建时分配逻辑容量,实际写入才占物理空间。这能提高空间利用率,但有超配风险——如果所有 LUN 都写满,物理空间不够就会出问题。用精简配置一定要监控实际物理使用率,设置告警阈值,别被逻辑容量迷惑。
5. 四种形态的协同与演进思路
实际生产环境里,这四种存储形态往往不是二选一,而是组合使用。我见过一套比较合理的架构是这样的:核心数据库跑 FC-SAN 保证低延迟和高 IOPS;虚拟化集群用 IP-SAN,兼顾性能和成本;文件共享和备份归档用 NAS;每台服务器本地再留 DAS 做系统盘和缓存。这种分层设计的原则是“把合适的负载放到合适的存储上”,而不是追求单一技术的统一。
从演进角度看,全闪存阵列的普及正在改变一些传统认知。以前 FC-SAN 的延迟优势很明显,现在全闪存 IP-SAN 的延迟也能做到亚毫秒级,加上 25G/100G 以太网的普及,IP-SAN 和 FC-SAN 的性能差距在缩小。但 FC-SAN 在确定性和隔离性上的优势依然存在,核心业务场景短期内不会被完全替代。我的建议是新建环境优先评估 IP-SAN,只有在性能测试证明 IP-SAN 满足不了需求时,再上 FC-SAN,这样性价比最高。
最后分享一个我自己的习惯:不管用哪种存储,上线前一定画一张拓扑图,标清楚每台主机、每块网卡/HBA、每个交换机端口、每个存储控制器的连接关系和 IP/WWN。这张图在排障时的价值无可估量,很多问题看着复杂,对着拓扑图一梳理,故障域立刻就缩小了。存储这行,配置可以查文档,但对自己环境的掌控感,只能靠平时一点一点积累。