原子方式部署网站更新?

时间:2016-06-28 09:10:49

标签: web-deployment atomic swap file-rename updating

将更改后的文件上传到实时网络服务器时,如何在任何特定时刻执行,整个文件集处于旧状态或新状态,但介于两者之间?

“介于两者之间”是指一些旧文件和一些新文件,或者某些特定文件被中途覆盖,等等。

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

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

mv foo foo-old; mv bar foo;

但是这样仍然存在 tiny 小数秒,其中foo/不存在,当旧目录刚重命名并且新目录即将到来时。< / p>

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

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

1 个答案:

答案 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个单独的主机(物理或虚拟),并将每个新用户从定义的时刻发送到包含升级后网站的新主机。