多台服务器文件共享存储

场景:这里以大文件上传为假设场景。大文件上传时,前端会将一个文件进行切片,然后将每个切片进行上传,这个时候会出现一个问题。如果后端有多台机器,那么文件就会上传到不同的机器上面。到最终文件上传完毕后,后端合并文件切片的时候,由于文件切片分散到了不同的机器上时,就会造成合并困难

✅ 目标

让多台后端服务器都能访问同一个文件目录,

不管前端上传到哪台机器,文件都能存放在同一地方。


🧱 实现思路

1️⃣ 选择一台服务器作为"文件中心"

假设有三台机器:

复制代码
serverA(应用)
serverB(应用)
serverC(存储)

其中 serverC 专门用来存储所有上传的文件(你也可以选任意一台机器充当这个角色)。


2️⃣ 在 serverC 上创建共享目录

比如:

复制代码
mkdir -p /data/uploads

然后安装 NFS 服务:

复制代码
sudo apt install nfs-kernel-server

编辑配置文件 /etc/exports

复制代码
/data/uploads 192.168.1.0/24(rw,sync,no_subtree_check)

允许局域网内其他机器访问 /data/uploads

重新加载 NFS 配置:

复制代码
exportfs -ra

3️⃣ 在其他机器(serverA、serverB)上挂载这个共享目录

复制代码
sudo apt install nfs-common
sudo mount -t nfs 192.168.1.30:/data/uploads /mnt/uploads

(假设 serverC 的 IP 是 192.168.1.30)

这样,/mnt/uploads 实际上指向 serverC 上的 /data/uploads


4️⃣ 修改你的上传路径

无论是 A 还是 B:

  • 上传的文件路径统一写到 /mnt/uploads/<fileHash>/<chunkIndex>
  • 合并时直接在该路径下进行;
  • 不需要关心是哪台机器接收了分片。

5️⃣ (可选)设置开机自动挂载

编辑 /etc/fstab

复制代码
192.168.1.30:/data/uploads /mnt/uploads nfs defaults 0 0

✅ 优点

  • 🚀 简单、稳定;
  • 💾 各服务器共享一份真实文件;
  • 🔄 合并逻辑无需改动;
  • 🔧 不用改前端;
  • 🔐 可用权限控制和 quota 管理;

⚠️ 注意事项

|---------|----------------------------------------|
| 项目 | 建议 |
| ⚙️ 性能 | NFS 的写入速度比本地盘略慢,但对大文件上传影响不大(一般瓶颈在网络上)。 |
| 🔒 权限 | 保证 NFS 目录对应用服务进程有写权限。 |
| 🔄 同步问题 | NFS 是实时共享的,不需要你手动同步。 |
| 🧹 清理 | 上传临时文件可以设置 cron 定期清理旧文件。 |


💡 实战例子

假设你后端保存上传文件的代码是这样的:

复制代码
const savePath = `/mnt/uploads/${fileHash}`;
fs.mkdirSync(savePath, { recursive: true });
fs.writeFileSync(`${savePath}/${chunkIndex}`, chunkBuffer);

那无论这个接口在哪台服务器上被调用,

文件最终都会写入同一个共享目录中 👍。


✅ 总结一句话

"通过挂载虚拟目录(NFS/SMB/GlusterFS)让所有应用服务器共享同一个文件存储路径,这样大文件分片上传时,无论落到哪台机器,最后都能在同一地方被合并。"

相关推荐
Bony-41 分钟前
Go语言完全学习指南 - 从基础到精通------语言基础篇
服务器·开发语言·golang
阿巴~阿巴~1 小时前
线程安全单例模式与懒汉线程池的实现与优化
linux·服务器·单例模式·线程池·饿汉模式·懒汉模式·静态方法
大隐隐于野1 小时前
tcp 丢包分析
linux·服务器·网络
天若有情6731 小时前
【java EE】IDEA 中创建或迁移 Spring 或 Java EE 项目的核心步骤和注意事项
后端·spring·java-ee·intellij-idea
Broken Arrows2 小时前
在Linux系统中,top命令的显示参数详解
linux·运维·服务器
APIshop2 小时前
PHP:一种强大的服务器端脚本语言
服务器·php
大鱼七成饱3 小时前
💥 从崩溃到稳定:我踩过的 Rust Tokio 线程池坑(含代码示例)
后端
喵个咪3 小时前
开箱即用的GO后台管理系统 Kratos Admin - 站内信
后端·微服务·go
韩立学长3 小时前
基于Springboot的旧物公益捐赠管理系统3726v22v(程序、源码、数据库、调试部署方案及开发环境)系统界面展示及获取方式置于文档末尾,可供参考。
数据库·spring boot·后端
Dyan_csdn4 小时前
springboot系统设计选题3
java·spring boot·后端