部署网站更新的原子方式?
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 个独立的主机(物理或虚拟)并将每个新用户从定义的时间及时路由到包含升级网站的新主机。
将更改的文件上传到实时网络服务器时,我如何在任何给定时刻强制执行,我的 整个 文件集要么处于旧状态,要么处于新状态,但从来没有什么在两者之间?
'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 个独立的主机(物理或虚拟)并将每个新用户从定义的时间及时路由到包含升级网站的新主机。