服务器云硬盘和本地硬盘有什么区别?性能、扩容与数据可靠性分析

采购或升级服务器时,销售给你的配置单上往往只写一句"1TB SSD"或"500GB 云硬盘"。看上去都是"硬盘",用起来却完全是两回事:同样是 1TB,云硬盘可以在线扩到 4TB 而业务不中断,本地盘想扩容就得停机拆机;同样标称 IOPS,一块 NVMe 本地盘的随机写延迟可能只有云硬盘的三分之一,但本地盘一旦物理损坏,数据就真的没了。搞清楚服务器云硬盘和本地硬盘的区别,直接决定了你的数据库该放哪、备份该怎么做、以及未来两年扩容要花多少钱。本文从性能、扩容、数据可靠性三个维度拆开讲。

一、先分清概念:本地盘、云硬盘到底指的是什么

先澄清一个常见的混淆。"本地硬盘"在物理服务器场景指插在机器上的 SATA/SAS/NVMe 盘,由服务器的 RAID 卡或主板控制器直接管理;在云服务器场景,"本地盘"(有的厂商叫"本地 SSD 盘""实例存储")指的是与某台云主机同机部署、物理上直接挂在该宿主机上的盘,它不是网络存储,但它的生命周期跟随实例——实例被释放或宿主机故障,数据一起消失。

"云硬盘"(云盘、块存储、EBS 类服务)则是从存储集群里通过网络划出来的一块块设备。对操作系统而言它和本地盘一样有 /dev/vdb、/dev/sdb 这样的设备名,可以分区、格式化、挂载,但底层数据被切成多份副本分散在不同机柜的不同磁盘上,通过网络连接挂载到你的实例。

用一条命令就能看出盘是不是网络盘:本地 NVMe 通常走 PCIe,设备名带 nvme 命名空间;云硬盘在虚拟化环境下常常以 virtio-blk 形式出现,驱动是 virtio_blk。

# 查看块设备与驱动/传输类型
lsblk -d -o NAME,SIZE,ROTA,TYPE,MODEL,TRAN

# 查看某块盘走的是什么驱动(虚拟化环境常见 virtio_blk)
lsblk -S -o NAME,HCTL,TYPE,VENDOR,MODEL,REV,SIZE

# 内核识别到的设备队列与调度信息
ls -l /sys/block/vdb/device/driver
cat /sys/block/vdb/queue/rotational   # 0=SSD/闪存 1=机械盘
cat /sys/block/vdb/queue/scheduler

这里 ROTA 列为 1 表示机械旋转介质,0 表示固态;TRAN 字段在部分环境会直接显示 nvme、sas 或空值。判断介质类型很关键,因为后面所有的性能预期都建立在它是机械还是固态之上。

二、性能对比:别只看 IOPS,要看延迟和一致性

性能是云硬盘和本地硬盘差异最直观的地方,但绝大多数人只盯着厂商标称的 IOPS 数字,忽略了两个更重要的指标:延迟(latency)和延迟的一致性。

2.1 三个核心指标的读法

  • IOPS:每秒能完成多少次 I/O 请求。小块随机读写场景(数据库 OLTP)的主要瓶颈,块大小通常按 4KB 计。
  • 吞吐(带宽,BW):每秒传输多少 MB。大块顺序读写场景(日志、视频、备份)的主要瓶颈,单位是 MiB/s。
  • 延迟(lat):一次 I/O 从发出到返回的时间,看平均值意义不大,要看 99.00%、99.99% 分位(clat percentiles)。数据库对尾延迟极其敏感。

本地 NVMe 盘因为直接走 PCIe,单队列延迟常在几十微秒量级;云硬盘要经过网络传输,延迟里多出一跳网络往返,通常在百微秒到毫秒量级。这个差距在单次操作上不明显,但在"一个 SQL 请求触发几百次随机读"的场景下会被放大成明显的慢查询。

2.2 用 fio 实测,别信标称值

无论销售怎么说,拿到机器上先自己测一轮。下面是一组通用的随机读写测试命令,--iodepth 控制队列深度,--numjobs 控制并发任务数,这是模拟真实业务压力的关键。

# 4K 随机读,队列深度 32,4 并发,测试 60 秒
fio --name=randread --filename=/data/testfile --ioengine=libaio \
    --direct=1 --rw=randread --bs=4k --iodepth=32 --numjobs=4 \
    --size=2G --runtime=60 --time_based --group_reporting

