geek.conf.2

あるエンジニアの備忘録

pgpool-IIをインストールしよっか、そして設定もしようよ

pgpool-IIとは・・・
postgreSQLの高速化と高信頼化を目的としたミドルウェアである。pgpool-IIは、クライアントとpostgreSQLの間に入る形(プロキシ形式)で動作する。なお、データベースクライアントはpostgreSQLサーバへ接続するのではなく、 pgpool-IIへ接続することになる。

簡単に言えばpostgreSQLプロキシクライアントツールで、postgreSQLの間に立って効率的に接続させることを可能にするツールなんですね。

今回、私が導入しましたモードはマスター/スレーブモードでサブモードはslonyです。
導入の一番の目的は、ずばりfailover_commandです。

マスター/スレーブとして動作する複数台のpostgreSQLサーバの代表として、クライアントにpgpool-IIを通過させ、マスターpostgreSQLサーバが倒れれば、切り離し、正常に動くスレーブpostgreSQLサーバにのみ接続させてやると、そんな風に動作させたく思う次第でございます。

pgpool-IIの機能、failover_commandとは上記の切り離し時に、コマンドを実行してくれるといったものです。
例えば、マスター/スレーブpostgreSQLサーバ間を常時、slony-IによってDBレプリケーションしているとして、上記切り離しが起こった場合、正常に動くスレーブpostgreSQLサーバにpgpool-IIがクライアントを繋げてもslony-Iの中でもマスター/スレーブを切り替えなければDBに書き込み出来ません。

そこでfailover_commandを使用して

pgpool-IIがマスターpostgreSQLサーバの障害を検知→
pgpool-IIがマスターpostgreSQLサーバを切り離し、スレーブpostgreSQLサーバにクライアント接続を切り替え→
と同時にfailover_commandによってslony-Iのマスター/スレーブを切り替え→幸

を実現します。

それでは私が行ったインストール手順をば

*OSはRHEL 5っす

・ユーザ設定
pgpool-II用にユーザを作成します。このユーザはpgpool-IIがDBに接続する際に使用するユーザです。
ユーザ名は適宜で。

# su - pgpool2
$ vi .bashrc
→ 以下の設定を追記
PGPOOL2_HOME="/usr/local/pgpool2"
export PATH=$PGPOOL2_HOME/bin:"$PATH"

・インストール
ソースからコンパイルします。
configure optionはprefix=インストールディレクトリのみです。


# tar zxvf pgpool-II-3.0.tar.gz
# cd pgpool-II-3.0
# ./configure --prefix=/usr/local/pgpool2
# make
# make install
# chown -R pgpool2:pgpool2 /usr/local/pgpool2

自動起動の設定
# cp -p /usr/local/src/pgpool-II-3.0/redhat/pgpool.init /etc/init.d/pgpool2
/usr/local/src/pgpool-II-3.0/redhat/pgpool.initを使用します。
以下のように編集します。

# vi /etc/init.d/pgpool2

-------------------------起動スクリプト編集ここから-----------------------------

#postgresユーザの箇所をpgpool2ユーザに編集する。
#今回、pgpool2ユーザをpgpool-IIの起動ユーザにしますよ。

PGPOOLENGINE=/usr/local/pgpool2/bin
PGPOOLDAEMON=$PGPOOLENGINE/pgpool
PGPOOLCONF=/usr/local/pgpool2/etc/pgpool.conf
PGPOOLPIDDIR=/var/run/pgpool2
PGPOOLLOG=/var/log/pgpool2/pgpool.log


#起動オプションに-Dを付けて以前のノードステータスをクリアして起動するようにする。
#pgpool-IIは停止するとlogdir/pool_statusにpostgreSQLサーバのステータスを記録しておきますが、pgpool-II起動後にこのpool_statusをクリアするよう-Dオプションを起動オプションに付与します。

$SU -l pgsql8 -c "$PGPOOLDAEMON -D -n -f $PGPOOLCONF $OPTS & " >> "$PGPOOLLOG" 2>&1 < /dev/null -n
#を追記してログ出力させる。

killproc /usr/local/pgpool2/bin/pgpool
#に編集する。

-------------------------起動スクリプト編集ここまで-----------------------------

所有者/所有グループ変更やサービス登録などやっちゃおう。
# chown root:root /etc/init.d/pgpool2
# chkconfig --add pgpool2
# chkconfig pgpool2 on
# mkdir /var/log/pgpool2
# chown pgpool2:pgpool2 /var/log/pgpool2
# mkdir /var/run/pgpool2
# chown pgpool2:pgpool2 /var/run/pgpool2



