PolarDB PostgreSQL分布式版叢集是一款基於集中式PolarDB PostgreSQL版叢集打造的分散式資料庫,採用CN/DN的雙層架構,實現計算與儲存分離的分布式擴充能力。同時支援集中式PolarDB PostgreSQL版叢集的現有能力,充分滿足企業級業務在效能和可靠性方面的多樣化需求。
技術架構
PolarDB PostgreSQL分布式版包含兩類核心節點:
每個計算或資料節點本身都是一個高可用的PolarDB PostgreSQL版叢集,內建了讀寫(RW)節點、唯讀(RO)節點和分布式儲存(PolarStore),確保了組件層級的可靠性。

架構優勢
線上水平擴充:通過線上增加節點來擴充計算與儲存能力,突破單機瓶頸,支援PB級海量資料和高並發業務。
靈活的擴充方式:節點採用共用儲存(Share Storage)架構,支援通過增加節點(Scale Out)或提升節點規格(Scale Up)兩種方式進行擴充。
高可用與低成本:採用ParallelRaft複製協議的三副本分布式儲存(PolarStore)確保了資料的高可用性,而費用僅按單副本計算。儲存空間根據實際使用方式進行收費,無需手動調整容量。
高效能:基於Distributed File System(Polar File System, 簡稱PolarFS)進行深度IO最佳化,如並行刷髒、批量讀寫以及表大小緩衝等,提供超高IOPS。
秒級備份恢複:支援秒級建立備份,並提供按時間點恢複(PITR)等多種資料恢複方式。
分布式開發模式
在PolarDB PostgreSQL分布式版上開發,核心是規劃資料的分布方式。您可以根據業務情境選擇以下兩種模式:
水平分割(Horizontal Splitting):將單張大表的資料行,按某一列(分布列)的雜湊值分散到多個資料節點(DN)上。此模式適用於解決單表資料量過大導致的效能問題,例如使用者表、訂單表等。為達到最佳效能,查詢時應盡量攜帶分布列作為過濾條件。
分布表(Distributed Table):在邏輯上是一張完整的表,但其資料被物理地拆分儲存在多個DN上。例如,應用訪問的是sensors_data表,而資料實際儲存在sensors_data_shard1、sensors_data_shard2等分區中。
分布列(Distribution Column):建立分布表時用於計算雜湊值以決定資料分布的列,例如sensor_id。
複製表(Reference Table):一種特殊的表,它的全量資料在每個DN上都存有一份完整的副本。它通常用於儲存資料量小且需要與大型分布表頻繁關聯的維度資料表(如國家、配置資訊等),可將跨節點JOIN最佳化為本地JOIN,顯著提升查詢效能。
分散式交易:當單個操作(顯式BEGIN ... COMMIT/ROLLBACK或隱含交易)需要修改分布在多個DN上的資料時,系統會自動啟用分散式交易以保證資料的一致性(ACID)。
主/從計算節點(Primary/Follower CN):所有CN節點均可處理查詢請求。但為保證中繼資料的一致性,DDL操作(如CREATE TABLE)只能由主CN上執行,變更結果會自動同步至所有其他節點(CN節點與DN節點)。
垂直分割(Vertical Splitting):將不同業務模組的表分別部署到不同的資料節點(DN)。此模式適用於按業務隔離資源,例如將高頻交易業務與後台報表業務的表存放在不同節點,避免相互影響。該模式對應用侵入性極小,因為計算節點(CN)對上層屏蔽了底層細節,應用依然可以像訪問單機資料庫一樣訪問所有表。

開發指南
準備工作:
設定叢集白名單
您可以前往PolarDB控制台,在叢集列表中單擊目的地組群ID進入叢集詳情頁。在中添加IP白名單或安全性群組。
說明 如果您是使用ECS訪問PolarDB,並且ECS與PolarDB位於同一VPC內,您可以選擇將ECS的內網IP地址添加至新的IP白名單分組,或將ECS所在的安全性群組添加至叢集白名單中。
如果您是使用ECS訪問PolarDB,但ECS與PolarDB不在同一VPC內,您可以選擇將ECS的公網IP地址添加至新的IP白名單分組,或將ECS所在的安全性群組添加至叢集白名單中。
如果您是在本地環境中訪問PolarDB,請將您本地環境的公網IP地址添加至新的IP白名單分組中。
本地環境的公網IP地址擷取方法如下:Linux作業系統:開啟終端,輸入curl ifconfig.me命令後斷行符號。
若您的本網環境存在代理等情況,以上方式擷取的IP可能並非您的真實公網IP。您可以將IP段0.0.0.0/0添加至PolarDB叢集白名單中,成功串連叢集後,執行SELECT pid,usename,datname,client_addr,state,query FROM pg_stat_activity WHERE state = 'active';命令擷取真實公網IP地址,並將其加入到叢集白名單中。隨後刪除白名單中的IP段0.0.0.0/0。