# 4K 随机写
fio --name=randwrite --filename=/data/testfile --ioengine=libaio \
    --direct=1 --rw=randwrite --bs=4k --iodepth=16 --numjobs=4 \
    --size=2G --runtime=60 --time_based --group_reporting

# 1M 顺序读(看吞吐)
fio --name=seqread --filename=/data/testfile --ioengine=libaio \
    --direct=1 --rw=read --bs=1M --iodepth=8 --numjobs=1 \
    --size=4G --runtime=60 --time_based --group_reporting

结果里重点看这几行:IOPS= 是平均 IOPS;BW= 是带宽;lat 段里的 avg、99.00th、99.99th 是延迟分布。经验判读:如果 99.99th 延迟是 avg 的 10 倍以上,说明这块盘存在严重的抖动(可能被其他租户抢占、或后端正在做数据重建);如果随机写 IOPS 只有随机读的三分之一甚至更低,很可能是固态盘的写放大或云盘的写入同步延迟导致的。

注意 --direct=1 必须加,否则测的是操作系统页缓存,数字会高得离谱而毫无参考价值。测试文件也要远大于内存容量。

2.3 用 iostat 看实时负载

# 每 2 秒刷新一次,显示扩展统计
iostat -x 2

# 只看某块盘
iostat -x -d /dev/vdb 2

输出里 %util 接近 100% 说明设备已饱和;await 是平均 I/O 等待时间(毫秒),SSD 上持续超过 5ms、机械盘持续超过 20ms 通常意味着存在压力;svctm 在新版本 sysstat 中已不可靠,不要作为判断依据。另外要区分:机械盘的 %util 高但 IOPS 很低是正常现象(IOPS 上限由寻道时间决定),而固态盘 %util 高同时 IOPS 也很高。

三、扩容能力:一个要停机,一个在线完成

这是两者在运维体验上最大的分水岭。

本地盘扩容:物理服务器需要采购新盘、停机、开箱、插入、做 RAID 重建;云服务器的本地盘则通常不支持直接扩容,只能在新建实例时选择更大的本地盘规格,然后把数据整体迁移过去。无论哪种,都要停机,而且窗口期不可控。

云硬盘扩容:控制台点几下把容量从 200GB 改成 500GB,然后在操作系统内做两件事——扩展分区、扩展文件系统——全程业务不中断。

# 1. 确认盘已识别到新容量
lsblk
# 2. 扩展分区(如 /dev/vdb 的第 1 个分区)
growpart /dev/vdb 1
# 3. ext4 文件系统扩容;XFS 则用 xfs_growfs /挂载点
resize2fs /dev/vdb1
# 4. 确认结果
df -h

关于容量上限,不同厂商、不同类型的盘差异很大,选购时要看清楚"单盘最大容量"和"单实例可挂载数量",不要默认所有盘都能到几十 TB。

四、数据可靠性:副本、快照与"本地盘会丢数据"

这是最容易被低估、也最容易出事的部分。

4.1 本地盘的可靠性模型

一块物理盘就是单点。企业级机械盘的年化故障率(AFR)通常在百分之一到百分之几的量级,看起来不高,但换算成 100 块盘一年,出问题的概率就非常可观。机械盘还有明显的"浴盆曲线":刚上线的早期故障期、稳定期、以及使用三五年后的损耗期。

本地盘唯一的自救手段是 RAID:RAID 1 牺牲一半容量换取镜像,RAID 5/RAID 6 用校验换取容错。但 RAID 有个致命误区——RAID 不是备份。误删文件、勒索软件加密、文件系统元数据损坏,RAID 会原封不动地把破坏同步到所有成员盘。

# 定期检查硬盘健康状态(需要 smartmontools)
smartctl -a /dev/sda
smartctl -H /dev/sda
# 重点关注 Reallocated_Sector_Ct、Current_Pending_Sector、UDMA_CRC_Error_Count
smartctl -A /dev/sda | grep -Ei 'realloc|pending|uncorrect|crc|power_on|temperature'

判断标准:Current_Pending_Sector(待映射扇区)大于 0,或 Reallocated_Sector_Ct(已重映射扇区)持续上涨,说明盘已经在物理损坏,应尽快更换而不是继续观察。

4.2 云硬盘的可靠性模型

