PolarDB for PostgreSQL 分散版 クラスタは、PolarDB for PostgreSQL 集中式版に基づいて開発された分散データベースソリューションです。 このクラスタは、計算ノード (CN) とデータノード (DN) の 2 層アーキテクチャを使用して、計算とストレージを分離し、分散スケーリング機能を提供します。 このクラスタは、分散データベースの強みと、PolarDB for PostgreSQL の実績のある機能を組み合わせており、エンタープライズレベルのアプリケーションの多様なパフォーマンスと信頼性の要件を満たすことができます。
仕組み
PolarDB for PostgreSQL 分散版 には、2 種類のコアノードが含まれています。
各計算ノードまたはデータノードは、高可用性 (HA) の PolarDB for PostgreSQL クラスタです。 各ノードには、読み書き (RW) ノード、読み取り専用 (RO) ノード、および分散ストレージ (PolarStore) が含まれており、コンポーネントレベルの信頼性を確保します。
アーキテクチャ上の利点
オンライン水平スケーリング: オンラインでノードを追加して、計算およびストレージ容量を拡張します。 これにより、単一マシンのボトルネックが解消され、ペタバイト規模のデータと高並列サービスがサポートされます。
柔軟なスケーリング方法: ノードは共有ストレージアーキテクチャを使用します。 ノードを追加することでスケールアウトしたり、ノードの仕様を向上させることでスケールアップしたりできます。
高可用性と低コスト: 分散ストレージ (PolarStore) は、3 重レプリカと ParallelRaft レプリケーションプロトコルを使用して、高いデータ可用性を確保します。 1 つのレプリカに対してのみ課金されます。 ストレージは実際の使用量に基づいて課金されるため、容量を手動で調整する必要はありません。
高パフォーマンス: 分散ファイルシステム (PolarFileSystem、または PolarFS) に基づくディープ I/O 最適化により、非常に高い入出力操作/秒 (IOPS) が実現します。 これらの最適化には、並列ダーティページフラッシュ、バッチ読み取りと書き込み、テーブルサイズキャッシングが含まれます。
迅速なバックアップとリカバリ: 数秒でバックアップを作成します。 ポイントインタイムリストア (PITR) など、複数のデータ復旧方法が利用可能です。
分散開発パターン
PolarDB for PostgreSQL 分散版 で開発する場合、中心となるタスクはデータ分布の計画です。 ビジネスシナリオに基づいて、次の 2 つのパターンのいずれかを選択できます。
水平分割: 特定の列 (分布列) のハッシュ値に基づいて、大きな単一テーブルの行を複数の DN に分散します。 このパターンは、ユーザーテーブルや注文テーブルなど、過度に大きな単一テーブルによって引き起こされるパフォーマンスの問題を解決します。 最適なパフォーマンスを得るには、クエリに分布列をフィルタ条件として含めます。
分散テーブル: 論理的には完全ですが、データが物理的に分割され、複数の DN に格納されているテーブル。 たとえば、アプリケーションは sensors_data テーブルにアクセスしますが、データは実際には sensors_data_shard1 や sensors_data_shard2 などのシャードに格納されています。
分布列: 分散テーブルを作成するときにデータ分布を決定するためにハッシュ値の計算に使用される列。 例としては sensor_id があります。
レプリケートされたテーブル: データの完全なコピーがすべての DN に格納される特別なタイプのテーブル。 通常、国や構成情報などの小さなディメンションテーブルに使用され、大きな分散テーブルと頻繁に結合されます。 これにより、ノード間の JOIN がローカル JOIN に最適化され、クエリのパフォーマンスが大幅に向上します。
分散トランザクション: 単一の操作 (明示的な BEGIN ... COMMIT/ROLLBACK または暗黙的なトランザクション) で複数の DN に分散されたデータを変更する必要がある場合、システムは自動的に分散トランザクションを有効にしてデータの整合性 (原子性、整合性、分離性、および耐久性 (ACID)) を確保します。
説明 レプリケートされたテーブルを変更すると、分散トランザクションがトリガーされます。
プライマリ/フォロワー CN: すべての CN はクエリリクエストを処理できます。 ただし、メタデータの整合性を確保するために、CREATE TABLE などのデータ定義言語 (DDL) 操作は、プライマリ CN でのみ実行できます。 変更は他のすべてのノード (CN および DN) に自動的に同期されます。
垂直分割: 異なるビジネスモジュールのテーブルを異なる DN にデプロイします。 このパターンは、ビジネスごとにリソースを分離するのに適しています。 たとえば、高頻度トランザクションサービスとバックエンドレポートサービスのテーブルを異なるノードに格納して、互いに影響を与えないようにすることができます。 CN は下層の詳細を上位層から隠蔽するため、このパターンはアプリケーションへの影響は最小限です。 アプリケーションは、スタンドアロンデータベースにアクセスしているかのように、すべてのテーブルにアクセスできます。
使用方法
分散データベースに接続する
データベースアカウントを作成する
PolarDB コンソール にログインします。 クラスタリストで、クラスタの ID をクリックして、その [基本情報] ページに移動します。 左側のナビゲーションウィンドウで、 を選択して、データベースアカウントを作成。
説明 [特権アカウント] または [標準アカウント] を作成できます。 これら 2 種類のアカウントには、異なる権限。 ビジネス要件に基づいてデータベースアカウントを作成します。
クラスタホワイトリストを構成する
PolarDB コンソール にログインします。 クラスタリストで、接続するクラスタの ID をクリックして、その [基本情報] ページに移動します。 左側のナビゲーションウィンドウで、 を選択し、IP ホワイトリスト、または セキュリティグループ。
説明 ECS インスタンスから PolarDB クラスタにアクセスする場合、ECS インスタンスが PolarDB クラスタと同じ VPC にある場合は、IP アドレスホワイトリストを作成し、ECS インスタンスの内部 IP アドレスをホワイトリストに追加するか、ECS インスタンスが属するセキュリティグループを追加します。
ECS インスタンスから PolarDB クラスタにアクセスする場合、ECS インスタンスが PolarDB クラスタと異なる VPC にある場合は、IP アドレスホワイトリストを作成し、ECS インスタンスのパブリック IP アドレスをホワイトリストに追加するか、ECS インスタンスが属するセキュリティグループを追加します。
オンプレミス環境から PolarDB クラスタにアクセスする場合は、IP アドレスホワイトリストを作成し、オンプレミス環境のパブリック IP アドレスをホワイトリストに追加します。
次の方法を使用して、オンプレミス環境のパブリック IP アドレスを取得します。
Linux: CLI を開き、curl ifconfig.me コマンドを入力し、Enter キーを押します。
Windows: コマンドプロンプトを開き、curl ip.me コマンドを入力し、Enter キーを押します。
macOS: ターミナルを起動し、curl ifconfig.me コマンドを入力し、Enter キーを押します。
オンプレミスネットワーク環境でプロキシが使用されている場合、前述の方法で取得した IP アドレスは実際のパブリック IP アドレスではない可能性があります。 PolarDB クラスタのホワイトリストに 0.0.0.0/0 CIDR ブロックを追加できます。 クラスタに接続した後、SELECT pid,usename,datname,client_addr,state,query FROM pg_stat_activity WHERE state = 'active'; コマンドを実行して実際のパブリック IP アドレスを取得し、クラスタのホワイトリストに追加します。 次に、ホワイトリストから 0.0.0.0/0 CIDR ブロックを削除します。

