上一篇 下一篇 分享链接 返回 返回顶部

TB级海外短视频素材库部署香港服务器,如何按并发与读写比例规划存储配置?

发布人:Minchunlin 发布时间:2026-10-05 13:08 阅读量:2

TB级海外短视频素材库部署在香港服务器上时,存储不能只按“现有文件总大小”购买。更可靠的做法是先把高峰并发、视频读写比例、请求类型、每日新增量和保留周期换算成可用容量、吞吐量、IOPS与网络带宽,再给未来增长和故障处理留出空间。

例如,当前已有12TB原始素材,每天新增约300GB,计划至少覆盖未来90天,衍生预览文件按原始素材的15%估算,上传临时文件和转码中间文件按10%估算,存储长期保持20%空闲,则在线可用容量约为:

从业务场景反推配置配图

  • 现有原始素材:12TB
  • 90天新增素材:0.3TB × 90 = 27TB
  • 预览、缩略图及其他衍生文件:约5.85TB
  • 临时文件和中间文件:约3.9TB
  • 规划前合计:48.75TB
  • 加上20%空闲空间后:48.75 ÷ 0.8 ≈ 60.94TB

因此,这类场景不能只准备50TB可用空间,至少应按约61TB可用容量进行规划,并另外核对服务商展示的是“可用容量”还是“原始容量”。如果还需要在同一环境中保留备份副本,备份容量应单独计算,不能把备份空间误认为业务可用余量。

先把业务负载拆成四组数据

容量规划前,建议把素材站的访问拆成浏览、预览、完整下载和上传写入四类。四类操作对存储的压力并不相同。

1. 浏览与元数据请求

分类页、素材详情页、标签查询和权限校验通常是大量小请求,主要消耗:

  • 元数据存储的随机读取能力;
  • 文件系统目录和索引的响应时间;
  • 应用进程、内存和连接数;
  • 缩略图、封面和低码率预览文件的读取能力。

这部分请求数可能很高,但单次传输量很小。即使视频文件总容量达到几十TB,若缩略图和目录结构规划不当,也可能先出现IOPS不足或目录响应变慢。

2. 预览请求

预览一般会产生连续读取,也可能使用HTTP Range分段请求。一个用户看一次视频,未必只对应一次文件请求,拖动进度条、断点续传和播放器分片都会增加请求次数。

规划时需要分别记录:

  • 预览请求数,即每秒请求数;
  • 单次请求平均传输量;
  • Range请求占比;
  • 同一素材被反复访问的比例;
  • 预览文件是否与原始素材放在同一存储路径。

3. 完整下载请求

完整下载是最容易把网络出口和存储吞吐同时推高的业务动作。在线人数不等于下载并发,真正需要计算的是同时处于数据传输状态的连接数。

例如:

用请求量和并发量计算性能需求配图

  • 高峰同时下载连接:120个;
  • 每个下载连接平均传输速度:4MB/s;
  • 预计读取吞吐:120 × 4MB/s = 480MB/s;
  • 换算网络速率:480MB/s × 8 = 3840Mbps,约3.84Gbps。

如果同时还有20个上传连接,每个上传速度约2MB/s,写入吞吐约为40MB/s,网络方向上还需要额外承受约320Mbps的上传流量。此时,存储读吞吐、网络出口和连接处理能力都不能按“普通网页访问”估算。

4. 上传与后台写入

上传写入通常具有突发性。素材批量导入、团队集中上传或自动同步可能在短时间内产生大量写入。

需要单独记录:

  • 每天新增素材量;
  • 高峰每分钟或每小时的写入量;
  • 平均文件大小和P95文件大小;
  • 上传失败后的重试比例;
  • 是否需要临时文件、校验文件和转码中间文件;
  • 上传完成后是否立即对外提供下载。

读写比例应同时使用“字节比例”和“操作比例”两个口径。比如,大文件下载可能占总字节量的95%,但缩略图和元数据请求可能占总操作数的90%。只看其中一个比例,都会低估一类负载。

用请求量和并发量计算性能需求

并发数不等于每秒请求数

可以用下面两个关系建立初步估算:

  • 并发传输数 ≈ 每秒新请求数 × 单次请求持续时间;
  • 吞吐量 ≈ 每秒请求数 × 单次请求平均传输量。

例如,某类视频Range请求每秒12次,每次平均读取50MB,则:

  • 存储读取量:12 × 50MB = 600MB/s;
  • 网络速率:600MB/s × 8 = 4800Mbps,约4.8Gbps。

