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インストール
# 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文を複数のデータベースに対して振り分け、負荷分散を行う。
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による負荷分散構成で起動しているとおもいます。