0.0.0.0/0 CIDR ブロックを IP ホワイトリストに追加すると、すべてのソースがクラスタにアクセスできるようになります。 必要な場合を除き、クラスタの IP ホワイトリストに 0.0.0.0/0 を追加しないでください。
データベースのエンドポイントとポートを取得する
PolarDB コンソール にログインします。 クラスタリストで、クラスタの ID をクリックして、その [基本情報] ページに移動します。 次に、[データベース接続] セクションで エンドポイント 情報を表示できます。
説明 デフォルトでは、分散 PolarDB for PostgreSQL クラスタには [プライマリエンドポイント] が 1 つだけあり、デフォルトのポート番号は 5432 です。
アクセス環境に基づいて、[プライベート] または [パブリック] エンドポイントを使用します。
ECS インスタンスから PolarDB クラスタにアクセスする場合、ECS インスタンスが PolarDB クラスタと同じ VPC にある場合は、[プライベート] エンドポイントを使用します。
オンプレミス環境から PolarDB クラスタにアクセスする場合は、[パブリック] エンドポイントを使用します。 デフォルトでは、パブリックエンドポイントは使用できません。 [適用] をクリックして、パブリックエンドポイントを申請します。
[パブリックエンドポイント] を使用して接続する場合、PolarDB クラスタは最適なパフォーマンスを達成できません。
[プライベート] エンドポイントを使用して、仮想ホストおよび軽量サーバーから PolarDB クラスタに接続することはできません。
分散クラスタに接続する
DMS を使用してクラスタに接続する
Data Management (DMS) は、Alibaba Cloud が提供するグラフィカルなデータ管理ツールです。 データ管理、スキーマ管理、ユーザー管理、セキュリティ監査、データトレンド、データ追跡、ビジネスインテリジェンス (BI) チャート、パフォーマンスの最適化、サーバー管理など、さまざまなデータ管理サービスを提供します。 他のツールを使用せずに、DMS を使用して PolarDB クラスタを直接管理できます。
PolarDB コンソール にログインします。 クラスタリストで、接続するクラスタの ID をクリックして、その [基本情報] ページに移動します。 ページの右上隅にある [データベースにログイン] をクリックします。
表示されるダイアログボックスで、クラスタ用に作成したデータベースアカウントとパスワードを入力し、[ログイン] をクリックします。
クラスタにログインした後、左側のナビゲーションウィンドウで を選択して、 クラスタを管理します。
クライアントを使用してクラスタに接続する
クライアントを使用して PolarDB クラスタに接続できます。 次の手順では、pgAdmin 4 v9.0 クライアントを使用してクラスタに接続します。
pgAdmin 4 クライアントを ダウンロード してインストールします。
pgAdmin 4 クライアントを開き、[サーバー] を右クリックし、 を選択します。
[全般] タブで、接続名を設定します。 [接続] タブで、クラスタ接続情報を構成し、[保存] をクリックします。

