簡體   English   中英

Citus 數據 - 如何從查詢中的單個分片查詢數據?

[英]Citus data - How to query data from a single shard in a query?

我們正在為我們組織中的大規模數據用例評估 Citus 數據。 在分析時,我想看看是否有辦法使用 Citus 數據實現以下目標:

  • 我們要創建一個分布式表(客戶),customer_id 是分片/分發鍵(customer_id 是應用程序端生成的 UUID)
  • 雖然我們可以對這些實體上的所有 CRUD 操作使用常規 SQL 查詢,但我們還需要定期查詢表(周期性任務)到 select 基於某些過濾條件的多個條目,以獲取結果集到應用程序並更新一些列和寫回(讀取和更新操作)。
  • 我們的應用程序是一個水平可擴展的微服務,具有多個並行運行的服務實例
  • 所以我們想把周期性任務(分成多個子任務)拆分到服務的多個實例上並行執行

因此,我正在尋找一種方法來從子任務的特定分片中查詢結果,以便每個子任務只負責獲取和更新一個分片上的數據。 這將讓我們並行運行周期性任務,而不必擔心沖突,因為每個子任務都在一個分片上運行。

我無法從文檔中找到任何關於我們如何實現這一目標的信息。 Citus數據可以做到這一點嗎?

Citus(默認情況下)使用分布列的 hash 值(在您的情況下為 customer_id)跨分片分布數據。

為此,您可能需要在應用程序中存儲 (customer_id - shard_id) 映射,並將子任務分配給分片,並使用此映射從子任務發送查詢。

您可能會考慮一種 hacky 解決方案:您可以添加一個虛擬列(我將其命名為 shard_id)並將其設為分布列。 這樣您的應用程序就知道應該從哪個子任務中獲取/更新哪些行。 換句話說,每個子任務將獲取/更新具有 (shard_id) 列的特定值的行,並且所有這些行將位於同一個分片上,因為它們具有相同的分布列。 在這種情況下,您可以操縱哪些 customer_ids 將在同一個分片上,哪些應該形成一個單獨的分片; 通過為他們分配你想要的 shard_id。

另外我建議您看一下最新博客文章中提到的“租戶隔離”: https://www.citusdata.com/blog/2022/09/19/citus-11-1-shards- postgres-tables-without-interruption/#isolate-tenant它基本上將租戶(在您的情況下具有相同 customer_id 的所有數據)隔離到單個分片中。 也許它在某些時候對你有用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM