OSS Fan ~OSSでLinuxサーバ構築~

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

PostgreSQL 9.4.8をAWSのEC2(RHEL 7.2)へインストールして初期設定

カテゴリ:OSSセットアップ | ソフトウェア:PostgreSQL | タグ:
最終更新日:2020/12/31 | 公開日:2016/07/08

目次

構成

想定環境

PostgreSQL 9.4.8構成

サーバ構成

OSバージョン

Red Hat Enterprise Linux 7.2 x86_64

パッケージ一覧

  • postgresql94-9.4.8-1PGDG.rhel7.x86_64.rpm
  • postgresql94-libs-9.4.8-1PGDG.rhel7.x86_64.rpm
  • postgresql94-server-9.4.8-1PGDG.rhel7.x86_64.rpm

環境構築

インストール

 AWSのEC2インスタンスには初期状態ではPostgreSQLがインストールされていません。 PostgreSQLの公式サイトから最低限必要なパッケージをwgetコマンドでダウンロードしてから、rpmコマンドでインストールします。 もしwgetコマンドがインストールされていない場合は、先にyumコマンドでインストールしてください。

$ sudo su -
Last login: Mon Jul  4 17:21:32 EDT 2016 on pts/1
# cd /media/installer/
# wget http://yum.postgresql.org/9.4/redhat/rhel-7-x86_64/postgresql94-9.4.8-1PGDG.rhel7.x86_64.rpm
--2016-07-07 09:42:51--  http://yum.postgresql.org/9.4/redhat/rhel-7-x86_64/postgresql94-9.4.8-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|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 1087476 (1.0M) [application/x-redhat-package-manager]
Saving to: ‘postgresql94-9.4.8-1PGDG.rhel7.x86_64.rpm’

100%[==================================================================================================>] 1,087,476   2.78MB/s   in 0.4s

2016-07-07 09:42:52 (2.78 MB/s) - ‘postgresql94-9.4.8-1PGDG.rhel7.x86_64.rpm’ saved [1087476/1087476]

# wget http://yum.postgresql.org/9.4/redhat/rhel-7-x86_64/postgresql94-libs-9.4.8-1PGDG.rhel7.x86_64.rpm
--2016-07-07 09:43:19--  http://yum.postgresql.org/9.4/redhat/rhel-7-x86_64/postgresql94-libs-9.4.8-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|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 215152 (210K) [application/x-redhat-package-manager]
Saving to: ‘postgresql94-libs-9.4.8-1PGDG.rhel7.x86_64.rpm’

100%[==================================================================================================>] 215,152      549KB/s   in 0.4s

2016-07-07 09:43:19 (549 KB/s) - ‘postgresql94-libs-9.4.8-1PGDG.rhel7.x86_64.rpm’ saved [215152/215152]

# wget http://yum.postgresql.org/9.4/redhat/rhel-7-x86_64/postgresql94-server-9.4.8-1PGDG.rhel7.x86_64.rpm
--2016-07-07 09:43:41--  http://yum.postgresql.org/9.4/redhat/rhel-7-x86_64/postgresql94-server-9.4.8-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|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 4044904 (3.9M) [application/x-redhat-package-manager]
Saving to: ‘postgresql94-server-9.4.8-1PGDG.rhel7.x86_64.rpm’

100%[==================================================================================================>] 4,044,904   6.47MB/s   in 0.6s

2016-07-07 09:43:42 (6.47 MB/s) - ‘postgresql94-server-9.4.8-1PGDG.rhel7.x86_64.rpm’ saved [4044904/4044904]

