在couchbase中的“用户数据”策略

时间:2014-01-12 17:49:36

标签: performance database-performance couchbase

我知道Couchbase的很大一部分性能来自于提供内存文档和我的许多数据类型,这似乎是一个完全合理的愿望,但考虑到用户数据如何扩展和使用我想知道是否计划只有一小部分用户文档在内存中是合理的。我想在任何时候都可能只有10-15%。考虑到这是一个合理的假设吗?

  • 在任何给定时间段内,将只有少数用户将使用该系统。
  • 在这种情况下,用户只能访问自己的数据(或主要是那样)
  • 最近输入的数据比历史用户文档更容易被查看

更新:

一些额外的背景:

  • 假设有100万客户的用户群,20%很少访问该网站,40%每周访问一次,40%每天访问它。
  • 在任何特定时刻,只有5-10%的用户群将被登录
  • 当用户登录时,他们喜欢在单个会话中重新查询某些文档(尽管客户端会进行一些对象缓存以最大限度地减少这种情况)
  • 对于任何用户,最近的记录非常活跃,非常旧的记录非常不活跃

总之,我会说大多数用户触发的交易文件很少被查询,但有一个核心集 - 在过去24-48小时内产生的记录与当前“登录”组相关 - - 这将成为记忆中的重要好处。

两个子问题是:

  1. 有没有办法在每个文档的基础上指出时间戳,以表明需要保存在内存中?
  2. couchbase如何克服日益增长的文档ID内存列表。我的理解是,所有ID必须始终在内存中?对于某些应用程序来说,这不是太占用内存吗?

2 个答案:

答案 0 :(得分:2)

首先,CB的一个主要好处是它分布在多个节点上。这也意味着您的查询分布在多个节点上,因此您可以获得性能提升(我知道其他几个类似的nosql跨节点传播 - 所以可能与您的比较无关?)。

接下来,我相信这个问题有点过于宽泛,因为我认为答案真的取决于你的用法。给定用户是否只是随机查询一次他的数据?如果是这样,那么根据你的情况,10-15%的时间内只会有记忆中的好处。相反,如果用户在网站上,他们可能会多次查询他们的数据,这有一定的性能优势。

无论如何,Couchbase具有非常快的磁盘访问性能,特别是在SSD上,所以它可能没有太大的区别,但是没有具体细节也没有办法确定。如果它是一个相对较小的文档大小,如果它涉及用户等待其中一个加载,那么用户肯定不会注意到文档是从RAM还是磁盘加载。

Here是一篇关于CB针对类似nosql平台的基准测试的有趣文章。

编辑:

在阅读了您的其他背景信息之后,我认为您的场景几乎完全符合Couchbase的设计运行方式。从驱逐的角度来看,CB将最新且最常访问的项目保存在RAM中。当RAM填满新的和/或旧的项目时,最老的和最不频​​繁访问的被“逐出”到磁盘。 Couchbase手册中的This link解释了有关其工作原理的更多信息。

我认为你与Couchbase走在正确的轨道上 - 无论如何,它的扩展灵活性很容易让你将数据库调整到你的应用程序。我真的认为你不会在这里出错。

关于你的两个问题:

  1. 不在Couchbase 2.2
  2. 您应该使用相对较小的文档ID。虽然它们确实存储在RAM中,但如果您的文档ID很小,如果您使用相当大比例的可用群集RAM来存储密钥,则部署不是“正确大小”。 This link讨论密钥并提供与密钥大小相关的详细信息(例如,大小,元数据等限制为250字节)。

答案 1 :(得分:2)

基本上,您正在做出决定的是调整Couchbase群集的存储区RAM大小,并允许降低驻留率(RAM中文档值的百分比),并使用缓存未命中从磁盘提取。

但是,这种情况也有一些警告。你基本上也会有相对稳定的高速缓存驱逐"哪里"最近没用过"当您将缓存丢失的文档从磁盘拉入RAM时,将从RAM缓存中删除这些值。这是因为您将始终浮动在Bucket RAM配额的高水位线上。如果您同时具有较高的写入速度(新的/更新的数据),则还需要保留它们。如果写入速度超过您的驱逐/检索容量,这两个进程可以竞争磁盘I / O,如果您实际上无法快速驱逐以便为新写入打开RAM,则SDK客户端将收到临时OOM错误。当您横向扩展时,由于您在更多计算机上同时执行此过程的磁盘I / O容量更多,因此这种可能性降低。

如果你说"查询"你的意思是查询索引(即视图),这是你要查询的磁盘上的一个单独的数据结构,当然返回结果不受驱逐/ NRU的影响,但是如果你按照查看查询进行多次获取以上仍然适用。 (不要将整个文件放入索引!)