pgd node setup
==============

概要
----

``pgd node setup``
コマンドは、クラスター内のPGDデータノードを構成するために使用されます。新しいノードのセットアップ、既存のノードのクラスターへの参加、またはクラスターへのノードの論理参加を実行するために使用できます。

!!!重要「物理的結合のバージョン要件」

``pgd node setup``
が物理的結合ローカルノードが起動して実行されていないときにリモートノードからデータをコピーする場合、ソースノードと参加ノードの両方がまったく同じPGDバージョンである必要があります。物理的結合を使用して、別のPGDバージョンのノードを既存のクラスターに参加させることはできません。ローリングアップグレードの場合、代わりに論理結合を使用してください。詳細については、
:ref:`ノード参加を使用したローリングアップグレード <ノード参加を使用したローリングアップグレード>` を参照してください。

.. ::
   シングルユーザーモードで新しいノードを初期化する場合、コマンドは`NextOID` カウンターがユーザー範囲≧16384かどうかを確認します。それ以外の場合、 BDRオブジェクトデータベース、拡張機能、スキーマを作成する前に`pg_resetwal` を使用してカウンターを進めます。カウンタを進めることで、これらのオブジェクトにユーザー範囲OIDが割り当てられ、後で`pgd node upgrade` を実行する際のプリフライトチェックの失敗を防ぎます。

コマンドの動作は、コマンドで指定されたローカルノードとリモートノードの状態によって異なります。

これがクラスター内の最初のノードの場合、 ``pgd node setup``
は\ ``initdb`` を実行し、 PGDノードをセットアップします。

これが最初のノードではなく、ローカルノードが起動して実行されていない場合、
``pgd node setup``
はクラスターへのノードの物理的参加を実行します。これにより、初期化プロセスの一部としてリモートノードからローカルノードにデータがコピーされ、ローカルノードがクラスターに参加します。これは、新しいノードにデータをロードする最も速い方法です。

ローカルノードが起動して実行されており、リモートノードにも到達可能である場合、
``pgd node setup``
はクラスターへのノードの論理参加を実行します。これにより、クラスター内に新しいノードが作成され、リモートノードからストリーミングレプリケーションが開始されます。これは、新しいノードを既存のクラスターに追加するための推奨される方法です。

ローカルノードがアップして実行されており、リモートノードdsnが提供されていない場合、
``pgd node setup``
は、ノードが指定されたグループの一部でない場合、ノードグループのスイッチを実行します。

ユーザーとロール
^^^^^^^^^^^^^^^^

``pgd node setup``
コマンドを実行するには、スーパーユーザーロールが必要です。スーパーユーザーロールは、データディレクトリを作成し、データベースを初期化するために使用されます。データベースを作成するには、スーパーユーザーロールに\ ``CREATEDB``
特権が必要です。

``--dsn`` オプションで指定されたユーザーが存在しない場合は作成されます。
PGD機能を管理できる\ ``bdr_superuser``
ロールのみが付与されます。ただし、データベースに対する他の特権はありません。

透過的データ暗号化TDEのサポート
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

透過的データ暗号化TDEは、 EDB Postgres Advanced ServerおよびEDB Postgres
Extended Serverバージョン15以降で利用可能なオプション機能です。

``pgd node setup``
コマンドは、新しいデータベースサーバーを初期化するとき、または既存のノードをクラスターに参加させるときにこの機能をサポートします。
``pgd node setup`` によって公開されるTDEオプションは、次の例外を除き
`initdb TDE options <https://www.enterprisedb.com/docs/tde/latest/initdb_tde_options>`_  に似ています。

- オプション\ ``--data-encryption``
  は、ブール値のみのフラグですAESキー長さの値は受け入れません。

- 代わりに、オプション ``--data-encryption-keylen``
  を使用してAESキー長を指定します。

構文
----

.. code:: plaintext

   pgd node <NODE_NAME> setup [OPTIONS] -D <PG_DATA>

引数
----

- ``<NODE_NAME\>``
  作成するノードの名前。これは、クラスター内のノードを識別するために使用される名前です。クラスター内で一意である必要があります。

オプション
----------