# ls -l postgresql*
-rw-r--r--. 1 root root 1087476 May 11 11:39 postgresql94-9.4.8-1PGDG.rhel7.x86_64.rpm
-rw-r--r--. 1 root root  215152 May 11 11:39 postgresql94-libs-9.4.8-1PGDG.rhel7.x86_64.rpm
-rw-r--r--. 1 root root 4044904 May 11 11:39 postgresql94-server-9.4.8-1PGDG.rhel7.x86_64.rpm
# rpm -ihv ./postgresql94-*.rpm
warning: ./postgresql94-9.4.8-1PGDG.rhel7.x86_64.rpm: Header V4 DSA/SHA1 Signature, key ID 442df0f8: NOKEY
Preparing...                          ################################# [100%]
Updating / installing...
   1:postgresql94-libs-9.4.8-1PGDG.rhe################################# [ 33%]
   2:postgresql94-9.4.8-1PGDG.rhel7   ################################# [ 67%]
   3:postgresql94-server-9.4.8-1PGDG.r################################# [100%]

設定

postgresユーザのパスワード設定

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

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

postgresユーザの環境変数設定

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

# grep postgres /etc/passwd
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/9.4/data
export PGDATA
   ↓変更
PGDATA=/data/pgdata1
export PGDATA

※ファイルの末尾に追加※
export PATH=$PATH:/usr/pgsql-9.4/bin

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

 インストールしたRPMパッケージで初期設定されているデータベースクラスタは /var/lib/pgsql/9.4/data/ となっています。 このままでも良いのですが、ディレクトリ階層が深くて分かりづらいため /data/pgdata1/ に変更します。 ディレクトリを作成して必要なパーミッションを設定します。 データベースクラスタ用のディレクトリは管理者ユーザのpostgresユーザのみが参照、更新できるようにします。

# cd /
# chmod 777 data
# su - postgres
Last failed login: Wed Jul  6 17:47:34 EDT 2016 from 114.215.211.176 on ssh:notty
There were 27 failed login attempts since the last successful login.
-bash-4.2$ cd /data/
-bash-4.2$ mkdir -m 700 pgdata1

データベースクラスタ作成

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

-bash-4.2$ initdb --encoding=UTF8 --no-locale --pgdata=/data/pgdata1 --auth=ident
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.

creating 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
creating template1 database in /data/pgdata1/base/1 ... ok
initializing pg_authid ... ok
initializing dependencies ... ok
creating system views ... ok
loading system objects' descriptions ... ok
creating collations ... ok
creating conversions ... ok
creating dictionaries ... ok
setting privileges on built-in objects ... ok
creating information schema ... ok
loading PL/pgSQL server-side language ... ok
vacuuming database template1 ... ok
copying template1 to template0 ... ok
copying template1 to postgres ... ok
syncing data to disk ... ok

Success. You can now start the database server using:

    postgres -D /data/pgdata1
or
    pg_ctl -D /data/pgdata1 -l logfile start

-bash-4.2$

 initdb コマンドの --auth=ident オプションは pg_hba.conf の認証設定初期値を決めるものです。 後続の設定手順で書き換えてしまうため指定してもあまり意味がありません。 ただ、省略した場合は認証方式が trust (認証なし)となっているため、 pg_hba.conf の設定を忘れた場合の保険の意味で指定しています。

リッスンアドレスとログ出力設定の変更

 ここではPostgreSQLインスタンスがリッスンするIPアドレスと ログ出力に関する設定を行います。

 初期設定では localhost(127.0.0.1)のみでリッスンする設定になっています。 そのため、他のサーバからTCP/IP接続することができません。 ローカルからもリモートからもTCP/IP接続できるように、 このサーバが持つ全てのIPアドレスでリッスンする設定とします。 本番運用ではDBに接続できるノードは絞った方が良いですが、 現時点ではインターネット経由でpgAdminIII等で接続することも考慮して 接続元の制限は入れないことにしました。

 ログの出力先は /data/pgdata1/pg_log/ ディレクトリ内とします。 ログファイル名は postgresql-20160708.log のように ログファイルが作成された年月日を付与します。 ログファイルは7日間経過後に自動でローテーションされ、 新しいログファイルに出力が切り替わるようにします。 一定のファイルサイズに達した際にローテーションされる 機能は使用しません。あくまで日数経過後にローテーションします。 ログファイルには標準では発生したイベントの内容のみが記録されます。 ただ、これでは後から見たときに分かりづらいので、 イベントが発生した年月日時分秒とプロセスIDが出力されるように設定します。 ログメッセージの形式は以下のようになります。

