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

作成日: 2014/06/08
更新日: 2016/07/04

OSSでLinuxサーバ構築

PostgreSQL 9.3をPidora 2014へインストールして初期設定

トップページOSSでLinuxサーバ構築 > PostgreSQL 9.3をPidora 2014へインストールして初期設定
このエントリーをはてなブックマークに追加

概要

 Raspberry PiにPidora 2014をインストールしました。 サーバとしてどの程度使い物になるのか調べるべく、 PostgreSQLをインストールしてDBサーバとして使ってみることにしました。

 Pidora 2014はインストールDVDなどないので、 インターネットに接続してyumでPostgreSQLのインストールを行いました。

構成

サーバ構成

OSバージョン

Pidora 2014

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

postgresql-libs-9.3.4-1.fc20.armv6hl.rpm
postgresql-9.3.4-1.fc20.armv6hl.rpm
postgresql-server-9.3.4-1.fc20.armv6hl.rpm

サーバ構築

インストール

 事前にPidora 2014をインストールし、ネットワークの設定(IPアドレスやデフォルトゲートウェイ、DNSサーバなど)を 行っておいてください。その前提でyumによるインストールを行います。 インストールするパッケージとしては『postgresql-server』を指定しておけば、依存関係で必要な postgresql パッケージと postgresql-libs パッケージも一緒にインストールされます。

# yum install postgresql-server
Loaded plugins: langpacks, refresh-packagekit
Resolving Dependencies
--> Running transaction check
---> Package postgresql-server.armv6hl 0:9.3.4-1.fc20 will be installed
--> Processing Dependency: postgresql-libs(armv6hl-32) = 9.3.4-1.fc20 for package: postgresql-server-9.3.4-1.fc20.armv6hl
--> Processing Dependency: postgresql(armv6hl-32) = 9.3.4-1.fc20 for package: postgresql-server-9.3.4-1.fc20.armv6hl
--> Processing Dependency: libpq.so.5 for package: postgresql-server-9.3.4-1.fc20.armv6hl
--> Running transaction check
---> Package postgresql.armv6hl 0:9.3.4-1.fc20 will be installed
---> Package postgresql-libs.armv6hl 0:9.3.4-1.fc20 will be installed
--> Finished Dependency Resolution

Dependencies Resolved

====================================================================================================
 Package                    Arch             Version                  Repository               Size
====================================================================================================
Installing:
 postgresql-server          armv6hl          9.3.4-1.fc20             pidora-updates          3.4 M
Installing for dependencies:
 postgresql                 armv6hl          9.3.4-1.fc20             pidora-updates          3.0 M
 postgresql-libs            armv6hl          9.3.4-1.fc20             pidora-updates          202 k

Transaction Summary
====================================================================================================
Install  1 Package (+2 Dependent packages)

Total download size: 6.7 M
Installed size: 32 M
Is this ok [y/d/N]: y ←yを入力
Downloading packages:
(1/3): postgresql-libs-9.3.4-1.fc20.armv6hl.rpm                              | 202 kB  00:00:03
(2/3): postgresql-9.3.4-1.fc20.armv6hl.rpm                                   | 3.0 MB  00:00:05
(3/3): postgresql-server-9.3.4-1.fc20.armv6hl.rpm                            | 3.4 MB  00:00:02
----------------------------------------------------------------------------------------------------
Total                                                               1.0 MB/s | 6.7 MB  00:00:06
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  Installing : postgresql-libs-9.3.4-1.fc20.armv6hl                                             1/3
  Installing : postgresql-9.3.4-1.fc20.armv6hl                                                  2/3
  Installing : postgresql-server-9.3.4-1.fc20.armv6hl                                           3/3
  Verifying  : postgresql-server-9.3.4-1.fc20.armv6hl                                           1/3
  Verifying  : postgresql-libs-9.3.4-1.fc20.armv6hl                                             2/3
  Verifying  : postgresql-9.3.4-1.fc20.armv6hl                                                  3/3

Installed:
  postgresql-server.armv6hl 0:9.3.4-1.fc20

Dependency Installed:
  postgresql.armv6hl 0:9.3.4-1.fc20              postgresql-libs.armv6hl 0:9.3.4-1.fc20

Complete!

 以上でインストールは完了です。

設定

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

 環境変数としてPostgreSQLのデータベースクラスタ($PGDATA)を設定します。 postgresユーザのホームディレクトリにある『.bash_profile』には始めから PGDATA環境変数が設定されていますが、異なるパス(/data/pgdata1)にデータベースクラスタを 作成しますので、それに合わせて変更します。

-bash-4.2$ cd ~/
-bash-4.2$ pwd
/var/lib/pgsql
-bash-4.2$ vi .bash_profile
ファイル名:/var/lib/pgsql/.bash_profile
※以下、該当箇所のみ変更※
PGDATA=/var/lib/pgsql/data
   ↓変更
PGDATA=/data/pgdata1

 .bash_profile を変更して保存したら、読み込んで反映させます。 その後 $PGDATA 環境変数が反映されていることを確認します。

-bash-4.2$ . .bash_profile
-bash-4.2$ echo $PGDATA
/data/pgdata1

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

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

# cd /
# mkdir -m 777 /data
# ls -ld /data
drwxrwxrwx 2 root root 4096 Jun  7 12:20 /data
# su - postgres
-bash-4.2$ cd /data/
-bash-4.2$ mkdir -m 700 pgdata1
-bash-4.2$ ls -ld pgdata1
drwx------ 2 postgres postgres 4096 Jun  7 12:21 pgdata1

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

 指定したデータベースクラスタ用ディレクトリ内にデータベースクラスタを作成します。 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.

