memcached是否有必要复制其数据?

时间:2013-09-12 17:39:07

标签: session memcached cluster-computing couchbase

据我所知,memcached是一个分布式缓存系统。但是,memcached是否完全有必要进行复制?目标是在集群环境中保持会话。

例如,如果我们在说2台服务器上运行memcached,其中包含数据,服务器#1发生故障,我们是否可能丢失存储在其上的会话数据?换句话说,如果任何memcached服务器(存储数据)发生故障,它们应该会发生什么?它会如何影响我们在集群环境中的会话?

在一天结束时,是否可以使用为我们的应用程序添加一些容错功能?例如,如果密钥不存在可能是因为它所在的服务器之一出现故障,请重新查询并存储回memcached?

从我正在阅读的内容来看,它似乎倾向于这个方向,但希望得到确认:https://developers.google.com/appengine/articles/scaling/memcache#transient

提前致谢!

2 个答案:

答案 0 :(得分:3)

Memcached内置了自己的容错功能,因此您无需将其添加到应用程序中。我想提供一个例子将说明为什么会这样。假设您在数据库前设置了2个memcached服务器(假设它是mysql)。最初,当您启动应用程序时,memcached中将没有任何内容。如果您的应用程序需要获取数据,如果首先检入memcached,如果它不存在,那么它将从数据库中读取数据并将其插入memcached,然后再将其返回给用户。对于写入,您将确保将数据插入数据库和memcached。当应用程序继续运行时,它将使用大量数据填充memcached服务器并从数据库中卸载。

现在你的一个memcached服务器崩溃,你丢失了一半的缓存数据。将会发生的事情是,您的应用程序现在将在崩溃后更频繁地访问数据库,并且您的应用程序逻辑将继续将数据插入到memcached中,除非所有内容都直接发送到未崩溃的服务器。这里唯一的结果是您的缓存较小,如果一切都不适合缓存,您的数据库可能需要做更多的工作。您的memcached客户端也应该能够处理崩溃,因为它将能够找出剩余的健康memcached服务器的位置,并相应地自动将值散列到它们中。因此,简而言之,memcached中的故障情况不需要任何额外的逻辑,因为memcached客户端应该为您处理这个问题。您只需要了解memcached服务器关闭可能意味着您的数据库必须做很多额外的工作。我也不建议在失败后重新填充缓存。只需让缓存自行备份,因为加载你不会在不久的将来使用的项目是没有意义的。

m03geek还发了一篇帖子,他提到你也可以使用Couchbase,这是事实,但我想在他的回答中添加一些关于利弊的内容。首先,Couchbase有两种桶(数据库)类型,它们是Memcached Bucket和Couchbase Bucket。 Memcached存储桶是普通的memcached,我上面写的所有内容都适用于这个存储桶。如果您要使用memcached存储桶,那么您可能想要使用Couchbase的唯一原因是您获得了一个很好的web ui,它将提供有关memcached群集的统计信息以及添加和删除服务器的易用性。您还可以获得Couchbase的付费支持。

Couchbase存储桶完全不同,它不是缓存,而是实际的数据库。您可以完全删除后端数据库,只使用此存储桶类型。关于Couchbase存储桶的一个好处是它提供了复制,因此可以防止memcached存在的冷缓存问题。我建议您阅读Couchbase文档,如果这听起来很有趣,因为Couchbase存储桶有很多功能。

关于Facebook如何使用memcached的这篇论文也可能很有趣。 https://www.usenix.org/system/files/conference/nsdi13/nsdi13-final170_update.pdf

答案 1 :(得分:0)

Couchbase嵌入式memcached和“vanilla”memcached有一些差异。据我所知,其中一个是couchbase的memcached服务器就像一个。这意味着如果将键值存储在一台服务器上,您将能够从群集中的另一台服务器中检索它。而vanilla memcached“集群”通常使用分片技术构建,这意味着在应用程序端,您应该知道哪个服务器包含所需的密钥。

我的观点是复制memcached数据是无关紧要的。现代数据中心提供近99%的正常运行时间。因此,如果有一天你的一个memcached服务器出现故障,只需要一些在线用户重新登录。

同样在许多网站上,您可以看到设置Cookie的“记住我”复选框,可用于恢复会话。如果您的用户拥有该cookie,他们甚至不会注意到您的某个服务器已关闭。 (这是关于“为我们的应用程序添加一些容错”的问题的答案)

但您可以随时使用haproxy之类的东西,并在2个或更多独立服务器上复制所有会话数据。在这种情况下,要存储1个用户会话,您需要N倍的RAM,其中N是副本的数量。

另一种方法 - 使用couchbase存储会话。 Couchbase集群支持“开箱即用”的副本,它还将数据存储在磁盘上,因此,如果您的节点(或所有节点)突然关闭或重新启动,会话数据将不会丢失。

简短的回答:memcached与“记住我”cookie并没有复制就足够了。