AWS ELB作为Varnish Accelerator的后端

我正在进行AWS上的大型部署,这些部署全天具有较高的正常运行时间和可变负载。 显然,这是ELB(Elastic Load Balancer)和自动缩放的完美用例。

但是,我们也依靠清漆来cachingAPI调用。 我最初的本能是构build堆栈,以便清漆使用ELB作为后端,然后触发一个appGroup。

Varnish -> ELB -> AppServers

但是,根据一些不可能的消息来源 ,因为ELB不断地改变其DNS主机名的IP地址,在启动时清除caching,这意味着IP的改变将不会被清漆拾取。

然而,阅读周围,它看起来像人们这样做,所以我想知道什么解决方法存在? 也许一个脚本定期重新加载VCL?

在这种情况下,这真的不是一个好主意,任何其他解决scheme的想法?

清漆实际上可以作为负载平衡器工作。 你应该尝试Varnish -> AppServers

只需在Varnishconfiguration中将每个应用程序服务器定义为导演中的后端即可。

您甚至可以添加探测器来检查后端可用性,在请求过程中发生故障时重试切换到另一台服务器等。

您的Varnish实例在哪里托pipe? ASW呢? 你可以尝试在应用程序相同的服务器上清漆哈希指导和主机清漆。 每个实例将处理它应该处理的请求,并将其他请求转发给右后端。 每个唯一的URL将只被caching在1(可用)服务器上,并且caching内存将乘以Varnish实例的数量,而caching未命中将受到限制。

这是完全可能的,但它需要几个步骤才能很好地工作! 当我们需要这种configuration时,我们这样做的方式是:

  • 创build一个VPC。 您需要在VPC中执行此操作,因为您需要在其中创build子网。

  • 在每个可用区中创build一个子网,您将拥有在ELB中注册的实例。 您应该子网,以便您在每个子网中有less量的IP地址,因为每个IP地址将成为开销。 (我们目前使用的子网是/ 26)

  • 开始在您的清漆VCL中创buildDNS Director后端。 添加上面创build的3个子网。 ( https://www.varnish-cache.org/docs/3.0/reference/vcl.html#the-dns-director

  • 将DNS Director后端的主机设置设置为varnish应该看到的主机名。 (例如,如果您的前端服务被调用,例如front-end-service.subdomain.example.com,则将front-end-service.example.com作为VCL中的主机设置。)

  • 将DNS Director中的后缀设置设置为可以parsing的内容。 继续上面的例子,你可以很容易地使用'-varnish.example.com'作为你的后缀。 当一个请求到达清漆时,清漆将查看HTTP主机头,如果名称与VCL的DNS主pipe后端中的主机头设置相匹配,varnish将追加后缀并对主机名执行DNS查找将主机头的内容与后缀连接起来的结果。 因此,在这个例子中,DNS查询将由varnish对名为“front-end-service.subdomain.example.com-varnish.example.com”的主机执行

  • 创build您的负载均衡后端,并将其附加到您创build的每个子网。

  • 将连接结果的DNSlogging设置为Amazon提供给您的负载均衡器的DNS名称的CNAME。

  • 开始清漆,可以select清漆来validation后端的数量。

  • testing您的设置通过发出一个

    curl -H“主机:front-end-service.subdomain.example.com” http://varnish-server-hostname.example.com/whatever-path

  • 用varnishlog看请求进来validation一切正常。

请注意,如果要在该子网中放置负载均衡器,AWSbuild议您应该有一个至less有20个未使用的IP地址的子网。 (请参阅http://docs.aws.amazon.com/ElasticLoadBalancing/latest/DeveloperGuide/UserScenariosForVPC.html

我们已经为最近一个需要ELB需求规格的项目做了这个工作,但是我们关心的是如何在pipe理的简化方面进行扩展,并且正在研究基于服务发现的方法,以及类似于自动VCL更新的方法,以及自动化的VCL通过像Varnish Agent( https://github.com/varnish/vagent2

但是,如果您不介意pipe理您的VPC子网,则上述说明非常有效。

干杯!

ELB的部分目的是为了保持主机停机。 即使在自动扩展和CloudWatch的情况下,如果需要更换死的实例,您也可能会在几分钟的停机时间内查看。

我build议:

 [Front End ELB] -> [Varnish] -> [Back End ELB] -> [AppServers] 

我知道你想尽可能地利用caching,但是你真的应该把负载分散到所有的可用区域。 这意味着在区域A,B和C中有相同数量的实例用于堆栈所在的区域(如此3x清漆)。 这当然会花费更多,但它使您能够在整个AZ停运的情况下生存下来。 削减这个成本意味着在某个时候你可能需要花费时间。 这是你的决定,但至less你可以做出明智的决定。

有两个安全组,一个用于清漆,另一个用于AppServers。 对每个进行configuration,以便只有关联的ELB可以在相应的端口上访问它。

对于Varnishconfiguration,请将DNS控制器设置为TTL较低。 将其设置为等于亚马逊为后端ELB提供的CNAME的TTL的一半(或一半)。 这应该足以让Varnish保持最新状态。


*如果你想要最终的可用性。 使用具有多区域,多az冗余的Route53。