postgreSQLアーキテクチャ メモ

Facebook にシェア
このエントリーをはてなブックマークに追加
[`livedoor` not found]
Delicious にシェア

最近、初めてpostgreSQLをさわったので、アーキテクチャなど少し調べました。

postgreSQLとその他のDBMSとの大きな違いは追記型である点です。
updateを行う際に、オリジナル行に対して更新をするのではなく、
新規行をinsertとオリジナル行に無効化フラグを付加します。
よって、データベース内には複数versionのデータを保持することになります。
この機能をMVCC(Multi Version Concurrency Control)と呼ばれています。
更新トランザクションが発生する毎にレコードのversionが増える為、大量トランザクション発生するシステムの場合、
データ量が膨大になります。
そこで、vacuum機能で、無効化フラグのついたレコードをお掃除します。

vacuumには以下の2種類があります。

  1. concurrent vacuum
  2. 無効化フラグが付加されたレコードを再利用可能とする。排他ロックは行われない。

  3. vacuum full
  4. 従来からあるvacuumで排他ロックが発生する。
     → 定期的にサービス停止が必要

以下はメモです。
■ postgreSQL起動
起動は$pg_ctl start で行います。 (停止、再起動はそれぞれstop, restart)

[postgres@hoge data]$ pg_ctl -w start
waiting for postmaster to start....LOG:  database system was shut down at 2011-06-22 13:36:38 JST
LOG:  checkpoint record is at 0/ACB3E0
LOG:  redo record is at 0/ACB3E0; undo record is at 0/0; shutdown TRUE
LOG:  next transaction ID: 576; next OID: 17231
LOG:  database system is ready
 done
postmaster started

起動後、プロセスを確認します。

[postgres@hoge data]$ ps aux | grep postgres
postgres 26561  0.0  0.0  92552   360 ?        S    12:26   0:00 /usr/local/pgsql/bin/postmaster
postgres 26563  0.0  0.0  92552   340 ?        S    12:26   0:00 postgres: writer process
postgres 26564  0.0  0.0  82820   180 ?        S    12:26   0:00 postgres: stats buffer process
postgres 26565  0.0  0.0  81948   188 ?        S    12:26   0:00 postgres: stats collector process

■ 設定ファイル
MySQLで言うmy.confに相当する設定ファイルとして、postgres.confがあります。
私の場合は /usr/local/data/postgres.conf にあります。(以下、$PGDATA)

[postgres@hoge data]$ ls -al
合計 64
drwx------ 8 postgres postgres  4096  6月 22 12:26 .
drwxr-xr-x 9 postgres root      4096  6月 21 13:19 ..
-rw------- 1 postgres postgres     4  6月 21 13:19 PG_VERSION
drwx------ 5 postgres postgres  4096  6月 21 13:21 base
drwx------ 2 postgres postgres  4096  6月 22 12:26 global
drwx------ 2 postgres postgres  4096  6月 21 13:19 pg_clog
-rw------- 1 postgres postgres  3406  6月 21 13:19 pg_hba.conf
-rw------- 1 postgres postgres  1460  6月 21 13:19 pg_ident.conf
drwx------ 2 postgres postgres  4096  6月 21 13:19 pg_subtrans
drwx------ 2 postgres postgres  4096  6月 21 13:19 pg_tblspc
drwx------ 3 postgres postgres  4096  6月 21 13:19 pg_xlog
-rw------- 1 postgres postgres 11030  6月 22 12:23 postgresql.conf
-rw------- 1 postgres postgres    30  6月 22 12:26 postmaster.opts
-rw------- 1 postgres postgres    48  6月 22 12:26 postmaster.pid

■ プロセスファイル
postgreSQLを起動すると、$PGDATA/postmaster.pidが生成されます。
pidファイルの中身は以下のようになっています。

26561
/usr/local/pgsql/data
  5432001   2326529

1行目:”26561″はプロセスID
2行目:postgreSQLのDATA格納ディレクトリ
3行目:port番号 (後ろのほうは分からなかった)

■ リスナー
postgreSQLを起動すると、フロントエンドとバックエンド間の通信を行う為のリスナーが生成されます。
リスナーは /tmp/.s.PGSQL.5432 になります。

[postgres@hoge data]$ ls -al /tmp/.s.PGSQL.5432*
srwxrwxrwx 1 postgres postgres  0  6月 22 13:36 /tmp/.s.PGSQL.5432
-rw------- 1 postgres postgres 28  6月 22 13:36 /tmp/.s.PGSQL.5432.lock

“5432”はport番号で、postgreSQLのデフォルトportは5432となります。
変更したい場合はpostgres.confで変更すればOKです。(標準ではコメントアウトされている)

■ template database
コンソールから$psql -l を実行すると、作成されているデータベースが確認出来ます。