这里的MB/s是每秒兆字节,Mbps是每秒兆比特,换算时需要乘以8。若用GB计算,十进制规划中应先将GB换成MB,或者直接使用“GB/s × 8 × 1000 = Mbps”的方式,不能把MB和Mb混用。

使用峰值和P95,而不是日均值

日均流量只能用于容量增长估算,不能直接用来选择性能配置。性能规划至少需要观察:

指标建议采用的口径主要影响
在线会话数高峰同时打开页面的用户数应用连接、内存
下载并发数同时传输视频的连接数网络出口、连续读吞吐
请求速率高峰RPS及P95IOPS、应用处理能力
平均文件大小按原始、预览、缩略图分别统计单次吞吐、缓存
读写比例按字节和操作数分别统计存储读写能力
每日新增量按日均与高峰日分别统计容量增长、写入突发
Range占比Range请求数占视频请求数比例请求次数、随机读取
失败重试率上传和下载分别统计额外带宽、重复写入

如果尚未上线,可以先采用一个明确的参考场景进行压测,例如:

  • 页面和元数据请求:100RPS;
  • 视频预览与下载请求:12RPS;
  • 高峰下载连接:120个;
  • 高峰上传连接:20个;
  • 读写字节比例:约90:10;
  • 日均新增素材:300GB;
  • 计划增长观察周期:90天;
  • 高峰负载相对日均值:按3至5倍预留。

这些数字是容量推演的示例,不代表某种香港服务器配置的官方承载保证。上线后应使用真实访问日志替换估算值。

把数据规模映射到存储容量

容量公式

可以使用下面的方式计算业务所需可用容量:

可用容量目标 = 原始素材 + 衍生文件 + 临时空间 + 规划周期内新增量 + 回收缓冲,再除以目标使用率

其中:

  • 原始素材:当前仍需在线提供服务的源文件;
  • 衍生文件:缩略图、预览文件、封面和索引相关文件;
  • 临时空间:上传未完成文件、处理中间文件和失败重试文件;
  • 规划周期内新增量:每日新增量乘以规划天数;
  • 回收缓冲:误删恢复、重新生成和短期重复文件所需空间;
  • 目标使用率:建议不要长期超过80%,高频写入场景可按70%至75%规划。

如果素材有明确的保留期限,应把过期清理延迟算进去。例如设置保留90天,但实际清理任务每天运行一次,且失败后可能延迟两天,就应额外为至少两天新增量保留空间。

容量口径要统一

规划时需要统一以下单位:

  • 采购或服务商控制台可能使用十进制TB;
  • Linux系统常以TiB显示,1TiB约等于1.1TB;
  • 文件大小常以GB、MB表示;
  • 传输速率常以Mbps、Gbps表示;
  • 存储吞吐则常以MB/s或GB/s表示。

如果控制台显示的是原始容量,而业务需要的是可用容量,还要扣除冗余、文件系统、快照和预留空间。不要把“标称100TB”直接当作“可写100TB”。

参考容量档位

下面是便于初步沟通的参考档位。表中的吞吐和并发是规划目标区间,不是具体产品的官方规格,也不替代实际压测。

场景建议可用容量高峰下载并发典型读写字节比例规划读取吞吐参考CPU与内存
小规模素材站5至10TB30至5080:20至90:10150至250MB/s4至8 vCPU,16至32GB
中等素材站20至30TB80至15090:10左右300至600MB/s8至16 vCPU,32至64GB
高并发TB级素材站60至100TB200至30090:10至95:5600MB/s至1GB/s16至32 vCPU,64至128GB

如果业务主要是大文件连续下载,读取吞吐比IOPS更重要;如果素材包含大量小预览图、字幕文件和元数据,IOPS、目录响应和内存缓存的权重会明显上升。不能因为表面读写比例是90:10,就认为所有存储只需要关注顺序读取。

按业务用途划分存储空间

TB级素材库不建议把系统文件、原始素材、上传临时文件和日志全部写入同一个逻辑目录。至少应在路径和配额层面划分用途:

/srv/materials/
├── originals/       # 原始视频和源素材
├── previews/        # 预览文件、封面和缩略图
├── incoming/        # 上传中的临时文件
├── processing/      # 处理中间文件
├── quarantine/      # 校验失败或待人工处理的文件
└── logs/            # 业务相关日志,容量单独限制

