2012/04/30

Postgres ディスク 負荷分散 テーブルスペース tablespace

ディスクの負荷分散!?

Postgresインストール先・データは/usr/local/pgsql/(/dev/sda)としてHDD2個追加してDBを作ってみる

テーブルスペース用のディスクをフォーマット&マウント

# mke2fs -j /dev/sdb1
# e2label /dev/sdb1 /pgsql1
# mkdir /pgsql1
# mount /dev/sdb1 /pgsql1
 
# mke2fs -j /dev/sdc1
# e2label /dev/sdc1 /pgsql2
# mkdir /pgsql2
# mount /dev/sdc1 /pgsql2
 
# vi /etc/fstab
LABEL=/pgsql1 /pgsql1 ext3 defaults,noatime 1 2
LABEL=/pgsql2 /pgsql2 ext3 defaults,noatime 1 2

テーブルスペース作成

# mkdir /pgsql1/pgdata1
# chown postgres:postgres /pgsql1
# chown postgres:postgres /pgsql1/pgdata1
 
# mkdir /pgsql2/pgdata2
# chown postgres:postgres /pgsql2
# chown postgres:postgres /pgsql2/pgdata2
 
# su - postgres
$ psql -c "\db+" template1 又は↓
$ psql -c "SELECT spcname FROM pg_tablespace;" template1
 
                        List of tablespaces
    Name    |  Owner   | Location | Access privileges | Description 
------------+----------+----------+-------------------+-------------
 pg_default | postgres |          |                   | 
 pg_global  | postgres |          |                   | 
(2 rows)
 
$ psql -c "create tablespace ts_pgdata1 location '/pgsql1/pgdata1';" template1
CREATE TABLESPACE
 
$ psql -c "create tablespace ts_pgdata2 location '/pgsql2/pgdata2';" template1
CREATE TABLESPACE
 
$ psql -c "\db+" template1
 
                            List of tablespaces
    Name    |  Owner   |    Location     | Access privileges | Description 
------------+----------+-----------------+-------------------+-------------
 pg_default | postgres |                 |                   | 
 pg_global  | postgres |                 |                   | 
 ts_pgdata1 | postgres | /pgsql1/pgdata1 |                   | 
 ts_pgdata2 | postgres | /pgsql2/pgdata2 |                   | 
(4 rows)

出来上がった環境

Postgresインストール先 /dev/sda上の/usr/local/pgsql

Postgresデータ /dev/sda上の/usr/local/pgsql/data

テーブルスペース1 /dev/sdb上の/pgsql1/pgdata1

テーブルスペース2 /dev/sdc上の/pgsql2/pgdata2

DB作成

日々更新・参照されるdb(db1+db2+db3...)はts_pgdata1へ

日々更新されるdb1,db2,db3.....とdbのINDEXはts_pgdata2へ

ということをしてみようかと。

# su - postgres
$ createdb db -D ts_pgdata1
$ psql -c "create table table1 ....." db
$ psql -c "create index index1 ..... tablespace ts_pgdata2" db
 
$ createdb db1 -D ts_pgdata2
$ psql -c "create table table1 ....." db1
$ psql -c "create index index1 ....." db1
 
$ createdb db2 -D ts_pgdata2
$ psql -c "create table table1 ....." db2
$ psql -c "create index index1 ....." db2
 
$ createdb db3 -D ts_pgdata2
$ psql -c "create table table1 ....." db3
$ psql -c "create index index1 ....." db3

確認。。。。。

?。。。テーブルとインデックス作成時にテーブルスペースを指定しなかったので現状を確認したいけれど、方法が分からなかったのでpg_adminでプロパティを見てみると意図したとおりに作成されていた。プロパティを持ってるってことはSQLでも確認できそうなので今度Postgresのシステムテーブルを漁ってみることに。。。

PostgresドキュメントのCREATE INDEX欄も見てみると載っていた。。。

>CREATE [ UNIQUE ] INDEX name ON table [ USING method ]

> ( { column | ( expression ) } [ opclass ] [, ...] )

> [ TABLESPACE tablespace ]

> [ WHERE predicate ]

>tablespace

>インデックスを生成するテーブル空間です。 指定されなかった場合、default_tablespaceが使用されます。 もし、default_tablespaceが空文字列であった場合はデータベースのデフォルトのテーブル空間が使用されます。

おまけ

DBダンプを取って見てみると違う環境でDBダンプから再構築したとしてもCREATE文ではエラーが出ないようになっていた。

ただ同じ名前のテーブルスペースがあったとしたら意図しないテーブルスペースを使用する可能性があるので余計な事を考えたくなければ、テーブルスペース名にサーバの名称など一意なものを加えると管理しやすいかも。

SET default_tablespace = '';
...
CREATE TABLE table1 ...;
...
...
SET default_tablespace = ts_pgdata2;
...
CREATE INDEX index1 ...;

0 件のコメント:

コメントを投稿