すべてのプロダクト
Search
ドキュメントセンター

PolarDB:PolarDB for PostgreSQL 分散版

最終更新日:Sep 03, 2025

PolarDB for PostgreSQL 分散版 クラスタは、PolarDB for PostgreSQL 集中式版に基づいて開発された分散データベースソリューションです。 このクラスタは、計算ノード (CN) とデータノード (DN) の 2 層アーキテクチャを使用して、計算とストレージを分離し、分散スケーリング機能を提供します。 このクラスタは、分散データベースの強みと、PolarDB for PostgreSQL の実績のある機能を組み合わせており、エンタープライズレベルのアプリケーションの多様なパフォーマンスと信頼性の要件を満たすことができます。

仕組み

PolarDB for PostgreSQL 分散版 には、2 種類のコアノードが含まれています。

  • 計算ノード (CN): クラスタのアクセスポイントとして機能します。 SQL を解析し、分散クエリプランを作成し、メタデータを管理します。

  • データノード (DN): テーブルの物理データシャードを格納します。

各計算ノードまたはデータノードは、高可用性 (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_shard1sensors_data_shard2 などのシャードに格納されています。

    • 分布列: 分散テーブルを作成するときにデータ分布を決定するためにハッシュ値の計算に使用される列。 例としては sensor_id があります。

    • レプリケートされたテーブル: データの完全なコピーがすべての DN に格納される特別なタイプのテーブル。 通常、国や構成情報などの小さなディメンションテーブルに使用され、大きな分散テーブルと頻繁に結合されます。 これにより、ノード間の JOIN がローカル JOIN に最適化され、クエリのパフォーマンスが大幅に向上します。

    • 分散トランザクション: 単一の操作 (明示的な BEGIN ... COMMIT/ROLLBACK または暗黙的なトランザクション) で複数の DN に分散されたデータを変更する必要がある場合、システムは自動的に分散トランザクションを有効にしてデータの整合性 (原子性、整合性、分離性、および耐久性 (ACID)) を確保します。

      説明

      レプリケートされたテーブルを変更すると、分散トランザクションがトリガーされます。

    • プライマリ/フォロワー CN: すべての CN はクエリリクエストを処理できます。 ただし、メタデータの整合性を確保するために、CREATE TABLE などのデータ定義言語 (DDL) 操作は、プライマリ CN でのみ実行できます。 変更は他のすべてのノード (CN および DN) に自動的に同期されます。

  • 垂直分割: 異なるビジネスモジュールのテーブルを異なる DN にデプロイします。 このパターンは、ビジネスごとにリソースを分離するのに適しています。 たとえば、高頻度トランザクションサービスとバックエンドレポートサービスのテーブルを異なるノードに格納して、互いに影響を与えないようにすることができます。 CN は下層の詳細を上位層から隠蔽するため、このパターンはアプリケーションへの影響は最小限です。 アプリケーションは、スタンドアロンデータベースにアクセスしているかのように、すべてのテーブルにアクセスできます。

使用方法

  1. 分散データベースに接続する

    1. データベースアカウントを作成する

      PolarDB コンソール にログインします。 クラスタリストで、クラスタの ID をクリックして、その [基本情報] ページに移動します。 左側のナビゲーションウィンドウで、[設定と管理] > [アカウント] を選択して、データベースアカウントを作成image

      説明

      [特権アカウント] または [標準アカウント] を作成できます。 これら 2 種類のアカウントには、異なる権限。 ビジネス要件に基づいてデータベースアカウントを作成します。

    2. クラスタホワイトリストを構成する

      PolarDB コンソール にログインします。 クラスタリストで、接続するクラスタの ID をクリックして、その [基本情報] ページに移動します。 左側のナビゲーションウィンドウで、[設定と管理] > [クラスタホワイトリスト] を選択し、IP ホワイトリスト、または セキュリティグループimage

      説明
      • 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 ブロックを削除します。

        image

      • 0.0.0.0/0 CIDR ブロックを IP ホワイトリストに追加すると、すべてのソースがクラスタにアクセスできるようになります。 必要な場合を除き、クラスタの IP ホワイトリストに 0.0.0.0/0 を追加しないでください。

    3. データベースのエンドポイントとポートを取得する

      PolarDB コンソール にログインします。 クラスタリストで、クラスタの ID をクリックして、その [基本情報] ページに移動します。 次に、[データベース接続] セクションで エンドポイント 情報を表示できます。image

      説明
      • デフォルトでは、分散 PolarDB for PostgreSQL クラスタには [プライマリエンドポイント] が 1 つだけあり、デフォルトのポート番号は 5432 です。

      • アクセス環境に基づいて、[プライベート] または [パブリック] エンドポイントを使用します。

        • ECS インスタンスから PolarDB クラスタにアクセスする場合、ECS インスタンスが PolarDB クラスタと同じ VPC にある場合は、[プライベート] エンドポイントを使用します。

        • オンプレミス環境から PolarDB クラスタにアクセスする場合は、[パブリック] エンドポイントを使用します。 デフォルトでは、パブリックエンドポイントは使用できません。 [適用] をクリックして、パブリックエンドポイントを申請します。

      • [パブリックエンドポイント] を使用して接続する場合、PolarDB クラスタは最適なパフォーマンスを達成できません。

      • [プライベート] エンドポイントを使用して、仮想ホストおよび軽量サーバーから PolarDB クラスタに接続することはできません。

    4. 分散クラスタに接続する

      DMS を使用してクラスタに接続する

      Data Management (DMS) は、Alibaba Cloud が提供するグラフィカルなデータ管理ツールです。 データ管理、スキーマ管理、ユーザー管理、セキュリティ監査、データトレンド、データ追跡、ビジネスインテリジェンス (BI) チャート、パフォーマンスの最適化、サーバー管理など、さまざまなデータ管理サービスを提供します。 他のツールを使用せずに、DMS を使用して PolarDB クラスタを直接管理できます。

      1. PolarDB コンソール にログインします。 クラスタリストで、接続するクラスタの ID をクリックして、その [基本情報] ページに移動します。 ページの右上隅にある [データベースにログイン] をクリックします。image

      2. 表示されるダイアログボックスで、クラスタ用に作成したデータベースアカウントとパスワードを入力し、[ログイン] をクリックします。image

      3. クラスタにログインした後、左側のナビゲーションウィンドウで [データベースインスタンス] > [接続されたインスタンス] を選択して、 クラスタを管理します。image

      クライアントを使用してクラスタに接続する

      クライアントを使用して PolarDB クラスタに接続できます。 次の手順では、pgAdmin 4 v9.0 クライアントを使用してクラスタに接続します。

      1. pgAdmin 4 クライアントを ダウンロード してインストールします。

      2. pgAdmin 4 クライアントを開き、[サーバー] を右クリックし、[登録 > サーバー...] を選択します。image

      3. [全般] タブで、接続名を設定します。 [接続] タブで、クラスタ接続情報を構成し、[保存] をクリックします。image

        image

        パラメータ

        説明

        ホスト名/アドレス

        PolarDB クラスタの エンドポイントとポート

        • ECS インスタンスから PolarDB クラスタにアクセスする場合、ECS インスタンスが PolarDB クラスタと同じ VPC にある場合は、[プライベート] エンドポイントとポートを指定します。

        • オンプレミス環境から PolarDB クラスタにアクセスする場合は、[パブリック] エンドポイントとポートを指定します。

        • デフォルトのポート番号は 5432 です。

        ポート

        ユーザー名

        PolarDB クラスタの データベースアカウントとパスワード

        パスワード

      4. 接続結果を表示します。 接続情報が正しい場合、次のインターフェースが表示され、接続が成功したことを示します。image

        説明

        postgres はデフォルトのシステムデータベースです。 このデータベースでは操作を実行しないでください。

      psql を使用してクラスタに接続する

      PostgreSQL ダウンロード から psql をダウンロードして、PolarDB クラスタに接続できます。 PolarDB-Tools を使用して、PolarDB クラスタに接続することもできます。

      説明
      • psql を使用したクラスタ接続方法は、Windows システムと Linux システムで同じです。

      • psql の使用方法の詳細については、「psql」をご参照ください。

      構文

      psql -h <host> -p <port> -U <username> -d <dbname>

      パラメータ

      説明

      host

      PolarDB クラスタの クラスタエンドポイントとポート

      • ECS インスタンスから PolarDB クラスタにアクセスする場合、ECS インスタンスが PolarDB クラスタと同じ VPC にある場合は、[プライベート] エンドポイントとポートを指定します。

      • オンプレミス環境から PolarDB クラスタにアクセスする場合は、[パブリック] エンドポイントとポートを指定します。

      • デフォルトのポート番号は 5432 です。

      port

      username

      PolarDB クラスタの データベースアカウント

      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 クラスターに接続する方法を説明します。

      1. pom.xml ファイルにPostgreSQL JDBC ドライバーの依存関係を追加します。サンプルコード:

        <dependency>
          <groupId>org.postgresql</groupId>
          <artifactId>postgresql</artifactId>
          <version>42.2.18</version>
        </dependency>
      2. クラスタに接続します。 <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 クラスタに接続する方法について説明します。

      1. psycopg2 ライブラリをインストールします。

        pip3 install psycopg2-binary
      2. クラスタに接続します。 <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 クラスタに接続する方法について説明します。

      1. lib/pq ドライバをインストールします。

        go get -u github.com/lib/pq
      2. クラスタに接続します。 <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()
        }
        
  2. 分散テーブルとレプリケートされたテーブルを作成および管理する

  3. 分散テーブルに対する DML 操作

  4. 分散テーブルに対するクエリを最適化する

  5. CDC を構成してデータ変更を同期する