A First Cluster Deployment
==========================

この短いチュートリアルでは、単純な :ref:`M1 architecture <M1>` 
デプロイメントをローカルのDockerインストールにデプロイする方法について説明します。最終的には、4つのコンテナ、1つのプライマリデータベース、2つのレプリカ、バックアップノードが構成され、探索する準備が整います。

この例では、UbuntuシステムでTPAを実行しますが、考慮事項はほとんどのLinuxシステムで似ています。

TPAのインストール
^^^^^^^^^^^^^^^^^

EDBのお客様は、
 :ref:`EDB Repo instructions <TPA installation>` に従ってください。EDBのリポジトリからTPAパッケージを直接インストールします。

TPAのオープンソースユーザーは、Github.comからダウンロードできる :ref:`instructions on how to build from the source <TPA installation>` があります。

それらのガイドに従って、ここに戻ります。

Dockerのインストール
^^^^^^^^^^^^^^^^^^^^

前述のように、
デプロイ例をDockerにデプロイします。Dockerがすでにインストールされている場合を除き、セットアップする必要があります。

DebianまたはUbuntuでは、次を実行してDockerをインストールします。

::

   sudo apt update
   sudo apt install docker.io

他のLinuxディストリビューションについては、 `Docker Engine Install page <https://docs.docker.com/engine/install/>`_ 
を参照してください。

次のコマンドを使用して、ユーザーをdockerグループに追加します。

::

   sudo usermod -aG docker <yourusername>
   newgrp docker

CgroupVersion
^^^^^^^^^^^^^

現在、TPAでは、システムでCgroupsバージョン1を構成する必要があります。

実行：

::

   mount | grep cgroup | head -1

出力に\ ``tmpfs`` への参照が表示されない場合は、cgroups
v2を無効にする必要があります。

実行：

::

   echo GRUB_CMDLINE_LINUX=systemd.unified_cgroup_hierarchy=false | sudo tee /etc/default/grub.d/cgroup.cfg

適切な変更を行うには、Grubを更新し、次のコマンドでシステムをリブートします。

::

   sudo update-grub
   sudo reboot

..  Warning::
   ユーザーにDockerデーモンと話す機能を与えると、ユーザーは簡単にDockerホストでrootを取得できます。信頼できるユーザーのみがDockerデーモンにアクセスできるようにする必要があります。

TPAで構成を作成する
^^^^^^^^^^^^^^^^^^^

このプロセスの次のステップは、構成を作成することです。 TPAは、
``configure``
コマンドを介してほとんどの作業を行います。あなたがしなければならないのは、コマンドラインフラグとオプションを提供して、大まかに言って、展開するものを選択することです。ここに私たちの\ ``tpaexec configure``
コマンドがあります：

::

   tpaexec configure demo --architecture M1 --platform docker --postgresql 15 --enable-repmgr --no-git

これにより、 :ref:`M1 architecture <M1>`  を持つ ``demo``
という構成が作成されます。したがって、プライマリ、レプリカ、およびバックアップノードがあります。

``--platform docker``
は、この構成をローカルのDockerインスタンスで作成する必要があることをTPAに指示します。すべてのコンテナとOSの要件をプロビジョニングします。他のプラットフォームには、アマゾン
ウェブ サービスと同じことを行う :ref:`認証情報に関する奇妙なAWSエラー <認証情報に関する奇妙なAWSエラー>` 
や、オペレーティングシステムのプロビジョニングにスキップし、構成済みのLinuxホストへのソフトウェアのインストールに直接進む
 :ref:`bare(-metal servers) <bare(-metal servers)>`  があります。

``--postgresql 15`` を使用して、 Community
Postgresバージョン15を使用するようにTPAに指示します。
ここでは、ソフトウェアの選択に関していくつかのオプションがありますが、これはオープンソースユーザーにとって最も簡単なデフォルトです。

``--enable-repmgr`` を追加すると、
 :ref:`Replication Manager <Configuring repmgr>` を使用してレプリケーションとフェイルオーバーを行うようにデプロイメントを構成するようにTPAに指示します。

最後に、 ``--no-git``
は、gitを介して構成をリビジョン制御できるTPAの機能をオフにします。

このコマンドを実行すると、明らかに、コマンドラインで何も起こりません。ただし、
``demo``
というディレクトリが作成され、新しい展開の青写真である\ ``config.yml``
ファイルを含むいくつかのファイルが含まれていることがわかります。

