【问题标题】:Replacing static files that are under heavy read load替换读取负载较重的静态文件
【发布时间】:2023-03-18 20:10:02
【问题描述】:

假设我们有一个静态文件服务器(Nginx + Linux),它提供 10 个文件。这些文件的读取频率几乎与服务器可以处理的频率一样高。但是,有些文件需要替换为新版本,以便文件名和 URL 地址保持不变。如何安全地替换文件而不用担心某些读取失败或成为两个版本的混合?

我知道这是一个相当基本的操作系统问题,与重命名、符号链接和文件大小有关。但是,我没有找到明确的参考或很好的讨论,我希望我们可以在这里建立一个。

【问题讨论】:

标签: nginx concurrency symlink static-files fileserver


【解决方案1】:

使用rsync。通常我选择rsync -av src dst,但选择 YMMV。

rsync 的了不起之处在于,除了在几乎没有更改或没有更改时基本为零成本外,它还使用原子重命名。因此,在文件传输过程中,“.fooNNNNN”临时文件变得越来越大。完成后,rsync 会关闭文件并将其重命名为“foo”。所以网络客户端要么看到所有旧文件,要么看到所有新文件。请注意,范围下载(例如从错误后重新启动)不是原子的,这会使此类客户端丢失,尤其是在文件开头附近插入字节时。 SHA1 不会验证这样的客户端,他必须从头开始重新下载。顺便说一句,如果这些是“大”文件,请告诉 nginx 使用零拷贝 sendfile()。

【讨论】:

  • 感谢您的提示!我想牛肉是重命名在 Linux 中是原子的。在我的情况下,新版本是由同一台服务器上的工作进程生成的,所以 rsync 可能是一种过度杀伤,尤其是在文件很小的情况下。不过,这个问题并没有提到,因为我想把它保持在一般水平。有趣的点还在!
猜你喜欢
  • 1970-01-01
  • 2016-05-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-22
  • 2014-02-06
  • 2013-10-27
  • 1970-01-01
相关资源
最近更新 更多