【问题标题】:Which distributed SQL databases put data from different tables with the same tenant in the same node?哪些分布式 SQL 数据库将来自同一租户的不同表中的数据放在同一节点中?
【发布时间】:2022-01-04 14:21:39
【问题描述】:

我正在设计一个 SQL 数据模式,其中包含许多具有 (customer_id, id) 复合主键的表。应用程序将经常需要运行JOIN 查询来组合数据。但是,它不应该运行跨客户连接。 (严格禁止跨客户加入可能是一个有用的安全功能,但业务需求可能会发生变化。)

我正在研究分布式 SQL 数据库。理想情况下,我想知道同一个customer_id 的跨表数据存在于同一个分片上,因此不需要跨分片执行连接。

我已经阅读了 Vitess、YugabyteDB 和 CockroachDB 的文档。在这三个中,我只相信 Vitess 会将来自同一客户的数据存储在同一节点上。

我是否缺少 YugabyteDB/CockroachDB 的功能?

【问题讨论】:

  • YugabyteDB blog post关于它如何分布数据读取 "主键或索引列定义定义了分片方法,使用 HASH 或范围(ASC 或 DESC)分片。这就是我们选择在散列列上分配数据以实现负载平衡并避免热点。这也是我们将行放在升序或降序列上以进行范围扫描的地方(如''、'BETWEEN'谓词)" 这表明主键决定了分片之间的数据分布。
  • 不过它也提到了,它的分布式架构“但是,他们没有将它们作为多个数据库管理的负担,因为SQL层在上面。连接和二级索引不被处理在这个级别,因为这可以防止跨分片事务” 表明对于您的JOIN 场景,它的分发/分片逻辑是多余的,因为它不在分片/平板电脑级别运行 SQL。
  • 这在 YugabyteDB 中作为“托管数据库”docs.yugabyte.com/latest/architecture/docdb-sharding/… 与表组一起在工作中github.com/yugabyte/yugabyte-db/blob/…
  • 现在阅读 YugabyteDB 并置表,谢谢。从最初的阅读中,我看不到如何基于共享分区桶列水平分片并置表?似乎它们是一种将小型非分片表存储在一起的解决方案。
  • @Calebmer 说您有 10K 租户。您创建 100 个表组并将租户分布在这 100 个组中。现在您可以将表组分布在整个集群中。然后,您可以将单个表组分片以分布在多个服务器上。

标签: sql cockroachdb distributed-database yugabyte-db vitess


【解决方案1】:

CockroachDB 不支持此处要求的并置表。这以前以交错表的形式得到支持,但最近被弃用了,因为实现难以维护并且没有像预期的那样产生显着的性能提升。如果您有兴趣了解更多信息,请在此 GH 线程 https://github.com/cockroachdb/cockroach/issues/52009 上详细讨论性能方面。

【讨论】:

    【解决方案2】:

    其中有两个方面:安全性和性能。 对于安全性(租户隔离),如果您具有行级安全性,则不需要专用节点。以下是 YugabyteDB 上的示例: https://dev.to/yugabyte/hyper-scale-multi-tenant-for-saas-an-example-with-pgbench-33a3 为了提高性能(避免跨节点事务),您可以在其之上使用声明性分区。分区,就像在博客文章中创建的一样,可以通过云/区域/区域拓扑标记到特定节点

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-06
      • 1970-01-01
      • 2012-03-14
      • 1970-01-01
      • 2018-07-04
      • 2012-11-22
      相关资源
      最近更新 更多