デプロイメントのプロビジョニング
--------------------------------

これで、新しいデプロイを実行するコンテナ（または仮想マシン）を作成する準備が整いました。これは、
``provision`` コマンドで実現できます。実行：

::

   tpaexec provision demo

構成の展開の準備に必要なさまざまな操作を通じてTPAが機能することがわかります。

展開中
------

プロビジョニングが完了したら、デプロイに進むことができます。これにより、必要に応じて、オペレーティングシステムとシステムパッケージがインストールされます。次に、要求されたPostgresアーキテクチャをインストールし、必要なすべての構成を実行します。

::

   tpaexec deploy demo

構成の展開に必要なさまざまな操作をTPAが実行することがわかります。

テスト
------

新しいデータベースでpgbenchを実行するtpaexec ``test``
コマンドを使用して、新しくデプロイした構成をすばやくテストできます。

::

   tpaexec test demo

接続する
--------

psqlプロンプトを表示する最も簡単なルートは、dockerまたはSSHを使用してコンテナ（または構成に応じてVMまたはホスト）の1つにログインすることです。実行

::

   tpaexec ping demo

展開内のすべての接続可能なホストにpingを実行します。次のような出力が得られます。

::

   $ tpaexec ping demo 
   unfair | SUCCESS => {
       "changed": false,
       "ping": "pong"
   }
   uptake | SUCCESS => {
       "changed": false,
       "ping": "pong"
   }
   quondam | SUCCESS => {
       "changed": false,
       "ping": "pong"
   }
   uptight | SUCCESS => {
       "changed": false,
       "ping": "pong"
   }

``SUCCESS`` で応答したノードの1つを選択します。この例では ``uptake``
を使用します。

dockerのみを使用する予定がある場合は、コマンド\ ``docker exec -it uptake /bin/bash``
を使用し、適切なホスト名に置き換えます。

すべてのタイプのTPA展開で動作する別のオプションは、SSHを使用することです。これを行うには、最初に現在のディレクトリを作成した構成ディレクトリに変更します。

たとえば、私たちの構成はdemoと呼ばれるので、そのディレクトリに移動します。そこで
``ssh -F ssh_config ourhostname`` を実行して接続します。

::

   cd demo
   ssh -F ssh_config uptake
   Last login: Wed Sep  6 10:08:01 2023 from 172.17.0.1
   [root@uptake ~]# 

どちらの場合も、コンテナにrootユーザーとしてログインします。

``sudo -iu postgres`` を使用して、ユーザーを\ ``postgres``
ユーザーに変更できるようになりました。 ``postgres`` として、 ``psql``
を実行できます。 TPAはすでにそのユーザーを\ ``.pgpass``
ファイルで構成しているため、パスワードを提示する必要はありません。

::

   [root@uptake ~]# 
   postgres@uptake:~ $ psql
   psql (15.4)
   Type "help" for help.

   postgres=# 

そして、私たちはデータベースに接続されています。

コンテナの1つにSSH接続せずにホストシステムから接続できます。
``ssh_config`` ファイルから接続するホストのIPアドレスを取得します。

::

   $ grep "^ *Host" demo/ssh_config 
   Host *
   Host uptight
       HostName 172.17.0.9
   Host unfair
       HostName 172.17.0.4
   Host quondam
       HostName 172.17.0.10
   Host uptake
       HostName 172.17.0.11

取り込みに接続するため、IPアドレスは172.17.0.11です。

postgresユーザーのパスワードも取得する必要があります。
``tpaexec show-password demo postgres``
を実行して、システムから保存されているパスワードを取得します。

::

   tpaexec show-password demo postgres
   a9LmI1X^uMOpPoEnLuRdL%L$oRQak3om

Postgresqlクライアントがインストールされていると仮定すると、次を実行できます。

::

   psql --host 172.17.0.11 -U postgres
   Password for user postgres: 

先ほど取得したパスワードを入力します。

::

   psql (14.9 (Ubuntu 14.9-0ubuntu0.22.04.1), server 15.4)
   WARNING: psql major version 14, server major version 15.
            Some psql features might not work.
   SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, bits: 256, compression: off)
   Type "help" for help.

   postgres=# 

これで、Dockerホストから、TPAでデプロイされたDockerコンテナの1つで実行されているPostgresに接続されました。
