このエントリーをはてなブックマークに追加

概要

 リリースから時間が経ってしまいましたが、PostgreSQL 10をインストールしてみたので手順を載せます。 2018/8/4時点でリビジョンは10.4まで進んでいました。 設定ファイルの設定項目が増えていたり、ディレクトリ名が変わっているものがありましたが、 バージョン10のインストールの基本的な流れは9.6と変わらないようです。

 今回はRHEL 7.5がインストールされたAWSのEC2インスタンスに、PostgreSQL 10.4をインストールします。 運用の中で、人為的な操作ミスによるデータの削除や、バッチ処理のバグによるデータ誤りなどのデータベースの論理障害が 発生することを想定し、バックアップからのPITR(Point In Time Recovery)を行える構成とします。 ただし、ディスクの故障など物理障害は今回想定から外すこととし、Linuxのディスク構成を簡略化しています。 また、SystemdでPostgreSQLの起動を制御できるよう設定します。

 WALファイルをアーカイブする場合の注意点として、アーカイブファイルを自動で削除する仕組みがありません。 ディスクの使用率が不足する前に定期的に削除する必要があります。 適切なタイミングとしては、データベースクラスタのベースバックアップを取得したタイミングで、 それ以前に生成されたアーカイブファイルが不要となりますので、 ベースバックアップの実行とアーカイブファイルの削除をセットで運用するのが良いと思います。 今回はその詳細については触れませんが、運用設計として考慮しておいてください。

 WALはWrite Ahead Loggingの略で、いわゆるデータベースのトランザクションログです。 Oracle DatabaseではREDOログと呼んでいるものと同じです。

構成

想定環境

 今回構築するPostgreSQLサーバのプロセス、メモリ、接続の構成概要は以下の通りとなります。

PostgreSQL 10.4構成

 ディレクトリ構成は任意ですが、今回は以下の通りとします。 ご自身の環境に読み替えて構築してください。

最新データ/data/
バックアップデータ/bkup/
データベースクラスタ/data/pgdata1/
WALファイル/data/pgdata1/pg_wal/
アーカイブファイル/bkup/pgdata1/pg_arch/

 サーバ環境はAWS(Amazon Web Services)のEC2インスタンスを利用しました。 サーバのスペックは以下のとおりです。 構築作業時はスペックが低くても問題ないので、インスタンスタイプはt2.microを選択しています。 本番運用開始前にインスタンスタイプをアップさせる前提です。

■サーバスペック
項目内容
インスタンスタイプt2.micro
vCPU1
メモリ1GiB
ディスクSSD 10GiB
リージョンアジアパシフィック (東京)

サーバ構成

OSバージョン

Red Hat Enterprise Linux 7.5 x86_64

ソフトウェア・パッケージ一覧

  • postgresql10-10.4-1PGDG.rhel7.x86_64.rpm
  • postgresql10-libs-10.4-1PGDG.rhel7.x86_64.rpm
  • postgresql10-server-10.4-1PGDG.rhel7.x86_64.rpm

サーバ構築

インストール

(1) wgetのインストール

 今回利用したAWSのEC2インスタンスでは初期状態でwgetがインストールされていないので、 始めにインストールします。その後、wgetでPostgreSQLのインストールパッケージをダウンロードします。 コマンドに都度 sudo をつけるのが面倒なので、作業は root ユーザで実行しています。

$ sudo su -
# yum -y install wget
Loaded plugins: amazon-id, rhui-lb, search-disabled-repos
rhui-REGION-client-config-server-7                                                               | 2.9 kB  00:00:00
rhui-REGION-rhel-server-releases                                                                 | 3.5 kB  00:00:00
rhui-REGION-rhel-server-rh-common                                                                | 3.8 kB  00:00:00
(1/7): rhui-REGION-client-config-server-7/x86_64/primary_db                                      | 1.2 kB  00:00:00
(2/7): rhui-REGION-rhel-server-rh-common/7Server/x86_64/group                                    |  104 B  00:00:00
(3/7): rhui-REGION-rhel-server-releases/7Server/x86_64/group                                     | 855 kB  00:00:00
(4/7): rhui-REGION-rhel-server-rh-common/7Server/x86_64/primary_db                               | 121 kB  00:00:00
(5/7): rhui-REGION-rhel-server-rh-common/7Server/x86_64/updateinfo                               |  33 kB  00:00:00
(6/7): rhui-REGION-rhel-server-releases/7Server/x86_64/updateinfo                                | 2.9 MB  00:00:00
(7/7): rhui-REGION-rhel-server-releases/7Server/x86_64/primary_db                                |  54 MB  00:00:01
Resolving Dependencies
--> Running transaction check
---> Package wget.x86_64 0:1.14-15.el7_4.1 will be installed
--> Finished Dependency Resolution

