【问题标题】:Primary Keys (UUID, Sequence) strategy on CitusCitus 上的主键(UUID,序列)策略
【发布时间】:2022-01-27 00:24:25
【问题描述】:

Citus 上主键的最佳方法是什么?

UUID: 与身份/序列相反,不需要锁定。但是存储成本高,最终查询成本高+会导致碎片。

序列 - 身份 在创建实体时导致瓶颈。存储成本更低,查询更快+没有碎片。

如果我们想成为可扩展的项目,使用 UUID 会更好吗?

根据这篇文章: https://www.cybertec-postgresql.com/en/uuid-serial-or-identity-columns-for-postgresql-auto-generated-primary-keys/

对于分片,建议最终使用 UUID。

它在 Citus 上的表现如何?

我将给出一个架构示例:

User
UserId uuid/bigint?

Device
Device Id uuid/bigint?
UserId (here for the distribution key)

在上面的例子中,我们要根据UserId分配用户数据,例如他的Devices。 主键 ID 类型应该是什么? 如果 UUID 是答案,我们应该害怕节点中的碎片吗?

【问题讨论】:

    标签: postgresql primary-key uuid bigint citus


    【解决方案1】:

    免责声明:我是在 Citus 引擎上工作的软件工程师,他打开了一个 PR 以支持列默认值中的 UDF。

    在您在问题gen_random_uuid() 中分享的帖子中,UDF 被用作列默认值。 Citus 尚不支持此功能。

    我建议你使用 bigserial。

    我还想指出,博客中的某些陈述对 Citus 不正确。例如:

    因此,如果您使用分片(将数据分布在多个数据库中),则不能使用序列。

    在 Citus 中,您可以创建分布式序列对象,其中每个工作节点将使用序列允许值的不相交子集。应用程序在协调节点上看到一个序列,而分片有自己的序列,具有不同的起始值。

    (您可以使用定义为 INCREMENT 大于 1 和不同 START 值的序列,但这可能会在您添加其他分片时导致问题。)

    Citus 将 bigserial 的开头移动了 node_group_id * 2^48,这意味着您最多只能使用几乎无限的 2^18 分片。当您在单个表中拥有 PB 级的数据或百万分之一的分片时,您会遇到更大的问题,而这里的限制不会真正影响您的集群。

    PS:我在 UDF 列默认值方面的工作现在暂停,因为最近的一些代码更改将使解决方案更简洁,更易于维护。我们尚未在发布版本中发布这些更改。 https://github.com/citusdata/citus/pull/5149

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-01-22
      • 2021-06-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多