如何在 CockroachDB 中构建一个 multi-tenant 系统以确保良好的性能?

How to structure a multi-tenant system in CockroachDB to ensure good performance?

我们有一个 multi-tenant 系统,我们正开始将其数据迁移到 CockroachDB。 我们经常需要连接属于来自多个 table 的单个租户的数据。在极少数情况下,我们还会读取属于 multiple/all 个租户的数据 - 但这种情况不会经常发生,因此从性能角度来看并不那么重要。

我们认为 table interleaving 可能 是一个好的解决方案的一部分 - 即:有一个租户“parent” table,并且然后将其他 table 交织到那个 table 中,以增加属于同一租户的数据最终在同一范围内的机会。但不管这是不是个好主意,现在都不重要了,因为交错已经被弃用了。

为每个租户创建一个单独的模式或数据库,可能是一种解决方案。但是由于我们已经为每个微服务提供了一个模式,这将导致模式激增(我们有数千个租户)。因此,一些带有“鉴别器”列的设计更可取,该列告诉给定数据行属于哪个租户。

什么是好的设计,既好用又性能好?例如。使用复合键和 tenant-ID 作为键的第一部分会有帮助吗?我想这至少可以确保来自同一租户的数据在单个 table 中彼此相邻,因此更有可能在同一范围内结束?不过,这在 tables 之间进行连接时无济于事(这是我期望交错的帮助)。

Creating a separate schema or database per tenant, might be one solution. But as we already have one schema per microservice, that would lead to an explosion of schemas (we have thousands of tenants). Thus some design with a "discriminator" column telling which tenant a given row of data belongs to is preferable.

就性能而言,这些方法中的任何一种都适用。事实上,它们会在 CRDB 的 distributed key-value store.

中产生非常相似的密钥编码。

也就是说,CockroachDB 有大约 10k 个数据库的软限制,所以如果您已经有数千个用户,那么每个用户一个数据库可能是不可取的。

因此,将租户 ID 作为每个 table 的主键和二级索引的前缀可能是最好的方法。它将确保来自同一租户的数据在单个 table 中彼此相邻,以优化扫描和多行读写事务。