Technology

pgpool-II オンラインリカバリスクリプト の修正

投稿日:2020年6月20日 更新日:

課題

pgpoolに付属のオンラインリカバリスクリプトが実行できない

  1. Postgres プライマリのホスト名の名前解決ができない
  2. 「レプリケーションスロット名が不正」となる

環境

  • 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}');

-Technology
-,

執筆者:

関連記事

Powershellを利用してFirefoxをダウンロードしてインストールする

PowerShell3.0 で導入された Invoke-WebRequest を利用してFirefoxをダウンロードします。Start-Process に -Verb RunAs をつけるこ …

CentOS8のリポジトリ参照先をCentOS Stream 8に変更する

CentOS Project の方針変更の発表がされました。 https://blog.centos.org/2020/12/future-is-centos-stream/ 要約すると、CentOS …

node.jsの最大メモリを増やす

node.jsの最大メモリは2GBです。メモリ不足でWebpackのビルドが落ちることがあります。 FATAL ERROR: Ineffective mark-compacts near heap l …

マルチタッチ検出

スマートフォン, タブレットなどタッチイベントを検出します。 DEMO window.addEventListener('load', (event) => { let e: H …

cURLでWebDAV

Basic認証でファイルのダウンロード curl –user name:password -X GET -O –url https://example.com/path/to/filename.t …