Postgres データベースのインポート

このセクションでは、新しい CloudNativePG クラスター内に 1 つ以上の既存の PostgreSQL データベースをインポートする方法について説明します。

インポート操作は、PostgreSQL のオンライン論理バックアップの概念に基づいており、元のホストへのネットワーク接続を介した pg_dump と pg_restore に依存しています。ネイティブの Multi-Version Concurrency Control (MVCC) とスナップショットのおかげで、PostgreSQL は、書き込みアクティビティを停止することなく、ネットワーク経由で一貫したバックアップを同時に行うことができます。

論理バックアップは、PostgreSQL バージョンのメジャー アップグレードを実行するための最も一般的で、柔軟で信頼性の高い手法でもあります。

そのため、このセクションの手順は次の両方に適しています。

  • Kubernetes の外部であっても、既存の PostgreSQL インスタンスから 1 つ以上のデータベースをインポートする

  • データベースを任意の PostgreSQL バージョンから同じか新しいバージョンにインポートし、PostgreSQL の メジャー アップグレード を有効にします (たとえば、バージョン 11.x からバージョン 15.x へ)。

警告

PostgreSQL のメジャー アップグレードを実行する場合、アプリケーションが新しいバージョンと互換性があり、データベースに含まれるオブジェクト (拡張機能を含む) のアップグレード パスが実行可能であることを確認する責任があります。

どちらの場合も、元のデータベースの一貫性のある スナップショット に対して操作が実行されます。

重要

このため、Cluster リソースでの最終インポートの前に、ソースでの書き込み操作を停止することをお勧めします。バックアップの開始後にソース データベースに加えられた変更は宛先クラスターに含まれないため、この機能が参照される理由です。 「オフライン インポート」または「オフライン メジャー アップグレード」として。

使い方