Dependencies Resolved

========================================================================================================================
 Package           Arch                Version                      Repository                                     Size
========================================================================================================================
Installing:
 wget              x86_64              1.14-15.el7_4.1              rhui-REGION-rhel-server-releases              547 k

Transaction Summary
========================================================================================================================
Install  1 Package

Total download size: 547 k
Installed size: 2.0 M
Downloading packages:
wget-1.14-15.el7_4.1.x86_64.rpm                                                                  | 547 kB  00:00:00
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  Installing : wget-1.14-15.el7_4.1.x86_64                                                                          1/1
  Verifying  : wget-1.14-15.el7_4.1.x86_64                                                                          1/1

Installed:
  wget.x86_64 0:1.14-15.el7_4.1

Complete!

(2) RPMパッケージのダウンロード

 PostgreSQLサーバに最低限必要なRPMパッケージを3つダウンロードします。 ファイルのダウンロード先は /media/installer/ ディレクトリとしています。

【ダウンロードサイト】
 RHEL 7系(x86_64)Linux向けPostgreSQL 10ダウンロードページ

# cd /media/
# mkdir installer
# cd installer/
# wget https://yum.postgresql.org/10/redhat/rhel-7-x86_64/postgresql10-10.4-1PGDG.rhel7.x86_64.rpm
--2018-08-04 12:55:04--  https://yum.postgresql.org/10/redhat/rhel-7-x86_64/postgresql10-10.4-1PGDG.rhel7.x86_64.rpm
Resolving yum.postgresql.org (yum.postgresql.org)... 174.143.35.196, 2001:4800:1501:1::196
Connecting to yum.postgresql.org (yum.postgresql.org)|174.143.35.196|:443... connected.
HTTP request sent, awaiting response... 301 Moved Permanently
Location: http://download.postgresql.org/pub/repos/yum/10/redhat/rhel-7-x86_64/postgresql10-10.4-1PGDG.rhel7.x86_64.rpm [following]
--2018-08-04 12:55:06--  http://download.postgresql.org/pub/repos/yum/10/redhat/rhel-7-x86_64/postgresql10-10.4-1PGDG.rhel7.x86_64.rpm
Resolving download.postgresql.org (download.postgresql.org)... 174.143.35.246, 204.145.124.244, 217.196.149.55, ...
Connecting to download.postgresql.org (download.postgresql.org)|174.143.35.246|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 1624360 (1.5M) [application/x-redhat-package-manager]
Saving to: ‘postgresql10-10.4-1PGDG.rhel7.x86_64.rpm’

100%[==============================================================================>] 1,624,360   1.45MB/s   in 1.1s

2018-08-04 12:55:08 (1.45 MB/s) - ‘postgresql10-10.4-1PGDG.rhel7.x86_64.rpm’ saved [1624360/1624360]

# wget https://yum.postgresql.org/10/redhat/rhel-7-x86_64/postgresql10-libs-10.4-1PGDG.rhel7.x86_64.rpm
--2018-08-04 12:55:16--  https://yum.postgresql.org/10/redhat/rhel-7-x86_64/postgresql10-libs-10.4-1PGDG.rhel7.x86_64.rpm
Resolving yum.postgresql.org (yum.postgresql.org)... 174.143.35.196, 2001:4800:1501:1::196
Connecting to yum.postgresql.org (yum.postgresql.org)|174.143.35.196|:443... connected.
HTTP request sent, awaiting response... 301 Moved Permanently
Location: http://download.postgresql.org/pub/repos/yum/10/redhat/rhel-7-x86_64/postgresql10-libs-10.4-1PGDG.rhel7.x86_64.rpm [following]
--2018-08-04 12:55:17--  http://download.postgresql.org/pub/repos/yum/10/redhat/rhel-7-x86_64/postgresql10-libs-10.4-1PGDG.rhel7.x86_64.rpm
Resolving download.postgresql.org (download.postgresql.org)... 87.238.57.227, 174.143.35.246, 204.145.124.244, ...
Connecting to download.postgresql.org (download.postgresql.org)|87.238.57.227|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 362496 (354K) [application/x-redhat-package-manager]
Saving to: ‘postgresql10-libs-10.4-1PGDG.rhel7.x86_64.rpm’

100%[==============================================================================>] 362,496      324KB/s   in 1.1s

