nob0303
@nob0303 (nob aki)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

公式のPGPOOL冗長化手順(CentOS8使用)で発生したエラーについてご教授お願いします。

解決したいこと

公式のpgpool冗長化手順(https://www.pgpool.net/docs/latest/ja/html/example-cluster.html)を
「8.2.9. 動作確認」の項目まで実施しました。

続く「8.2.9.1. PostgreSQL スタンバイサーバを構築」のpcp_recovery_node コマンドを実行しましたが、何もレスポンスがない状態のままになってしまいます。

公式手順との差分

  • OSはCentOS8を使用(vagrant+virtualboxで実験しています。 CentOSのダウンロード先https://app.vagrantup.com/bento/boxes/centos-8)
  • 手動viで編集している箇所はansibleによる編集後ファイルの上書きでのコピー
  • postgres13をインストールしたあと、「su - postgres -c '/usr/pgsql-13/bin/initdb -E UTF8 --locale=C -A scram-sha-256 -W'」を実行。

発生している問題・エラー

[root@server1 ~]# pcp_recovery_node -h 192.168.137.150 -p 9898 -U pgpool -n 1
Password: 
※pgpoolのパスワードを入力してENTERを押した後、何も進まなくなります。

自分で試したこと

  • バックエンドの情報を確認するコマンドが続く手順に書いてあったので実行

コマンド結果から他のサーバの情報は見えていますが、statusがダウン状態と表示されていました。

[root@server1 ~]# psql -h 192.168.137.150 -p 9999 -U pgpool postgres -c "show pool_nodes"
Password for user pgpool: 
 node_id | hostname | port | status | lb_weight |  role   | select_cnt | load_balance_node | replication_delay | replication_state | replication_sync_state | last_status_change  
---------+----------+------+--------+-----------+---------+------------+-------------------+-------------------+-------------------+------------------------+---------------------
 0       | server1  | 5432 | up     | 0.333333  | primary | 0          | true              | 0                 |                   |                        | 2021-05-30 12:23:49
 1       | server2  | 5432 | down   | 0.333333  | standby | 0          | false             | 0                 |                   |                        | 2021-05-30 11:59:47
 2       | server3  | 5432 | down   | 0.333333  | standby | 0          | false             | 0                 |                   |                        | 2021-05-30 11:59:47
(3 rows)

[root@server1 ~]# 
  • /var/lib/pgsql/13/data/recovery_1st_stage の内容を手動実行
[root@server1 ~]# vi /var/lib/pgsql/13/data/recovery_1st_stage 
〜中略〜
     45 ## Execute pg_basebackup to recovery Standby node
     46 ssh -T -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null postgres@$DEST_NODE_HOST -i ~/.ssh/id_rsa_pgpool "
     47 
     48     set -o errexit
     49     touch /tmp/asdf.txt ←/tmpにゴミファイルが作成されるか実験。
     50     rm -rf $DEST_NODE_PGDATA
     51     rm -rf $ARCHIVEDIR/*
     52 
     53     ${PGHOME}/bin/pg_basebackup -h $PRIMARY_NODE_HOST -U $REPLUSER -p $PRIMARY_NODE_PORT -D $DEST_NODE_PGDATA -X stream
〜中略〜

※「pcp_recovery_node -h 192.168.137.150 -p 9898 -U pgpool -n 1」コマンドを実行後、server2の/tmpにゴミファイルが作成されていることを確認
[root@server2 ~]# ll /tmp
total 4
-rw-rw-r--  1 postgres postgres  0 May 30 12:29 asdf.txt
-rw-r--r--  1 postgres postgres 13 May 30 12:29 pgpool_status
drwx------  3 root     root     17 May 30 02:33 systemd-private-4476dc2f056a45869c4c192818fd8310-chronyd.service-H8MVhI
drwxr-xr-x. 3 vagrant  root     23 May 30 10:51 vagrant-ansible

確認用に追加したtouchコマンドが動いていたため、後続の下記コマンドが動いていないのではないかと思い、手動実行しました。

${PGHOME}/bin/pg_basebackup -h $PRIMARY_NODE_HOST -U $REPLUSER -p $PRIMARY_NODE_PORT -D $DEST_NODE_PGDATA -X stream

手動実行結果後、正常にserver1からデータをコピーすることができました(初回投稿時はコマンドが間違っていました。)
※なお、replユーザーがpool_passwdに存在しないというエラーが出たため、pg_enc -m -k ~/.pgpoolkey -u repl -pを各サーバで実行しました。

[root@server2 ~]# sudo -u postgres /usr/pgsql-13/bin/pg_basebackup -h server1 -U repl -p 5432 -D $PGDATA -X stream
could not change directory to "/root": Permission denied
Password: 
[root@server2 ~]# 
[root@server2 ~]# ll $PGDATA
total 204
-rw------- 1 postgres postgres      3 May 30 17:54 PG_VERSION
-rw------- 1 postgres postgres    224 May 30 17:54 backup_label
〜略〜

pg_basebackupコマンドが失敗しているか、何かの接続を待ち受け状態に移行してそのまま固まってしまっているのではないかと思っています。
またserver2のpgpoolのログからはpcp_recovery_node -h 192.168.137.150 -p 9898 -U pgpool -n 1を実行した時間帯に下記出力がありましたが、調べても手がかりは掴めずでした。

2021-05-30 12:51:30: pid 10458: ERROR:  failed to make persistent db connection

他に見るべきログやアクションなど、お手数ですが、どなたかご教授お願いします。

0

1Answer

本件自己解決しました。
原因は.pgpassの配置場所がダメだったみたいです。
postgresユーザーはansibleで予め作成していてホームディレクトリが/var/lib/pgsqlだとは知らずに作業してました。
一応/home/postgres配下に配置して動作確認したので、今度はansibleでちゃんと/var/lib/pgsqlで作成されるようにします。。。

0Like

Your answer might help someone💌