.. csv-table::
  :header: Option                                             ,Description
  :widths: 10,30
  :align: left
  :class: longtable

  `--listen-addr <LISTEN_ADDR>`,構成されたノードが着信接続をリッスンするアドレス、および他のノードがこのノードに接続するために使用するアドレス。これは通常、少なくとも`localhost`に設定されますが、任意の有効なアドレスに設定できます。デフォルトは`localhost`です。 `--dsn`からの`host`値もこのリストに追加されます。
  `--initial-node-count <INITIAL_NODE_COUNT>`,クラスター内のノードまたはクラスター内に含まれる予定のノードの数。ノードのさまざまなリソース設定を計算するために使用されます。デフォルト3です。
  `--bindir <BINDIR>`,&lt;BINDIR> バイナリが存在するディレクトリを指定します。デフォルトは、実行中のpgdバイナリが置かれているディレクトリです。
  `--log-file <LOG_FILE>`,ログファイルへのパス。postgres起動ログに使用されます。デフォルトでは、`postgres-<port>.log`という名前の現在のディレクトリにあるファイルに書き込みます。ここで、ポート値は`--dsn`オプションの`port`属性から取得されます。
  "`-D`, `--pgdata <PG_DATA>`",ノードのデータディレクトリとして<PG_DATA>を使用します。環境変数`PGDATA`でも設定されます。これは有効なディレクトリであり、コマンドを実行するユーザーが書き込み可能である必要があります。
  `--superuser <SUPERUSER>`,`initdb`のスーパーユーザー名。デフォルトは`postgres`です。
  `--node-kind <NODE_KIND>`,作成するノードの種類を指定します。デフォルトは`data`です。サポートされている値は`data`、`witness`、`subscriber-only`です。
  `--group-name <GROUP_NAME>`,ノードグループ名。指定しない場合、ノードはアクティブノードのグループに追加されます。これは、グループの最初のノードの必須引数です。
  `--create-group`,指定されたグループがまだ存在しない場合、このフラグを設定して作成します。これは、最初のノードのデフォルトでtrueになります。
  `--cluster-name <CLUSTER_NAME>`,ノードに参加するクラスターの名前。クラスターを初めてセットアップするときに、これは`parent node group`を作成するために使用されます。指定しない場合、デフォルトの`pgd`。
  `--cluster-dsn  <CLUSTER_DSN>`,アクティブなPGDクラスターに属するDSN。これは、クラスターの最初のノードを構成する場合には必要ありませんが、後続のノードには必須です。既存のアクティブノードのDSNを指す必要があります。
  `--postgresql-conf <POSTGRESQL_CONF>`,ノードに使用される`postgresql.conf`ファイルのオプションのパス。
  `--postgresql-auto-conf <POSTGRESQL_AUTO_CONF>`,ノードに使用される`postgresql.auto.conf`ファイルのオプションのパス。
  `--hba-conf <HBA_CONF>`,ノードに使用される`pg_hba.conf`ファイルのオプションのパス。
  `--update-pgpass`,設定されている場合、新しいノードパスワードのpgpassファイルは、現在のユーザーの`.pgpass`ファイルに保存されます。
  `--verbose`,詳細なメッセージを出力します。
  "`-y`, `--data-encryption`",データベースサーバーの初期化時にTDEを追加します。
  `--data-encryption-keylen <AES_KEYLEN>`,TDEのAESキーの長さ。デフォルトは`128`です。サポートされている値は`128`および`256`です。
  `--key-wrap-command <KEY_WRAP_COMMAND>`,データ暗号化キーを保護するためのラッピング/暗号化コマンド。 `<KEY_WRAP_COMMAND>`はカスタマイズ可能ですが、プレースホルダー `%p`を含める必要があります。このオプションを使用しない場合、`pgd node setup`は環境変数`PGDATAKEYWRAPCMD`にフォールバックします。
  `--key-unwrap-command <KEY_UNWRAP_COMMAND>`,データ暗号化キーにアクセスするための解凍/復号コマンド。 `<KEY_UNWRAP_COMMAND>`はカスタマイズ可能ですが、プレースホルダー `%p`を含める必要があります。このオプションを使用しない場合、`pgd node setup`は環境変数`PGDATAKEYUNWRAPCMD`にフォールバックします。
  `--no-key-wrap`,キーのラッピングを無効にします。このオプションは、実稼働環境での使用はお勧めできません。
  `--copy-key-from <COPY_KEY_FROM>`,指定された場所から既存のデータ暗号化キーをコピーします。通常、暗号化キーは`pg_encryption/key.bin`に保存されます

`Global Options <https://www.enterprisedb.com/docs/pgd/latest/reference/cli/command_ref/#global-options>`_  も参照してください。

``pgd node setup``
コマンドは、次の取得方法を優先順に確認することにより、非対話型でデータベースパスワードを見つけようとします。

- ``--dsn`` グローバルオプションで提供される\ ``password``
  パラメーターで設定されたパスワード。