次にpgpool-IIの設定を行います。
・pgpool-II設定(pgpool.conf)
pgpool-IIの設定ファイルをサンプルから作成し設定を行います。
今回、pgpool-IIをマスター/スレーブ(サブ:slony)モードで動作させます。

# cd /usr/local/pgpool2/etc
# cp -p pgpool.conf.sample-master-slave pgpool.conf
# vi /usr/local/pgpool2/etc/pgpool.conf
→ 以下に変更パラメータを纏める

-------------------------pgpool.conf編集ここから-----------------------------

#LISTENするインターフェース
listen_addresses‘*’

#使用ポート
port 5432

#preforkするサーバプロセス数、クライアントがpgpool-IIに接続できる最大数
#基本的にmax_pool×num_init_childrenがpostgreSQLに接続できる最大数となります
num_init_children 50

#コネクションプール中のコネクション有効期間(秒)
connection_life_time 300

#ログディレクトリ
logdir '/var/log/pgpool2'

#pidファイル
pid_file_name '/var/run/pgpool2'

#レプリケーションモードまたはマスタースレーブモードの際に、SELECT文をロードバランスする
load_balance_mode = true

#マスター/スレーブモードで動作させる。master_slave_sub_modeはslony
master_slave_mode = true

#レプリケーションに遅延があった場合にログ出力する
#今回、master_slave_sub_modeはstreamではないため意味なし
log_standby_delay = 'always'

#ヘルスチェックが実施できない場合のタイムアウト
#0の場合タイムアウト値はOSのTCP/IPタイムアウトに依存する
#詳細にはkernelパラメータ/proc/sys/net/ipv4/tcp_retries1,tcp_retries2に依存する?????????
health_check_timeout = 0

#ヘルスチェック実施の間隔
#0の場合ヘルスチェックを行わない
#ヘルスチェックを行わない場合でもfail_over_on_backend_errorをtrueにすればフェールオーバする???????
health_check_period = 5

#ヘルスチェック実施ユーザ
health_check_user = pgpool2

#フェールオーバ時に実施するコマンド
#シェルスクリプト実行にしとけばいいじゃん?
failover_command = '/home/pgpool2/failover.sh'

#master_slave_sub_mode = streamのときtrueなお話
insert_lock = false

#postgreSQLサーバ = バックエンド情報
#↓ホスト名だがIPアドレスがいいよね
backend_hostname0 = 'primsrv'
backend_port0 = 5432
backend_weight0 = 1
backend_data_directory0 = '/usr/local/pgsql/data'
#↓ホスト名だがIPアドレスがいいよね
backend_hostname1 = 'scdsrv'
backend_port1 = 5432
backend_weight1 = 1
backend_data_directory1 = '/usr/local/pgsql/data'

#上記変更箇所はpgpool.conf.sampleからの変更箇所となります。

-------------------------pgpool.conf編集ここまで-----------------------------

# /etc/init.d/pgpool2 restart

・pgpool-II設定(pcp.conf)
pgpool-IIはpcpコマンドというツールを使用してpostgreSQLに接続し、pool情報を取得します。
pgpoolへの認証アカウントを設定します。これもサンプルを使用して・・・
# cd /usr/local/pgpool2/etc
# cp -p pcp.conf.sample pcp.conf
# su - pgpool2
pg_md5コマンドでパスワードpostgresのハッシュ値を得る
$ pg_md5 postgres
postgres: md5ハッシュ値
$ vi pcp.conf
→ 以下を追記する

-------------------------pcp.conf編集ここから-----------------------------

postgres: md5ハッシュ値

-------------------------pcp.conf編集ここまで-----------------------------

# /etc/init.d/pgpool2 restart

・pgpool-II設定(pool_hba.conf)
pgpoolへのアクセスをNWで制限する。postgreSQLのpg_hba.confのようなもの、例のごとくサンプルから・・
# cd /usr/local/pgpool2/etc
# cp -p pool_hba.conf.sample pool_hba.conf
# su - pgpool2
# vi pool_hba.conf
→ 以下を追記する

-------------------------pcp.conf編集ここから-----------------------------

host all all 192.168.0.0/16 trust

-------------------------pcp.conf編集ここまで-----------------------------

# /etc/init.d/pgpool2 restart


なので以下にホントにpgpool-II動いてる?な確認方法をば

#su - pgpool2
$psql -U postgres dbname

dbname=#show pool_nodes;
hostname | port | status | lb_weight
--------------+------+--------+-----------
192.168.0.17 | 5432 | 2 | 0.500000
192.168.0.18 | 5432 | 2 | 0.500000
(2 rows)

dbname=#

的な?

statusは2が正常、3が異常、的な?