Azure Database for PostgreSQL 中的節(jié)點和表–超大規(guī)模 (Citus)

來源: Microsoft Azure
作者:Microsoft Azure
時間:2021-02-01
16118
超大規(guī)模(Citus)承載類型允許Azure Database for PostgreSQL服務器(稱為節(jié)點,)在無共享體系結構中彼此協(xié)調。服務器組中的節(jié)點共同保存更多的數(shù)據(jù),并使用比單個服務器上的更多的CPU內核。該體系結構還允許通過向服務器組中添加更多節(jié)點來縮放數(shù)據(jù)庫。

Nodes

超大規(guī)模(Citus)承載類型允許Azure Database for PostgreSQL服務器(稱為節(jié)點,)在"無共享"體系結構中彼此協(xié)調。服務器組中的節(jié)點共同保存更多的數(shù)據(jù),并使用比單個服務器上的更多的CPU內核。該體系結構還允許通過向服務器組中添加更多節(jié)點來縮放數(shù)據(jù)庫。

協(xié)調器和輔助角色

每個服務器組都有一個協(xié)調器節(jié)點和多個輔助角色。應用程序將其查詢發(fā)送到協(xié)調器節(jié)點,該節(jié)點將其中繼到相關的工作線程并累計其結果。應用程序無法直接連接到輔助角色。

超大規(guī)模(Citus)使數(shù)據(jù)庫管理員能夠在不同的工作節(jié)點上分發(fā)表,并存儲不同的行。分布式表是超大規(guī)模(Citus)性能的關鍵。如果無法分發(fā)表,則會將它們完全留在協(xié)調器節(jié)點上,并且無法利用跨計算機并行。

對于分布式表的每個查詢,協(xié)調器會將其路由到單個輔助角色節(jié)點,或將其并行在多個節(jié)點上,具體取決于所需的數(shù)據(jù)是位于單個節(jié)點上還是在多個節(jié)點上。協(xié)調器通過咨詢元數(shù)據(jù)表確定要執(zhí)行的操作。這些表跟蹤輔助角色節(jié)點的DNS名稱和運行狀況,以及跨節(jié)點分布的數(shù)據(jù)。

表類型

超大規(guī)模(Citus)服務器組中有三種類型的表,每個表在節(jié)點上以不同方式存儲,并用于不同目的。

類型1:分布式表

第一種類型,最常見的是分布式表。它們看起來像是SQL語句的普通表,但它們在工作節(jié)點之間水平分區(qū)。這意味著表中的行存儲在名為分片的碎片表中的不同節(jié)點上。

超大規(guī)模(Citus)只在整個群集中運行SQL但DDL語句。更改分布式表的架構會進行級聯(lián)以更新所有表在工作線程中的分片。

分布列

超大規(guī)模(Citus)使用算法分片將行分配到分片。根據(jù)名為分布列的表列的值,賦值是明確的。群集管理員必須在分發(fā)表時指定此列。做出正確的選擇對性能和功能非常重要。

類型2:引用表

引用表是一種分布式表,其整個內容將集中到單個分片中。分片在每個輔助角色上復制。對任何工作人員的查詢都可以在本地訪問引用信息,而無需從另一個節(jié)點請求行的網(wǎng)絡開銷。引用表沒有分布列,因為無需區(qū)分單獨的分片每行。

引用表通常很小,用于存儲與在任何輔助節(jié)點上運行的查詢相關的數(shù)據(jù)。例如訂單狀態(tài)或產(chǎn)品類別等枚舉值。

類型3:本地表

使用超大規(guī)模(Citus)時,連接到的協(xié)調器節(jié)點是一個常規(guī)的PostgreSQL數(shù)據(jù)庫??梢栽趨f(xié)調器上創(chuàng)建普通表,并選擇不分片。

對于本地表,最好是不參與聯(lián)接查詢的小型管理表。例如,應用程序登錄和身份驗證的用戶表。

分片

上一部分介紹了如何將分布式表存儲為輔助角色節(jié)點上的分片。本部分將討論更多技術詳細信息。

pg_dist_shard協(xié)調器的元數(shù)據(jù)表為系統(tǒng)中每個分布式表的每個分片都包含一行。該行將分片ID與(shardminvalue,shardmaxvalue)的哈希空間中的整數(shù)范圍匹配。

SQL

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)

如果協(xié)調器節(jié)點要確定哪些分片包含一行github_events,則將對該行中分布列的值進行哈希處理。然后,該節(jié)點檢查哪些分片的'范圍包含哈希值。定義這些范圍是為了使哈希函數(shù)的圖像是其不相交的聯(lián)合。

分片放置

假設分片102027與相關行相關聯(lián)。在其中一個輔助角色中調用的表中讀取或寫入該行github_events_102027。哪個工作線程?這完全由元數(shù)據(jù)表確定。分片到輔助角色的映射稱為分片位置。

協(xié)調器節(jié)點將查詢重寫為引用特定表的片段,github_events_102027并在相應的輔助角色上運行這些片段。下面是在幕后運行的查詢示例,用于查找包含分片ID 102027的節(jié)點。

SQL

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│

└─────────┴───────────┴──────────┘ 

立即登錄,閱讀全文
版權說明:
本文內容來自于Microsoft Azure,本站不擁有所有權,不承擔相關法律責任。文章內容系作者個人觀點,不代表快出海對觀點贊同或支持。如有侵權,請聯(lián)系管理員(zzx@kchuhai.com)刪除!
優(yōu)質服務商推薦
更多
掃碼登錄
打開掃一掃, 關注公眾號后即可登錄/注冊
加載中
二維碼已失效 請重試
刷新
賬號登錄/注冊
個人VIP
小程序
快出海小程序
公眾號
快出海公眾號
商務合作
商務合作
投稿采訪
投稿采訪
出海管家
出海管家