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