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

标签 web-deployment atomic swap file-rename updating

将更改的文件上传到实时网络服务器时,如何在任何给定时刻强制我的整个文件集处于旧状态或新状态,但绝不会处于两者之间?

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

假设我的实时网络服务器上有一个名为 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/

相关文章:

bash - 交换不同长度字符串中特定位置的字符

java - 新部署给出嵌套异常是 java.lang.NoClassDefFoundError : org/postgresql/core/types/PGLong

html - 我有这个简单的响应式网站正在运行,但我有一个问题

asp.net-mvc - Bower、Grunt 和 Yeoman 如何适应 Visual Studio .NET 工作流?

deployment - 部署 WAR 文件时出错

.net - .NET 的线程安全缓存库

python - 什么是使用交换。 python 版本

c++ - 两个线程共享变量 C++

c++ - std::shared_ptr 和 std::experimental::atomic_shared_ptr 有什么区别?

assembly - x86 程序集 : Output from swap function is incorrect even when the implementation is correct