2018-08-04 12:55:19 (324 KB/s) - ‘postgresql10-libs-10.4-1PGDG.rhel7.x86_64.rpm’ saved [362496/362496]

# wget https://yum.postgresql.org/10/redhat/rhel-7-x86_64/postgresql10-server-10.4-1PGDG.rhel7.x86_64.rpm
--2018-08-04 12:55:30--  https://yum.postgresql.org/10/redhat/rhel-7-x86_64/postgresql10-server-10.4-1PGDG.rhel7.x86_64.rpm
Resolving yum.postgresql.org (yum.postgresql.org)... 174.143.35.196, 2001:4800:1501:1::196
Connecting to yum.postgresql.org (yum.postgresql.org)|174.143.35.196|:443... connected.
HTTP request sent, awaiting response... 301 Moved Permanently
Location: http://download.postgresql.org/pub/repos/yum/10/redhat/rhel-7-x86_64/postgresql10-server-10.4-1PGDG.rhel7.x86_64.rpm [following]
--2018-08-04 12:55:30--  http://download.postgresql.org/pub/repos/yum/10/redhat/rhel-7-x86_64/postgresql10-server-10.4-1PGDG.rhel7.x86_64.rpm
Resolving download.postgresql.org (download.postgresql.org)... 217.196.149.55, 87.238.57.227, 174.143.35.246, ...
Connecting to download.postgresql.org (download.postgresql.org)|217.196.149.55|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 4742480 (4.5M) [application/x-redhat-package-manager]
Saving to: ‘postgresql10-server-10.4-1PGDG.rhel7.x86_64.rpm’

100%[==============================================================================>] 4,742,480    707KB/s   in 7.5s

2018-08-04 12:55:38 (615 KB/s) - ‘postgresql10-server-10.4-1PGDG.rhel7.x86_64.rpm’ saved [4742480/4742480]

# ls -l
total 6576
-rw-r--r--. 1 root root 1624360 May 14 13:46 postgresql10-10.4-1PGDG.rhel7.x86_64.rpm
-rw-r--r--. 1 root root  362496 May 14 13:46 postgresql10-libs-10.4-1PGDG.rhel7.x86_64.rpm
-rw-r--r--. 1 root root 4742480 May 14 13:46 postgresql10-server-10.4-1PGDG.rhel7.x86_64.rpm

(3) RPMパッケージからPostgreSQLをインストール

 ダウンロードしたRPMパッケージを使用してPostgreSQLをインストールします。 インストール時に警告メッセージが表示されますが、無視して構いません。

# rpm -ihv postgresql10-*.rpm
warning: postgresql10-10.4-1PGDG.rhel7.x86_64.rpm: Header V4 DSA/SHA1 Signature, key ID 442df0f8: NOKEY
Preparing...                          ################################# [100%]
Updating / installing...
   1:postgresql10-libs-10.4-1PGDG.rhel################################# [ 33%]
   2:postgresql10-10.4-1PGDG.rhel7    ################################# [ 67%]
   3:postgresql10-server-10.4-1PGDG.rh################################# [100%]

設定

(1) postgresユーザのパスワード設定

 PostgreSQLのパッケージをインストールすると、自動で postgres という名前のLinuxユーザが作成されます。 作成直後はパスワードが設定されていないため、設定します。

# passwd postgres
Changing password for user postgres.
New password: ←パスワードを入力(表示されません)
Retype new password: ←上と同じパスワードを入力(表示されません)
passwd: all authentication tokens updated successfully.

(2) postgresユーザの環境変数設定

 postgresユーザの環境変数としてデータベースクラスタとPostgreSQLのコマンドへのパスを設定します。

# grep postgres /etc/passwd ←postgresユーザのホームディレクトリを確認
postgres:x:26:26:PostgreSQL Server:/var/lib/pgsql:/bin/bash
# cd /var/lib/pgsql/
# vi .bash_profile
ファイル名:/var/lib/pgsql/.bash_profile
※以下、該当箇所のみ変更※
PGDATA=/var/lib/pgsql/10/data
export PGDATA
   ↓変更
PGDATA=/data/pgdata1
export PGDATA
export PATH=$PATH:/usr/pgsql-10/bin

