多台服务器共享文件用什么?一次电商站扩容实录
一个做得还不错的电商站,最初只用一台云服务器ECS撑起了商品展示、用户上传和订单处理。但随着访问量上涨,团队决定扩容到多台服务器分担压力,这时候遇到了一个新问题:用户上传的商品图片,怎么让所有服务器都能访问到?
场景描述:单机时代的隐患
最初架构很简单:一台ECS同时跑Web服务和文件存储,用户上传的图片直接存在本地磁盘。这种方式在单机时期没问题,但暴露出两个隐患:
1. 磁盘容量有上限,图片越积越多迟早不够用;2. 一旦要扩容多台服务器分担流量,新增的服务器读取不到老服务器本地的图片文件。
遇到的问题:扩容后图片显示不全
团队把Web服务扩容到3台ECS做负载均衡后,很快发现一个诡异现象:部分商品图片时有时无。排查发现,用户上传图片时请求被负载均衡分配到了某一台服务器,图片只存在那一台的本地磁盘上,其他两台服务器完全没有这份文件,用户刷新页面碰到不同服务器就会看到图片时而正常时而404。
解决方案:引入NAS做共享存储
问题的根源是本地磁盘不能跨服务器共享,团队最终选择文件存储NAS作为共享层,具体步骤如下:
- 创建NAS文件系统:在控制台创建一个通用型NAS实例,选择与ECS相同的可用区
- 挂载到所有ECS:3台服务器分别执行挂载命令,将NAS挂载到统一的本地目录(如/mnt/uploads)
- 迁移历史文件:把原来分散在各服务器本地的图片统一拷贝到NAS挂载目录
- 修改上传逻辑:将应用的文件上传路径指向NAS挂载目录,不再写本地磁盘
- Web服务器: 3台ECS负载均衡
- 共享存储: NAS通用型,按容量计费
- 迁移耗时: 约2小时(含数据拷贝)
效果验证:问题彻底解决
切换到NAS共享存储后,团队做了三项验证:
| 验证项 | 切换前 | 切换后 |
|---|---|---|
| 图片显示一致性 | 约30%概率丢失 | 3台服务器完全一致 |
| 新增服务器接入 | 需手动同步文件 | 挂载即可直接读取 |
| 磁盘容量管理 | 各自独立,容易不均衡 | 统一容量池,按需扩展 |
后续再扩容第4、第5台服务器时,只需要执行挂载命令,不需要再做任何文件同步操作,扩容效率明显提升。
常见问题
NAS和OSS都能做共享存储,该选哪个?
NAS更适合需要像本地磁盘一样挂载读写的场景,比如多服务器共享的上传目录;OSS更适合海量非结构化文件的存储和分发,通常搭配CDN对外提供访问,两者定位不同,也可以配合使用。
NAS挂载会不会影响读写性能?
NAS是网络文件系统,读写延迟略高于本地磁盘,但对于图片这类中小文件的存储场景,实际体验差异不大,通用型规格已能满足大部分中小型网站需求。
迁移到NAS需要停机吗?
不一定需要完全停机,可以先挂载NAS并同步历史文件,验证无误后再切换应用的写入路径,实现平滑过渡,减少对用户的影响。
小型网站有必要现在就上NAS吗?
如果确定只用一台服务器,暂时不需要;但如果已经规划好后续要扩容多台服务器,提前用NAS做共享存储可以避免像本文场景中那样返工迁移。
总结
这次电商站扩容的复盘说明,多台服务器共享文件的问题不能靠本地磁盘解决,NAS作为统一的共享存储层,既能解决图片丢失的问题,也让后续扩容变得更简单。如果你的网站也在规划从单机走向多机架构,NAS是值得提前准备的一环。