課題
pgpoolに付属のオンラインリカバリスクリプトが実行できない
- Postgres プライマリのホスト名の名前解決ができない
- 「レプリケーションスロット名が不正」となる
環境
- CentOS7
- PostgreSQL 11.8
- pgpool-II version 4.1.2
対応
ホスト名の解決
< PRIMARY_NODE_HOST=$(hostname)
---
> PRIMARY_NODE_HOST=$(getent ahostsv4 $HOSTNAME | awk '{print $1}' | uniq)
PostgreSQLバージョンの取得
pgpoolを入れているサーバにPostgreSQL Serverを入れているとは限らない。
< PGVERSION=`${PGHOME}/bin/initdb -V | awk '{print $3}' | sed 's/\..*//' | sed 's/\([0-9]*\)[a-zA-Z].*/\1/'`
---
> PGVERSION=`$(which psql) -V | awk '{print $3}' | sed 's/\..*//' | sed 's/\([0-9]*\)[a-zA-Z].*/\1/'`
レプリケーションスロット名の変更
レプリケーションスロット名は小文字、数字とアンダースコアのみを含むことができます。
> SLOT_NAME=$(echo $FAILED_NODE_HOST | sed 's/\./_/g')
< ${PGHOME}/bin/psql -p ${NEW_MASTER_NODE_PORT} -c \"SELECT pg_create_physical_replication_slot('${FAILED_NODE_HOST}');\"
---
> ${PGHOME}/bin/psql -p ${NEW_MASTER_NODE_PORT} -c \"SELECT pg_create_physical_replication_slot('${SLOT_NAME}');\"
< primary_slot_name = '${FAILED_NODE_HOST}'
---
> primary_slot_name = '${SLOT_NAME}'
< primary_slot_name = '${FAILED_NODE_HOST}'
---
> primary_slot_name = '${SLOT_NAME}'
< ${PGHOME}/bin/psql -p ${NEW_MASTER_NODE_PORT} -c \"SELECT pg_drop_replication_slot('${FAILED_NODE_HOST}')\"
---
> ${PGHOME}/bin/psql -p ${NEW_MASTER_NODE_PORT} -c \"SELECT pg_drop_replication_slot('${SLOT_NAME}')\"
< ${PGHOME}/bin/psql -p ${NEW_MASTER_NODE_PORT} -c "SELECT pg_drop_replication_slot('${FAILED_NODE_HOST}')"
---
> ${PGHOME}/bin/psql -p ${NEW_MASTER_NODE_PORT} -c "SELECT pg_drop_replication_slot('${SLOT_NAME}')"
> SLOT_NAME=$(echo $FAILED_NODE_HOST | sed 's/\./_/g')
< ${PGHOME}/bin/psql -p $OLD_PRIMARY_NODE_PORT -c \"SELECT pg_drop_replication_slot('${FAILED_NODE_HOST}')\"
---
> ${PGHOME}/bin/psql -p $OLD_PRIMARY_NODE_PORT -c \"SELECT pg_drop_replication_slot('${SLOT_NAME}')\"
< logger -i -p local1.error failover.sh: drop replication slot "${FAILED_NODE_HOST}" failed
---
> logger -i -p local1.error failover.sh: drop replication slot "${SLOT_NAME}" failed
> PRIMARY_SLOT_NAME=$(echo $DEST_NODE_HOST | sed 's/\./_/g')
< SELECT pg_create_physical_replication_slot('${DEST_NODE_HOST}');
---
> SELECT pg_create_physical_replication_slot('${PRIMARY_SLOT_NAME}');
< primary_slot_name = '${DEST_NODE_HOST}'
---
> primary_slot_name = '${PRIMARY_SLOT_NAME}'
< SELECT pg_drop_replication_slot('${DEST_NODE_HOST}');
---
> SELECT pg_drop_replication_slot('${PRIMARY_SLOT_NAME}');