我有一台专用于 Varnish 的服务器,用于处理数以万计的静态文件。这台服务器有 32GB 的 RAM。这些文件几乎占用了所有的 RAM,其中绝大多数也经常使用,所以我现在面临的问题是 - 该怎么办。服务器毫不费力地处理请求,但服务文件的数量一直在增加,我随时都会面临 RAM 的问题。添加额外的 RAM 不是一个选择,以及将部分数据保存在硬盘上。
我决定再放置一台具有相同参数的服务器。我想在两台服务器之间传播数据。两台服务器都可以与 HAProxy 配合使用。
由于缓存中存储的数据量增长非常快,并且它们不断轮换,我需要一个解决方案,可以让我自动在两台服务器上分配数据。例如:
Varnish1 处理站点 S1、S3、S5
Varnish2 处理站点 S2、S4、S6
当 S7 页面出现时,应该自动将其附加到负载最小的服务器。同样,当网站消失时,例如 S2,应该将数据重新分配到服务器,以实现最均衡的负载。在服务器正常运行期间也应该发生同样的情况,当一个网站(例如 S1)突然消耗比正常情况下多得多的资源时,服务器应该自动将部分支持的数据转移到其他服务器。我接受部分复制,即当 S1 等请求的数量增加到会堵塞一台服务器的程度时,数据应该立即复制到另一台服务器。
我预测将来服务的数据量以及服务器数量都会增加几倍,因此我不能依赖Varnish的手持解决方案。
答案1
我同意 Shane Madden 的观点。这是一个棘手的问题。以下是一些想法:
重新考虑磁盘
重新考虑使用磁盘作为 Varnish 缓存。添加磁盘比添加 RAM 更容易;您能负担得起的磁盘越快越好。性能会有所下降,但对于普通用户来说,可能并不明显。我们在 Varnish 中使用磁盘非常成功。磁盘的另一个优点是:例如,如果您使用 NAS,您可以将 NAS 安装在不同的服务器上,这样您就不必担心在各个服务器之间同步文件。
HAProxy
使用代理,您可以转移流量,但最终您会遇到同样的问题——内存或磁盘空间不足。
不要关注清漆
也许是时候考虑 Varnish 以外的解决方案了。也许是 CDN?它可能满足也可能不满足您的需求,但您可以将一些使用频繁的文件卸载到 CDN 上,而对于使用较少的文件,则从您的服务器交付。
HTH,祝你好运!
答案2
首先要检查是否Vary
正确处理了 HTTP 标头。这一点非常重要,因为如果处理不当,您可能会获得同一缓存对象的多个副本,但由于 HTTP 标头不正确,这些副本只是单独的副本。
当你奔跑时你得到了什么curl -I http://yourhost.com/path/to/a/static/file.ext
?