我的缓存守护进程应该在哪里生活?

时间:2014-04-05 21:03:15

标签: caching amazon-web-services redis memcached aws-opsworks

TL; DR - 用于会话存储的简单缓存集群(使用memcache或redis)应该在应用程序的服务器上(即与nginx和php一起)或在其自己的单独ec2实例上(如弹性缓存或自定义的ec2实例) ?

我正在使用Amazon OpsWorks设置我的网络应用程序的基础架构。我倾向于通过安装在应用层本身而不是作为自己的ec2实例的memcache实例来实现会话缓存。例如:

                 [ Load Balancer ]
                /        |        \
[ App Layer 1 ] – [ App Layer 2 ] – [ App Layer 3 ]  * /w memcache or redis

VS

                 [ Load Balancer ]
               /         |         \
[ App Layer 1 ]   [ App Layer 2 ]   [ App Layer 3 ]
               \         |         /
                [ Cache Server(s) ]   * ElastiCache or custom ec2 /w memcache or redis

这里有什么优点和缺点?对我来说,后来的解决方案似乎是不必要的,但我可以看到一个具有非常大的会话缓存的高流量网站可能需要这个。

我是否有理由不想在我的nginx / php app服务器堆栈旁边运行redis或elasticache?是否会使自动缩放或监视性能更难以实现?

2 个答案:

答案 0 :(得分:2)

第一种解决方案的两个主要缺点是:

  • 你会被迫陷入会议粘性。
  • 您将应用程序与缓存的扩展事件相结合。

虽然在您的情况下这些可能不是问题,但通常我尽可能避免使用它们,因为从长远来看它们往往会使问题复杂化。

答案 1 :(得分:1)

在您的应用服务器上放置缓存的主要原因是成本问题。这与将您的数据库与Web或应用服务器放在同一服务器上的想法相同。

如果你有一个小规模的应用程序,你可以在同一台机器上挤压你的所有资源,但随后你可以从任何类型的失败中恢复(和#34; everything fails"),您将丢失数据,或者它将为您的部分用户提供部分服务。

一旦有足够的应用服务器,每个服务器的缓存群集成本就会降低。

从架构的角度来看,当规模和高可用性很重要时,您应该拥有比更复杂的组件更小的组件。

例如,如果您想要为您的机群添加另一个应用服务器,因为您有更多用户,添加服务器会更快,因为您在此服务器上安装的软件组件较少,并且服务器已经可以提供服务以前的用户作为他们的会话集中存储。如果要删除应用服务器(或丢失应用服务器),该服务器所服务的用户可以轻松迁移到其他服务器,因为其会话/状态存储在缓存集群中。