Citus数据-如何在查询中从单个碎片查询数据



我们正在为组织中的大规模数据用例评估Citus数据。在分析时,我试图看看是否有一种方法可以用Citus数据实现以下目标:

  • 我们想要创建一个分布式表(customers(,其中customer_id是shard/distribution键(customer_id为在应用程序端生成的UUID(
  • 虽然我们可以对这些实体上的所有CRUD操作使用常规SQL查询,但我们也需要定期查询表(周期性任务(,以根据一些筛选条件选择多个条目,从而将结果集获取到应用程序,并更新一些列和写回(读取和更新操作(
  • 我们的应用程序是一个水平可扩展的微服务,具有并行运行的多个服务实例
  • 因此,我们希望将周期性任务(拆分为多个子任务(在服务的多个实例上运行,以并行执行

因此,我正在寻找一种方法,从子任务中查询特定碎片的结果,以便每个子任务只负责获取和更新一个碎片上的数据。这将使我们能够并行运行周期性任务,而不用担心冲突,因为每个子任务都在一个碎片上操作。

我无法从文件中找到任何关于我们如何实现这一目标的内容。根据Citus的数据,这可能吗?

Citus(默认情况下(使用分布列的哈希值(在您的情况下是customer_id(在碎片中分布数据。

为了实现这一点,您可能需要在应用程序中存储一个(customer_id-shard_id(映射,并将子任务分配给碎片,并通过使用该映射从子任务发送查询。

您可能会考虑一个棘手的解决方案:您可以添加一个伪列(我将其命名为shard_id(,并将其作为分发列。以便您的应用程序知道应该从哪个子任务中提取/更新哪些行。换句话说,每个子任务将获取/更新具有特定值(shard_id(列的行,并且所有这些行都将位于同一个shard上,因为它们具有相同的分布列。在这种情况下,您可以操作哪些customer_id将在同一个碎片上,哪些应该形成一个单独的碎片;通过为它们分配所需的shard_id。

此外,我建议你看看";租户隔离";,在最新的博客文章中提到:https://www.citusdata.com/blog/2022/09/19/citus-11-1-shards-postgres-tables-without-interruption/#isolate-租户它基本上将租户(在您的案例中,所有数据都具有相同的customer_id(隔离到单个碎片中。也许它在某个时候对你有用。

最新更新