接続結果を表示します。 接続情報が正しい場合、次のインターフェースが表示され、接続が成功したことを示します。
説明 postgres はデフォルトのシステムデータベースです。 このデータベースでは操作を実行しないでください。
psql を使用してクラスタに接続する
PostgreSQL ダウンロード から psql をダウンロードして、PolarDB クラスタに接続できます。 PolarDB-Tools を使用して、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 for PostgreSQL クラスタへの接続は、通常の PostgreSQL データベースへの接続と似ています。 エンドポイント、ポート、アカウント、パスワードなどの接続パラメータを変更するだけで済みます。 特定のプログラミング言語で PolarDB クラスタに接続する方法の例を以下に示します。
Java
この例では、Maven ベースの Java プロジェクトで PostgreSQL JDBC ドライバーを使用して PolarDB for 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 {
// PostgreSQL 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
この例では、Python 3 で psycopg2 ライブラリを使用して、PolarDB for 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("Error:", e)
finally:
# 接続を閉じます。
if 'cursor' in locals():
cursor.close()
if 'conn' in locals():
conn.close()
Go
この例では、Go 1.23.0 で database/sql パッケージと lib/pq ドライバを使用して、PolarDB for 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" // PostgreSQL ドライバを初期化します。
)
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("PostgreSQL に接続しました!")
// クエリを実行します。
rows, err := db.Query("SELECT * FROM <YOUR_TABLE_NAME>")
if err != nil {
log.Fatal(err)
}
defer rows.Close()
}
分散テーブルとレプリケートされたテーブルを作成および管理する
分散テーブルに対する DML 操作
分散テーブルに対するクエリを最適化する
CDC を構成してデータ変更を同期する