(3) データベースクラスタ用ディレクトリ($PGDATA)作成

 インストールしたRPMパッケージで初期設定されているデータベースクラスタは /var/lib/pgsql/10/data/ となっています。 このままでも良いのですが、ディレクトリ階層が深くて分かりづらいため /data/pgdata1/ に変更します。 また、アーカイブファイルの格納先は /bkup/pgdata1/pg_arch/ とします。 その他、データベースクラスタのベースバックアップの取得先は /bkup/ ディレクトリとします。

 データベースクラスタのベースバックアップと最新のWALファイル、アーカイブファイルはPITRに必要なファイルなので、 冗長化を高めたディスクに保管した方が良いですが、今回は物理障害ではなく、論理障害(人為的操作ミス)からの 復旧に限定した構成としているため、データベースクラスタと同じディスク上に保存しています。

 それぞれディレクトリを作成して必要なパーミッションを設定します。 データベースクラスタ用のディレクトリはPostgreSQL管理者ユーザの postgres のみが参照、更新できるようにします。

# cd /
# chmod 777 data ←最新データ用
# mkdir -m 777 bkup ←バックアップデータ用
# su - postgres
-bash-4.2$ cd /data/
-bash-4.2$ mkdir -m 700 pgdata1 ←データベースクラスタ用
-bash-4.2$ ls -l
total 0
drwx------. 2 postgres postgres 6 Aug  4 13:08 pgdata1
-bash-4.2$ cd /bkup/
-bash-4.2$ mkdir -m 700 pgdata1
-bash-4.2$ ls -l
total 0
drwx------. 2 postgres postgres 6 Aug  4 13:08 pgdata1
-bash-4.2$ cd pgdata1/
-bash-4.2$ mkdir -m 700 pg_arch ←アーカイブファイル用
-bash-4.2$ ls -l
total 0
drwx------. 2 postgres postgres 6 Aug  4 13:09 pg_arch

(4) データベースクラスタ作成

 前の手順で作成したデータベースクラスタ用ディレクトリ内にデータベースクラスタを作成します。 initdbコマンドを使用しますが、必ず管理者ユーザであるpostgresユーザで実行してください。 エンコーディングは UTF8、ロケールは設定しません。 PostgreSQLでロケールを選択した場合、検索性能に問題が出るらしく、 ロケールを選択しないことが推奨とされています。(10でも該当するかは未確認です)

-bash-4.2$ initdb --encoding=UTF8 --no-locale --pgdata=/data/pgdata1
The files belonging to this database system will be owned by user "postgres".
This user must also own the server process.

The database cluster will be initialized with locale "C".
The default text search configuration will be set to "english".

Data page checksums are disabled.

fixing permissions on existing directory /data/pgdata1 ... ok
creating subdirectories ... ok
selecting default max_connections ... 100
selecting default shared_buffers ... 128MB
selecting dynamic shared memory implementation ... posix
creating configuration files ... ok
running bootstrap script ... ok
performing post-bootstrap initialization ... ok
syncing data to disk ... ok

WARNING: enabling "trust" authentication for local connections
You can change this by editing pg_hba.conf or using the option -A, or
--auth-local and --auth-host, the next time you run initdb.

Success. You can now start the database server using:

    pg_ctl -D /data/pgdata1 -l logfile start

-bash-4.2$

(5) PostgreSQLの設定ファイル変更

 ここではPostgreSQLインスタンスがリッスンするIPアドレスと ログ出力、WALファイルのアーカイブに関する設定を行います。

 初期設定ではPostgreSQLが localhost(127.0.0.1)のみでリッスンする設定になっています。 そのため、他のサーバからTCP/IP接続することができません。 ローカルからもリモートからもTCP/IP接続できるように、 このサーバが持つ全てのIPアドレスでリッスンする設定とします(全てと言ってもEC2のデフォルトではNICはeth0の1つしかありませんが)。

 ログの出力先は /data/pgdata1/log/ ディレクトリとします。 ログファイル名は postgresql-20180804.log のように ログファイルが作成された年月日を付与します。 ログファイルは7日間経過後に自動でローテーションされ、 新しいログファイルに出力が切り替わるようにします。 ログが一定のファイルサイズに達した際にローテーションされる機能は使用しません。 あくまで日数経過後にローテーションします。 ログのタイムゾーンが日本になっていない場合は、日本(Japan)に変更します。 ログメッセージの形式は以下のようになります。

【ログメッセージの出力例】
2018-08-04 22:41:50.448 JST [9000] LOG: database system was shut down at 2018-08-04 22:09:35 JST
2018-08-04 22:41:50.452 JST [8997] LOG: database system is ready to accept connections

 WALファイルは初期設定ではアーカイブする設定になっていないため、 ログファイルが循環すると古いファイルから削除されてしまいます。 PITRではベースバックアップからの一連の更新ログが必要となるため、 WALファイルをアーカイブする設定に変更します。 また、データベースクラスタのベースバックアップ(pg_basebackup)を取得する際に レプリケーションプロトコルが利用される仕様となっているため、 一部レプリケーションに関する設定も必要となります。

 データベースクラスタ内の postgresql.conf ファイルを編集します。

