【问题标题】:Is it necessary for memcached to replicate its data?memcached 是否有必要复制其数据?
【发布时间】:2013-09-12 17:39:07
【问题描述】:

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

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

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

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

提前致谢!

【问题讨论】:

    标签: session memcached cluster-computing couchbase


    【解决方案1】:

    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

    【讨论】:

    • 谢谢,我们实际上正在使用 Couchbase,目前正在根据我们的应用程序评估它的性能。就容错而言,我们确实有一个可行的解决方案,它首先更新 memcache 和数据库并从 memcache 调用。您能否详细说明“允许内存缓存预热”是什么意思?据我了解,如果发生这种情况,我们的应用程序仍然必须使用来自停机的 memcache 服务器的缺失变量重新填充缓存。
    • 你的应用程序重新填充缓存就是我所说的预热。
    【解决方案2】:

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

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

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

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

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

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

    【讨论】:

    • 不确定当您说“记住我”cookie 可用于恢复会话时,这里暗示了什么。从什么恢复?使用该 cookie 值的数据库查询?
    • 通常会话包含一些关于存储在数据库中某处的用户帐户的信息。当用户登录时,此信息将从 DB 检索到会话。 “记住我” cookie 存储了一些令牌,可以在不让他登录的情况下识别用户(输入登录名并通过)。因此,如果用户未登录(会话不包含有关系统帐户的任何信息)并且此 cookie 存在,那么您通过该 cookie 令牌获取用户帐户并将其写入会话。见stackoverflow.com/questions/244882/…
    • 好吧,这就是我认为你的意思。在这一点上,我们几乎是在这样做,但会缓存变量,以减少对数据库的看似昂贵的查询。
    猜你喜欢
    • 2012-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多