pgpool-IIはPostgreSQL専用のミドルウェアで,
PostgreSQLのデータベースクライアントとPostgreSQLサーバの間に割り込む形で動作し,
PostgrSQLに以下のような機能を追加します.
・コネクションプーリング::接続を保存し,再利用することで接続オーバヘッドを低減しスループット向上を図る
・負荷分散::多数のリクエストをそれぞれのサーバで分担して負荷を軽減させ,システム全体の性能を向上させることができます
・レプリケーション::物理的に2台以上のディスクにリアルタイムで書き込み処理を行い、万が一どれかのディスクに障害が発生しても運用を継続することができます.
・パラレルクエリ::それぞれのサーバに問い合わせを行い、問い合わせの処理時間を短縮
ここでの環境のポート番号は以下のようにしております
※PORT5439にて接続した場合はPGPOOL経由となりレプリケーションなどが働きます。
PGPOOLはメインDBにインストールしています
—————————————–
アプリ
↓
pgpool(5439)
↓ ↓
メインDB(5432) バックエンドDB(5432)
—————————————–
PGPOOLインストール
事前準備
su -
mkdir /usr/local/pgpool
chown postgres:postgres /usr/local/pgpool
展開&インストール
su postgres
cd /usr/local/src/
% tar zxf pgpool-II-2.1.tar.gz
% cd pgpool-II-2.1
% PATH=/usr/local/pgsql/bin:$PATH
% ./configure --prefix=/usr/local/pgpool
% make
% make install
% ls /usr/local/pgpool/bin/pgpool
pgpool
パスの追加
~/.bashrcにパス追加
vi ~/.bashrc
PATH="$PATH":/usr/local/pgsql/bin:/usr/local/pgpool/bin
source ~/.bashrc
インストールが完了すると設定ファイルの雛形が
作成されるので、これをコピーする。
% cp /usr/local/pgpool/etc/pgpool.conf{.sample,}
% cp /usr/local/pgpool/etc/pcp.conf{.sample,}
% cp /usr/local/pgpool/etc/pool_hba.conf{.sample,}
以上の設定で、/usr/local/pgpool/etc/pgpool.confがpgpool-IIの設定ファイルになる。
PGPOOLの起動
起動するには、
※pgpoolⅡ2.5では/va/run/pgpoolというディレクトリが必要
permission:postgres:postgres
postgres postgres 4096 11月 21 16:05 pgpool
% pgpool -n &c
とコマンドを入力する。
PGPOOLの停止
% pgpool -n stop
PGPOOLの自動起動
pgpoolの起動ですが、
redhat系の場合は自動起動用のスクリプトが
pgpoolのソールディレクトリの
redhat/pgpool.initにあります。
(/usr/local/src/pgpool-II-2.1/redhat/pgpool.init)
スクリプトの最初の方の変数を適宜環境に合せて書き換えて、
vi /usr/local/src/pgpool-II-2.1/redhat/pgpool.init
PGPOOLENGINE=/usr/local/pgpool/bin
PGPOOLDAEMON=$PGPOOLENGINE/pgpool
PGPOOLCONF=/usr/local/pgpool/etc/pgpool.conf
PGPOOLPID=/tmp/pgpool.pid
PGPOOLLOG=/var/log/pgpool.log
/etc/init.d/pgpoolにコピーします。
su -
cp /usr/local/src/pgpool-II-2.1/redhat/pgpool.init /etc/init.d/pgpool
これで
/etc/init.d/pgpool start
で起動できます。
su -
cp /usr/local/src/pgpool-II-2.1/redhat/pgpool.init /etc/init.d/pgpool
vi /etc/init.d/pgpool
chkconfig --add pgpool
chkconfig pgpool on
chkconfig --list pgpool
又は
ntsysv でチェックする
PGPOOLの設定
それでは、実際にレプリケーションを行ってみる。
レプリケーションのために、pgpool.confに以下の項目を追加する。
なお、ここでの例ではPostgreSQLサーバが
localhostの5432ポートで動いているものとする。
vi /usr/local/pgpool/etc/pgpool.conf
# Host name or IP address to listen on: '*' for all, '' for no TCP/IP
# connections
listen_addresses = '*'
# Port number for pgpool
port = 5439
# Port number for pgpool communication manager
pcp_port = 9898
# レプリケーションの設定
# Replication mode
replication_mode = true
# ロードバランスの設定
# Load balancing mode, i.e., all SELECTs are load balanced.
# This is ignored if replication_mode is false.
load_balance_mode = true
#set pgpool2 hostname
pgpool2_hostname = ''
# メインDB
# system DB info
system_db_hostname = 'localhost'
system_db_port = 5432
system_db_dbname = 'pgpool'
system_db_schema = 'pgpool_catalog'
system_db_user = 'pgpool'
system_db_password = ''
# backend_hostname, backend_port, backend_weight
# here are examples
#バックエンド1
backend_hostname0 = 'バックエンドDB1'
backend_port0 = 5432
backend_weight0 = 1
#backend_data_directory0 = '/data'
#バックエンド2
backend_hostname1 = 'バックエンドDB2'
backend_port1 = 5432
backend_weight1 = 1
#backend_data_directory1 = '/data1'
※メインDBのpostgres.confのPortは5432とする
設定ファイルの編集が完了したところでpgpoolを起動し、
レプリケーションされているかどうかを確認する。
まずはpgpool-IIに接続し、データベース、テーブル、データ5件を作成する。
% createdb -p 5439 replication (5439 番ポートへ接続)
% psql -p 5439 replication
replication=# CREATE TABLE rep (a INT);
replication=# INSERT INTO rep SELECT generate_series(1, 10);
次に直接メインDBとバックエンドDBに5432ポートに接続し、実際にデータが5件作成されているかどうかを確認する。
メインDB
% for p in 5432 ; do
for> echo port: $p
for> psql -p $p -c 'select count(*) from rep' replication
for> done
port: 5432
count
-------
5
(1 row)
バックエンドDB
port: 5432
count
-------
5
(1 row)
PGPOOLのステータス確認
psql -p 5439 replication
show pool_status;