- ``PGPASSWORD`` 環境変数で設定されたパスワード。

- ``--dsn`` グローバルオプションで提供される\ ``passfile``
  パラメーターで設定されたパスワードファイル。

- ``PGPASSFILE`` 環境変数で設定されたパスワードファイル

- コマンドを呼び出すユーザーの\ ``HOME``
  ディレクトリにあるパスワードファイル ``.pgpass``

システムがこれらの方法でパスワードを見つけられない場合、コマンドはパスワードを手動で入力するように求めます。

``--update-pgpass``
フラグは、システムがパスワードを正常に取得した後に発生する動作を制御します。設定すると、パスワードが将来の非対話型使用に備えて保存されます。更新するパスワードファイルは、次の優先順位に従います。

- ``--dsn option`` に提供された接続文字列内の\ ``passfile``
  パラメーターで指定されたパス。

- ``PGPASSFILE`` 環境変数で指定されたファイル

- ``.pgpass`` ファイルは、コマンドを呼び出したユーザーの\ ``HOME``
  ディレクトリにあります。

例
--

これらの例では、3つのホスト\ ``host-1`` 、\ ``host-2``
、および\ ``host-3``
でクラスターをセットアップして、3つのノード\ ``node-1`` 、\ ``node-2``
、および\ ``node-3`` を作成します。
3つのノードはデータノードであり、グループ名が\ ``group-1``
である\ ``pgd`` という名前のクラスターの一部です。

PGPASSWORD環境変数をエクスポートして、コマンドを実行するたびに\ ``pgdadmin``
ユーザーのパスワードを入力する必要を回避することをお勧めします。これは、次のコマンドで行うことができます。

.. code:: shell

   export PGPASSWORD=pgdsecret

最初のノードの構成
^^^^^^^^^^^^^^^^^^

.. code:: shell

   pgd node node-1 setup --dsn "host=host-1 port=5432 user=pgdadmin dbname=pgddb" \
   - -listen-addr "localhost,host-1" \
   - -group-name group-1 --cluster-name pgd \
   - D /var/lib/edb-pge/17/main

コマンドをステップ実行して、\ ``node-1``
を設定しています。最初のオプションは\ ``--dsn``
オプションで、これはノードの接続文字列です。これは通常、\ ``host=hostname port=5432 user=pgdadmin dbname=pgd``
に設定されます。これは、ローカルPostgresインスタンスの一般的な接続文字列です。

``--listen-address``
オプションは、ノードが着信接続をリッスンするアドレスを指定するために使用されます。この場合、\ ``localhost,host-1``
に設定しています。これは、ノードがローカルホストと\ ``host-1``
アドレスの両方でリッスンすることを意味します。

これはクラスター内の最初のノードであるため、グループ名を\ ``group-1``
に設定し、クラスター名を\ ``pgd``
実際にデフォルトに設定します。これはクラスター内の最初のノードであるため、
``--create-group`` オプションが自動的に設定されます。

最後に、 ``-D``
オプションを使用してノードのデータディレクトリを設定します。これは、Postgresデータファイルが保存される場所です。この例では、データディレクトリとして\ ``/var/lib/edb-pge/17/main``
を使用しています。

このコマンドは、データディレクトリを作成し、データベースをPGD用に正しく初期化します。次に、ノードを起動し、クラスターに参加する他のノードを含む新しい接続で利用できるようにします。

2番目のノードの構成
^^^^^^^^^^^^^^^^^^^

.. code:: shell

   pgd node node-2 setup --dsn "host=host-2 port=5432 user=pgdadmin dbname=pgddb" \
   - -listen-addr "localhost,host-2" \
   - D /var/lib/edb-pge/17/main
   - -cluster-dsn "host=host-1 port=5432 user=pgdadmin dbname=pgddb"

このコマンドは最初のノードに似ていますが、\ ``node-2``
を設定しています。 ``--dsn``
オプションは、ノードの接続文字列であり、通常は\ ``host=hostname port=5432 user=pgdadmin dbname=pgd``
に設定されます。 ``cluster-dsn``
は、アクティブなノードを指す必要があります。接続マネージャー、またはプロキシエンドポイントなどを指すことができます。
CLIは、その背後にあるノードの実際のDSNを取得します。この場合、クラスター内の最初のノードの接続文字列である\ ``host=host-1 port=5432 user=pgdadmin dbname=pgd``
に設定しています。

.. _番目のノードの構成-1:

3番目のノードの構成
^^^^^^^^^^^^^^^^^^^

