Tablespaces =========== .. raw:: html テーブルスペースは、データベース管理システムで堅牢で広く採用されている機能です。データの物理的および論理モデリングを分離することにより、データベースの垂直スケーラビリティを強化する強力な手段を提供します。基本的に、これは物理データベースモデリングの技術として機能し、個別のストレージ上のマルチプルのボリューム全体にI/O操作を効率的に分散できます。これにより、並列ディスク上の読み取り/書き込み操作を介してパフォーマンスが最適化されます。 データベース業界のコンテキストでは、テーブルスペースは、特に論理データベースモデリング技術であるテーブルパーティショニングと組み合わせた場合、戦略的な役割を果たします。これらは大規模なデータベースの管理に役立つことが証明されており、インデックスからテーブルを分離したり、一時的な操作を実行したりするようなタスクにも使用されます。 PostgreSQLのテーブルスペースは、2005バージョン8.0から重要な役割を果たしていますが、宣言的パーティショニングは2017バージョン10に導入されました。その結果、テーブルスペースは、サポートされているPostgreSQLのすべてのリリースにシームレスに統合されています。 `PostgreSQL documentation on tablespaces `_ からの引用 テーブルスペースを使用することにより、管理者はPostgreSQLインストールのディスクレイアウトを制御できます。これは、少なくとも2つの方法で役立ちます。 > > - まず、クラスターが初期化されたパーティションまたはボリュームが領域不足で実行され、拡張できない場合、別のパーティションにテーブルスペースを作成し、システムが再構成できるまで使用できます。 > - 第二に、テーブルスペースにより、管理者はデータベースオブジェクトの使用パターンに関する知識を使用して、パフォーマンスを最適化できます。 宣言的テーブルスペース ---------------------- CloudNativePGは、2つの異なるレベルで動作する *宣言テーブルスペース* を介してPostgreSQLテーブルスペースのサポートを提供します。 - Kubernetes、PGDATAおよびWALボリュームが処理される方法と同じように、永続ボリューム要求を管理します - PostgreSQL、 PostgreSQLインスタンスで\ ``TABLESPACE`` グローバルオブジェクトを管理する Kubernetesエコシステムの一部であるCloudNativePGの宣言的テーブルスペースは、永続ボリューム要求および永続ボリュームを活用して実装されます。クラスターで定義された各テーブルスペースは、独自の永続ボリュームに格納されます。 CloudNativePGは、PVCの生成を担当します。正規化された場所のインスタンスポッドに必要なボリュームをマウントし、プライマリでアクティブにする前にレプリカがテーブルスペースをサポートする準備ができていることを確認します。 要求されたときにストレージが利用可能な場合、クラスターの作成時にテーブルスペースを設定するか、後で追加できます。現在、それらを削除することはできません。ただし、この制限はCloudNativePGの将来のマイナーまたはパッチバージョンで対応される予定です。 宣言的テーブルスペースの使用 ---------------------------- 宣言的テーブルスペースの使用は簡単です。完全な例は `cluster-example-with-tablespaces.yaml `_ にあります。 これらを使用するには、新しいまたは既存の\ ``Cluster`` リソースで新しい\ ``tablespaces`` スタンザを使用します。 .. code:: yaml spec: instances: 3 # ... tablespaces: - name: tbs1 storage: size: 1Gi - name: tbs2 storage: size: 2Gi - name: tbs3 storage: size: 2Gi 各テーブルスペースには、生成されたPVCのサイズとストレージクラスを構成できる独自のストレージセクションがあります。したがって、管理者は、 :ref:`ストレージクラスとテーブルスペース <ストレージクラスとテーブルスペース>` で説明しているように、さまざまな種類のワークロードに異なるストレージクラスの使用を計画できます。 CloudNativePGは、高可用性Postgresクラスター内の各インスタンスの永続ボリューム要求を作成します。プロビジョニングが完了すると、各ポッドにマウントします。次に、 ``CREATE TABLESPACE`` コマンドを使用してプライマリPostgreSQLインスタンスに\ ``tbs1`` 、\ ``tbs2`` 、および\ ``tbs3`` 表領域が作成されることを確認します。このプロセスは迅速で、これはPostgresに反映されます。 .. code:: txt app=# SELECT oid, spcname FROM pg_tablespace; oid | spcname - ------+-------------------- 1663 | pg_default 1664 | pg_global 16387 | tbs1 16388 | tbs2 16389 | tbs3 (5 rows) すぐに使用を開始できます。 .. code:: txt app=# CREATE TABLE fibonacci(num INTEGER) TABLESPACE tbs1; CREATE TABLE クラスターステータスには、テーブルスペースのセクションがあります。 .. code:: yaml status: <- snipped -> tablespacesStatus: - name: atablespace state: reconciled - name: another_tablespace state: reconciled - name: tablespacea1 state: reconciled ストレージクラスとテーブルスペース ---------------------------------- PGDATAおよびWALボリュームと同じように、テーブルスペースにさまざまなストレージクラスを使用できます。これは、リソースを最適化し、データアクセスの使用量と予想に基づいてストレージのパフォーマンスとコストのバランスを保つ便利な方法です。 この例は、機能を説明するのに役立ちます。 .. code:: yaml apiVersion: postgresql.cnpg.io/v1 kind: Cluster metadata: name: yardbirds spec: instances: 3 storage: size: 10Gi walStorage: size: 10Gi tablespaces: - name: current storage: size: 100Gi storageClass: fastest - name: this_year storage: size: 500Gi storageClass: balanced ``yardbirds`` クラスター例は、3つの異なるストレージクラスを使用して4つの永続ボリューム要求を要求します。 - デフォルトのストレージクラス – ``PGDATA`` およびWALボリュームによって使用されます。 - ``fastest`` – ``current`` テーブルスペースによって使用され、データベースで最もアクティブで要求の高いデータセットを保存します。 - ``balanced`` – ``this_year`` 表領域によって使用され、ユーザーがほとんどアクセスせず、パフォーマンスの期待が最も高くないデータの古いパーティションを保存します。 次に、ホリゾンタルテーブルパーティショニングを利用して、\ ``current`` 表領域に当月のテーブル2023年12月のファクトなどを作成できます。 .. code:: sql CREATE TABLE facts_202312 PARTITION OF facts FOR VALUES FROM (2023-12-01) TO (2024-01-01) TABLESPACE current; .. Note:: この例では、 `PostgreSQL declarative partitioning `_ に精通していることを前提としています。   テーブルスペースの所有権 ------------------------ デフォルトでは、特に指定しない限り、表領域は ``.spec.bootstrap.initdb.owner`` で定義されているように、\ ``app`` アプリケーションユーザーが所有します。詳細は、 :ref:`Bootstrap a new cluster ` を参照してください。このデフォルトの動作は、ほとんどのマイクロサービスデータベースのユースケースで動作します。 次の抜粋のように、 ``owner`` スタンザで表領域の所有者、たとえば ``postgres`` ユーザーを設定できます。 .. code:: yaml # ... tablespaces: - name: clapton owner: name: postgres storage: size: 1Gi .. Note:: 表領域の所有権を変更する場合は、既存のロールを使用していることを確認します。それ以外の場合、クラスターのステータスが問題を報告し、修正されるまでテーブルスペースのリコンサイルを停止します。ステータスとログを監視し、問題を修正して迅速に介入するのはあなたの責任です。   存在しない所有者でテーブルスペースを定義すると、CloudNativePGはテーブルスペースを作成できず、これをクラスターステータスに反映します。 .. code:: yaml spec: instances: 3 # ... tablespaces: - name: tbs1 storage: size: 1Gi - name: tbs2 storage: size: 2Gi - name: tbs3 owner: name: badhombre storage: size: 2Gi status: <- snipped -> tablespacesStatus: - name: tbs1 status: reconciled - name: tbs2 status: reconciled - error: while creating tablespace tbs3: ERROR: role "badhombre" does not exist (SQLSTATE 42704) name: tbs3 status: pending バックアップ リカバリー ----------------------- CloudNativePGは、オブジェクトストアとボリュームスナップショットの両方でテーブルスペースおよび相対テーブルスペースマップのバックアップを処理します。 .. Warning:: デフォルトでは、バックアップはレプリカノードから取得されます。クラスターで表領域を作成した直後にバックアップを作成すると、レプリカからの表領域の不完全なビュー、したがって不完全なバックアップが生成される場合があります。遅延は、次の調整で最大5分で解決されます。   .. Warning:: 既存のクラスターで表領域を追加または削除すると、新しいベースバックアップを作成するまでWALからのリカバリは失敗します。   テーブルスペースを含むクラスターにベースバックアップがあると、そこから新しいクラスターを復元できます。復旧側については、復旧したデータベースの\ ``Cluster`` 定義に表領域の正確なリストが含まれていることを確認するのは自分の責任です。 レプリカクラスター ------------------ レプリカクラスターには、オリジンと同じ表領域定義が必要です。その理由は、 ``CREATE TABLESPACE`` のようなテーブルスペース管理コマンドはWALログに記録され、物理レプリケーションクライアントストリーミングまたはWALシッピング経由で再生されるためです。 レプリカクラスターに同じ名前のテーブルスペースの同じリストがあることを確認するのはあなたの責任です。ストレージクラスとサイズは異なる場合があります。 例 .. code:: yaml spec: # ... bootstrap: recovery: # ... your selected recovery method tablespaces: - name: tbs1 storage: size: 1Gi - name: tbs2 storage: size: 2Gi - name: tbs3 storage: size: 2Gi 一時テーブルスペース -------------------- PostgreSQLでは、1つ以上の一時表領域を定義して、 ``CREATE`` コマンドが明示的に表領域を指定しない場合に、一時オブジェクト一時テーブルと一時テーブルのインデックスを作成したり、大規模なデータセットのソートなどの目的で一時ファイルを作成したりできます。一時表領域が指定されない場合、PostgreSQLは、現在メインの\ ``PGDATA`` ボリュームであるデータベースのデフォルトの表領域を使用します。 複数の一時テーブルスペースを指定すると、PostgreSQLは、トランザクションで最初に一時オブジェクトを作成する必要があるときにランダムに1つを選択します。次に、リストを順番に反復します。 一時テーブルスペースは、バックアップに関して通常のテーブルスペースと同様に動作します。 CloudNativePGは、 ``.spec.tablespaces[*].temporary`` オプションを提供して、テーブルスペースを\ ``temp_tablespaces`` PostgreSQLパラメーターに追加し、明示的なテーブルスペースの割り当てがない一時データを保存できるかどうかを決定します。 .. code:: yaml spec: [...] tablespaces: - name: atablespace storage: size: 1Gi temporary: true これらは初期化時に作成するか、後で追加できますが、ローリング更新が必要です。 ``temporary: true/false`` オプションは、 ``temp_tablespaces`` オプションの表領域のリストに表領域名を追加または削除します。この変更では、PostgreSQLの再起動は必要ありません。 一時表領域は通常の表領域として機能することもできますが、ユーザーが一時的な操作に使用しながら通常のデータをホストすることもできますが、2つのワークロードを混合しないことをお勧めします。 `PostgreSQL documentation on `temp_tablespaces` `_ を参照してください。 詳細については。 kubectlプラグインのサポート --------------------------- :ref:`kubectl status ` プラグインには、表領域のステータス、所有者、一時フラグ、エラーなどの便利な概要を提供する表領域専用のセクションが含まれています。 .. code:: yaml [...] Tablespaces status Tablespace Owner Status Temporary Error - --------- ----- ------ --------- ----- atablespace app reconciled true another_tablespace app reconciled true tablespacea1 app reconciled false Instances status [...] 制限事項 -------- 現在、既存のCloudNativePGクラスターからテーブルスペースを削除することはできません。