1

我们正在使用 ELB 在两个不同 AZ 中的两个不同 Nginx+Varnish 服务器之间对请求进行负载平衡。这些 Varnish 服务器已配置为平衡对另一个 ELB 的请求,将请求分发到我们的应用服务器。这样,如果一个 AZ 停止工作,我们应该能够保持站点正常工作。

我们使用这种方法面临的问题是,我们不知道如何防止站点向同一个客户端提供不同的缓存对象,即保持两个 Varnish 服务器之间缓存内容的一致性。

一种可能的解决方案是使用 ELB 的 IP 散列,以便根据客户端 IP,一个 Varnish 或另一个将服务于请求。这会在一定程度上缓解这个问题。

有没有其他方法可以在这两个 Varnish 服务器之间同步内容?

4

2 回答 2

3

Varnish 中没有可用的活动状态同步。

您可以使用一个辅助进程来执行此操作,该进程尾随 varnishlog 并调用其他 n 个 Varnish 服务器,但这很脆弱,可能会影响您。常见的方法是进行循环并拥有足够的流量以将所有内容缓存在需要的位置。:)

有一些关于您的应用程序行为方式的基本知识已融入您的问题,但没有那么多细节。为什么不同的后端做出响应是一个问题?如果它们是相同的(因为您想要冗余,我希望它们是相同的?)这应该不是问题。

如果后端使用某些 URL 的用户特定响应数据进行回复,它应该使用 Vary 标头告诉 Varnish。

在 ELB 中添加会话粘性(~ip 哈希)只会隐藏您的问题,直到其中一个可用区出现故障并重新路由流量,此时我猜您已经很忙了。

于 2013-11-06T15:21:15.543 回答
0

您可以启用 ELB 粘性来实现您所需要的,没有 varnish 集群在 varnish 实例之间共享状态。

于 2014-09-12T20:10:59.813 回答