将更改的文件上传到实时网络服务器时,如何在任何给定时刻强制我的整个文件集处于旧状态或新状态,但绝不会处于两者之间?
“中间”是指一些旧文件和一些新文件,或者某些特定文件被中途覆盖,等等。
假设我的实时网络服务器上有一个名为 foo/
的目录,其中包含框架或一堆脚本文件(包括彼此),并且我需要同时替换一大堆文件 。我将其称为“原子更新”。
我能得到的最接近的是将我的新 foo/
目录(包含新文件)上传到不同的名称,例如bar/
,然后在网络服务器上的 shell 上执行:
mv foo foo-old; mv bar foo;
但是这样,当旧目录刚刚被重命名并且新目录被重命名时,仍有一小部分时间 foo/
不存在。即将。
是否有 100% 正确的方法?我想我需要某种“原子交换”,将两个目录名称重命名或交换为文件系统级别上的单个原子操作。
如果它与操作系统相关:我正在使用运行 CentOS 的网络服务器并获得 SSH 访问权限。
最佳答案
近原子
实现近原子目录更改的最简单方法是使用符号链接(symbolic link)作为 Web 根目录,您可以在升级时将其重新指向不同的位置。
$ mkdir old
$ mkdir new
$ ln -s old live
$ ls -l
live -> old
new
old
...
$ ln -snf new live
live -> new
new
old
更改符号链接(symbolic link)的目标实际上是内部的两步操作,unlink
后面是 symlink
。
原子
目录的原子更改可以通过创建指向新目录的辅助符号链接(symbolic link),然后将新符号链接(symbolic link)重命名为旧符号链接(symbolic link)来实现。
$ mkdir old new
$ ln -s old live
$ ln -s new live_new
$ mv -fT live_new live
mv
命令将使用单个原子操作(rename
)来用新符号链接(symbolic link)覆盖旧符号链接(symbolic link)。
网络层原子
使用 2 个独立的主机(物理或虚拟),并将每个新用户从定义的时刻及时路由到包含升级网站的新主机。
关于web-deployment - 部署网站更新的原子方式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38071870/