IP段0.0.0.0/0表示允許所有的訪問源訪問叢集,將其設定在叢集白名單中存在極大的風險,如非必要,切勿將其添加至白名單。
擷取資料庫連接地址與連接埠
您可以前往PolarDB控制台,在叢集列表中單擊目的地組群ID進入叢集詳情頁。在資料庫連接地區中擷取資料庫連接地址。
說明 PolarDB PostgreSQL分布式版叢集預設僅包含主地址,且預設連接埠號碼為5432。
請根據您的訪問環境選擇私網地址或公網地址。
公網地址即互連網,通過公網地址訪問將無法實現PolarDB叢集的最佳效能。
暫不支援使用虛擬機器主機和Simple Application Server使用私網地址串連PolarDB叢集。
串連分布式版叢集
使用DMS串連叢集
DMS是阿里雲提供的圖形化的資料管理工具,它是一種集資料管理、結構管理、使用者授權、安全審計、資料趨勢、資料追蹤、BI圖表、效能與最佳化和伺服器管理於一體的資料管理服務。您無需藉助其他工具,即可直接在DMS上管理您的PolarDB叢集。
前往PolarDB控制台,在叢集列表中單擊目的地組群ID進入叢集詳情頁。在頁面右上方單擊登入資料庫。
在彈出的對話方塊中,輸入集群中建立的資料庫帳號和資料庫密碼,單擊登入。
登入後,您可以在左側導覽列的列表中查看到所登入的PolarDB叢集,並進行相應的管理操作。
使用用戶端串連叢集
您可以使用任何通用的用戶端串連PolarDB叢集。此處pgAdmin 4 v9.0版本為例,其它用戶端的操作類似。
下載並安裝pgAdmin 4用戶端。
開啟pgAdmin 4用戶端,按右鍵Servers,選擇。
在General頁設定串連名稱,Connection頁設定要串連的叢集資訊,並單擊Save。

查看串連結果。若串連資訊無誤,會出現如下介面,則表示串連成功。
說明 postgres是預設的系統資料庫,請勿在該資料庫中進行任何操作。
使用命令列串連叢集
您可以前往PostgreSQL官網網站下載並使用psql工具串連PolarDB資料庫叢集。您也可以使用PolarDB提供的PolarDB-Tools工具包中的psql工具串連PolarDB資料庫叢集。
文法
psql -h <host> -p <port> -U <username> -d <dbname>
樣本
psql -h pc-xxx.rwlb.rds.aliyuncs.com -p 5432 -U testusername -d postgres
使用應用程式串連叢集
串連PolarDB PostgreSQL版叢集的方式與串連其他PostgreSQL資料庫的方式一樣,僅需將資料庫連接地址、連接埠、帳號及密碼等進行替換即可。以下為您列舉部分開發語言如何通過應用程式訪問PolarDB資料庫:
Java
此處以Maven專案為例,使用PostgreSQL JDBC驅動串連PolarDB PostgreSQL版叢集。
首先,您需要在pom.xml檔案中添加PostgreSQL JDBC驅動的依賴,程式碼範例:
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>42.2.18</version>
</dependency>
串連叢集。請將參數<HOST>、<PORT>、<USER>、<PASSWORD>、<DATABASE>、<YOUR_TABLE_NAME>及<YOUR_TABLE_COLUMN_NAME>進行替換。
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
public class PolarDBConnection {
public static void main(String[] args) {
// 資料庫URL, 使用者名稱, 密碼
String url = "jdbc:postgresql://<HOST>:<PORT>/<DATABASE>";
String user = "<USER>";
String password = "<PASSWORD>";
try {
// 載入JDBC驅動
Class.forName("org.postgresql.Driver");
// 建立串連
Connection conn = DriverManager.getConnection(url, user, password);
// 建立Statement對象
Statement stmt = conn.createStatement();
// 執行SQL查詢
ResultSet rs = stmt.executeQuery("SELECT * FROM <YOUR_TABLE_NAME>");
// 處理結果集
while (rs.next()) {
System.out.println(rs.getString("<YOUR_TABLE_COLUMN_NAME>"));
}
// 關閉資源
rs.close();
stmt.close();
conn.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
Python
此處以Python3為例,使用psycopg2庫串連PolarDB PostgreSQL版叢集。
首先,您需要安裝psycopg2庫。如果您還沒有安裝,可以通過以下命令進行安裝:
pip3 install psycopg2-binary
串連叢集。請將參數<HOST>、<PORT>、<USER>、<PASSWORD>、<DATABASE>及<YOUR_TABLE_NAME>進行替換。
import psycopg2
try:
# 串連參數
conn = psycopg2.connect(
host="<HOST>", # 資料庫主機地址
database="<DATABASE>", # 資料庫名稱
user="<USER>", # 使用者名稱
password="<PASSWORD>", # 密碼
port="<PORT>" # 連接埠
)
# 建立遊標對象
cursor = conn.cursor()
# 執行查詢
cursor.execute("SELECT * FROM <YOUR_TABLE_NAME>")
# 擷取所有結果
records = cursor.fetchall()
for record in records:
print(record)
except Exception as e:
print("錯誤:", e)
finally:
# 關閉串連
if 'cursor' in locals():
cursor.close()
if 'conn' in locals():
conn.close()
Go
此處以go1.23.0為例,使用database/sql包和lib/pq驅動來串連PolarDB PostgreSQL版叢集。
首先,您需要安裝lib/pq驅動。您可以通過以下命令進行安裝:
go get -u github.com/lib/pq
串連叢集。請將參數<HOST>、<PORT>、<USER>、<PASSWORD>、<DATABASE>及<YOUR_TABLE_NAME>進行替換。
package main
import (
"database/sql"
"fmt"
"log"
_ "github.com/lib/pq" // 初始化驅動
)
func main() {
// 連接字串格式
connStr := "user=<USER> password=<PASSWORD> dbname=<DATABASE> host=<HOST> port=<PORT> sslmode=disable"
// 開啟資料庫連接
db, err := sql.Open("postgres", connStr)
if err != nil {
log.Fatal(err)
}
defer db.Close() // 程式退出前關閉串連
// 測試連接是否成功
err = db.Ping()
if err != nil {
log.Fatal(err)
}
fmt.Println("Connected to PostgreSQL!")
// 執行查詢樣本
rows, err := db.Query("SELECT * FROM <YOUR_TABLE_NAME>")
if err != nil {
log.Fatal(err)
}
defer rows.Close()
}
建立與管理分布表和複製表
分布表DML操作說明
其他: