使用 Citus PostgresQL 需要注意哪些设置

What are settings to lookout for with Citus PostgresQL

我们正在考虑使用 CitusDB。阅读所有文档后,我们对一些基础知识还不清楚。希望有人能指点一下。

在 Citus 中,您指定 shard_countshard_max_size,这些设置是根据文档在协调器上设置的(但奇怪的是也可以在节点上设置)。

当您指定 1000 个分片并向 100 个客户端分发 10 tables 时会发生什么?

  1. 它是否为每个 table(users_1、users_2、shops_1 等)创建一个分片(如此有效地使用所有 1000碎片。

  2. 如果您要再增加 100 个客户,我们已经达到 1000 个限制,这些 table 是如何分区的?

  3. shard_max_size 默认为 1Gb。如果分片大于 1Gb,则会创建一个新分片,但是当 shard_count 已经命中时会发生什么?

  4. 最后,3000个碎片合适吗?我们在文档中读到 128 建议用于 saas。但是,如果您有 100 个客户 * 10 tables,那么这个接缝就很低了。 (我知道这取决于..但是..)

前 Citus/current Microsoft 员工,在此提出一些建议。

Citus 分片基于分布键的整数哈希范围。当插入一行时,分布键的值被散列,规划器查找分配给哪个分片该键落入的散列值范围,然后查找分片所在的工作线程,然后运行插入那个工人这意味着客户以大致均匀的方式分布在各个分片中,当您添加新客户时,它只会进入现有分片。

至关重要的是,您希望彼此连接的所有分布式 table 都具有相同数量的分片,并且它们的分布列具有相同的类型。这让我们可以完全在 workers 上执行连接,这对性能来说非常棒。

如果您有一个超级大客户(数据是普通客户的 100 倍是一个不错的启发式方法),我会提前使用租户隔离功能为他们提供自己的分片。如果您决定在未来这样做,这将使它们更容易移动到专用硬件。

shard_max_size 设置对哈希分布 table 没有影响。随着您不断插入数据,分片将无限增长,并且 hash-distributed tables 在正常操作下永远不会增加其分片数量。此设置仅适用于附加分发,这几天很少使用(我能想到一两家公司使用它,但仅此而已)。

对于您描述的用例,我强烈建议不要将 citus.shard_count 更改为 3000。 64 或 128 可能是正确的,如果您正在查看 >100TB 的数据,我会考虑 256。如果您最终拥有数千个分布式 table 并且每个都有 128 个分片,那完全没问题,但最好保持每个 table 的分片数量合理。