这种划分不是为了增加目录数量,而是为了避免临时文件或日志突然增长,挤占正式素材的空间。

上传采用临时文件加原子切换

上传未完成时,不应直接使用正式文件名,否则下载端可能读到不完整的视频。推荐流程是:

  1. 文件先写入incoming/;
  2. 上传完成后校验文件大小、哈希或分片完整性;
  3. 校验通过后移动到originals/;
  4. 索引或数据库只在移动完成后将文件标记为可用;
  5. 校验失败的文件进入quarantine/,按保留时间清理。

同一存储卷内的重命名或移动通常比跨卷复制更快,但跨卷移动可能变成完整复制操作。因此,如果原始素材和临时空间不在同一个卷上,需要把复制时间和额外写入量纳入写入峰值。

控制单目录文件数量

不要把数十万甚至数百万个素材文件直接放在同一个目录下。可以按日期、项目编号或哈希前缀分层,例如:

originals/2026/10/ab/ab31f0...mp4
previews/2026/10/ab/ab31f0...jpg

目录分层可以降低目录扫描和批量维护压力,但不会替代数据库索引。文件名、素材ID、所属项目、文件大小和校验值仍应由业务索引维护。

在香港服务器上落地存储路径

以下命令以常见Linux环境为例,只用于核对和挂载已有数据卷,不包含格式化操作。实际操作前必须确认设备名称,不能直接把示例设备名复制到生产环境。

1. 检查设备与现有挂载

lsblk -f
df -hT
df -ih
findmnt

重点确认:

  • 数据卷的设备名称;
  • 文件系统类型;
  • 是否已经挂载到其他目录;
  • 当前可用容量;
  • inode是否接近耗尽;
  • 是否存在同名挂载点。

如果lsblk -f显示的设备已经包含业务数据,不要执行格式化、分区重建或强制覆盖操作。

2. 创建挂载点并挂载

sudo mkdir -p /srv/materials
sudo blkid /dev/<实际数据设备>
sudo mount /dev/<实际数据设备> /srv/materials
findmnt /srv/materials
df -hT /srv/materials

<实际数据设备>必须替换为核验后的设备,例如控制台或lsblk显示的实际路径。挂载成功后,应确认findmnt返回的设备确实是数据卷,而不是系统盘上的普通目录。

如果需要写入/etc/fstab实现重启自动挂载,先备份原文件:

sudo cp -a /etc/fstab /etc/fstab.bak.$(date +%Y%m%d%H%M%S)
sudo blkid /dev/<实际数据设备>

然后根据blkid返回的实际UUID和文件系统类型添加配置,示例格式如下:

UUID=<实际UUID> /srv/materials <实际文件系统类型> defaults 0 2

修改后不要直接重启,先执行:

sudo mount -a
findmnt /srv/materials
df -hT /srv/materials

数据卷不建议在没有应用层挂载检查的情况下简单使用nofail。如果数据卷挂载失败而服务仍然启动,程序可能把文件写入系统盘上的空目录,造成“看起来服务正常、实际数据写错位置”的风险。

3. 创建业务目录并检查写入位置

sudo mkdir -p \
  /srv/materials/originals \
  /srv/materials/previews \
  /srv/materials/incoming \
  /srv/materials/processing \
  /srv/materials/quarantine \
  /srv/materials/logs

findmnt /srv/materials
df -hT /srv/materials

应用启动前,应增加以下检查:

  • /srv/materials必须处于挂载状态;
  • 可用空间不得低于预设阈值;
  • 临时目录和正式目录必须位于预期存储卷;
  • 上传账号只能写入允许的目录;
  • 分发进程只能读取正式素材目录;
  • 临时目录不能被公开访问。

如果没有应用层检查,至少在服务启动脚本或健康检查中确认挂载点的设备UUID与预期一致。

分发层的关键配置原则

如果现有分发层使用Nginx,可以把静态素材目录映射到单独路径。下面是结构示例,正式上线前应按当前Nginx版本和权限模型验证:

server {
    listen 80;
    server_name assets.example.com;

    location /media/ {
        alias /srv/materials/originals/;
        sendfile on;
        tcp_nopush on;
        max_ranges 1;
    }

    location /preview/ {
        alias /srv/materials/previews/;
        sendfile on;
        tcp_nopush on;
    }
}

