部署网站更新的原子方式?

atomic way of deploying website updates?

将更改的文件上传到实时网络服务器时,我如何在任何给定时刻强制执行,我的 整个 文件集要么处于旧状态,要么处于新状态,但从来没有什么在两者之间?

'in between' 我的意思是一些旧文件和一些新文件,或者某些特定文件被中途覆盖,等等。

假设我的实时网络服务器上有一个名为 foo/ 的目录,其中包含一个框架或一堆脚本文件,包括 eachother,我需要同时替换一大堆文件 。我称之为 'atomic update'。

我能得到的最接近的是将我的新 foo/ 目录(包含新文件)上传到不同的名称,例如bar/,然后在网络服务器上的 shell 我做的是:

mv foo foo-old; mv bar foo;

但是这样仍然有 tiny 秒的一小部分 foo/ 不存在,当旧目录刚刚重命名并且新目录即将.

是否有 100% 正确的方法?我想我需要某种 'atomic swap',将两个目录名称重命名或交换为文件系统级别上的单个原子操作。

如果它 OS 依赖:我正在使用网络服务器 运行 CentOS 并获得 SSH 访问权限。

近原子

实现近原子目录更改的最简单方法是使用符号link作为您的网络根目录,您可以将其重新指向升级时位置不同

$ mkdir old
$ mkdir new
$ ln -s old live
$ ls -l
live -> old
new
old

...

$ ln -snf new live
live -> new
new
old

更改符号 link 的目标在内部实际上是一个 2 步操作,unlink 其次是 symlink

原子

通过创建指向新目录的辅助符号 link,然后将新符号 link 重命名为旧符号 link,可以实现目录的原子更改.

$ mkdir old new
$ ln -s old live
$ ln -s new live_new
$ mv -fT live_new live

mv 命令将使用单个原子操作 (rename) 将旧的符号 link 覆盖为新的。

网络层原子

使用 2 个独立的主机(物理或虚拟)并将每个新用户从定义的时间及时路由到包含升级网站的新主机。