3

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

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

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

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

提前致谢!

4

2 回答 2

3

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

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

m03geek 还发表了一篇文章,他提到你也可以使用 Couchbase,这是真的,但我想在他的回复中添加一些关于优缺点的内容。首先,Couchbase 有两种存储桶(数据库)类型,它们是 Memcached 存储桶和 Couchbase 存储桶。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

于 2013-09-13T19:29:51.433 回答
0

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

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

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

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

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

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

于 2013-09-12T18:34:16.623 回答