云硬盘底层通常采用多副本或纠删码(EC)机制,把数据切分后写入不同机柜的多个存储节点,单块盘甚至单个机柜故障不影响数据可用性,后台自动重建。这就是云硬盘敢宣称"几个 9 的可靠性"的底气。

但云平台给你的可靠性是基础设施层的,它防的是硬件故障,防不住你自己的误操作。所以即便用了云硬盘,仍然必须做两件事:

  1. 开启定期快照:快照是崩溃一致性(crash-consistent)的,恢复速度快,用于应对误删、改错配置、升级失败。数据库场景需要先做一致性处理再打快照。
  2. 异地/异地介质备份:快照通常和源盘在同一地域的同一存储集群,遇到地域级故障或账号被入侵删除时不起作用,必须把备份复制到另一个地域或对象存储。

五、一张表看清差异与选型

对比维度本地硬盘(本地盘)云硬盘(块存储)
数据访问路径直连 SATA/SAS/NVMe,无网络跳转经网络访问存储集群,多一跳延迟
随机 I/O 延迟低且稳定,尤其 NVMe 本地盘略高,受网络与后端负载影响,可能有抖动
IOPS 上限取决于单盘/RAID 卡,NVMe 可极高与容量、盘类型挂钩,可配置规格
扩容方式停机加盘/重建,或迁移到新实例控制台在线扩容量 + 系统内扩展分区文件系统
单盘容量上限受机型盘位与单盘容量限制取决于厂商规格,通常可到数 TB~数十 TB
硬件故障影响单盘故障即数据风险,需 RAID 兜底底层多副本,单盘/单机柜故障透明
实例故障后数据云服务器本地盘随实例释放而丢失可卸载后挂载到另一台实例,数据保留
快照/回滚不支持,依赖自建备份原生支持快照与回滚
成本形态一次性买断(物理机)或含在实例价内按容量与盘类型独立计费,通常另计
典型场景高性能计算、缓存层、可重建的临时数据数据库主存储、业务数据、系统盘、需长期保存的数据

六、落地选型:五步判断法

  1. 先判断数据能不能重建。缓存、临时计算中间结果、可从源重新拉取的数据可以放本地盘;用户上传文件、订单数据、账目数据一律放云硬盘。
  2. 实测延迟而不是看标称。用 fio 跑 4K 随机写,看 99.99th 分位延迟。延迟抖动大的盘,即使平均 IOPS 好看也不适合放数据库。
  3. 估算 12 个月后的容量。按日均增量 × 365 × 1.5(留余量)估算,如果 12 个月后需要停机扩容才能解决,就选云硬盘。
  4. 确认单盘上限与可挂载数量。不要等到容量不够才发现这个机型最多挂 4 块盘。
  5. 把备份方案在采购前就定下来。快照周期、保留份数、异地复制目标、恢复演练时间,写进运维文档,不要等出事再想。

小结与避坑建议

云硬盘和本地硬盘的核心区别不在"快不快",而在三个问题:故障后数据还在不在、扩容要不要停机、延迟是否稳定。本地盘胜在延迟低、单位性能成本有优势,代价是可靠性完全靠你自己兜底;云硬盘胜在弹性、可迁移、有底层副本和快照,代价是延迟略高、成本按容量持续支出。

几条常见的坑:

  • 把云服务器的本地盘当持久存储用。实例释放、宿主机故障、甚至某些情况下的停机迁移,本地盘数据都可能丢失。这是最高频的数据事故来源。
  • 认为"云硬盘有副本就不用备份"。副本防硬件故障,不防误删、不防勒索、不防账号被盗后数据被整体删除。
  • 测试时不加 --direct=1,测出来的是内存缓存速度,几 GB/s 的数字完全不能反映真实磁盘性能。
  • 只看平均延迟。业务卡顿往往由 P99/P99.9 尾延迟引起,平均值掩盖了一切。
  • 忽略 inode 与文件系统上限。海量小文件场景下,df -h 还有空间但 df -i 显示 inode 用满,同样会写入失败。

最终建议是混合使用:系统盘和核心业务数据放云硬盘并配定期快照;对延迟极度敏感且可重建的缓存、临时目录放本地盘。这样既拿到了性能,也没有把数据的命交给一块物理盘。


本文为存储与硬盘管理系列之一,命令示例基于常见 Linux 发行版,具体参数请以实际环境为准。