Postgresql11.xでインスタンスを複数起動する

# PostgreSQLインストール
PostgreSQL11.6をインストールし、インスタンスを複数起動する。
また、起動スクリプトもインスタンスごとに作成して個別に起動/停止できるようにする。

* インスタンス①
 * pgsql-5432
 * ポート:5432
 * /data/pgsql-5432

* インスタンス②
 * pgsql-5433
 * ポート5433
 * /data/pgsql-5433

## Yumリポジトリの追加
今回はバージョン11をインストールするため、リポジトリの追加を行う。

```
$ yum --disablerepo=\* --enablerepo=centos-media list
$ yum -y install https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm
```

## Yumの実行

```
$ yum -y install postgresql11-server postgresql11-contrib
$ rpm -qa |grep postgres
$ ls -l /usr/pgsql-11/
```

## 環境変数の設定
postgresユーザにPATHを追加する。

```
$ su - postgres
$　vi ./bashrc
export PATH=$PATH:/usr/pgsql-11/bin
export PGDATA=/data/pgsql-5432
export PATH
export PGDATA

$ source bashrc
``` 

## インスタンス①(pgsql-5432)
一つ目のインスタンスpgsql-5432を作成する。

### インスタンス作成
initdbコマンドでディレクトリ「/data/pgsql-5432」にインスタンス作成を作成する。

```
$ initdb --pgdata=/data/pgsql-5432
$ cat /data/pgsql-5432/PG_VERSION
11
```
### インスタンス起動確認
pg_ctlコマンドを実行し、インスタンスの起動確認をする。

```
$ su postgres
$ /usr/pgsql-11/bin/pg_ctl -D /data/pgsql-5432 start
$ /usr/pgsql-11/bin/pg_ctl -D /data/pgsql-5432 stop
$ exit
```

### 起動スクリプト作成
インストール時に作成された起動スクリプトを複製して、インスタンス①用に編集する。
※デフォルトのpostgresql.serviceは使用する予定が無ければ、別ディレクトリへ退避、もしくは編集で良いかも。
systemctlとかを実行する時にTAB補完されてしまうため。

```
$ cd /usr/lib/systemd/system/
$ cp -p postgresql.service postgresql-5432.service
$ vi /usr/lib/systemd/system/postgresql-5432.service
Environment=PGDATA=/data/pgsql-5432/
```
#### 起動スクリプト確認
インスタンス①のサービス停止/起動、必要なら自動起動設定をしておく。
※インスタンス②を作るときに、このままポートが被るためサービス停止しておく。

```
$ systemctl daemon-reload
$ systemctl status postgresql-5432.service
$ systemctl start postgresql-5432.service
$ systemctl stop postgresql-5432.service
$ systemctl status postgresql-5432.service

$ systemctl enable postgresql-5432.service
$ systemctl list-unit-files |grep postgres
```

## インスタンス②(pgsql-5433)
一つ目のインスタンスpgsql-5433を作成する。
「インスタンス①」で実行した手順のディレクトリパスを変更するだけ。

### インスタンス作成
initdbコマンドでディレクトリ「/data/pgsql-5433」にインスタンス作成を作成する。

```
$ initdb --pgdata=/data/pgsql-5433
$ cat /data/pgsql-5433/PG_VERSION
11
```

### インスタンス起動確認
pg_ctlコマンドを実行し、インスタンスの起動確認をする。

```
$ su postgres
$ /usr/pgsql-11/bin/pg_ctl -D /data/pgsql-5432 start
$ /usr/pgsql-11/bin/pg_ctl -D /data/pgsql-5432 stop
$ exit
```

### 起動スクリプト作成
インストール時に作成された起動スクリプトを複製して、インスタンス②用に編集する。

```
$ cd /usr/lib/systemd/system/
$ cp -p postgresql.service postgresql-5433.service
$ vi /usr/lib/systemd/system/postgresql-5433.service
Environment=PGDATA=/data/pgsql-5432/
```
#### 起動スクリプト確認
インスタンス②のサービス停止/起動、必要なら自動起動設定をしておく。
※このままだとインスタンス①とポートが被るためサービス停止しておく。

```
$ systemctl daemon-reload
$ systemctl status postgresql-5433.service
$ systemctl start postgresql-5433.service
$ systemctl stop postgresql-5433.service
$ systemctl status postgresql-5433.service

$ systemctl enable postgresql-5433.service
$ systemctl list-unit-files |grep postgres
```
## ポート設定
各インスタンスが使用するポートを変更する。
今回はインスタンス②のみ変更。

```
$ vi /data/pgsql-5433/postgresql.conf
#port = 5432
port = 5433
```

## インスタンス起動
インスタンスを個別に起動させる。

```
$ systemctl start postgresql-5432.service
$ systemctl status postgresql-5432.service

$ systemctl start postgresql-5433.service
$ systemctl status postgresql-5433.service
```

### プロセス確認
各インスタンスのプロセスを確認する。

```
$ ps -ef |grep pgsql
postgres 28435     1  0 Feb09 ?        00:00:02 /usr/pgsql-11/bin/postmaster -D /data/pgsql-5432/
postgres 28456     1  0 Feb09 ?        00:00:01 /usr/pgsql-11/bin/postmaster -D /data/pgsql-5433/
```

### ポート確認
各インスタンスが指定したポートで起動していることを確認する。

```
$ ss -anp |grep 5432
～～～
tcp    LISTEN     0      128       *:5432                  *:*                   users:(("postmaster",pid=28435,fd=3))
～～～

$ ss -anp |grep 5433
～～～
tcp    LISTEN     0      128       *:5433                  *:*                   users:(("postmaster",pid=28456,fd=3))
～～～
```

あとは、インスタンスごとに設定するだけ！

```
$ ll /data/pgsql-5432
$ ll /data/pgsql-5433
``` 

以上。