-bash-4.2$ cd /data/pgdata1/
-bash-4.2$ vi postgresql.conf
ファイル名:/data/pgdata1/postgresql.conf
※以下、該当箇所を変更※
#------------------------------------------------------------------------------
# CONNECTIONS AND AUTHENTICATION
#------------------------------------------------------------------------------
#listen_addresses = 'localhost'         # what IP address(es) to listen on;
   ↓変更
listen_addresses = '*'                  # what IP address(es) to listen on;

#------------------------------------------------------------------------------
# WRITE AHEAD LOG
#------------------------------------------------------------------------------
#wal_level = replica                    # minimal, replica, or logical
   ↓変更
wal_level = replica                     # minimal, replica, or logical

#archive_mode = off             # enables archiving; off, on, or always
   ↓変更
archive_mode = on               # enables archiving; off, on, or always

#archive_command = ''           # command to use to archive a logfile segment
   ↓変更
archive_command = 'cp %p /bkup/pgdata1/pg_arch/%f'              # command to use to archive a logfile segment

#------------------------------------------------------------------------------
# REPLICATION
#------------------------------------------------------------------------------
#max_wal_senders = 10           # max number of walsender processes
   ↓変更
max_wal_senders = 2             # max number of walsender processes

※変更なし※
#------------------------------------------------------------------------------
# ERROR REPORTING AND LOGGING
#------------------------------------------------------------------------------
log_destination = 'stderr'              # Valid values are combinations of
logging_collector = on                  # Enable capturing of stderr and csvlog
log_directory = 'log'                   # directory where log files are written,

log_filename = 'postgresql-%a.log'      # log file name pattern,
   ↓変更
log_filename = 'postgresql-%Y%m%d.log'  # log file name pattern,

log_truncate_on_rotation = on           # If on, an existing log file with the
   ↓変更
log_truncate_on_rotation = off          # If on, an existing log file with the

log_rotation_age = 1d                   # Automatic rotation of logfiles will
   ↓変更
log_rotation_age = 7d                   # Automatic rotation of logfiles will

※変更なし※
log_rotation_size = 0                   # Automatic rotation of logfiles will
log_line_prefix = '%m [%p] '            # special values:

log_timezone = 'UTC'
   ↓変更
log_timezone = 'Japan'

(6) クライアント認証の設定

 クライアントからPostgreSQLに接続する際の認証設定を行います。 デフォルトで設定されている内容は全てコメントアウトし、必要な設定をファイルの末尾に追加します。 設定する認証ルールは以下の通りとします。

  • postgresユーザ(管理者ユーザ)がUNIXドメインソケット接続(ローカル接続)を行った場合は、 パスワードの入力を求めない。
  • postgresユーザ(管理者ユーザ)がUNIXドメインソケット接続(ローカル接続)でレプリケーションが要求された場合、 パスワードの入力を求めない(replicationという名のデータベースは存在せず、特殊な操作を表す予約語)。
  • postgresユーザ(管理者ユーザ)以外のユーザ(一般ユーザ)がUNIXドメインソケット接続(ローカル接続)を行った場合は、 PostgreSQLユーザ名とパスワードで認証する。パスワードはMD5で暗号化して送信する。
  • ユーザに関係なくTCP/IP接続(リモート接続)を行った場合は、PostgreSQLユーザ名とパスワードで認証する。 システム開発者がpgAdmin4などを利用してインターネット経由で接続してくることを想定し、接続元IPアドレスが不定であることから、 任意のIPアドレス(0.0.0.0/0)からの接続を許可する。※LAN環境でのみ利用する場合はIPアドレスを限定してください。 パスワードはMD5で暗号化して送信する。

 PostgreSQLでデータベースクラスタのオンラインバックアップ(pg_basebackup)を実行する場合、 レプリケーションプロトコルを利用してバックアップが作成される仕様となっています。 そのため、上記2つ目のルールを記述しておく必要があることに注意してください。

-bash-4.2$ vi pg_hba.conf
ファイル名:/data/pgdata1/pg_hba.conf
※以下、該当箇所を変更※
# TYPE  DATABASE        USER            ADDRESS                 METHOD

