5

在从 MySQL 迁移到 Citus 集群期间,我使用了range分发方法。迁移已完成,但现在我想将分发方式更改为hash.

对于已有数据的现有表,有没有办法将分布方法从更改为更改rangehash

我想出了以下程序,但不确定它是否有效:

  1. 为所有正在更改的分片更新表的minvaluemaxvaluepg_dist_shard
  2. 将表的分片存储类型列pg_dist_partition从更新rh
  3. COMMIT;
4

1 回答 1

4

这是个好问题。目前,Citus 不提供直接更改现有数据的分区类型的方法。

在范围分区中,记录根据其分区列值和分片最小/最大值放置在分片中。如果记录 x 驻留在分片 y 中,则表示y.minvalue <= x.partition_column <= y.maxvalue

在散列分区中,对分区列进行散列,并根据此散列值路由记录。因此,您看到的最小/最大值pg_dist_shard是散列函数结果的边界值。在这种情况下y.minvalue <= hash(x.partition_column) <= y.maxvalue

因此,进行您提到的更改最终会导致分配不正确。为了从范围分区切换到哈希分区,数据应该重新分布。为此,我建议将数据重新加载到一个空的散列分区表中。

有关更多信息,您可以参考Citus 文档的使用分布式表散列分布部分。

于 2016-04-28T09:17:39.323 回答