背景:最近在项目开发中出现一个新需求。以前项目是单节点,所以用户上传的文件及资料都在一个服务器节点(以下简称A节点)上,此时用户资料的上传及下载没有任何问题。不过因为用户量的增大,单节点有点不够看了,于是又启动了一个服务节点(以下简称B节点),并做好了负载均衡。这时候问题来了。
由于以前单个节点时,用户都在A节点访问,导致所有的文件都在A节点上。现在再多加了B节点,并且做了负载。那么当用户再次访问系统时分配到了B节点。这时,用户想要下载文件会报错,因为B节点上没有A节点的文件。同理,当用户在B节点上传的文件,那么A节点中不会存在。
解决方法很简单,添加一个文件服务器(NFS)便可。将用户上传的文件进行统一管理,只需要将A节点和B节点的文件存放路径和NFS的文件路径做一个挂载。但,当两个服务节点挂载完成后问题出现了。。。
在通过web应用上传时,日志显示文件上传成功,但是在NFS中并没有上传成功的文件。将节点解除挂载后,文件出现在了服务节点A的文件存放路径中。
解决方案:最后通过重启docker解决了该问题。
猜测原因:docker 可以看作是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数。其特点是不包含任何动态数据,其内容在构建之后也不会被改变。所以在文件服务器挂载后到应用服务器节点后,docker需要重新启动,让上传路径重新加载一下。
不知道这个猜测是否合理,有不同观点的可以讨论一下。