一台 48TB 的存储服务器上线时,大家都觉得"够用三年"。一年半后告警:磁盘使用率 92%,业务开始报"磁盘空间不足",而此时想扩容,才发现单实例最多只能挂 8 块盘、且机房没有空余盘位。这种局面几乎总是源于同一个错误:规划时只看了"现在用了多少 TB",而没有算过增长速度、没有评估 IOPS 需求、也没有设计好扩容路径。存储架构规划不是买够容量就完事,而是要把容量、性能、增长三个维度放在一起算。本文给出一套可落地的规划方法,包含具体的测算公式、分层设计思路和 Linux 下的实操命令。
一、容量规划:从"现在多少"到"三年后多少"
1.1 先摸清现状
# 各挂载点容量与使用率 df -h # inode 使用情况(海量小文件场景必看) df -i # 定位占用大户:只统计一层深度,快速找出最大目录 du -h --max-depth=1 /data | sort -hr | head -20 # 交互式分析(需安装 ncdu,比 du 更直观) ncdu /data # 找出被删除但仍被进程占用、空间未释放的文件(经典"磁盘满了却找不到大文件") lsof | grep deleted lsof +L1 # 查看文件系统总容量与已用(含保留块) tune2fs -l /dev/sdb1 | grep -Ei 'block count|reserved block|free block'
这里有一个高频陷阱:df -h 显示已用 100%,但 du 统计所有文件加起来只有 60%。这种情况几乎都是文件被删除但仍被某个进程持有句柄,空间没有真正释放。用 lsof | grep deleted 找出进程,重启或让其释放句柄即可,千万不要直接重启数据库来"解决"空间问题——先确认是哪个进程。Nginx、MySQL、Java 应用的日志文件是最常见的元凶。
1.2 测算未来容量
用下面的公式做三年规划:
- 日均增量 =(当前占用 − N 天前占用)÷ N。取 30 天或 90 天的窗口,避免单日波动。
- 年增长量 = 日均增量 × 365。
- T 年后的总需求 = 当前占用 + 年增长量 × T。
- 规划容量 = 总需求 ÷ 目标水位线(建议 0.7),即留 30% 余量。
举个例子:当前占用 4TB,过去 90 天增长了 1.2TB,则日均增量约 13.3GB/天,年增长约 4.9TB。三年后需求约 4 + 14.6 ≈ 18.6TB,按 70% 水位线反推,规划容量应为 18.6 ÷ 0.7 ≈ 26.6TB。这就是为什么"现在 4TB,买 8TB 够了吧"这种直觉判断经常出错。
水位线为什么重要?文件系统在接近满时性能会明显下降:ext4 需要更多时间寻找连续块,XFS 会因为分配组(AG)空间不足而频繁失败;更实际的风险是"某天突然写满导致数据库崩溃",而清理空间需要时间。生产环境的经验值是:使用率超过 80% 就该预警,超过 85% 就该扩容或清理,绝不要等到 95%。
1.3 别忘了 inode 这个隐形上限
如果业务是海量小文件(邮件、图片碎片、日志、缓存),容量没满也可能写不进去——inode 用完了。
df -i /data # 统计某个目录下文件数量(比 ls 快得多) find /data/cache -type f | wc -l # 格式化时增大 inode 密度(bytes-per-inode 越小,inode 越多) mkfs.ext4 -i 4096 /dev/sdb1 # 或直接指定 inode 数量 mkfs.ext4 -N 200000000 /dev/sdb1 # 查看已格式化文件系统的 inode 总数 tune2fs -l /dev/sdb1 | grep -i 'inode count'
ext4 的 inode 数量在格式化时就固定,事后无法增加(只能重新格式化)。所以小文件场景必须在建文件系统时规划。XFS 采用动态 inode 分配,不存在这个限制,这也是大文件量场景倾向 XFS 的原因之一。
二、IOPS 规划:容量够不代表性能够
这是第二个常见错误:买了一块 16TB 的大容量盘,容量完全够,但业务卡得要命。原因是大容量盘往往是 7200 转机械盘,随机 IOPS 只有几十到一百出头,而业务需要几千。
2.1 单盘 IOPS 的经验参考
| 介质类型 | 随机读 IOPS(经验量级) | 顺序吞吐(经验量级) | 适合场景 |
|---|---|---|---|
| 7200 转机械盘 | 约 75~100 | 约 150~200 MB/s | 归档、备份、冷数据 |
| 10000/15000 转 SAS | 约 150~200 | 约 200~250 MB/s | 中等压力业务 |
| SATA SSD | 数万级 | 约 400~550 MB/s | 通用业务、数据库 |
| NVMe SSD | 数万至数十万级 | 数 GB/s | 高并发数据库、AI 训练 |
上表为经验参考量级,实际值取决于具体介质、接口、队列深度与块大小,务必用 fio 实测后作为规划依据。
2.2 从容量需求反推盘数
关键公式:满足 IOPS 所需的盘数 = 业务峰值 IOPS ÷(单盘 IOPS ÷ 写惩罚)。
举例:业务峰值需要 3000 随机写 IOPS,采用 7200 转机械盘(单盘约 80 IOPS)做 RAID 10(写惩罚为 2)。则所需盘数 = 3000 ÷ (80 ÷ 2) = 3000 ÷ 40 = 75 块盘。而容量需求可能只要 4 块 4TB 盘就够。这就是典型的"容量富余、IOPS 枯竭"——也是大容量存储服务器最容易掉进的坑。此时正确做法是换用固态盘,而不是继续堆机械盘数量。
反过来,"IOPS 富余、容量枯竭"的情况则出现在小容量高性能盘上,此时应增加盘数或换更大容量介质。规划时两个约束都要算,取更严格的那一个作为最终配置。
# 用 fio 实测获得规划所需的基础数据
fio --name=randread --filename=/data/fio.test --ioengine=libaio --direct=1 \
--rw=randread --bs=4k --iodepth=32 --numjobs=4 --size=4G \
--runtime=120 --time_based --group_reporting
# 采集业务真实 IOPS 基线(sar 需开启 sysstat 历史采集)
sar -d -p 1 10
sar -d -f /var/log/sa/sa$(date +%d) | grep -Ei 'DEV|sd|vd|nvme'
# 实时观察
iostat -xmt 2
三、分层存储架构设计
把所有数据放在同一种介质上是成本和性能的双重浪费。合理的做法是按访问热度分层。
| 层级 | 数据特征 | 访问频率 | 推荐介质 | 冗余策略 |
|---|---|---|---|---|
| 热数据层 | 数据库文件、活跃业务数据、索引 | 持续高频随机读写 | NVMe / SATA SSD | RAID 10 + 实时同步副本 |
| 温数据层 | 近 30 天日志、近期上传文件、常用附件 | 每天数次 | SATA SSD 或 SAS 阵列 | RAID 5/6/10 |
| 冷数据层 | 历史归档、合规留存、历史备份 | 数月一次或基本不访问 | 大容量机械盘 / 对象存储归档 | 多副本或纠删码 |
| 备份层 | 备份集、快照 | 仅故障时 | 对象存储 / 异地机房 | 跨地域复制 + 版本控制 |
分层的关键在于要有明确的迁移规则,而不是靠人工判断。例如:日志在本地 SSD 上保留 7 天,7 天后自动打包转移到机械盘归档区,90 天后上传对象存储归档类型并删除本地副本。这类规则用 logrotate 加定时任务就能实现。
# logrotate 示例:保留 7 天压缩日志,超过则删除
cat /etc/logrotate.d/myapp
# /var/log/myapp/*.log {
# daily
# rotate 7
# compress
# delaycompress
# missingok
# notifempty
# sharedscripts
# postrotate
# systemctl reload myapp > /dev/null 2>&1 || true
# endscript
# }
# 手动触发一次验证(不要等它自动跑)
logrotate -d /etc/logrotate.d/myapp # 调试模式,只看不改
logrotate -f /etc/logrotate.d/myapp # 强制执行
# 归档冷数据的定时任务示例(crontab)
0 3 * * * find /data/logs -name '*.gz' -mtime +30 -exec mv {} /data/archive/ \;
0 4 * * 0 rclone move /data/archive remote:archive-bucket/ --min-age 90d --progress --log-file=/var/log/rclone-archive.log
四、目录与文件系统规划
大容量服务器上,目录结构的规划决定了后续运维的难度。
- 按生命周期分目录,而不是按业务分:
/data/hot、/data/warm、/data/cold分别挂不同介质的文件系统,迁移规则按目录走,清晰且易于自动化。 - 单目录下文件数控制在十万量级以内。目录内文件过多会导致
ls、find、备份遍历极慢。用哈希分片:/data/uploads/a/b/ab12cd34.jpg。 - 日志与数据分离。日志增长不可控且容易失控,务必放在独立文件系统上,避免日志写满导致数据库一起挂掉。
- 系统盘与数据盘分离。系统盘只装操作系统和应用,业务数据一律在数据盘,便于重装系统和迁移。
# 建议的目录结构 lsblk -f # / 系统盘(50-100GB,SSD) # /data/hot 热数据(SSD,RAID 10) # /data/warm 温数据(SAS/SSD) # /data/cold 冷数据(大容量机械盘) # /var/log 独立分区,防止日志写满系统盘 # 用 LVM 管理,为后续在线扩容留出余地 pvcreate /dev/sdb1 vgcreate vg_data /dev/sdb1 lvcreate -L 500G -n lv_hot vg_data mkfs.xfs /dev/vg_data/lv_hot mount /dev/vg_data/lv_hot /data/hot # 后续扩容:加新盘进卷组,再扩逻辑卷 pvcreate /dev/sdc1 vgextend vg_data /dev/sdc1 lvextend -L +200G /dev/vg_data/lv_hot xfs_growfs /data/hot # XFS 传挂载点 # 若是 ext4:resize2fs /dev/vg_data/lv_hot
LVM 的价值在于把"物理盘"和"逻辑卷"解耦:以后扩容不必关心数据在哪块盘上,加盘进卷组即可;替换老盘时用 pvmove 可以在线把数据从旧盘迁到新盘,业务不中断。
# 在线把数据从旧盘迁到新盘(替换硬件前的标准动作) pvmove /dev/sdb1 /dev/sdc1 vgreduce vg_data /dev/sdb1 pvremove /dev/sdb1
五、规划与实施步骤清单
- 盘点现状:
df -h、df -i、du --max-depth=1,同时检查是否有 deleted 未释放的文件。 - 测算增长:取 90 天窗口算日均增量,推算 1 年、3 年需求,按 70% 水位线反推规划容量。
- 测算 IOPS:用
sar -d取业务峰值 IOPS,结合写惩罚和单盘实测 IOPS 反推所需盘数。 - 取两个约束的交集:容量算出的盘数和 IOPS 算出的盘数,取较大值,再据此选介质类型(IOPS 约束远大于容量约束时,应换固态而不是堆机械盘)。
- 设计分层:按热度划分 hot/warm/cold,分别指定介质、冗余策略与迁移规则。
- 规划目录结构:按生命周期分目录,日志独立分区,单目录文件数做哈希分片。
- 用 LVM 建卷,为在线扩容留余地;格式化时按文件特征设置 inode 密度。
- 配置监控与告警:使用率 80% 预警、85% 告警;同时监控 inode 使用率、await、%util。
- 配置自动清理:logrotate + 归档迁移定时任务,并定期验证真的执行了。
- 做一次扩容演练:在测试环境完整走一遍加盘 → 扩卷 → 扩文件系统的流程,记录耗时。
- 写容量报告:每季度复核一次增长率,实际增长与预测偏差超过 30% 就重新规划。
小结与避坑建议
大容量服务器的存储规划,本质是三笔账:容量账(当前 + 增长 × 年限,除以水位线)、性能账(峰值 IOPS ÷ 单盘有效 IOPS = 所需盘数)、增长账(分层规则 + 自动清理 + 定期复核)。三笔账都算清楚,才能避免"上线即落后"。
避坑清单:
- 按当前占用买容量。这是最普遍的错误。至少按 3 年增长量 + 30% 余量规划。
- 只看容量不看 IOPS。一块 16TB 机械盘放数据库,容量满分、性能零分。
- 忽略 inode。小文件业务必须关注
df -i,ext4 的 inode 数量要在格式化时就定好。 - 等到 95% 才扩容。留出清理和迁移的时间窗口,80% 就该启动流程。
- 日志和数据挤在一个分区。日志失控是最常见的"磁盘写满"原因,必须隔离。
- 不使用 LVM。裸分区扩容的灵活性差很多,尤其是不确定未来增长形态时。
- 扩容后忘记扩文件系统。扩了分区不跑
resize2fs/xfs_growfs,df里看到的容量不会变,这是最常见的"扩容无效"投诉。 - 配置完定时任务不验证。logrotate 和归档脚本配置错误时不会报错,只会安静地不执行,直到某天磁盘写满。
- 没有容量趋势记录。没有历史数据就无法判断增长是否加速,也就无法提前扩容。
最后一个建议:把"扩容需要多长时间"作为架构指标之一。如果一次扩容要走审批、采购、到货、停机、迁移,耗时两周,那就应该把水位线定得更低(比如 60%),把扩容提前到半年之前启动。存储的规划不只是技术问题,更是时间管理问题。
本文为存储与硬盘管理系列,各项参考值为经验量级,请以实际环境的 fio 实测数据为准。
企业QQ咨询




