首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >memcached有必要复制它的数据吗?

问memcached有必要复制它的数据吗?
EN

Stack Overflow用户
提问于 2013-09-13 01:39:07
回答 2查看 7K关注 0票数 3

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

例如,如果我们在2台服务器上运行memcached,这两台服务器上都有数据,而1号服务器宕机了,我们可能会丢失存储在它上面的会话数据吗?换句话说,如果任何memcached服务器(存储数据)宕机,我们应该看到什么情况,以及它将如何影响我们在集群环境中的会话?

归根结底,是否可以使用它为我们的应用程序添加一些容错功能?例如,如果键不存在,可能是因为它所在的服务器之一宕机了,那么重新查询并存储回memcached?

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

提前感谢!

EN

回答 2

Stack Overflow用户

发布于 2013-09-14 03:29:51

Memcached内置了自己的容错功能,因此您不需要将其添加到应用程序中。我认为提供一个例子可以说明为什么会这样。假设您在数据库前面设置了两个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用户界面,它将提供关于你的memcached集群的统计信息,以及添加和删除服务器的易用性。您还可以在Couchbase的道路上获得付费支持。

Couchbase存储桶完全不同,因为它不是缓存,而是一个实际的数据库。您可以完全删除您的后端数据库,只使用此存储桶类型。Couchbase存储桶的一个优点是它提供了复制,从而防止了memcached存在的冷缓存问题。我建议您阅读Couchbase文档,如果您对此很感兴趣,因为Couchbase存储桶有很多特性。

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

票数 3
EN

Stack Overflow用户

发布于 2013-09-13 02:34:17

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

我的观点是复制memcached数据是不必要的。现代数据中心提供了近99%的正常运行时间。因此,如果有一天你的memcached服务器宕机了,那么只需要你的一些在线用户重新登录。

在许多网站上,你也可以看到“记住我”复选框,它设置了一个cookie,可以用来恢复会话。如果您的用户将拥有该cookie,他们甚至不会注意到您的一台服务器已停机。(这就是您关于“为我们的应用程序添加一些容错能力”问题的答案)

但是你可以使用haproxy这样的工具,将你所有的会话数据复制到2个或更多的独立服务器上。在这种情况下,要存储一个用户会话,您将需要N倍的RAM,其中N是副本的数量。

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

简而言之:带有“记住我”cookie的memcached和不带复制的memcached应该就足够了。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18770867

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档