# "local" is for Unix domain socket connections only
local   all             all                                     trust
# IPv4 local connections:
host    all             all             127.0.0.1/32            trust
# IPv6 local connections:
host    all             all             ::1/128                 trust
# Allow replication connections from localhost, by a user with the
# replication privilege.
local   replication     all                                     trust
host    replication     all             127.0.0.1/32            trust
host    replication     all             ::1/128                 trust
   ↓変更
# TYPE  DATABASE        USER            ADDRESS                 METHOD

# "local" is for Unix domain socket connections only
#local   all             all                                     trust ※コメントアウト
# IPv4 local connections:
#host    all             all             127.0.0.1/32            trust ※コメントアウト
# IPv6 local connections:
#host    all             all             ::1/128                 trust ※コメントアウト
# Allow replication connections from localhost, by a user with the
# replication privilege.
#local   replication     all                                     trust ※コメントアウト
#host    replication     all             127.0.0.1/32            trust ※コメントアウト
#host    replication     all             ::1/128                 trust ※コメントアウト
local   all             postgres                                peer
local   replication     postgres                                peer
local   all             all                                     md5
host    all             all             0.0.0.0/0               md5

(7) Systemdの設定

 Systemdを利用してPostgreSQLの起動を管理する設定を行います。 PostgreSQL用のサービスユニットファイルをコピーして編集します。 変更するのは PGDATA の環境変数のみで構いません。

-bash-4.2$ exit
logout
# cp -piv /lib/systemd/system/postgresql-10.service /etc/systemd/system/postgresql-10.service
‘/lib/systemd/system/postgresql-10.service’ -> ‘/etc/systemd/system/postgresql-10.service’
# cd /etc/systemd/system/
# ls -l
total 8
drwxr-xr-x. 2 root root   57 Mar 23 17:45 basic.target.wants
lrwxrwxrwx. 1 root root   46 Mar 23 17:43 dbus-org.freedesktop.NetworkManager.service -> /usr/lib/systemd/system/NetworkManager.service
lrwxrwxrwx. 1 root root   57 Mar 23 17:43 dbus-org.freedesktop.nm-dispatcher.service -> /usr/lib/systemd/system/NetworkManager-dispatcher.service
lrwxrwxrwx. 1 root root   37 Mar 23 17:51 default.target -> /lib/systemd/system/multi-user.target
drwxr-xr-x. 2 root root   87 Mar 23 17:42 default.target.wants
drwxr-xr-x. 2 root root   38 Mar 23 17:45 dev-virtio\x2dports-org.qemu.guest_agent.0.device.wants
drwxr-xr-x. 2 root root   32 Mar 23 17:42 getty.target.wants
drwxr-xr-x. 2 root root   35 Mar 23 17:42 local-fs.target.wants
drwxr-xr-x. 2 root root 4096 Mar 23 17:51 multi-user.target.wants
drwxr-xr-x. 2 root root   48 Mar 23 17:43 network-online.target.wants
-rw-r--r--. 1 root root 1728 May 14 13:44 postgresql-10.service
drwxr-xr-x. 2 root root  134 Mar 23 17:42 sysinit.target.wants
drwxr-xr-x. 2 root root   44 Mar 23 17:42 system-update.target.wants
# vi postgresql-10.service
ファイル名:/etc/systemd/system/postgresql-10.service
※以下、該当箇所のみ変更※
# Location of database directory
Environment=PGDATA=/var/lib/pgsql/10/data/
   ↓変更
# Location of database directory
Environment=PGDATA=/data/pgdata1/

(8) SystemdでPostgreSQLを自動起動に設定

 SystemdでPostgreSQLのサービスユニットが認識されていることを確認します。 初期状態ではPostgreSQLは停止状態で、自動起動も無効になっています。 上記の手順でPostgreSQLをインストールした場合、 サービスユニット名は postgresql-10.service となっています。 OS起動時にSystemdがPostgreSQLを自動起動するように設定します。

# systemctl status postgresql-10.service
● postgresql-10.service - PostgreSQL 10 database server
   Loaded: loaded (/etc/systemd/system/postgresql-10.service; disabled; vendor preset: disabled) ←自動起動無効
   Active: inactive (dead) ←停止状態
     Docs: https://www.postgresql.org/docs/10/static/
# systemctl enable postgresql-10.service
Created symlink from /etc/systemd/system/multi-user.target.wants/postgresql-10.service to /etc/systemd/system/postgresql-10.service.
# systemctl status postgresql-10.service
● postgresql-10.service - PostgreSQL 10 database server
   Loaded: loaded (/etc/systemd/system/postgresql-10.service; enabled; vendor preset: disabled) ←自動起動有効
   Active: inactive (dead) ←停止状態
     Docs: https://www.postgresql.org/docs/10/static/