.. code:: shell

   pgd node node-3 setup --dsn "host=host-3 port=5432 user=pgdadmin dbname=pgddb" \
   - -listen-addr "localhost,host-3" \
   - -cluster-dsn "host=host-1 port=5432 user=pgdadmin dbname=pgddb" \
   - D /var/lib/edb-pge/17/main

このコマンドは2番目のノードに似ていますが、\ ``node-3``
を設定しています。 ``--dsn``
オプションは、ノードの接続文字列であり、通常は\ ``host=hostname port=5432 user=pgdadmin dbname=pgd``
に設定されます。 ``cluster-dsn``
は、アクティブなノードを指す必要があります。接続マネージャー、またはプロキシエンドポイントなどを指すことができます。
CLIは、その背後にあるノードの実際のDSNを取得します。この場合、クラスター内の最初のノードの接続文字列である\ ``host=host-1 port=5432 user=pgdadmin dbname=pgd``
に設定しています。

分割およびドロップされたノードのクラスターへの参加
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. code:: shell

   pgd node node-2 setup --dsn "host=host-2 port=5432 user=pgdadmin dbname=pgddb" \
   - -listen-addr "localhost,host-2" \
   - -cluster-dsn "host=host-1 port=5432 user=pgdadmin dbname=pgddb" \
   - D /var/lib/edb-pge/17/main

このコマンドは、後続のノードの設定に似ていますが、 ``node-2``
を再度設定します。 ``--dsn``
オプションは、ノードの接続文字列であり、通常は\ ``host=hostname port=5432 user=pgdadmin dbname=pgd``
に設定されます。 ``cluster-dsn``
は、アクティブなノードを指す必要があります。接続マネージャー、またはプロキシエンドポイントなどを指すことができます。
CLIは、その背後にあるノードの実際のDSNを取得します。この場合、クラスター内の最初のノードの接続文字列である\ ``host=host-1 port=5432 user=pgdadmin dbname=pgd``
に設定しています。

これは、メンテナンスなどのアクティビティのためにノードがクラスターから\ ``parted``
および\ ``dropped``
され、クラスターに再参加する必要がある場合に役立ちます。コマンドは、クラスターへのノードの論理参加を実行します。これにより、クラスター内に新しいノードが作成され、リモートノードからストリーミングレプリケーションが開始されます。

TDEオプションを使用した最初のノードの構成
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. code:: shell

   pgd node node-1 setup \
   - -dsn "host=host-1 port=5432 user=pgdadmin dbname=pgddb" \
   - -listen-addr "localhost,host-1" \
   - -group-name group-1 --cluster-name pgd \
   - D /var/lib/edb-pge/17/main \
   - -data-encryption \
   - -key-wrap-command "openssl enc -e -aes-128-cbc -pbkdf2 -pass pass:secret -out %p" \
   - -key-unwrap-command "openssl enc -d -aes-128-cbc -pbkdf2 -pass pass:secret -in %p"

TDE対応クラスターの\ ``pgd node setup``
コマンドは標準のコマンドに似ていますが、3つの追加TDE固有オプション
``--data-encryption`` 、\ ``--key-wrap-command``
、および\ ``--key-unwrap-command`` が必要です。

簡単にするために、この例の\ ``--key-wrap-command``
および\ ``--key-unwrap-command``
の値は単純なパスフレーズを使用しています。ただし、外部のキー管理サービスKMSなどのより安全なメカニズムを構成できます。

この例では、 ``--data-encryption-keylen``
オプションを明示的に設定せず、キー長をデフォルトの128ビットに設定しています。

TDEオプションを使用した2番目のノードの構成
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. code:: shell

   pgd node node-2 setup \
   - -dsn "host=host-2 port=5432 user=pgdadmin dbname=pgddb" \
   - -listen-addr "localhost,host-2" \
   - D /var/lib/edb-pge/17/main \
   - -cluster-dsn "host=host-1 port=5432 user=pgdadmin dbname=pgddb" \
   - -key-wrap-command "openssl enc -e -aes-128-cbc -pbkdf2 -pass pass:secret -out %p" \
   - -key-unwrap-command "openssl enc -d -aes-128-cbc -pbkdf2 -pass pass:secret -in %p"

このコマンドは、最初のノードで使用されるセットアップに似ていますが、必要なTDEオプションを保持します。残りの引数は、クラスター内の後続のノードをセットアップするときに使用される標準のコマンドと一貫しています。
TDEオプションの値は、初期ノードに提供されたものと同じである必要があります。
