在群集环境中缓存

时间:2009-12-03 15:54:37

标签: php .net caching coldfusion cluster-computing

出于多种原因,在应用程序代码中缓存数据通常是一个好主意。我们在包括ColdFusion,.NET和PHP在内的共享环境中安静了一段时间。但是,由于我们与组织中的许多其他开发组共享此环境,因此我们(或我们的客户)所欣赏的停机时间明显更多。

因此,我们的网站管理员正在努力实施新环境。在这种环境中,他们在当前Dev和Prod环境之间添加了QA级别。此外,为了增加正常运行时间,它们是QA和Prod级别的集群机器。

由于许多原因,这一切都很棒。我看到问题的一个方面是缓存。将有两个(或更多取决于节点数)缓存集。可以想象,这会产生以下潜在问题。节点A和B上的缓存是相同的。用户1更新数据,因此缓存在节点A上更新。用户2来查询数据但是在节点B上,因此得到旧数据。

他们是如何处理这个问题的最佳做法?

我可以在代码中进行任何类型的更改吗?

是否有可以实施的服务器设置?

5 个答案:

答案 0 :(得分:2)

内容缓存的基本两种方法是1)集中化和2)复制。

每种方法都可以通过各种方式实施,并具有各种复杂程度。

如果您只谈论一小组Web服务器,那么您需要一个简单的集中设置。我建议每个环境memcached服务器(PHP supports)。因此,在您的模型中,节点A和B都将使用来自新节点的缓存数据:节点C。

复制是一种可扩展性更高的解决方案,但实施起来也要复杂得多。但你需要点击浩大的流量来走这条路(想想facebook,youtube,维基百科),所以我怀疑你需要担心它。

答案 1 :(得分:2)

将ColdFusion Multiserver配置与群集ColdFusion实例一起使用时,可以在群集中使用会话复制,但要谨慎使用它,因为缓存数据会不断地序列化并编组到群集中的其他服务器。您可以序列化复杂数据(CFWDDX)并将其存储在数据库中,然后将主键存储在会话范围中以复制查找记录的位置,并且可能是一个标志,指示缓存的数据已更改,这将导致其他服务器从数据库中刷新缓存。

答案 2 :(得分:1)

如果您正在运行ColdFusion 9,您可以使用新的内置缓存来实现ehcache。在集群环境中,设置使用RMI的复制集群缓存非常容易(只需几行XML)。请参阅我在ColdFusion 9中的缓存系列:

http://www.brooks-bilson.com/blogs/rob/index.cfm/Caching

关于设置群集缓存的帖子尚未完成,但如果您直接与我联系,我可以提供您的ehcache.xml文件所需的配置以及更具体的说明。

答案 3 :(得分:0)

对于数据库存储的复杂数据而言,这是一种集中化的手段,如上面Peter所建议的那样。服务器将复制引用数据的键,并标记指示它是否已更改。然后在更改时,其他服务器将查询已修改的数据并对其进行缓存,直到再次设置更改标志。每次更改时,每个服务器只会查询一次数据库,并且数据是集中的,而不是仅保存在内存中。

如果数据不是那么复杂,那么会话复制可以完成你想要的,而根本不涉及数据库。性能与群集中的服务器数量成反比(因为复制量会随着所有数据复制到其他成员而呈指数级增长)和要复制的数据量。

答案 4 :(得分:0)

java memcached客户端的cf实现允许您使用memcached轻松地直接从coldfusion进行缓存。

http://memcached.riaforge.org/

我会对memcached进行非常强烈的投票,即使您必须在同一个Web服务器群集上运行它,您也可以获得数据元素的单个缓存位置和群集冗余的好处。