(9) SystemdでPostgreSQLの起動

 SystemdでPostgreSQLを起動します。

# systemctl start postgresql-10.service
# systemctl status postgresql-10.service
● postgresql-10.service - PostgreSQL 10 database server
   Loaded: loaded (/etc/systemd/system/postgresql-10.service; enabled; vendor preset: disabled) ←自動起動有効
   Active: active (running) since Sat 2018-08-04 13:41:50 UTC; 2s ago ←起動状態
     Docs: https://www.postgresql.org/docs/10/static/
  Process: 8992 ExecStartPre=/usr/pgsql-10/bin/postgresql-10-check-db-dir ${PGDATA} (code=exited, status=0/SUCCESS)
 Main PID: 8997 (postmaster)
   CGroup: /system.slice/postgresql-10.service
           tq8997 /usr/pgsql-10/bin/postmaster -D /data/pgdata1/
           tq8999 postgres: logger process
           tq9001 postgres: checkpointer process
           tq9002 postgres: writer process
           tq9003 postgres: wal writer process
           tq9004 postgres: autovacuum launcher process
           tq9005 postgres: archiver process
           tq9006 postgres: stats collector process
           mq9007 postgres: bgworker: logical replication launcher

Aug 04 13:41:50 ip-172-31-18-21.ap-northeast-1.compute.internal systemd[1]: Starting PostgreSQL 10 database server...
Aug 04 13:41:50 ip-172-31-18-21.ap-northeast-1.compute.internal postmaster[8997]: 2018-08-04 22:41:50.431 JST [8997]...2
Aug 04 13:41:50 ip-172-31-18-21.ap-northeast-1.compute.internal postmaster[8997]: 2018-08-04 22:41:50.431 JST [8997]...2
Aug 04 13:41:50 ip-172-31-18-21.ap-northeast-1.compute.internal postmaster[8997]: 2018-08-04 22:41:50.433 JST [8997]..."
Aug 04 13:41:50 ip-172-31-18-21.ap-northeast-1.compute.internal postmaster[8997]: 2018-08-04 22:41:50.435 JST [8997]..."
Aug 04 13:41:50 ip-172-31-18-21.ap-northeast-1.compute.internal postmaster[8997]: 2018-08-04 22:41:50.444 JST [8997]...s
Aug 04 13:41:50 ip-172-31-18-21.ap-northeast-1.compute.internal postmaster[8997]: 2018-08-04 22:41:50.444 JST [8997]....
Aug 04 13:41:50 ip-172-31-18-21.ap-northeast-1.compute.internal systemd[1]: Started PostgreSQL 10 database server.
Hint: Some lines were ellipsized, use -l to show in full.

(10) スーパーユーザのパスワード設定

 データベースクラスタ作成時点では、スーパーユーザ(データベースユーザ) postgres のパスワードが設定されていません。 以下では postgres ユーザのパスワードを「password」に設定しますが、実際にはもっと推測されづらいものを採用してください。

# su - postgres
Last login: Sat Aug  4 13:07:16 UTC 2018 on pts/0
-bash-4.2$ psql -c "alter role postgres with password 'password';"
ALTER ROLE
-bash-4.2$ exit
logout

動作確認

(1) プロセス起動確認

 PostgreSQLのプロセスが起動していることを確認します。 今回の設定ではマスタサーバプロセス1つとワーカプロセス8つが起動します。 logical replication launcherプロセスはバージョン9.6の時は起動していませんでした。 バージョン10からロジカルレプリケーションがサポートされたので、そのためのプロセスと思われます。

# ps -ef | grep postgres | grep -v grep
                                                ↓マスタサーバプロセス(1つ)
postgres  8997     1  0 13:41 ?        00:00:00 /usr/pgsql-10/bin/postmaster -D /data/pgdata1/
                                                ↓ワーカプロセス(8つ)
postgres  8999  8997  0 13:41 ?        00:00:00 postgres: logger process
postgres  9001  8997  0 13:41 ?        00:00:00 postgres: checkpointer process
postgres  9002  8997  0 13:41 ?        00:00:00 postgres: writer process
postgres  9003  8997  0 13:41 ?        00:00:00 postgres: wal writer process
postgres  9004  8997  0 13:41 ?        00:00:00 postgres: autovacuum launcher process
postgres  9005  8997  0 13:41 ?        00:00:00 postgres: archiver process
postgres  9006  8997  0 13:41 ?        00:00:00 postgres: stats collector process
postgres  9007  8997  0 13:41 ?        00:00:00 postgres: bgworker: logical replication launcher

