【发布时间】: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