概念的には、インポートでは、 空のクラスターをブートストラップする (`initdb )<空のクラスターをブートストラップする (initdb )>` を使用してゼロから新しいクラスター (宛先クラスター) を作成し、次に initdb.import サブセクションを完了して、既存の Postgres クラスター (ソース クラスター) からオブジェクトをインポートする必要があります。 PostgreSQL の推奨に従って、宛先クラスター の PostgreSQL メジャー バージョンは、ソース クラスター のもの以上であることをお勧めします。

CloudNativePG には、ソース クラスターから宛先クラスターにオブジェクトをインポートする主な方法が 2 つあります。

  • マイクロサービスアプローチ : CloudNativePG プロジェクトで推奨されているように、宛先クラスターは、指定されたアプリケーション ユーザーが所有する単一のアプリケーション データベースをホストするように設計されています。

  • モノリスアプローチ : 宛先クラスターは、ソース クラスターからインポートされた複数のデータベースとさまざまなユーザーをホストするように設計されています。

最初のインポート方法は microservice タイプで利用でき、後者は monolith タイプで利用できます。

警告

スーパーユーザーまたは pg_dump で論理バックアップを作成するのに十分な権限を持つユーザーを使用して、宛先クラスターがソース クラスターにアクセスできることを確認するのは、ユーザーの責任です。 PostgreSQL documentation on "SQL Dump" を参照してください。

詳細については。

microservice タイプ

マイクロサービス アプローチを使用すると、ソース クラスターから宛先クラスターにインポートする単一のデータベースを指定できます。操作は次の 4 つのステップで実行されます。

  • 新しいクラスターの initdb ブートストラップ

  • pg_dump -Fc を使用して、選択したデータベース (initdb.import.databases 内) をエクスポートします。

  • initdb.owner ユーザーが所有する initdb.database (アプリケーション データベース) への pg_restore --no-acl --no-owner を使用したデータベースのインポート

  • データベース ダンプ ファイルのクリーンアップ

  • postImportApplicationSQL パラメータを介したアプリケーション データベースでのユーザー定義SQLクエリのオプションの実行

  • インポートされたデータベースでの ANALYZE VERBOSE の実行

Example of microservice import type

Example of microservice import type

たとえば、以下の YAML は、postgres に接続することにより、cluster-pg96 クラスター (サポートされていない PostgreSQL 9.6 を使用) から angus データベースをインポートする cluster-microservice という新しい 3 インスタンスの PostgreSQL クラスター (オペレーターがリリースされた時点で利用可能な最新のメジャー バージョン) を作成します。 cluster-pg96-superuser シークレットに保存されているパスワードを介して、postgres ユーザーを使用してデータベース。

apiVersion: postgresql.cnpg.io/v1
kind: Cluster
metadata:
  name: cluster-microservice
spec:
  instances: 3

  bootstrap:
    initdb:
      import:
        type: microservice
        databases:
          - angus
        source:
          externalCluster: cluster-pg96
        #postImportApplicationSQL:
        #- |
        #  INSERT YOUR SQL QUERIES HERE
  storage:
    size: 1Gi
  externalClusters:
    - name: cluster-pg96
      connectionParameters:
        # Use the correct IP or host name for the source database
        host: pg96.local
        user: postgres
        dbname: postgres
      password:
        name: cluster-pg96-superuser
        key: password

警告

上記の例では、コミュニティによってサポートされなくなったバージョンの PostgreSQL を実行しているソース データベースを意図的に使用しており、結果として CloudNativePG によってサポートされていません。ソース インスタンスからのデータ エクスポートは、宛先クラスター内の pg_dump のバージョンを使用して実行されます。これは、サポートされているものであり、ソース クラスター以上である必要があります。私たちの経験に基づいて、データをエクスポートするこの方法は、サポートされていない古いバージョンの Postgres でも機能するはずであり、Kubernetes 内のより良いシステムにレガシー データを移動する機会を与えてくれます。これが、このセクションの例で 9.6 を使用した主な理由です。この分野で問題が発生した場合は、ご連絡をお待ちしております。

microservice タイプを使用する際に注意する必要があることがいくつかあります。

  • インポートするデータを含む既存の PostgreSQL インスタンスを指す externalCluster が必要です (詳細については、 :ref:``externalClusters` セクション<externalClusters セクション>` を参照してください)。

  • 操作中、Kubernetes クラスターと externalCluster の間でトラフィックを許可する必要があります。

  • ソース データベースへの接続は、pg_dump を実行してロール情報を読み取る必要がある指定されたユーザーに許可する必要があります (スーパーユーザー は OK)。

  • 現在、pg_dump -Fc の結果は PGDATA ボリュームの dumps フォルダー内に一時的に保存されているため、割り当てられたノードのダンプ結果と復元されたデータとインデックスを一時的に格納するのに十分な空き容量が必要です。インポート操作が完了すると、このフォルダーはオペレーターによって自動的に削除されます。

  • initdb.import.databases 配列内に指定できるデータベースは 1 つだけです

  • ロールはインポートされません - そのため、initdb.import.roles 内で指定することはできません

monolith タイプ

モノリス アプローチでは、移行元クラスターから移行先クラスターにインポートする役割とデータベースのセットを指定できます。操作は次の手順で実行されます。

  • 新しいクラスターの initdb ブートストラップ

  • 選択した役割のエクスポートとインポート

  • pg_dump -Fc を使用して、選択したデータベース (initdb.import.databases 内) を一度に 1 つずつエクスポートします。

  • 選択した各データベースを作成し、pg_restore を使用してデータをインポートします

  • インポートされた各データベースで ANALYZE を実行します

  • データベース ダンプ ファイルのクリーンアップ

Example of monolith import type

Example of monolith import type

たとえば、以下の YAML は、cluster-pg96 から accounting 、banking 、resort データベースだけでなく、accountant および bank_user ロールをインポートする cluster-monolith と呼ばれる新しい 3 インスタンス PostgreSQL クラスター (オペレーターがリリースされた時点で利用可能な最新のメジャー バージョン) を作成します。 cluster-pg96-superuser シークレットに保存されているパスワードを介して、postgres ユーザーを使用して postgres データベースに接続することにより、クラスター (サポートされていない PostgreSQL 9.6 を使用)。

apiVersion: postgresql.cnpg.io/v1
kind: Cluster
metadata:
  name: cluster-monolith
spec:
  instances: 3
  bootstrap:
    initdb:
      import:
        type: monolith
        databases:
          - accounting
          - banking
          - resort
        roles:
          - accountant
          - bank_user
        source:
          externalCluster: cluster-pg96
  storage:
    size: 1Gi
  externalClusters:
    - name: cluster-pg96
      connectionParameters:
        # Use the correct IP or host name for the source database
        host: pg96.local
        user: postgres
        dbname: postgres
        sslmode: require
      password:
        name: cluster-pg96-superuser
        key: password

monolith タイプを使用する際に注意する必要があることがいくつかあります。

  • インポートするデータを含む既存の PostgreSQL インスタンスを指す externalCluster が必要です (詳細については、 :ref:``externalClusters` セクション<externalClusters セクション>` を参照してください)。

  • 操作中、Kubernetes クラスターと externalCluster の間でトラフィックを許可する必要があります。

  • ソース データベースへの接続は、pg_dump を実行してロール情報を取得する必要がある指定されたユーザーに許可する必要があります (スーパーユーザー は OK)。

  • 現在、pg_dump -Fc の結果は PGDATA ボリュームの dumps フォルダー内に一時的に保存されているため、割り当てられたノードのダンプ結果と復元されたデータとインデックスを一時的に格納するのに十分な空き容量が必要です。インポート操作が完了すると、このフォルダーはオペレーターによって自動的に削除されます。

  • initdb.import.databases 配列で指定される少なくとも 1 つのデータベース

  • インポートされたデータベースに必要な役割は、以下の制限付きで initdb.import.roles 内で指定する必要があります。

  • ワイルドカード "*" を databases および/または roles 配列の唯一の要素として使用して、その種類のすべてのオブジェクトをインポートできます。データベースに一致する場合、ワイルドカードは postgres データベース、テンプレート データベース、および接続を許可しないデータベースを無視します。

  • クローン手順が完了した後、すべてのデータベースに対して ANALYZE VERBOSE が実行されます。

  • postImportApplicationSQL フィールドはサポートされていません