【问题标题】:MongoDB 'Manually Sharding' for multi-tenancy用于多租户的 MongoDB“手动分片”
【发布时间】:2014-02-15 05:27:53
【问题描述】:

我们正在使用 Mongo 来托管多租户应用程序。每个租户都将拥有自己的数据库。为了解决资源利用问题,我们采用的方法是按数据库分片(而不是按集合 - 如果使用正确的话)。

这意味着我们将为每 x 个租户创建一个新的 3 节点副本集。因此,我们可能在一个分片上有 1000 个租户,在另一个分片上有另外 1000 个租户。

我的问题是关于新注册数据库的位置。我们将采取的方法是将一个分片标记为“活动”分片并在该分片上创建所有新租户。当它达到容量时,创建一个新的分片,将其标记为活动分片并继续。

你可以直接在 Mongo 中选择在哪个分片上创建新数据库吗?如果留给 Mongo,据我了解,当有多个分片时,它将以循环方式进行,这可能会使我们的分片不平衡。

这是正确的方法还是有其他更好的方法?

【问题讨论】:

  • 如果shard key是'tenant id',并且这个id是一个简单的递增计数器,新租户的数量总是比旧的多,那么我认为你描述的行为应该自动发生
  • 分片键不是在集合级别定义的吗?在这种情况下,数据库标识符将用于区分租户(具有不同的租户 ID 作为数据库名称的一部分),而不是分片键。由于我们不按集合进行分片,我不知道这将如何工作?

标签: mongodb multi-tenant saas


【解决方案1】:

您可以使用shard tags 强制某些集合仅驻留在特定分片上。因此,例如,您可以使用其序列号标记每个分片,并使用该标签标记您希望在该分片上拥有的集合/数据库,直到它运行满,此时您创建一个新分片,增加计数器并使用对于新数据。

另一个选项是根本不启用单个数据库上的分片,并使用movePrimary 命令强制特定分片充当特定数据库的主分片。由于数据库不会被分片,它的所有数据都将保留在其指定的主分片上,这正是您想要的。

话虽如此,在我看来,这种方法似乎与分片的概念相冲突,分片的目的是自动在多台机器上均匀分布数据。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-14
    • 1970-01-01
    • 2018-04-01
    • 2016-09-24
    • 1970-01-01
    • 1970-01-01
    • 2011-08-05
    • 1970-01-01
    相关资源
    最近更新 更多