Tug 的建议是正确的,也允许我添加一些观点。
可以认为存储桶与 RDMS 世界中的“数据库实例化”最密切相关(尽管不完全相关)。该“数据库”中将有多个表/模式,并且这些表/模式都可以在一个存储桶中组合。
将存储桶视为共享一些通用配置参数(RAM 配额、副本计数等)的数据的逻辑分组,当您需要单独控制某些数据集时,您只需要将数据拆分为多个存储桶。其他原因与不同数据集的工作负载非常不同或希望能够分别跟踪这些数据集的工作负载有关。
一些例子:
-我想控制一组数据的缓存行为与另一组不同。例如,许多客户有一个他们希望始终在 RAM 中的“会话”存储桶,而他们可能有一个更大的“用户配置文件”存储桶,不需要缓存在 RAM 中的所有数据。从技术上讲,这两个数据集可以驻留在一个存储桶中,并允许 Couchbase 智能地知道哪些数据要保存在 RAM 中,但是您没有太多保证或控制会话数据不会被推出......所以把它在自己的存储桶中允许您强制执行。它还为您提供了能够单独监控该流量的额外好处。
-我希望一些数据比其他数据被复制更多次。虽然我们通常在大多数集群中只推荐一个副本,但有时我们的用户会选择他们希望额外复制时间的某些数据集。这可以通过单独的存储桶进行控制。
- 同样,我只希望将一些数据复制到另一个集群/数据中心。这也是按桶控制的,因此可以将数据拆分到单独的桶中。
- 当您对给定数据集的工作负载(尤其是写入量)存在相当大的差异时,从视图/索引的角度来看,将数据分离到单独的存储桶中确实开始有意义。我提到这一点是因为这是真的,但我也想明确一点,这不是常见的情况。您应该在发现问题后使用此方法,而不是在您认为可能之前使用此方法。
关于最后一点,是的,对存储桶的每次写入都会被索引引擎拾取,但是通过使用 JSON 中的文档类型,您可以非常快速地中止对给定文档的处理,并且它确实不应该对有大量数据不适用于某些视图。如果您不介意,我特别好奇文档的哪些部分暗示了其他内容,因为这当然不是我们的意图。
所以一般来说,我们看到大多数部署的桶数(2-3)很少,只有少数超过 5 个。我们 10 的限制来自我们内部跟踪统计信息的一些已知 CPU 和磁盘 IO 开销(负载或桶上缺少它在这里无关紧要)。我们当然计划在未来的版本中减少这种开销,但这仍然不会改变我们只使用几个存储桶的建议。无论如何,能够将多个“模式”组合成一个逻辑分组并在其中应用视图/索引的优势仍然存在。
我们现在正在提出更具体的指导方针和规模建议(我写前两个博客作为权宜之计,直到我们这样做)。
作为初始方法,您希望尝试将设计文档的数量保持在 4 左右,因为默认情况下我们最多并行处理 4 个。您可以增加这个数字,但这应该与增加的 CPU 和磁盘 IO 容量相匹配。然后,您需要将每个文档中的视图数量保持在相对较低的水平,可能远低于 10,因为它们都是按顺序处理的。
我最近与一位拥有大量视图的用户合作(大约 8 个设计文档和一些具有近 20 个视图的 dd),我们能够通过将多个视图合并为一个来大幅降低这一点。显然它非常依赖于应用程序,但您应该尝试从一个索引生成多个不同的“查询”。使用归约、键前缀(在视图内)和排序规则,所有这些都与不同的范围和分组查询相结合,可以使单个索引起初看起来很拥挤,但实际上非常灵活。
您拥有的设计文档和视图越少,您需要的磁盘空间、IO 和 CPU 资源就越少。不幸的是,永远不会有灵丹妙药或硬性准则。最后,YMMV 和在您自己的数据集上进行的测试比我能写的任何多页响应都要好;-)
希望对您有所帮助,如果您对不想发布的特定用例有具体问题,请随时直接与我们联系。
佩里