配置重点包括:

  • alias目录末尾和URL路径保持正确对应;
  • 正式素材目录只提供读取,不直接暴露incoming和processing;
  • 是否允许多Range请求,应根据播放器和业务需求验证;
  • 访问权限、签名URL或登录校验不能因静态映射而被绕过;
  • 日志不能无限写入素材卷。

修改配置前先保存原文件并检查语法:

sudo cp -a /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak.$(date +%Y%m%d%H%M%S)
sudo nginx -t

语法检查通过后,再按现有服务管理方式平滑加载。若检查失败,不要直接覆盖原配置;恢复备份后重新执行nginx -t,确认通过后再加载原配置。

用压测验证容量是否够用

先验证空间和文件系统

上线前先确认容量、inode和挂载状态:

df -hT /srv/materials
df -ih /srv/materials
findmnt /srv/materials

成功标准可以设为:

  • 可用空间达到规划目标;
  • 长期空闲空间不低于20%;
  • inode使用率处于安全区间;
  • 正式素材、临时文件和日志路径都位于预期卷;
  • 重启或重新挂载后路径不发生漂移。

再验证顺序读取与写入能力

fio测试会产生实际读写,应只在独立测试目录、测试卷或已安排维护窗口时执行。不要在正式素材目录中直接运行写入测试,也不要让测试文件与真实文件同名。

示例:

sudo mkdir -p /srv/materials/.bench
sudo fio \
  --name=seq-write \
  --filename=/srv/materials/.bench/test.bin \
  --size=4G \
  --rw=write \
  --bs=1M \
  --iodepth=16 \
  --direct=1 \
  --runtime=60 \
  --time_based \
  --group_reporting

sudo fio \
  --name=seq-read \
  --filename=/srv/materials/.bench/test.bin \
  --size=4G \
  --rw=read \
  --bs=1M \
  --iodepth=16 \
  --direct=1 \
  --runtime=60 \
  --time_based \
  --group_reporting

确认测试已经结束且文件确实属于测试目录后,再删除测试文件:

sudo rm -f /srv/materials/.bench/test.bin
sudo rmdir /srv/materials/.bench

这组命令只适用于可删除的测试文件。若测试目录中存在真实业务文件,不要执行删除命令。测试结果应同时记录吞吐、IOPS、平均延迟和P95延迟,不能只看一个MB/s数字。

通过真实访问路径验证

准备一个非敏感的测试素材,使用实际分发域名访问:

curl -o /dev/null -sS \
  -w 'status=%{http_code} size=%{size_download} speed=%{speed_download}B/s time=%{time_total}\n' \
  'http://assets.example.com/media/sample.mp4'

验证时应逐步增加并发,例如10、30、60、100个连接,每一档保持足够时间观察。正式业务已经运行时,不要直接对生产路径进行高并发压测,应先使用隔离测试文件、低峰窗口和明确的停止条件。

同时观察系统指标:

iostat -xz 1 10
vmstat 1 10
df -hT /srv/materials
ss -s

重点关注:

用压测验证容量是否够用配图

  • 存储设备利用率是否长期接近100%;
  • await是否随并发快速上升;
  • CPU是否被iowait占用;
  • 网络发送速率是否达到预期;
  • 可用空间是否因临时文件快速下降;
  • 连接数增长是否伴随错误率上升。

一个较稳妥的验收参考是:达到目标并发后,读取吞吐仍有约20%的余量,存储设备没有持续满负载,P95响应时间没有随着并发阶梯式恶化,临时空间在测试结束后能够回收,HTTP错误率保持在业务设定范围内。具体阈值应以素材站对下载速度和用户体验的要求为准。

常见瓶颈与对应调整

容量足够,但下载速度不稳定

如果空间还有很多,读取吞吐和网络出口却接近上限,问题通常不在容量,而在吞吐能力或并发控制。此时应分别对比:

  • 存储读取MB/s;
  • 服务器网络发送Mbps;
  • 单连接平均速度;
  • 下载连接数;
  • HTTP响应和重试次数。

存储读取很低但网络已满,优先检查出口带宽和并发限速;网络还有余量但存储设备的读取队列很长,则应检查存储吞吐和读请求模式。

大文件下载正常,小文件预览变慢

