【问题标题】:How to structure a multi-tenant system in CockroachDB to ensure good performance?如何在 CockroachDB 中构建多租户系统以确保良好的性能?
【发布时间】:2021-05-11 23:13:31
【问题描述】:

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

我们认为table interleaving 可能是一个很好的解决方案的一部分 - 即:有一个租户“父”表,然后将其他表交错到该表中,以增加属于同一表的机会数据租户最终在同一范围内。但是,这是否是一个好主意,现在都无关紧要了,因为交错已被弃用。

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

什么是好的设计,既好用又性能好?例如。将租户 ID 的复合键用作键的第一部分会有所帮助吗?我想这至少可以确保单个表中来自同一租户的数据彼此相邻,因此更有可能最终在同一范围内?但是,在跨表进行连接时,这无济于事(这是我期望交错来帮助的)。

【问题讨论】:

    标签: performance database-design multi-tenant cockroachdb


    【解决方案1】:

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

    就性能而言,这些方法中的任何一种都是合适的。事实上,它们会在 CRDB 的 distributed key-value store 中产生非常相似的密钥编码。

    也就是说,CockroachDB 的软限制约为 10k 个数据库,因此如果您已经有数千个用户,则可能不建议每个用户使用一个数据库。

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

    【讨论】:

    • 好的 - 所以我理解你的答案,通过在键前面加上租户 ID,我们可以在按租户 ID 过滤时对 single 表进行快速查询。但是当我们连接 2 个不同的表时,数据可能仍然位于不同的范围内,因此位于不同的节点上。这是我希望交错表格能够帮助解决的问题之一。
    • Nathan,您知道您是否计划更换表交错以支持多租户表?例如。来自 2 个不同表的属于同一租户(因此具有相同的主键前缀)的数据位于同一范围内的机会增加了吗?这是有道理的,因为我们经常跨表连接属于同一租户的数据。
    • 使用租户 ID 前缀键将允许在按租户 ID 过滤时对一个 或多个 表进行快速查询。如果没有交错表,您会失去的东西是能够访问快速路径,其中连接被转换为对所有租户数据的单个连续扫描,而不是两个单独的、单独有效的扫描,合并连接结合它们的结果。
    • 但是,我们发现这种快速路径在实践中很少有好处。它通常会导致扫描其他交错表中不需要为给定查询提供服务的无关数据。交错连接也消除了并行性的机会。在我们的测试中,我们发现将交错连接替换为标准合并连接可使大多数客户查询的速度提高约 50%。
    • 所以我的建议是在每个索引前面加上租户 ID,然后在每个查询中包含一个租户 ID,看看事情的执行情况。如果您发现性能问题,我们将非常有兴趣了解这些问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-31
    • 1970-01-01
    • 1970-01-01
    • 2016-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多