適用於 PostgreSQL 的 Azure 資料庫彈性伺服器中的彈性叢集

適用於 PostgreSQL 的 Azure 資料庫服務上的彈性叢集是開放原始碼超大規模 (Citus) 延伸模組的受控供應項目,可啟用 PostgreSQL 的水平分區化。

雖然 Citus 只是延伸模組,但它會連線多個 PostgreSQL 執行個體。 當你部署一個 適用於 PostgreSQL 的 Azure 資料庫 靈活伺服器並搭配 Citus 時,它會將多個 PostgreSQL 實例的管理與設定視為單一資源。 它也會自動設定節點,並讓超大規模 (Citus) 延伸模組知道這些節點。

服務上的彈性叢集提供兩種分區模型:資料列型分區和結構描述型分區。 如需進一步瞭解,請參閱有關分片模型的開源說明文件。

Architecture

彈性叢集由一個或多個 適用於 PostgreSQL 的 Azure 資料庫 彈性伺服器節點組成。 這些實例會自動互相發現並互相連結,形成一個Citus叢集。 節點必須是相同的運算和儲存層級,你可以均勻地將它們擴展到更高或更低的層級。

彈性叢集會使用彈性伺服器 (稱為節點) 的執行個體,在「無共用」結構中彼此協調。 此架構也可藉由將更多節點新增至叢集,讓資料庫進行調整。

彈性叢集使用稱為節點的彈性伺服器,在 共享無關 架構中彼此協調運作。 該結構也會透過對叢集新增更多節點來允許調整資料庫規模。

不同於適用於 PostgreSQL 的 Cosmos DB,節點位址不會在外部公開。 如果您查看超大規模 (Citus) 中繼資料表,如 pg_dist_node,您可能會注意到所有節點的 IP 位址與範例 10.7.0.254 相同,但連接埠號碼不同。

select nodeid, nodename, nodeport from pg_dist_node;
 nodeid |  nodename  | nodeport
--------+------------+----------
      1 | 10.7.0.254 |     7000
      2 | 10.7.0.254 |     7001
 
(2 rows)

在 Azure 的基礎結構中,這些節點會存在於不同的虛擬機器上,即使它們可能看似同一部機器上的不同埠。

想了解更多關於 Citus 的資訊,請參閱官方開源 專案文件。

根據預設,使用超大規模 (Citus) 建立的資料表和結構描述不會在叢集之間自動散發。 您必須決定分區化模型,並決定散發結構描述,或決定使用以資料列型的分區化來散發資料表資料。

針對分散式資料表上的每個查詢,查詢的節點會將其路由傳送至單一節點,或將其平行處理到數個節點。 決策取決於所需的資料是否位於單一節點或多個節點上。 使用結構描述型分區化,協調員會將查詢直接路由傳送至裝載結構描述的節點。 在這兩者中,結構描述型分區化和資料列型分區化,節點會藉由諮詢中繼資料表來決定該怎麼做。 這些資料表會追蹤節點的位置和健康情況,以及跨節點的資料分佈。

使用其中一個分區化模型散發資料后,您可以連線到任何節點來執行 DML (資料修改語言) 作業 (SELECT、UPDATE、INSERT、DELETE)。 所有節點都包含尋找查詢所需資料需要的中繼資料,而且能夠取得它來回應查詢。

DDL (資料定義語言) 作業和叢集範圍作業目前僅限於擁有協調器角色的節點。 請務必連線到連接埠 5432,而不是使用連接埠 7432 來執行 DDL 和全叢集作業。

您可以透過新增節點和重新平衡資料來擴展彈性叢集。 重新平衡是線上作業,不會封鎖執行中的工作負載。

分區

上一節說明如何將分散式資料表儲存為背景工作角色節點上的分區。 本節討論這些分區的其他技術詳細資料。

pg_dist_shard 中繼資料資料表包含系統中每個分散式資料表之每個分區的資料列。 資料列會比對分區識別碼 (shardid) 與雜湊空間中的整數範圍 (shardminvalue,shardmaxvalue)。

SELECT * from pg_dist_shard;
logicalrelid  | shardid | shardstorage | shardminvalue | shardmaxvalue
---------------+---------+--------------+---------------+---------------
 github_events |  102026 | t            | 268435456     | 402653183
 github_events |  102027 | t            | 402653184     | 536870911
 github_events |  102028 | t            | 536870912     | 671088639
 github_events |  102029 | t            | 671088640     | 805306367
 
 (4 rows)

如果節點想要判斷哪一個分區保存的 github_events 資料列,它會雜湊資料列中散發資料行的值。 然後,節點會檢查哪個分區的範圍中包含雜湊值。 定義範圍,使雜湊函式的映像為其脫離聯合。

分區放置

假設分區 102027 與有問題的資料列相關聯。 資料列是在其中一個背景工作角色中稱為 github_events_102027 的資料表中讀取或寫入。 透過儲存在元資料表中的資訊,擴充套件決定要使用哪個特定工作者。 分區與背景工作角色的對應稱為分區放置。

節點會將查詢重寫成參考特定資料表的片段,例如 github_events_102027,並在適當的背景工作角色上執行這些片段。 以下是在幕後執行的查詢範例,以尋找具有識別碼 102027 之分區的節點。

SELECT
    shardid,
    node.nodename,
    node.nodeport
FROM pg_dist_placement placement
JOIN pg_dist_node node
  ON placement.groupid = node.groupid
 AND node.noderole = 'primary'::noderole
WHERE shardid = 102027;
┌─────────┬───────────┬──────────┐
│ shardid │ nodename  │ nodeport │
├─────────┼───────────┼──────────┤
│  102027 │ localhost │     5433 │
└─────────┴───────────┴──────────┘