这通常说明顺序读取能力不是主要瓶颈,随机读取、文件数量、目录结构或元数据索引出现压力。可以采取:

  • 将缩略图与原始视频分开统计和规划;
  • 减少单目录文件数量;
  • 为预览文件设置独立空间配额;
  • 检查inode使用率;
  • 观察IOPS和平均延迟,而不只看MB/s;
  • 避免在高峰期执行大规模目录扫描、批量校验和重复生成。

写入比例上升后,读取延迟明显增加

上传批次和下载高峰共用同一存储卷时,写入队列可能挤占读取资源。可按以下顺序处理:

  1. 确认上传临时文件是否在高峰期集中增长;
  2. 分别统计正式素材写入、临时文件写入和日志写入;
  3. 设置临时目录容量上限;
  4. 将上传完成动作与素材公开动作分开;
  5. 在业务允许时错开批量导入与下载高峰;
  6. 只有确认写入队列持续影响读取后,再增加存储吞吐或拆分卷。

可用容量下降很快

不要只查看正式素材目录,还要检查:

du -xhd1 /srv/materials | sort -h
df -hT /srv/materials

如果du统计量明显小于df已用空间,可能存在已删除但仍被进程打开的文件。此时应检查进程文件句柄,并通过应用自身的日志轮换、文件关闭或平滑重启处理,不要直接删除正在使用的文件。

读取量没有增加,但服务器负载升高

这类情况可能由目录扫描、校验任务、日志写入、上传重试或大量小文件请求造成。需要同时看请求数、IOPS、iowait和文件数量。若MB/s不高而IOPS和延迟明显上升,通常应优先优化小文件访问和后台任务,而不是单纯增加容量。

什么时候应该扩容

可以用以下指标触发扩容或重新规划,而不是等到磁盘写满才处理:

  • 可用空间连续多个观察周期低于20%;
  • 按最近30天增长速度计算,未来60至90天无法容纳新增素材;
  • 临时文件占用正式素材空间的比例持续上升;
  • 高峰读取吞吐达到规划上限的80%左右;
  • 写入队列在上传高峰持续堆积;
  • P95存储延迟随并发增加而明显恶化;
  • inode使用率接近预设阈值;
  • 下载网络流量接近出口上限,但存储仍有余量;
  • 读写比例从90:10变为80:20甚至更低,且这种变化持续存在;
  • 预览、缩略图和原始视频的增长速度明显不同。

扩容方式应与瓶颈对应。空间不足时增加可用容量;吞吐不足时提高存储读写能力;小文件请求过多时优化目录和预览文件组织;网络达到上限时调整并发、文件传输策略或出口容量。单纯增加TB数,无法解决网络或IOPS瓶颈。

变更失败时的回滚边界

存储变更前,先完成以下动作:

  • 记录当前挂载点、设备UUID和文件系统类型;
  • 备份挂载配置和分发层配置;
  • 确认最近一次备份可以读取;
  • 记录原始素材、预览文件和临时目录的当前容量;
  • 预留维护窗口,暂停批量上传和大规模迁移;
  • 明确回滚时禁止删除哪些目录和文件。

如果自动挂载失败,应先停止依赖该路径写入的业务进程,检查:

findmnt /srv/materials
sudo mount -a
journalctl -b | tail -n 100
df -hT

如果发现挂载到了错误设备,不要继续写入,也不要清理挂载点下的文件。恢复备份后的挂载配置,重新确认UUID和文件系统类型,再进行手动挂载。

如果是分发层配置失败,则恢复备份文件并再次检查:

sudo cp -a /etc/nginx/nginx.conf.bak.<时间戳> /etc/nginx/nginx.conf
sudo nginx -t

只有语法检查通过,且确认素材目录权限和挂载状态正常后,才恢复分发服务。

如果是数据迁移过程中失败,保留原目录和目标目录,不要立即执行覆盖式同步或删除原数据。先核对已复制文件数量、总容量和校验结果;确认目标数据完整后,再切换正式路径。回滚本质上是把分发路径指回原挂载点或原目录,而不是删除新旧数据来“重新开始”。

对TB级素材库而言,合适的香港服务器存储配置应由五个数字共同决定:高峰下载并发、峰值请求量、读写字节比例、当前与未来数据规模、以及存储和网络的实际瓶颈。容量至少按未来增长周期和20%左右空闲空间规划,性能则以P95请求和高峰吞吐验收。只有当空间、IOPS、吞吐、网络或延迟中的某项达到触发条件时再针对性升级,才能避免容量买够了却分发变慢,或者性能堆高了却很快被素材增长填满。

目录结构
全文