質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
CentOS

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

Q&A

解決済

1回答

11255閲覧

pgpool-II 起動時に backend 1 の status が 3 になってしまう (フェールオーバできない)

takito

総合スコア3111

CentOS

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

0グッド

0クリップ

投稿2015/07/01 03:33

編集2015/07/01 05:01

こんにちは

VirtualBox で2台のマシンを起動し、両方に PostgreSQL を入れて
ストリーミングレプリケーションによる DB レプリケーションを行っています。

pgpool-II を使ってフェールオーバーとオンラインリカバリを試したいのですが
フェールオーバがどうしてもうまくいきません。

試している環境は以下の通りです。

CentOS 6.5
PostgreSQL 9.3
pgpool-II 3.4.2

マシン構成(2台)

srv1 : マスタ, pgpool-II + PostgreSQL
srv2 : スレーブ, PostgreSQL

PostgreSQL 間のレプリケーションはうまくいっていて、
手作業でマスター/スレーブの切り替えもできます。

マスタ側で pool_nodes を見た状態は以下の通りです。

postgres=# show pool_nodes;
node_id | hostname | port | status | lb_weight | role
---------+----------+------+--------+-----------+---------
0 | srv1 | 5432 | 2 | 0.500000 | primary
1 | srv2 | 5432 | 3 | 0.500000 | standby
(2 行)

このように、srv2 側の status が 3 のままです。

この状態で srv1 で DB を停止させ

psql -h srv1 -p 9999 testdb

などのコマンド で DB アクセスを発生させると
フェールオーバの処理には入るのですが最終的に失敗してしまいます。

pgpool.conf では pgpool.conf.sample-stream をベースに使い
以下のように定義しています
(関係しそうな箇所のみ抜粋、記載無い部分はデフォルトのままです)

lang

1#------------------------------------------------------------------------------ 2# CONNECTIONS 3#------------------------------------------------------------------------------ 4listen_addresses = '*' 5 6backend_hostname0 = 'srv1' 7backend_port0 = 5432 8backend_weight0 = 1 9backend_data_directory0 = '/var/lib/pgsql/9.3/data' 10backend_flag0 = 'ALLOW_TO_FAILOVER' 11 12backend_hostname1 = 'srv2' 13backend_port1 = 5432 14backend_weight1 = 1 15backend_data_directory1 = '/var/lib/pgsql/9.3/data' 16backend_flag1 = 'ALLOW_TO_FAILOVER' 17 18#------------------------------------------------------------------------------ 19# REPLICATION MODE 20#------------------------------------------------------------------------------ 21 22replication_mode = off 23 24#------------------------------------------------------------------------------ 25# LOAD BALANCING MODE 26#------------------------------------------------------------------------------ 27 28load_balance_mode = on 29ignore_leading_white_space = on 30 31#------------------------------------------------------------------------------ 32# MASTER/SLAVE MODE 33#------------------------------------------------------------------------------ 34 35master_slave_mode = on 36master_slave_sub_mode = 'stream' 37 38sr_check_period = 10 39sr_check_user = 'postgres' 40sr_check_password = 'password' 41 42#------------------------------------------------------------------------------ 43# HEALTH CHECK 44#------------------------------------------------------------------------------ 45 46health_check_period = 10 47health_check_user = 'chk_user' 48health_check_password = '' 49 50#------------------------------------------------------------------------------ 51# FAILOVER AND FAILBACK 52#------------------------------------------------------------------------------ 53 54failover_command = '/usr/local/bin/failover_stream.sh %d %H /tmp/trigger_file0' 55 56#------------------------------------------------------------------------------ 57# ONLINE RECOVERY 58#------------------------------------------------------------------------------ 59 60recovery_user = 'postgres' 61recovery_password = 'password' 62recovery_1st_stage_command = 'recovery_1st_stage.sh' 63recovery_2st_stage_command = ''

ログを見ると、failover_command の実行時に %H 部分が空欄になっていることがわかりました。
(プライマリにするホスト名が不明なために失敗)

空欄になってしまう理由は恐らく srv2 が正しく認識されないためだと思っているのですが・・・

どなたかご経験ある方いらしゃいましたら、どのような些細な事でも結構ですのでアドバイスいただけませんでしょうか。
ご不明な点は何でもご質問ください。

※参考にしているサイト
http://www.pgpool.net/docs/latest/pgpool-ja.html
http://lets.postgresql.jp/documents/technical/pgpool/3

どうぞよろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

詳しくないのですが、このサイトの「オンラインリカバリを試してみる」という箇所にあるように、
「スタンバイサーバがクラッシュしてしまったとしましょう。この場合、
プライマリサーバのベースバックアップを取得してスタンバイサーバを
リストアするなどの作業が必要に」なるのではないでしょうか。

手順もその後に記述されています。

投稿2015/07/01 05:17

eripong

総合スコア1546

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

takito

2015/07/01 05:34

回答ありがとうございます。 現状、起動直後にスタンバイサーバ側の status が 3(down)となってしまているため、まだ運用の入り口にすら立てていない状況です。。。 試しに、プライマリサーバのベースバックアップからスタンバイサーバを再構築してみましたが、状況はかわりませんでした。 双方のDBは正常に起動しているのに、 pgpool がスレーブ側だけダウンしていると認識してまうのはなぜなのでしょう・・・
eripong

2015/07/01 05:53 編集

http://www.sraoss.jp/pipermail/pgpool-general-jp/2011-January/000876.html を見ると、pgpoolが状態を覚えてしまっている場合があるようです。 pgpoolを-Dオプション付きで起動することで、状態を忘れさせることが出来るようです。 また、-dオプションではpgpool起動時のログが取れるようなので、 解決しない場合はこれを見ると良いかもしれません。
takito

2015/07/01 06:21

これでした! -D オプション、気づきませんでした・・・ ユーザーマニュアルにもしっかり書かれてますね なんとかフェールオーバスクリプトの実行まで辿り着いたのですが、今度は別の問題が出てきました・・・ とりあえず本問題は解決とします 大変ありがとうございました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問