pgpool-IIで負荷分散めも その1

PostgreSQLのツール、pgpool-IIで負荷分散するメモの1

pgpool-IIとは

詳しくは↓をみれば事足りる
http://pgpool.projects.postgresql.org/pgpool-II/doc/pgpool-ja.html

プロジェクトホーム
http://pgfoundry.org/projects/pgpool/


pgpool-IIはPostgreSQL専用のミドルウェアで、Potgresqlと同等のインタフェースを実装しています。そのため、PostgreSQLを利用しているサービスはコードを変更すること無く、pgpool-IIを利用する事ができます。
以下主な機能について、ユーザマニュアルのコピペ。

  • コネクションプーリング

PostgreSQLへの接続を保存しておき、再利用することによってPostgreSQLへの接続オーバヘッドを低減し、システム全体のスループットを向上することができます。

pgpool-IIは複数のPostgreSQLサーバを管理することができます。レプリケーション機能を使用することにより、物理的に2台以上のDB サーバにリアルタイムでデータを保存することができ、万が一どれかのDBサーバに障害が発生しても運用を継続することができます。

  • 負荷分散

レプリケーションまたマスタースレーブモードで運用している場合、どのサーバに問い合わせても同じ結果が返ってきます。多数の検索リクエストをそれぞれのサーバで分担して負荷を軽減させ、システム全体の性能を向上させることができます。最良の場合にはサーバ台数に比例した性能向上が見込めます。特に多数のユーザが大量の問い合わせを投げるような環境で威力を発揮します。

  • 接続数の制限

PostgreSQLに接続可能なセッション数には上限があり、それを超えて接続することはできません。かと言って、同時セッション数をむやみに多くすると、メモリーなどのリソースが多く消費されてパフォーマンスに影響があります。pgpool-IIでもクライアントからの接続数には上限がありますが、それを超えてもただちにエラーになることはなく、一定の間待たされるようになっています。したがって、pgpool-IIはPostgreSQLへの接続要求を実質的にキューイングし、PostgreSQLへの過大な接続数を制限することが可能です。

  • パラレルクエリ

複数のサーバにデータを分割して受け持たせ、それぞれのサーバに同時に検索問い合わせを投げて、問い合わせの処理時間を短縮するパラレルクエリが利用できます。特に大規模なデータベースに対して検索を実行するときに威力を発揮します。


ここでは、コネクションプーリングと負荷分散の機能を用いた構成を構築します。

インストール

Postgresqlインストール

http://www.postgresql.org/

# make
cd /usr/local/src
wget http://wwwmaster.postgresql.org/download/mirrors-ftp/source/v9.0.3/postgresql-9.0.3.tar.bz2
tar jxf postgresql-9.0.3.tar.bz2
cd postgresql-9.0.3
./configure --enable-thread-safety
make

# install
su -
cd /usr/local/src/postgresql-9.0.3
make install
exit

# パス設定
cat >> ~/.bashrc
PG=/usr/local/pgsql
export PATH=$PATH:$PG/bin
export MANPATH="$MANPATH":$PG/man
export PGLIB=$PG/lib
export PGDATA=$PG/data
pgpool-IIインストール

http://pgfoundry.org/projects/pgpool/
pgpool-IIのダウンロードのほうです。(pgpoolではなく・・・)

インストールや設定の詳細は、ダウンロードしたpgpool-II-3.0.3.tar.gzを解凍したディレクトリのdoc配下にまとまっています。

  • インストール
cd /usr/local/src
wget http://pgfoundry.org/frs/download.php/2958/pgpool-II-3.0.3.tar.gz
tar zxf pgpool-II-3.0.3.tar.gz
cd /usr/local/src/pgpool-II-3.0.3
./configure --prefix=/usr/local/pgpool
make

su -
cd /usr/local/src/pgpool-II-3.0.3
./configure --prefix=/usr/local/pgpool
make install
exit

権限は適切なものにしてください。

mkdir /var/run/pgpool
cd /usr/local/pgpool
mkdir ./log
cd ./etc
cp pgpool.conf.sample pgpool.conf
cp pool_hba.conf.sample pool_hba.conf
cp pcp.conf.sample pcp.conf

pgpool-IIでの負荷分散構成構築

構成図

  • 概要

マスタDBとスレーブDBの同期はSlonyやストリーミングレプリケーションで行います。このまま運用する場合、スレーブDB側では参照クエリしか実行できないため、プログラム側で振り分ける必要が出てきてしまいます。
Pgpool-IIには更新やトランザクションクエリをマスタ側に、参照クエリをスレーブ側に振り分けてくれるマスタースレーブモードがありますので、それを利用して振り分けを行います。また、複数のスレーブDBを効率よく利用するため、あわせてロードバランスモードも使用します。

  • PostgresqlDBサーバ

192.168.0.100,192.168.0.101,192.168.0.102
Slonyやストリーミングレプリケーションでマスタースレーブ構成になっているとします。
(レプリケーション環境構築はコチラなどを参考にしてください。)

  • Pgpool-II

マスタースレーブモード、ロードバランスモードで実行。
マスタースレーブモード・・・マスタ側に更新やトランザクションクエリ、スレーブ側に参照クエリを実行する。
ロードバランスモード・・・SELECT文を複数のデータベースに対して振り分け、負荷分散を行う。

PostgreSQLの起動
# 192.168.100,101,102で
cd /usr/local/pgsql/bin
pg_ctl start
pgpool設定

pgpool設定を行います。/usr/local/pgpool/etcで作業を行います。

vi pgpool.conf

listen_addresses = '*' # 受付IPアドレス
port = 5432 # db接続受付ポート
pcp_port = 9898 # pcp(管理)受付ポート
connection_life_time = 60
child_max_connections = 300
logdir = '/usr/local/pgpool/log'
load_balance_mode = true # ロードバランスモード
master_slave_mode = true # マスタスレーブモード
health_check_period = 60
health_check_user = 'test'
insert_lock = false
log_statement = true  # ログ出力
log_per_node_statement = true
log_connections = true
log_hostname = true

# Master
backend_hostname0 = '192.168.0.100'
backend_port0 = 5432
backend_weight0 = 0

# Slave-1
backend_hostname1 = '192.168.0.101'
backend_port1 = 5432
backend_weight1 = 1

# Slave-2
backend_hostname2 = '192.168.0.102'
backend_port2 = 5432
backend_weight2 = 1

# 接続許可設定pool_hba.confを使用する
enable_pool_hba = true


vi pool_hba.conf

host    all         all         192.168.0.0/24        trust


vi pcp.conf

usser:"pg_md5コマンドでの返り値"


その他

# 使わないけど、警告ログが出るのでファイルだけ作成
touch pool_passwd

#パス設定
cat >> ~/bashrc
PGPOOL=/usr/local/pgpool
export PATH=$PATH:$PGPOOL/bin
export MANPATH="$MANPATH":$PGPOOL/man


pgpoolの管理スキーマはここでは、使用しないのでインストールしません。

Pgpool-II起動
# 起動
/usr/local/pgpool/bin/pgpool -f /usr/local/pgpool/etc/pgpool.conf -a /usr/local/pgpool/etc/pool_hba.conf -F /usr/local/pgpool/etc/pcp.conf

# 起動確認
ps aux|grep pgpool
psql -p 5433 -c'show pool_status;'
psql -p 5433 -c'show pool_nodes;'
psql -p 5433 -c'show pool_processes;'
psql -p 5433 -c'show pool_pools;'
psql -p 5433 -c'show pool_version;'


ここまでで、pgpoolによる負荷分散構成で起動しているとおもいます。