fixing permissions on existing directory /data/pgdata1 ... ok
creating subdirectories ... ok
selecting default max_connections ... 100
selecting default shared_buffers ... 128MB
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$

(4) ログ出力設定の変更

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

【ログメッセージの出力例】
2014-06-07 12:56:36 JST [5397] LOG: autovacuum launcher started 2014-06-07 12:56:36 JST [5390] LOG: database system is ready to accept connections

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

-bash-4.2$ cd /data/pgdata1/
-bash-4.2$ vi postgresql.conf
ファイル名:/data/pgdata1/postgresql.conf
#log_destination = 'stderr'           # Valid values are combinations of
   ↓変更
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_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_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 = ''                 # special values:
   ↓変更
log_line_prefix = '%t [%p] '          # special values:

※変更なし※
log_timezone = 'Japan'

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

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

-bash-4.2$ pg_ctl start -D /data/pgdata1 -w
waiting for server to start....2014-06-07 12:46:27 JST [5328] LOG:  redirecting log output to loggin g collector process
2014-06-07 12:46:27 JST [5328] HINT:  Future log output will appear in directory "pg_log".
. done
server started
-bash-4.2$ psql
psql (9.3.4)
Type "help" for help.

postgres=# alter role postgres with password 'postgres';
ALTER ROLE
postgres=# \q
-bash-4.2$ pg_ctl stop -D /data/pgdata1 -m fast
waiting for server to shut down..... done
server stopped

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

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

  • postgresユーザ(管理者ユーザ)がUNIXドメインソケット接続(ローカル接続)を行った場合は、 パスワードの入力を求めない。
  • postgresユーザ(管理者ユーザ)以外のユーザ(一般ユーザ)がUNIXドメインソケット接続(ローカル接続)を行った場合は、 PostgreSQLユーザ名とパスワードで認証する。パスワードはMD5で暗号化して送信する。
  • ユーザに関係なくTCP/IP接続(リモート接続)を行った場合は、PostgreSQLユーザ名とパスワードで認証する。 PostgreSQLが稼働するサーバと同一のネットワークセグメント(192.168.0.0/24)からの接続のみ許可する。 パスワードはMD5で暗号化して送信する。

-bash-4.2$ vi pg_hba.conf
ファイル名:/data/pgdata1/pg_hba.conf
※以下、該当箇所のみ変更※
local   all             all                                     peer
   ↓変更
#local   all             all                                     peer ←コメントアウト

host    all             all             127.0.0.1/32            ident
   ↓変更
#host    all             all             127.0.0.1/32            ident ←コメントアウト

host    all             all             ::1/128                 ident
   ↓変更
#host    all             all             ::1/128                 ident ←コメントアウト

※ファイルの末尾に追加※

local   all             postgres                                ident
local   all             all                                     md5
host    all             all             192.168.0.0/24          md5

(7) インスタンス起動

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

-bash-4.2$ pg_ctl start -w
waiting for server to start....2014-06-07 12:56:35 JST [5390] LOG:  redirecting log output to logging collector process
2014-06-07 12:56:35 JST [5390] HINT:  Future log output will appear in directory "pg_log".
. done
server started

動作テスト

プロセス起動確認

 PostgreSQLのプロセスが起動していることを確認します。 今回の設定ではマスタサーバプロセス1つとワーカプロセス6つが起動しています。 なお、バージョン9.0の時と比較して、新たに checkpointer process が追加となっています。

-bash-4.2$ ps -ef | grep postgres
                        ↓マスタサーバプロセス(1つ)
postgres  5390     1  0 Jun07 ?        00:00:01 /usr/bin/postgres
                        ↓ワーカプロセス(6つ)
postgres  5391  5390  0 Jun07 ?        00:00:00 postgres: logger process
postgres  5394  5390  0 Jun07 ?        00:00:00 postgres: checkpointer process
postgres  5395  5390  0 Jun07 ?        00:00:00 postgres: writer process
postgres  5396  5390  0 Jun07 ?        00:00:00 postgres: wal writer process
postgres  5397  5390  0 Jun07 ?        00:00:01 postgres: autovacuum launcher process
postgres  5398  5390  0 Jun07 ?        00:00:04 postgres: stats collector process
(後略)

ログ出力確認

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

-bash-4.2$ tail /data/pgdata1/pg_log/postgresql-20140607.log
(前略)
2014-06-07 12:56:36 JST [5397] LOG:  autovacuum launcher started
2014-06-07 12:56:36 JST [5390] LOG:  database system is ready to accept connections

SQL実行確認

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

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

postgres=# select now();
              now
-------------------------------
 2014-06-08 02:35:35.098243+09
(1 row)

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

postgres=# \q
-bash-4.2$

インスタンス停止・起動

 PostgreSQLインスタンスの停止、起動ができることを確認します。

-bash-4.2$ pg_ctl stop -m fast
waiting for server to shut down.... done
server stopped
-bash-4.2$ pg_ctl start -w
waiting for server to start....2014-06-08 03:08:32 JST [6579] LOG:  redirecting log output to logging collector process
2014-06-08 03:08:32 JST [6579] HINT:  Future log output will appear in directory "pg_log".
 done
server started
-bash-4.2$

プロフィール

らのっち

損害保険会社のIT企画部に勤務するSEです。OSSを勉強中です。

<所属>
日本PostgreSQLユーザ会とくしまOSS普及協議会


第000414号