【ログメッセージの出力例】
2016-07-07 23:44:27 JST [31478] LOG: shutting down
2016-07-07 23:44:27 JST [31478] LOG: database system is shut down

 あと、利用しているAWSのデータセンタのロケーションの関係で、 タイムゾーンがアメリカ東海岸になっていたので、日本に変更します。

 データベースクラスタ内の 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;

※変更なし※
#------------------------------------------------------------------------------
# ERROR REPORTING AND LOGGING
#------------------------------------------------------------------------------
log_destination = 'stderr'              # Valid values are combinations of
logging_collector = on                  # Enable capturing of stderr and csvlog
log_directory = 'pg_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 >'                      # special values:
   ↓変更
log_line_prefix = '%t [%p] '                    # special values:

log_timezone = 'US/Eastern'
   ↓変更
log_timezone = 'Japan'

スーパーユーザのパスワード設定

 データベースクラスタ作成時点では、スーパーユーザ(データベースユーザ) postgres のパスワードが 設定されていません。一度PostgreSQLのインスタンスを起動してパスワードを設定します。 パスワードを設定する前にクライアント認証を設定すると、ログインできなくなってしまう可能性がありますので要注意です。 パスワード設定後は再度インスタンスを停止します。 以下では postgres ユーザのパスワードを「password」に設定します。

-bash-4.2$ pg_ctl start -w
waiting for server to start....2016-07-07 23:41:31 JST [31475] LOG:  redirecting log output to logging collector process
2016-07-07 23:41:31 JST [31475] HINT:  Future log output will appear in directory "pg_log".
 done
server started
-bash-4.2$ psql -c "alter role postgres with password 'password';"
ALTER ROLE
-bash-4.2$ pg_ctl stop -m fast
waiting for server to shut down.... done
server stopped

クライアント認証の設定

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

  • postgresユーザ(管理者ユーザ)がUNIXドメインソケット接続(ローカル接続)を行った場合は、 パスワードの入力を求めない。
  • postgresユーザ(管理者ユーザ)以外のユーザ(一般ユーザ)がUNIXドメインソケット接続(ローカル接続)を行った場合は、 PostgreSQLユーザ名とパスワードで認証する。パスワードはMD5で暗号化して送信する。
  • ユーザに関係なくTCP/IP接続(リモート接続)を行った場合は、PostgreSQLユーザ名とパスワードで認証する。 パスワードはMD5で暗号化して送信する。
-bash-4.2$ cd /data/pgdata1/
-bash-4.2$ vi pg_hba.conf
ファイル名:/data/pgdata1/pg_hba.conf
# "local" is for Unix domain socket connections only
local   all             all                                     peer
   ↓変更
# "local" is for Unix domain socket connections only
#local   all             all                                     peer ※コメントアウト

# IPv4 local connections:
host    all             all             127.0.0.1/32            ident
   ↓変更
# IPv4 local connections:
#host    all             all             127.0.0.1/32            ident ※コメントアウト

# IPv6 local connections:
host    all             all             ::1/128                 ident
   ↓変更
# IPv6 local connections:
#host    all             all             ::1/128                 ident ※コメントアウト

※ファイルの末尾に追加※
local   all             postgres                                peer
local   all             all                                     md5
host    all             all             0.0.0.0/0               md5

 以上で設定は終了です。

インスタンス起動

 PostgreSQLのインスタンスを起動します。 起動には pg_ctl コマンドを使用します。

■pg_ctl コマンドのオプション
オプション説明
startインスタンスを起動します。
-D <データベースクラスタ>データベースクラスタのディレクトリ名を指定する。省略した場合は $PGDATA 環境変数に設定されているディレクトリが使用される。
-wウェイトオプション。通常起動コマンドを実行すると、コマンドはすぐに正常終了し、起動処理はバックグラウンドで実行されます。このオプションを付けると、インスタンスの起動を待って、起動完了後にコマンドが終了します。
-bash-4.2$ pg_ctl start -w
waiting for server to start....2016-07-07 23:50:22 JST [31518] LOG:  redirecting log output to logging collector process
2016-07-07 23:50:22 JST [31518] HINT:  Future log output will appear in directory "pg_log".
 done
