【问题标题】:How do you implement multi-tenancy on CouchBase? Can it be performant?您如何在 CouchBase 上实现多租户?它可以是高性能的吗?
【发布时间】:2015-03-21 05:20:18
【问题描述】:

我正在考虑一个可以存储客户数据的应用。鉴于存储桶在 CouchBase 中的工作方式,所有客户数据都将位于一个存储桶中。看来我有两个选择:

  1. 通过为每条记录分配一个字段来指示其所属的客户,从而在视图中实现多租户。

  2. 通过在每个作为客户 ID 的键上添加一个因素来实现它。

不过,似乎因为我将使用视图,所以我真的想要两者都做。在第 2 种情况下,我需要在记录中包含数据,以便可以对其进行索引(或者我可以在映射阶段提取部分键并在客户上建立索引)并且在选项 1 中,我想要它是检索数据时检查的关键部分,以确保我不会发送错误的客户数据。

问题是,这是一项服务,多个客户将进行交互,有时一个客户会创建一些数据,而另一个客户会在第一个客户请求时查看这些数据。但是,在每条记录上放置一个 ACL,列出所有有权查看它的人,至少可以说是有问题的。

我敢打赌,有一个通用的方法或设计模式可以回答这个问题,并且希望得到一些最佳实践的指导。

如果索引同时针对特定的相关数据和客户 ID 编制索引,我还担心性能...大量不同的客户可能会使索引的效率大大降低。 (但也许不是。)

【问题讨论】:

  • 基于 Couchbase 之类的非规范化性质...当客户创建数据供其他客户查看时...您可以简单地复制它并为其提供正确的客户受限 ID?显然取决于用例。如果这种情况一直发生,它将无法扩展。
  • 这是两个客户之间协作的情况,因此他们希望能够对同一个对象进行更改,他们都是。 (虽然可能不会同时进行,这意味着要么在应用层的两个副本之间进行协调,要么在分区后处理最终的一致性——但我认为如果不是这个租赁问题,后者将是更好的选择。)

标签: mapreduce couchdb couchbase multi-tenant


【解决方案1】:

以下是我对您的问题的看法:

[关于项目 #1 和 2] - 不过,由于我将使用视图,我似乎真的想要两者都做。

这对我来说似乎没有意义。在 Couchbase 中,映射阶段可以包含来自键和值的内容。将数据同时存储在键和值中几乎没有意义,因为您可以保证在那里有 1:1 的重复。将其存放在最适合存放它的地方;在这种情况下,可能是值。

问题是,这是一项服务,多个客户将进行交互,有时一个客户会创建一些数据,而另一个客户会在第一个客户请求时查看这些数据。但是,在每条记录上放置一个 ACL,列出所有有权查看它的人,至少可以说是有问题的。

我的网站也有存储在单个数据库中的多租户数据。在我的例子中,我使用对象唯一标识符作为我的键。默认情况下,客户可以访问属于他们的所有对象(我有一个用户对象,并且用户与客户帐户相关联)。用户还可以分配额外的权限,从而可以将来自另一个客户的单个对象添加到他们的用户帐户中,从而授予他们查看对象的访问权限。

另一种选择是“通过默默无闻的安全性”并使用 guid 作为随机标识符,让客户可以查看他们拥有 guid 的任何对象。

但是,我不会尝试将权限存储在对象本身上。那很快就会变得笨拙。您需要考虑您的具体用例,并决定哪种简单方法适用于大多数情况,而不支持其他 1-2% 的情况。

【讨论】:

  • 你的回答让我觉得我应该做一个记录类型,它是其他记录的概念所有者。因此,所有对象都有一个指向其所有者的指针。集合对象还将具有授权用户列表,因此可以在用户使用其拥有的对象之前对其进行检查。事实上,不同的用户可能拥有不同的权限,其中一个用户拥有全部权限。对该所有者对象进行索引可以让我快速找到它所拥有的对象。不确定对指数的影响。暂时投了赞成票,以后再想一想,你可能已经完全回答了问题。
  • 很高兴听到这个消息。如果我们的想法相同,那么在这种情况下,您的“所有者”就是您的客户。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-03
  • 2011-08-05
  • 1970-01-01
  • 2011-08-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多