将更改后的文件上传到实时网络服务器时,如何在任何特定时刻执行,整个文件集处于旧状态或新状态,但介于两者之间?
“介于两者之间”是指一些旧文件和一些新文件,或者某些特定文件被中途覆盖,等等。
假设我的实时网络服务器上有一个名为foo/
的目录,其中包含一个框架或一堆脚本文件,包括彼此,我需要同时替换一大堆文件 。我称之为'原子更新'。
我最接近的是将我的新foo/
目录(包含新文件)上传到其他名称,例如bar/
,然后在网络服务器上的shell上执行:
mv foo foo-old; mv bar foo;
但是这样仍然存在 tiny 小数秒,其中foo/
不存在,当旧目录刚重命名并且新目录即将到来时。< / p>
有100%正确的方法吗?我想我需要某种“原子交换”,将两个目录名称重命名或交换为文件系统级别的单个原子操作。
如果它依赖于操作系统:我正在使用运行CentOS的网络服务器并获得SSH访问权限。
答案 0 :(得分:1)
实现近原子目录更改的最简单方法是使用符号链接作为您的Web根目录,您可以在升级时重新指向其他位置。
$ mkdir old
$ mkdir new
$ ln -s old live
$ ls -l
live -> old
new
old
...
$ ln -snf new live
live -> new
new
old
更改符号链接的目标实际上是内部的两步操作,unlink
后跟symlink
。
目录的原子更改可以通过创建指向新目录的辅助符号链接,然后将新的符号链接重命名为旧的符号链接来实现。
$ mkdir old new
$ ln -s old live
$ ln -s new live_new
$ mv -fT live_new live
mv
命令将使用单个原子操作(rename
)用新的符号链接覆盖旧的符号链接。
使用2个单独的主机(物理或虚拟),并将每个新用户从定义的时刻发送到包含升级后网站的新主机。