server started

動作テスト

プロセス起動確認

 PostgreSQLのプロセスが起動していることを確認します。 今回の設定ではマスタサーバプロセス1つとワーカプロセス6つが起動します。

-bash-4.2$ ps -ef | grep postgres
(前略)
                                                ↓マスタサーバプロセス(1つ)
postgres 31518     1  0 10:50 pts/1    00:00:00 /usr/pgsql-9.4/bin/postgres
                                                ↓ワーカプロセス(6つ)
postgres 31519 31518  0 10:50 ?        00:00:00 postgres: logger process
postgres 31521 31518  0 10:50 ?        00:00:00 postgres: checkpointer process
postgres 31522 31518  0 10:50 ?        00:00:00 postgres: writer process
postgres 31523 31518  0 10:50 ?        00:00:00 postgres: wal writer process
postgres 31524 31518  0 10:50 ?        00:00:00 postgres: autovacuum launcher process
postgres 31525 31518  0 10:50 ?        00:00:00 postgres: stats collector process
(後略)

ログ出力確認

 設定したログファイルに起動ログが出力されていることを確認します。

-bash-4.2$ cd /data/pgdata1/pg_log/
-bash-4.2$ ls -l
total 4
-rw-------. 1 postgres postgres 1011 Jul  7 10:50 postgresql-20160707.log
-bash-4.2$ cat postgresql-20160707.log
2016-07-07 23:41:31 JST [31477] LOG:  database system was shut down at 2016-07-07 23:18:45 JST
2016-07-07 23:41:31 JST [31477] LOG:  MultiXact member wraparound protections are now enabled
2016-07-07 23:41:31 JST [31475] LOG:  database system is ready to accept connections
2016-07-07 23:41:31 JST [31481] LOG:  autovacuum launcher started
2016-07-07 23:44:27 JST [31475] LOG:  received fast shutdown request
2016-07-07 23:44:27 JST [31475] LOG:  aborting any active transactions
2016-07-07 23:44:27 JST [31481] LOG:  autovacuum launcher shutting down
2016-07-07 23:44:27 JST [31478] LOG:  shutting down
2016-07-07 23:44:27 JST [31478] LOG:  database system is shut down
2016-07-07 23:50:22 JST [31520] LOG:  database system was shut down at 2016-07-07 23:44:27 JST
2016-07-07 23:50:22 JST [31520] LOG:  MultiXact member wraparound protections are now enabled
2016-07-07 23:50:22 JST [31518] LOG:  database system is ready to accept connections
2016-07-07 23:50:22 JST [31524] LOG:  autovacuum launcher started

SQL実行確認

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

-bash-4.2$ psql
psql (9.4.8)
Type "help" for help.

postgres=# select now();
             now
-----------------------------
 2016-07-07 10:52:09.4854-04
(1 row)

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

postgres=# \q
-bash-4.2$

インスタンス再起動

 PostgreSQLインスタンスを再起動します。 pg_ctl コマンド1つで再起動できますが、ここでは確認のため停止・起動に分けて実行します。

-bash-4.2$ pg_ctl stop -m fast
waiting for server to shut down.... done
server stopped
-bash-4.2$ ps -ef | grep postgres ↓PostgreSQLのプロセスが表示されないことを確認
root     31369 31159  0 10:17 pts/1    00:00:00 su - postgres
postgres 31370 31369  0 10:17 pts/1    00:00:00 -bash
postgres 31538 31370  0 10:53 pts/1    00:00:00 ps -ef
postgres 31539 31370  0 10:53 pts/1    00:00:00 grep --color=auto postgres
-bash-4.2$ pg_ctl start -w
waiting for server to start....2016-07-07 23:53:41 JST [31542] LOG:  redirecting log output to logging collector process
2016-07-07 23:53:41 JST [31542] HINT:  Future log output will appear in directory "pg_log".
 done
server started