(2) ログ出力確認

 設定したログファイルにログが出力されていることを確認します。 ログディレクトリ名はバージョン9.6までは pg_log だったのに、バージョン10から log に変わったようです。 ログメッセージの先頭に出力されている日付もJSTなので日本時間になっていることが分かります。

# cd /data/pgdata1/log/
# ls -l
total 4
-rw-------. 1 postgres postgres 186 Aug  4 13:41 postgresql-20180804.log
# cat postgresql-20180804.log
2018-08-04 22:41:50.448 JST [9000] LOG:  database system was shut down at 2018-08-04 22:09:35 JST
2018-08-04 22:41:50.452 JST [8997] LOG:  database system is ready to accept connections

(3) SQL実行確認

 psqlコマンドで、SQLを実行できることを確認します。

# su - postgres
Last login: Sat Aug  4 13:49:30 UTC 2018 on pts/0
-bash-4.2$ psql
psql (10.4)
Type "help" for help.

postgres=# select now();
              now
-------------------------------
 2018-08-04 13:59:34.515219+00
(1 row)

postgres=# select oid, datname from pg_database;
  oid  |  datname
-------+-----------
 13806 | postgres
     1 | template1
 13805 | template0
(3 rows)

postgres=# \q
-bash-4.2$ exit
logout

(4) SystemdでPostgreSQLの停止

 PostgreSQLインスタンスを停止します。

# systemctl stop postgresql-10.service
# systemctl status postgresql-10.service
● postgresql-10.service - PostgreSQL 10 database server
   Loaded: loaded (/etc/systemd/system/postgresql-10.service; enabled; vendor preset: disabled) ←自動起動有効
   Active: inactive (dead) since Sat 2018-08-04 14:01:01 UTC; 2min 6s ago ←停止状態
     Docs: https://www.postgresql.org/docs/10/static/
  Process: 8997 ExecStart=/usr/pgsql-10/bin/postmaster -D ${PGDATA} (code=exited, status=0/SUCCESS)
  Process: 8992 ExecStartPre=/usr/pgsql-10/bin/postgresql-10-check-db-dir ${PGDATA} (code=exited, status=0/SUCCESS)
 Main PID: 8997 (code=exited, status=0/SUCCESS)

Aug 04 13:41:50 ip-172-31-18-21.ap-northeast-1.compute.internal systemd[1]: Starting PostgreSQL 10 database server...
Aug 04 13:41:50 ip-172-31-18-21.ap-northeast-1.compute.internal postmaster[8997]: 2018-08-04 22:41:50.431 JST [8997]...2
Aug 04 13:41:50 ip-172-31-18-21.ap-northeast-1.compute.internal postmaster[8997]: 2018-08-04 22:41:50.431 JST [8997]...2
Aug 04 13:41:50 ip-172-31-18-21.ap-northeast-1.compute.internal postmaster[8997]: 2018-08-04 22:41:50.433 JST [8997]..."
Aug 04 13:41:50 ip-172-31-18-21.ap-northeast-1.compute.internal postmaster[8997]: 2018-08-04 22:41:50.435 JST [8997]..."
Aug 04 13:41:50 ip-172-31-18-21.ap-northeast-1.compute.internal postmaster[8997]: 2018-08-04 22:41:50.444 JST [8997]...s
Aug 04 13:41:50 ip-172-31-18-21.ap-northeast-1.compute.internal postmaster[8997]: 2018-08-04 22:41:50.444 JST [8997]....
Aug 04 13:41:50 ip-172-31-18-21.ap-northeast-1.compute.internal systemd[1]: Started PostgreSQL 10 database server.
Aug 04 14:01:01 ip-172-31-18-21.ap-northeast-1.compute.internal systemd[1]: Stopping PostgreSQL 10 database server...
Aug 04 14:01:01 ip-172-31-18-21.ap-northeast-1.compute.internal systemd[1]: Stopped PostgreSQL 10 database server.
Hint: Some lines were ellipsized, use -l to show in full.
# ps -ef | grep postgres | grep -v grep ←プロセスが停止しているので表示されない

(5) アーカイブファイル確認

 PostgreSQLのインストール直後はアーカイブファイルは存在しませんが、 上記動作確認を行っている中でWALファイルが循環し、アーカイブされるため、 最後にアーカイブファイルが作成されていることを確認します。

# cd /bkup/pgdata1/pg_arch/
# ls -l
total 16384
-rw-------. 1 postgres postgres 16777216 Aug  4 14:01 000000010000000000000001