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
-,

執筆者:

関連記事

マルチタッチ検出

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

Vagrantfileの設定を外部ファイルにする

Rubyですから、お好きな形式で設定を定義して読み込みます。今回はYAMLを使います。 # -*- mode: ruby -*- # vi: set ft=ruby : require 'ya …

Raspberry Pi 4 を 外部ストレージで起動する。OSはCentOS8

CentoOS8 Raspberry Pi 4用イメージをダウンロード https://people.centos.org/pgreco/CentOS-Userland-8-stream-aarch6 …

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

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

cactiのトラブル

1.2.10 インストールが41%から進まない Cacti_Stats.xml.gz が壊れているので置き換える。 This was due to a damaged Cacti_Stats pack …