[postgres@hoge data]$ psql -l
        List of databases
    Name    |  Owner   | Encoding
------------+----------+----------
 shmachidDB | postgres | UNICODE
 template0  | postgres | UNICODE
 template1  | postgres | UNICODE
(3 rows)

template0, template1というデータベースは、標準機能として提供しているデータベースで、
ユーザが新規データベースを作成する際に内部でコピーするテンプレートデータベースとなります。
データベースの実体は、$PGDATA/base以下にあり、ファイル名は数値となります。

[postgres@hoge base]$ ls -al
合計 20
drwx------ 5 postgres postgres 4096  6月 21 13:21 .
drwx------ 8 postgres postgres 4096  6月 22 13:36 ..
drwx------ 2 postgres postgres 4096  6月 21 13:19 1
drwx------ 2 postgres postgres 4096  6月 21 13:19 17229
drwx------ 2 postgres postgres 4096  6月 21 13:21 17230

■ 複数起動
既にpostgreSQLが起動している状況で、もう1つpostgreSQLを立ち上げてみます。

[postgres@hoge base]$ pg_ctl start
pg_ctl: another postmaster may be running; trying to start postmaster anyway
FATAL:  lock file "/usr/local/pgsql/data/postmaster.pid" already exists
HINT:  Is another postmaster (PID 26808) running in data directory "/usr/local/pgsql/data"?
pg_ctl: could not start postmaster
Examine the log output.

既に$PGDATA/postmaster.pidが存在する為、怒られます。
そこで、postmaster.pidを別名に変更して、再度起動します。

[postgres@hoge data]$ pg_ctl start
postmaster starting
[postgres@hoge data]$ LOG:  could not bind IPv4 socket: Address already in use
HINT:  Is another postmaster already running on port 5432? If not, wait a few seconds and retry.
WARNING:  could not create listen socket for "localhost"
FATAL:  lock file "/tmp/.s.PGSQL.5432.lock" already exists
HINT:  Is another postmaster (PID 26808) using socket file "/tmp/.s.PGSQL.5432"?

今度はリスナーがあると怒られます。
では、次にpostgresql.confでport番号を別指定(今回は11111にします)し、再度起動します。(portは1…65535)

[postgres@hoge data]$ pg_ctl start
postmaster starting
[postgres@hoge data]$ LOG:  database system was interrupted at 2011-06-22 13:36:47 JST
LOG:  checkpoint record is at 0/ACB3E0
LOG:  redo record is at 0/ACB3E0; undo record is at 0/0; shutdown TRUE
LOG:  next transaction ID: 576; next OID: 17231
LOG:  database system was not properly shut down; automatic recovery in progress
LOG:  record with zero length at 0/ACB428
LOG:  redo is not required
LOG:  database system is ready

立ち上がりましたので、リスナーとプロセスを確認します。

[postgres@hoge data]$ ls -al /tmp/.s.PGSQL.*
srwxrwxrwx 1 postgres postgres  0  6月 22 13:51 /tmp/.s.PGSQL.11111
-rw------- 1 postgres postgres 28  6月 22 13:51 /tmp/.s.PGSQL.11111.lock
srwxrwxrwx 1 postgres postgres  0  6月 22 13:47 /tmp/.s.PGSQL.5432
-rw------- 1 postgres postgres 28  6月 22 13:47 /tmp/.s.PGSQL.5432.lock
[postgres@hoge data]$ ps aux | grep postgres
postgres 26808  0.0  0.2  92552  1320 pts/0    S    13:36   0:00 /usr/local/pgsql/bin/postmaster
postgres 26810  0.0  0.1  92552   632 pts/0    S    13:36   0:00 postgres: writer process
postgres 26811  0.0  0.0  82820   396 pts/0    S    13:36   0:00 postgres: stats buffer process
postgres 26812  0.0  0.0  81948   452 pts/0    S    13:36   0:00 postgres: stats collector process
postgres 26863  0.0  0.6  92552  3132 pts/0    S    13:51   0:00 /usr/local/pgsql/bin/postmaster
postgres 26865  0.0  0.1  92552   992 pts/0    S    13:51   0:00 postgres: writer process
postgres 26866  0.0  0.1  82820   704 pts/0    S    13:51   0:00 postgres: stats buffer process
postgres 26867  0.0  0.1  81948   832 pts/0    S    13:51   0:00 postgres: stats collector process

2つのport分(5432, 11111)のリスナーが生成されています。
プロセスも2つ分起動しています。

よって、今回は最初に起動していたpostmaster.pidを別名にしていますので、2つ立ち上がった事になりませんが、
$PGDATAを複数用意して、別portで起動すれば複数起動することが出来ると思われます。

あと今回はゴミプロセスが残っていますので、killしてください。