session - memcached 有必要复制它的数据吗?

标签 session memcached cluster-computing couchbase

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

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

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

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

提前致谢!

最佳答案

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

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

m03geek 还发了一篇帖子,他提到您也可以使用 Couchbase,这是事实,但我想在他的回复中补充一些关于优缺点的内容。首先 Couchbase 有两种桶(数据库)类型,它们是 Memcached Bucket 和 Couchbase Bucket。 Memcached bucket 是普通的 memcached,我上面写的所有内容都适用于这个 bucket。如果您要使用 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

关于session - memcached 有必要复制它的数据吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18770867/

相关文章:

windows - 诊断一个集群软件的病态行为

memcached - 什么可以用于(可靠地)测试 Couchbase 延迟?

python - 如何使用 pika 通过 Python 客户端连接到 RabbitMQ 集群?

asp.net - 在 ASP.NET 页面中保存变量

php - 使用 php 在 VARCHAR 中查找并替换

python-memcache 不加载/存储任何内容

python - GAE 开发服务器 memcached 永远不会返回任何内容

ruby-on-rails - 统计分析 Rails 应用程序的最佳托管

java - 如何将 session 值传递给java类

php - Symfony 1.4 session 随机丢失