caching - 支持分片、复制和低延迟的缓存系统的最佳解决方案

标签 caching memcached redis replication couchbase

我们正在部署一个高度动态的网站。在峰值容量下,每分钟处理和更新大约 20,000 个项目。每个项目的大小范围从 1kb 到 500kb。这些项目需要每分钟在缓存中检索、处理和更新。

我们预计前两三个月的用户流量将达到 1000 人。当每个用户登陆网站时,他们可能会请求一些受欢迎的内容,但其他人可能会请求不受欢迎的内容。所有内容都是持久存储中内容的更高级别处理形式。因此,绝对有必要将所有已处理的项目放在低延迟存储中,以提供卓越的用户体验,无论是受欢迎的还是不受欢迎的。

我们分别尝试了 Memcache、Redis 和 Couchbase。

Memcache 非常快,但我们遇到了某些 slab 内存不足和事件项目开始被逐出的问题。

Redis 比 Memcache 相对慢,如果您希望项目持久化,则它非常适合。

但很快我们就意识到我们需要分片和复制。

Couchbase 开箱即用。与 Couchbase 服务器接口(interface)的 Moxi 客户端有其自身的问题,无法处理繁重的并发进程。它会开始丢失集合并时不时地获取。移至与之交互的 Python SDK。它在集群中的一个节点出现故障时表现不佳,它根本无法发现新拓扑。最终在缓存中丢失了一些数据,并且站点在几个宝贵的小时内处于非事件状态。

此时我们意识到没有完美的产品可以满足我们的需求。您必须了解所有技术和您自己的需求。您必须预见您的数据将如何演变并相应地做好准备。最好的解决方案可能是多种技术的混合。但是,将其提出来是希望那里可能还有其他东西。 2012 年即将结束。开箱即用的解决方案以强大的硬件为后盾来满足我们的需求是多么困难啊。

任何想法和有见地的文章的链接将不胜感激。谢谢!

最佳答案

这里有一些关于您上面提到的一些技术的注释。

内存缓存:

Memcached 只是一个缓存系统,不会为您提供任何数据持久化。如果您选择使用 memcached,那么您将需要选择其他类型的持久存储来保存所有数据。 Memcached 也是一个非常简单的缓存系统,不提供复制功能,但它们是不同的项目(如 repcache),已将此类功能添加到 memcached。如果我想使用关系数据库作为我的持久层,我只会使用 memcached。

Redis:

Redis 是一种数据结构服务器,只能用于该目的。 Redis 的缺点是你只能在单个服务器上运行它,如果你想拥有多个 Redis 服务器,那么你需要进行应用程序分片。我见过的大多数 Redis 部署都伴随着另一种数据库技术。

沙发座:

Couchbase 2.0 将把产品变成文档数据库。该产品内置了 memcached 技术,因此您可以开箱即用 memcached,这意味着亚毫秒级延迟。除此之外,您还可以获得复制、跨数据中心复制和查询支持。另请注意,大多数 Couchbase SDK 不使用 moxi,并且 Python SDK 仍处于测试阶段。

可能对您有用的一件事是检查 YCSB 基准测试项目以及一些已经发布的结果。该项目将使您能够很好地了解这些数据库和其他数据库在负载下的性能。然后,一旦找到您喜欢的产品,您就可以查看它们的功能列表,并找出产品具有最适合您开发的应用程序的功能。

此外,如果我关于上述数据库的任何信息不正确,请告诉我。这些项目发展迅速,有时很难跟上。

编辑:我还应该提到 Couchbase 是所列数据库中唯一提供复制、分片和低延迟的数据库。我想 Redis 将允许您拥有一个副本服务器并因此进行复制,但是您所做的任何分片都必须在应用程序层完成。

关于caching - 支持分片、复制和低延迟的缓存系统的最佳解决方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13079333/

相关文章:

c# - 绝对过期缓存对象 - 可以手动删除吗?

android - 以编程方式清除android应用程序中的缓存

java - 如何从应用程序引擎上的 memcached 获取字符串 - java

Memcached LRU 和到期

activerecord - 在 yii2 的 redis 模型中查询

javascript - list 更改时 Html5 缓存不更新

caching - Symfony2 动态路由 - 缓存问题

django memcached on red hat

ruby-on-rails - 开发环境中的 Sidekiq

Laravel Horizo​​n 处于非事件状态且仍在处理中