1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

HadoopクラスタにHiveクラスタを導入してみた。(pgpool版)

Last updated at Posted at 2026-01-11

はじめに

Hiveについて、独立したホストでクラスタ化(pgpool利用)してみました。

前提として、以下手順に従いHadoopクラスタを構築してること。

動作確認用にzeppelinも構築していること。

構成概要

Hadoop クラスタ

master1 : ZooKeeper / JournalNode / NameNode(nn1) / ZKFC
JobHistoryServer / ATSv2 / Hive / PostgreSQL
master2 : ZooKeeper / JournalNode / NameNode(nn2) / ZKFC
ResourceManager(rm1)
master3 : ZooKeeper / JournalNode
ResourceManager(rm2)
worker1 : DataNode / NodeManager
worker2 : DataNode / NodeManager
zeppelin1 : zeppelin

上記ZookeeeperをHiveServer2クラスタで利用。
master1のHive&PostgreSQLは下記ホスト、Hive稼働できたらサービス停止してよい。

追加ホスト

hive1 : HiveServer2 + Hive Metastore
hive2 : HiveServer2 + Hive Metastore
pg1 : PostgreSQL Primary + pgpool
pg2 : PostgreSQL Standby + pgpool
pg3 : PostgreSQL Standby + pgpool
pg-vip : PostgreSQL 仮想IP(pgpool制御)

pg1/pg2/pg3について、AlmaLinux9を使用する。
それ以外は、Ubuntu24.04を使用する。

HA 方針

コンポーネント HA方式
HiveServer2 ZooKeeper Service Discovery
Hive Metastore Active-Active
PostgreSQL Streaming Replication
Primary 切替 pgpool
postgresql接続先 VIP (pgpool)
ZooKeeper Hadoop 既存を流用

前提 IP(例)

192.168.11.54 hive1
192.168.11.55 hive2
192.168.11.37 pg1
192.168.11.38 pg2
192.168.11.39 pg3
192.168.11.40 pg-vip

※適宜読み替えてください

1. 全ノード共通設定(新規ホスト)

全ホストの名前解決を行えるようにする。

以下のコマンドでBigTop APT リポジトリ追加すること。
こちらについてはpg1/pg2/pg3では実施しなくてよい。

sudo tee /etc/apt/sources.list.d/bigtop.list << 'EOF'
deb [trusted=yes] http://repos.bigtop.apache.org/releases/3.3.0/ubuntu/22.04/amd64 bigtop contrib
EOF

sudo apt update

2. PostgreSQL HA 構築

2.1. 全台共通(pg1 / pg2 / pg3)

2.1.1. 基本設定

sudo dnf -y update
sudo dnf -y install chrony vim wget
sudo systemctl enable --now chronyd

2.1.2. PostgreSQL PGDG リポジトリ

sudo dnf -y install dnf-plugins-core
sudo dnf config-manager --set-enabled crb
sudo dnf -qy module disable postgresql
sudo dnf -y install \
  https://download.postgresql.org/pub/repos/yum/reporpms/EL-9-x86_64/pgdg-redhat-repo-latest.noarch.rpm

2.1.3. PostgreSQL + Pgpool インストール(全台)

sudo dnf -y install pgpool-II pgpool-II-pcp
sudo dnf -y install postgresql16-server

2.2 PostgreSQL:Streaming Replication 構築

2.2.1. 3台共通:初期化・起動

sudo /usr/pgsql-16/bin/postgresql-16-setup initdb
sudo systemctl enable --now postgresql-16

2.2.2. pg1: postgresql.conf

sudo -u postgres sed -i \
  -e "s/^#listen_addresses.*/listen_addresses = '*'/" \
  /var/lib/pgsql/16/data/postgresql.conf
sudo -u postgres tee -a /var/lib/pgsql/16/data/postgresql.conf >/dev/null <<'EOF'
wal_level = replica
max_wal_senders = 10
max_replication_slots = 10
hot_standby = on
wal_log_hints = on
EOF

2.2.2. pg1: DBユーザー作成(pgpool / repl)

sudo -u postgres psql <<'SQL'
SET password_encryption = 'scram-sha-256';

DO $$
BEGIN
  IF NOT EXISTS (SELECT 1 FROM pg_roles WHERE rolname='pgpool') THEN
    CREATE ROLE pgpool LOGIN;
  END IF;
  IF NOT EXISTS (SELECT 1 FROM pg_roles WHERE rolname='repl') THEN
    CREATE ROLE repl REPLICATION LOGIN;
  END IF;
END $$;

GRANT pg_monitor TO pgpool;
SQL
sudo -u postgres psql -c "\password pgpool"

sudo -u postgres psql -c "\password repl"

sudo -u postgres psql -c "\password postgres"

→それぞれのDBパスワードを定め、パスワードを控える

2.2.3. pg1: pg_hba.conf

sudo -u postgres tee -a /var/lib/pgsql/16/data/pg_hba.conf >/dev/null <<'EOF'
host    all             all             192.168.11.0/24         scram-sha-256
host    replication     all             192.168.11.0/24         scram-sha-256
EOF
sudo systemctl restart postgresql-16

2.3. pg2/pg3 を Standby にする(basebackup)

2.3.1. pg2 / pg3: データ作り直し

sudo systemctl stop postgresql-16
sudo mv /var/lib/pgsql/16/data /var/lib/pgsql/16/data.old.$(date +%F-%H%M%S)
sudo install -d -o postgres -g postgres -m 700 /var/lib/pgsql/16/data
sudo restorecon -RFv /var/lib/pgsql/16/data || true

2.3.2. pg2/pg3: pg_basebackup(pg1から)

sudo -u postgres /usr/pgsql-16/bin/pg_basebackup \
  -h pg1 -p 5432 -U repl \
  -D /var/lib/pgsql/16/data \
  -R -X stream -C -S "$(hostname)" \
  --write-recovery-conf

→replのPW入力が出ます

2.3.3. pg2/pg3: 起動

sudo systemctl start postgresql-16

2.3.4. pg1: 確認

sudo -u postgres psql -c "select client_addr,state,sync_state from pg_stat_replication;"

→sync_stateが全てasyncとなること。

2.4 Pgpool-II:3台 Watchdog + VIP 構築

2.4.1. 3台共通:pgpool_node_id

pg1

echo 0 | sudo tee /etc/pgpool-II/pgpool_node_id

pg2

echo 1 | sudo tee /etc/pgpool-II/pgpool_node_id

pg3

echo 2 | sudo tee /etc/pgpool-II/pgpool_node_id

2.4.2. pg1:pgpool.conf(仮置き)

sudo cp -p /etc/pgpool-II/pgpool.conf.sample /etc/pgpool-II/pgpool.conf
sudo chown root:root /etc/pgpool-II/pgpool.conf
sudo chmod 644 /etc/pgpool-II/pgpool.conf
sudo tee -a /etc/pgpool-II/pgpool.conf >/dev/null <<'EOF'

# ===== minimal settings for pg_enc / SR mode =====
listen_addresses = '*'
port = 9999
pcp_port = 9898

backend_clustering_mode = 'streaming_replication'

backend_hostname0 = 'pg1'
backend_port0 = 5432
backend_data_directory0 = '/var/lib/pgsql/16/data'
backend_flag0 = 'ALLOW_TO_FAILOVER'

backend_hostname1 = 'pg2'
backend_port1 = 5432
backend_data_directory1 = '/var/lib/pgsql/16/data'
backend_flag1 = 'ALLOW_TO_FAILOVER'

backend_hostname2 = 'pg3'
backend_port2 = 5432
backend_data_directory2 = '/var/lib/pgsql/16/data'
backend_flag2 = 'ALLOW_TO_FAILOVER'

# pool_passwd を使う前提
health_check_user = 'pgpool'
health_check_password = ''
sr_check_user = 'pgpool'
sr_check_password = ''
EOF

2.4.3. pg1:pool_passwd

sudo -u postgres bash -lc '
set -e
umask 077
openssl rand -base64 32 | tr -d "\n" > ~/.pgpoolkey
chmod 600 ~/.pgpoolkey
ls -l ~/.pgpoolkey
wc -c ~/.pgpoolkey
'
sudo install -o postgres -g postgres -m 600 /dev/null /etc/pgpool-II/pool_passwd
sudo restorecon -v /etc/pgpool-II/pool_passwd 2>/dev/null || true
sudo -u postgres bash -lc 'pg_enc -m -k ~/.pgpoolkey -u pgpool -p'

→pgpoolのPW入力をすること。

sudo cat /etc/pgpool-II/pool_passwd

2.4.4. 3台共通:PCPユーザー(pgpool)

sudo chown -R postgres:postgres /etc/pgpool-II
sudo -u postgres touch /etc/pgpool-II/pcp.conf
sudo pg_md5 -u pgpool -p

→pgpoolパスワードをここで新しく設定し、帰ってきた値を控える

sudo -u postgres vi /etc/pgpool-II/pcp.conf

→以下の記載を入れる。

pgpool:<先ほど控えた値>

sudo chmod 600 /etc/pgpool-II/pcp.conf

2.4.5. 3台共通:sudoers(VIP操作)

sudo visudo -f /etc/sudoers.d/pgpool_vip

中身:

postgres ALL=NOPASSWD: /usr/sbin/ip
postgres ALL=NOPASSWD: /usr/sbin/arping
Defaults:postgres !requiretty

2.4.6. 3台共通:postgres SSH鍵(フェールオーバースクリプト用)

SSHフルメッシュ交換(postgresSSH鍵)

sudo -u postgres bash -lc 'test -f ~/.ssh/id_rsa_pgpool || ssh-keygen -t ed25519 -N "" -f ~/.ssh/id_rsa_pgpool'
sudo -u postgres cat /var/lib/pgsql/.ssh/id_rsa_pgpool.pub

それぞれの公開鍵を控える。

sudo -u postgres touch /var/lib/pgsql/.ssh/authorized_keys
sudo -u postgres chmod 600 /var/lib/pgsql/.ssh/authorized_keys
sudo -u postgres vi /var/lib/pgsql/.ssh/authorized_keys

控えた3台の公開鍵を書き込む。

sudo -u postgres ssh -i /var/lib/pgsql/.ssh/id_rsa_pgpool postgres@pg1 'hostname'
sudo -u postgres ssh -i /var/lib/pgsql/.ssh/id_rsa_pgpool postgres@pg2 'hostname'
sudo -u postgres ssh -i /var/lib/pgsql/.ssh/id_rsa_pgpool postgres@pg3 'hostname'

→yesを入力し、以下の回答が出てくること。(2回やったほうが結果はわかりやすい)

pg1
pg2
pg3

2.4.7. 3台共通:.pgpass(repl / postgres)

REPL_PASSWORDとPOSTGRES_PASSWORDは実値に置換する。

sudo -u postgres tee /var/lib/pgsql/.pgpass >/dev/null <<'EOF'
pg1:5432:replication:repl:REPL_PASSWORD
pg2:5432:replication:repl:REPL_PASSWORD
pg3:5432:replication:repl:REPL_PASSWORD
pg1:5432:postgres:postgres:POSTGRES_PASSWORD
pg2:5432:postgres:postgres:POSTGRES_PASSWORD
pg3:5432:postgres:postgres:POSTGRES_PASSWORD
EOF
sudo -u postgres chmod 600 /var/lib/pgsql/.pgpass

2.5 pgpool.conf/pool_hba.conf

2.5.1. pg1/pg2/pg3共通で設定

sudo tee /etc/pgpool-II/pgpool.conf >/dev/null <<'EOF'
########## 基本 ##########
listen_addresses = '*'
port = 9999
pcp_port = 9898

backend_clustering_mode = 'streaming_replication'

########## Backend ##########
backend_hostname0 = 'pg1'
backend_port0 = 5432
backend_weight0 = 1
backend_data_directory0 = '/var/lib/pgsql/16/data'
backend_flag0 = 'ALLOW_TO_FAILOVER'

backend_hostname1 = 'pg2'
backend_port1 = 5432
backend_weight1 = 1
backend_data_directory1 = '/var/lib/pgsql/16/data'
backend_flag1 = 'ALLOW_TO_FAILOVER'

backend_hostname2 = 'pg3'
backend_port2 = 5432
backend_weight2 = 1
backend_data_directory2 = '/var/lib/pgsql/16/data'
backend_flag2 = 'ALLOW_TO_FAILOVER'

########## health / sr check ##########
health_check_period = 5
health_check_timeout = 30
health_check_max_retries = 3
health_check_user = 'pgpool'
health_check_password = 'pgpoolpass'   # pgpool_passwdを使う
health_check_database = 'postgres'

sr_check_period = 5
sr_check_user = 'pgpool'
sr_check_password = 'pgpoolpass'       # pgpool_passwdを使う

########## フェイルオーバ / 追従 ##########
failover_command = '/etc/pgpool-II/failover.sh %d %h %p %D %m %H %M %P %r %R %N %S'
follow_primary_command = ''

########## watchdog + VIP ##########
use_watchdog = on
delegate_ip = '192.168.11.40'

# VIP scripts(ip/arping は実パスに統一)
if_up_cmd   = '/usr/bin/sudo /usr/sbin/ip addr add $_IP_$/24 dev eth0 label eth0:0'
if_down_cmd = '/usr/bin/sudo /usr/sbin/ip addr del $_IP_$/24 dev eth0'
arping_cmd  = '/usr/bin/sudo /usr/sbin/arping -U $_IP_$ -w 1 -I eth0'

# lifcheck: heartbeat(※定義がないと起動時に FATAL になります)
wd_lifecheck_method = 'heartbeat'
wd_interval = 10

heartbeat_device0 = 'eth0'
heartbeat_hostname0 = 'pg1'
heartbeat_port0 = 9694

heartbeat_device1 = 'eth0'
heartbeat_hostname1 = 'pg2'
heartbeat_port1 = 9694

heartbeat_device2 = 'eth0'
heartbeat_hostname2 = 'pg3'
heartbeat_port2 = 9694

# watchdog peers
hostname0 = 'pg1'
wd_port0 = 9000
pgpool_port0 = 9999

hostname1 = 'pg2'
wd_port1 = 9000
pgpool_port1 = 9999

hostname2 = 'pg3'
wd_port2 = 9000
pgpool_port2 = 9999

wd_escalation_command = '/etc/pgpool-II/escalation.sh'

########## pool_hba ##########
enable_pool_hba = on
pool_passwd = '/etc/pgpool-II/pool_passwd'
pool_key = '/var/lib/pgsql/.pgpoolkey'

########## ファイル出力先(Permission denied 回避のため必須) ##########
logdir = '/var/log/pgpool-II'
backend_status_file = '/var/log/pgpool-II/pgpool_status'
wd_ipc_socket_dir = '/var/run/pgpool'
pid_file_name = '/var/run/pgpool/pgpool.pid'
EOF
sudo tee /etc/pgpool-II/pool_hba.conf <<EOF
# ローカル運用
local   all         all                             trust
host    all         all         127.0.0.1/32         scram-sha-256
host    all         all         ::1/128              scram-sha-256

host    all         all         192.168.11.0/24      scram-sha-256

EOF

2.6. サンプルスクリプト有効化(PG16向けに修正)

2.6.1. 3台共通:配置

  • failover.sh(フェイルオーバーシェル)
sudo tee /etc/pgpool-II/failover.sh >/dev/null <<'EOF'
#!/bin/bash
# This script is run by failover_command.
set -o xtrace

FAILED_NODE_ID="$1"
FAILED_NODE_HOST="$2"
FAILED_NODE_PORT="$3"
FAILED_NODE_PGDATA="$4"
NEW_MAIN_NODE_ID="$5"
NEW_MAIN_NODE_HOST="$6"
OLD_MAIN_NODE_ID="$7"
OLD_PRIMARY_NODE_ID="$8"
NEW_MAIN_NODE_PORT="$9"
NEW_MAIN_NODE_PGDATA="${10}"
OLD_PRIMARY_NODE_HOST="${11}"
OLD_PRIMARY_NODE_PORT="${12}"

PGHOME=/usr/pgsql-16
REPL_SLOT_NAME=$(echo "${FAILED_NODE_HOST,,}" | tr -- -. _)
POSTGRESQL_STARTUP_USER=postgres
SSH_KEY_FILE=id_rsa_pgpool
SSH_OPTIONS="-o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -i ~/.ssh/${SSH_KEY_FILE}"

echo failover.sh: start: failed_node_id=$FAILED_NODE_ID failed_host=$FAILED_NODE_HOST \
    old_primary_node_id=$OLD_PRIMARY_NODE_ID new_main_node_id=$NEW_MAIN_NODE_ID new_main_host=$NEW_MAIN_NODE_HOST

# If there's no main node anymore, skip failover.
if [ "$NEW_MAIN_NODE_ID" -lt 0 ]; then
    echo failover.sh: All nodes are down. Skipping failover.
    exit 0
fi

# Test passwordless SSH
ssh -T ${SSH_OPTIONS} ${POSTGRESQL_STARTUP_USER}@${NEW_MAIN_NODE_HOST} ls /tmp > /dev/null
if [ $? -ne 0 ]; then
    echo failover.sh: passwordless SSH to ${POSTGRESQL_STARTUP_USER}@${NEW_MAIN_NODE_HOST} failed.
    exit 1
fi

# If Standby node is down (not old primary), drop replication slot and exit.
if [ "$OLD_PRIMARY_NODE_ID" != "-1" -a "$FAILED_NODE_ID" != "$OLD_PRIMARY_NODE_ID" ]; then
    ${PGHOME}/bin/psql -h ${OLD_PRIMARY_NODE_HOST} -p ${OLD_PRIMARY_NODE_PORT} postgres \
        -c "SELECT pg_drop_replication_slot('${REPL_SLOT_NAME}');"  >/dev/null 2>&1 || true
    echo failover.sh: end: standby node is down. Skipping failover.
    exit 0
fi

# Promote Standby node.
echo failover.sh: primary node is down, promote new_main_node_id=$NEW_MAIN_NODE_ID on ${NEW_MAIN_NODE_HOST}.
ssh -T ${SSH_OPTIONS} ${POSTGRESQL_STARTUP_USER}@${NEW_MAIN_NODE_HOST} \
  ${PGHOME}/bin/pg_ctl -D ${NEW_MAIN_NODE_PGDATA} -w promote

if [ $? -ne 0 ]; then
    echo ERROR: failover.sh: promote failed
    exit 1
fi

echo failover.sh: end: new_main_node_id=$NEW_MAIN_NODE_ID on ${NEW_MAIN_NODE_HOST} was successfully promoted to primary
exit 0
EOF
sudo chown postgres:postgres /etc/pgpool-II/failover.sh
sudo chmod 700 /etc/pgpool-II/failover.sh
  • escalation.sh(VIP取り扱いシェル)
sudo tee /etc/pgpool-II/escalation.sh >/dev/null <<'EOF'
#!/bin/bash
# Bring down the virtual IP on other pgpool nodes before bringing it up on this node.
set -o xtrace

POSTGRESQL_STARTUP_USER=postgres
SSH_KEY_FILE=id_rsa_pgpool
SSH_OPTIONS="-o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -i ~/.ssh/${SSH_KEY_FILE}"
SSH_TIMEOUT=5

PGPOOLS=(pg1 pg2 pg3)

VIP=192.168.11.40
DEVICE=eth0
CIDR_NETMASK=24
IP=/usr/sbin/ip

for pgpool in "${PGPOOLS[@]}"; do
  [ "$HOSTNAME" = "${pgpool}" ] && continue

  timeout ${SSH_TIMEOUT} ssh -T ${SSH_OPTIONS} ${POSTGRESQL_STARTUP_USER}@${pgpool} "
    ${IP} addr show dev ${DEVICE} | grep -F ${VIP} > /dev/null 2>&1
  "

  if [ $? -eq 0 ]; then
    timeout ${SSH_TIMEOUT} ssh -T ${SSH_OPTIONS} ${POSTGRESQL_STARTUP_USER}@${pgpool} "
      /usr/bin/sudo ${IP} addr del ${VIP}/${CIDR_NETMASK} dev ${DEVICE}
    " || echo "ERROR: escalation.sh: failed to release VIP on ${pgpool}."
  fi
done
exit 0
EOF
sudo chown postgres:postgres /etc/pgpool-II/escalation.sh
sudo chmod 700 /etc/pgpool-II/escalation.sh

2.7. pgpool 起動(全台)

2.7.1. pid/書き込み先置き場所作成

sudo install -d -m 755 -o postgres -g postgres /var/run/pgpool /var/log/pgpool-II
sudo restorecon -RFv /var/run/pgpool /var/log/pgpool-II 2>/dev/null || true

sudo tee /etc/tmpfiles.d/pgpool.conf >/dev/null <<'EOF'
d /var/run/pgpool 0755 postgres postgres -
EOF

sudo systemd-tmpfiles --create /etc/tmpfiles.d/pgpool.conf

2.7.2. 起動

sudo systemctl enable --now pgpool-II
sudo systemctl status pgpool-II

2.8. 確認(VIP / watchdog / pool_nodes)

2.8.1. VIPがどこにいるか(3台どれかで)

ip -br addr | grep 192.168.11.40 || true

→3台のどれかでVIPが出ればよい。

2.8.2. Pgpool経由で backend 状態(どこからでも)

psql -h 192.168.11.40 -p 9999 -U pgpool -d postgres -c "SHOW pool_nodes;"

→backendのステータスが見れること。

2.8.3. watchdog 状態

pcp_watchdog_info -h 127.0.0.1 -p 9898 -U pgpool

→pgpoolのパスワードを入れる。
3台のステータスが見れること。

2.9. アクセス制限更新(pg_hba.conf,pool_hba.conf)

pg1/pg2/pg3で実施

sudo tee /var/lib/pgsql/16/data/pg_hba.conf >/dev/null <<'EOF'
# ===== local =====
local   all             all                                     peer
host    all             all             127.0.0.1/32            scram-sha-256
host    all             all             ::1/128                 scram-sha-256

# ===== Pgpool health/sr_check user (pgpool) =====
# pgpool は同居でも別ノード経由でも backend に接続し得るので、3台のIPを明示許可
host    all             pgpool           192.168.11.37/32       scram-sha-256
host    all             pgpool           192.168.11.38/32       scram-sha-256
host    all             pgpool           192.168.11.39/32       scram-sha-256

# ===== Streaming Replication (repl) =====
# standby が primary に replication 接続するため
host    replication     repl             192.168.11.37/32       scram-sha-256
host    replication     repl             192.168.11.38/32       scram-sha-256
host    replication     repl             192.168.11.39/32       scram-sha-256

# follow_primary動作のため
host    all     postgres   192.168.11.37/32   scram-sha-256
host    all     postgres   192.168.11.38/32   scram-sha-256
host    all     postgres   192.168.11.39/32   scram-sha-256

EOF
sudo tee /etc/pgpool-II/pool_hba.conf <<EOF
# ローカル運用
local   all         all                              scram-sha-256
host    all         all         127.0.0.1/32         scram-sha-256
host    all         all         ::1/128              scram-sha-256

# pg1/pg2/pg3からのアクセス許可
host    all         all         192.168.11.37/32      scram-sha-256
host    all         all         192.168.11.38/32      scram-sha-256
host    all         all         192.168.11.39/32      scram-sha-256

EOF
sudo systemctl reload postgresql-16
sudo systemctl reload pgpool-II

2.10. pgpool認証ファイルコピー

2.10.1.【pg1】/tmp に一時コピーを作る(root)

sudo cp /etc/pgpool-II/pool_passwd /tmp/pool_passwd
sudo cp /var/lib/pgsql/.pgpoolkey /tmp/.pgpoolkey

sudo chown postgres:postgres /tmp/pool_passwd /tmp/.pgpoolkey
sudo chmod 600 /tmp/pool_passwd /tmp/.pgpoolkey

2.10.2.【pg1】postgres SSH で配布

sudo -u postgres scp -i /var/lib/pgsql/.ssh/id_rsa_pgpool \
  /tmp/pool_passwd /tmp/.pgpoolkey \
  postgres@pg2:/tmp/

sudo -u postgres scp -i /var/lib/pgsql/.ssh/id_rsa_pgpool \
  /tmp/pool_passwd /tmp/.pgpoolkey \
  postgres@pg3:/tmp/

2.10.3.【pg2 / pg3】正規配置(root)

sudo mv /tmp/pool_passwd /etc/pgpool-II/pool_passwd
sudo chown postgres:postgres /etc/pgpool-II/pool_passwd
sudo chmod 600 /etc/pgpool-II/pool_passwd
sudo mv /tmp/.pgpoolkey /var/lib/pgsql/.pgpoolkey
sudo chown postgres:postgres /var/lib/pgsql/.pgpoolkey
sudo chmod 600 /var/lib/pgsql/.pgpoolkey

2.10.4. Pgpool 反映(全ノード)

sudo systemctl restart pgpool-II

2.10.5.【後始末】pg1 の /tmp を掃除

sudo rm -f /tmp/pool_passwd /tmp/.pgpoolkey

3. Hive(hive1 / hive2)

3.1. インストール

sudo apt install -y hive hive-metastore hive-server2
sudo apt install -y openjdk-8-jdk

3.2. hadoop ユーザー作成

sudo useradd -m -g hadoop -s /bin/bash hadoop

3.3. Hadoop 設定作成

sudo tee /etc/hadoop/conf/core-site.xml << 'EOF'
<configuration>
  <property>
    <name>fs.defaultFS</name>
    <value>hdfs://cluster1</value>
  </property>
  <property>
    <name>ha.zookeeper.quorum</name>
    <value>master1:2181,master2:2181,master3:2181</value>
  </property>
  <property>
    <name>hadoop.tmp.dir</name>
    <value>/var/lib/hadoop/tmp</value>
  </property>
</configuration>
EOF
sudo tee /etc/hadoop/conf/hdfs-site.xml << 'EOF'
<configuration>

  <property>
    <name>dfs.nameservices</name>
    <value>cluster1</value>
  </property>

  <property>
    <name>dfs.ha.namenodes.cluster1</name>
    <value>nn1,nn2</value>
  </property>

  <property>
    <name>dfs.namenode.rpc-address.cluster1.nn1</name>
    <value>master1:8020</value>
  </property>

  <property>
    <name>dfs.namenode.rpc-address.cluster1.nn2</name>
    <value>master2:8020</value>
  </property>

  <property>
    <name>dfs.namenode.http-address.cluster1.nn1</name>
    <value>master1:9870</value>
  </property>
  
  <property>
    <name>dfs.namenode.http-address.cluster1.nn2</name>
    <value>master2:9870</value>
  </property>

  <property>
    <name>dfs.namenode.name.dir</name>
    <value>file:///var/lib/hadoop-hdfs/namenode</value>
  </property>

  <property>
    <name>dfs.datanode.data.dir</name>
    <value>file:///var/lib/hadoop-hdfs/datanode</value>
  </property>

  <property>
    <name>dfs.namenode.shared.edits.dir</name>
    <value>qjournal://master1:8485;master2:8485;master3:8485/cluster1</value>
  </property>

  <property>
    <name>dfs.journalnode.edits.dir</name>
    <value>/var/lib/hadoop-hdfs/journalnode</value>
  </property>

  <property>
    <name>dfs.client.failover.proxy.provider.cluster1</name>
    <value>
      org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider
    </value>
  </property>

  <property>
    <name>dfs.ha.automatic-failover.enabled</name>
    <value>true</value>
  </property>

  <property>
    <name>dfs.replication</name>
    <value>2</value>
  </property>

  <property>
    <name>dfs.ha.fencing.methods</name>
    <value>sshfence</value>
  </property>

  <property>
    <name>dfs.ha.fencing.ssh.private-key-files</name>
    <value>/home/hadoop/.ssh/id_rsa</value>
  </property>

</configuration>
EOF
sudo tee /etc/hadoop/conf/yarn-site.xml << 'EOF'
<configuration>

  <property>
    <name>yarn.resourcemanager.ha.enabled</name>
    <value>true</value>
  </property>

  <property>
    <name>yarn.resourcemanager.cluster-id</name>
    <value>ycluster</value>
  </property>

  <property>
    <name>yarn.resourcemanager.ha.rm-ids</name>
    <value>rm1,rm2</value>
  </property>

  <property>
    <name>yarn.resourcemanager.hostname.rm1</name>
    <value>master2</value>
  </property>

  <property>
    <name>yarn.resourcemanager.hostname.rm2</name>
    <value>master3</value>
  </property>

  <property>
    <name>yarn.resourcemanager.zk-address</name>
    <value>master1:2181,master2:2181,master3:2181</value>
  </property>

  <property>
    <name>yarn.nodemanager.resource.memory-mb</name>
    <value>512</value>
  </property>

  <property>
    <name>yarn.scheduler.minimum-allocation-mb</name>
    <value>128</value>
  </property>

  <property>
    <name>yarn.scheduler.maximum-allocation-mb</name>
    <value>256</value>
  </property>

  <property>
    <name>yarn.nodemanager.aux-services</name>
    <value>mapreduce_shuffle</value>
  </property>

  <property>
    <name>yarn.timeline-service.enabled</name>
    <value>true</value>
  </property>

  <property>
    <name>yarn.timeline-service.version</name>
    <value>2.0</value>
  </property>

  <property>
    <name>yarn.timeline-service.fs-writer.root-dir</name>
    <value>/atsv2</value>
  </property>

  <property>
    <name>yarn.timeline-service.reader.webapp.address</name>
    <value>master1:8188</value>
  </property>

  <property>
    <name>yarn.webapp.ui2.enable</name>
    <value>true</value>
  </property>

  <property>
    <name>yarn.log.server.url</name>
    <value>http://master1:19888/jobhistory/logs</value>
  </property>

  <property>
    <name>yarn.resourcemanager.webapp.address.rm1</name>
    <value>master2:8088</value>
  </property>

  <property>
    <name>yarn.resourcemanager.webapp.address.rm2</name>
    <value>master3:8088</value>
  </property>

</configuration>
EOF
sudo tee /etc/hadoop/conf/mapred-site.xml << 'EOF'
<configuration>
  <property>
    <name>mapreduce.framework.name</name>
    <value>yarn</value>
  </property>

  <property>
    <name>yarn.app.mapreduce.am.env</name>
    <value>HADOOP_COMMON_HOME=/usr/lib/hadoop,HADOOP_HDFS_HOME=/usr/lib/hadoop-hdfs,HADOOP_MAPRED_HOME=/usr/lib/hadoop-mapreduce</value>
  </property>

  <property>
    <name>mapreduce.map.env</name>
    <value>HADOOP_COMMON_HOME=/usr/lib/hadoop,HADOOP_HDFS_HOME=/usr/lib/hadoop-hdfs,HADOOP_MAPRED_HOME=/usr/lib/hadoop-mapreduce</value>
  </property>

  <property>
    <name>mapreduce.reduce.env</name>
    <value>HADOOP_COMMON_HOME=/usr/lib/hadoop,HADOOP_HDFS_HOME=/usr/lib/hadoop-hdfs,HADOOP_MAPRED_HOME=/usr/lib/hadoop-mapreduce</value>
  </property>

  <property>
    <name>mapreduce.application.classpath</name>
    <value>/etc/hadoop/conf,/etc/hadoop/conf/*,/usr/lib/hadoop/*,/usr/lib/hadoop/lib/*,/usr/lib/hadoop-hdfs/*,/usr/lib/hadoop-hdfs/lib/*,/usr/lib/hadoop-mapreduce/*,/usr/lib/hadoop-mapreduce/lib/*,/usr/lib/hadoop-yarn/*,/usr/lib/hadoop-yarn/lib/*</value>
  </property>

  <property>
    <name>mapreduce.jobhistory.address</name>
    <value>master1:10020</value>
  </property>

  <property>
    <name>mapreduce.jobhistory.webapp.address</name>
    <value>master1:19888</value>
  </property>

  <property>
    <name>mapreduce.jobhistory.done-dir</name>
    <value>/mr-history/done</value>
  </property>

  <property>
    <name>mapreduce.jobhistory.intermediate-done-dir</name>
    <value>/mr-history/tmp</value>
  </property>

  <property>
    <name>yarn.app.mapreduce.am.command-opts</name>
    <value>-Dlog4j.configuration=file:/etc/hadoop/conf/log4j.properties</value>
  </property>

  <property>
    <name>mapreduce.map.java.opts</name>
    <value>-Dlog4j.configuration=file:/etc/hadoop/conf/log4j.properties</value>
  </property>

  <property>
    <name>mapreduce.reduce.java.opts</name>
    <value>-Dlog4j.configuration=file:/etc/hadoop/conf/log4j.properties</value>
  </property>

  <property>
    <name>mapreduce.job.am.webapp.address</name>
    <value>0.0.0.0:0</value>
  </property>

  <property>
    <name>mapreduce.job.am.webapp.https.address</name>
    <value>0.0.0.0:0</value>
  </property>

  <property>
    <name>mapreduce.shuffle.port</name>
    <value>13562</value>
  </property>
</configuration>
EOF

3.4. hive-site.xml(両ノード共通)

sudo tee /etc/hive/conf/hive-site.xml << 'EOF'
<configuration>

  <property>
    <name>javax.jdo.option.ConnectionURL</name>
    <value>jdbc:postgresql://pg-vip:9999/hive_metastore</value>
  </property>
  <property>
    <name>javax.jdo.option.ConnectionDriverName</name>
    <value>org.postgresql.Driver</value>
  </property>
  <property>
    <name>javax.jdo.option.ConnectionUserName</name>
    <value>hive</value>
  </property>
  <property>
    <name>javax.jdo.option.ConnectionPassword</name>
    <value>HivePasswordHere</value>
  </property>

  <property>
    <name>hive.metastore.uris</name>
    <value>thrift://hive1:9083,thrift://hive2:9083</value>
  </property>
  
  <property>
    <name>hive.metastore.warehouse.dir</name>
    <value>/user/hive/warehouse</value>
  </property>

  <property>
    <name>hive.server2.support.dynamic.service.discovery</name>
    <value>true</value>
  </property>
  <property>
    <name>hive.zookeeper.quorum</name>
    <value>master1:2181,master2:2181,master3:2181</value>
  </property>
  <property>
    <name>hive.server2.zookeeper.namespace</name>
    <value>hiveserver2</value>
  </property>
  
  <property>
    <name>hive.metastore.client.notification.event.poll.interval</name>
    <value>0s</value>
  </property>
  <property>
    <name>hive.metastore.event.db.notification.api.auth</name>
    <value>false</value>
  </property>

  <property>
    <name>hive.server2.enable.doAs</name>
    <value>false</value>
  </property>

</configuration>
EOF

3.5. PostgreSQL JDBC ドライバを Hive に追加

sudo apt install -y libpostgresql-jdbc-java
dpkg -L libpostgresql-jdbc-java | grep -E 'postgresql.*\.jar$'

sudo ln -sf /usr/share/java/postgresql.jar /usr/lib/hive/lib/postgresql.jar
sudo rm -rf /usr/lib/hive/lib/postgresql-9.4.1208.jre7.jar

3.6. hive DB設定

3.6.1. HiveDB作成

pg1で実施。

psql -h pg1 -U postgres -d postgres <<'SQL'

DO $$
BEGIN
  IF NOT EXISTS (SELECT 1 FROM pg_roles WHERE rolname = 'hive') THEN
    CREATE ROLE hive LOGIN PASSWORD 'HivePasswordHere';
  END IF;
END $$;

CREATE DATABASE hive_metastore OWNER postgres;

\connect hive_metastore

GRANT CONNECT, TEMP ON DATABASE hive_metastore TO hive;

ALTER SCHEMA public OWNER TO hive;
GRANT USAGE, CREATE ON SCHEMA public TO hive;

GRANT ALL PRIVILEGES ON ALL TABLES    IN SCHEMA public TO hive;
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO hive;
GRANT ALL PRIVILEGES ON ALL FUNCTIONS IN SCHEMA public TO hive;

ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT ALL ON TABLES    TO hive;
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT ALL ON SEQUENCES TO hive;
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT ALL ON FUNCTIONS TO hive;

SQL

3.6.2. HiveDBアクセス設定

pg1/pg2/pg3で実施

sudo tee -a /var/lib/pgsql/16/data/pg_hba.conf >/dev/null <<'EOF'
# ------------------------------------------------------------
# 3) Hive Metastore
# ------------------------------------------------------------
host    hive_metastore  hive        192.168.11.37/32            scram-sha-256
host    hive_metastore  hive        192.168.11.38/32            scram-sha-256
host    hive_metastore  hive        192.168.11.39/32            scram-sha-256

EOF
sudo tee -a /etc/pgpool-II/pool_hba.conf <<EOF
# ------------------------------------------------------------
# Hive Metastore -> Pgpool VIP
# ------------------------------------------------------------
host    hive_metastore  hive    192.168.11.54/32    scram-sha-256
host    hive_metastore  hive    192.168.11.55/32    scram-sha-256

EOF
sudo systemctl reload postgresql-16
sudo systemctl reload pgpool-II

3.6.3. HiveDBアクセス認証情報配布

  • 【pg1】認証情報作成
sudo -u postgres bash -lc 'pg_enc -m -k ~/.pgpoolkey -u hive -p'
→HivePasswordHereを入れる
  • 【pg1】/tmp に一時コピーを作る(root)
sudo cp /etc/pgpool-II/pool_passwd /tmp/pool_passwd
sudo cp /var/lib/pgsql/.pgpoolkey /tmp/.pgpoolkey

sudo chown postgres:postgres /tmp/pool_passwd /tmp/.pgpoolkey
sudo chmod 600 /tmp/pool_passwd /tmp/.pgpoolkey
  • 【pg1】postgres SSH で配布
sudo -u postgres scp -i /var/lib/pgsql/.ssh/id_rsa_pgpool \
  /tmp/pool_passwd /tmp/.pgpoolkey \
  postgres@pg2:/tmp/

sudo -u postgres scp -i /var/lib/pgsql/.ssh/id_rsa_pgpool \
  /tmp/pool_passwd /tmp/.pgpoolkey \
  postgres@pg3:/tmp/
  • 【pg2 / pg3】正規配置(root)
sudo mv /tmp/pool_passwd /etc/pgpool-II/pool_passwd
sudo chown postgres:postgres /etc/pgpool-II/pool_passwd
sudo chmod 600 /etc/pgpool-II/pool_passwd
sudo mv /tmp/.pgpoolkey /var/lib/pgsql/.pgpoolkey
sudo chown postgres:postgres /var/lib/pgsql/.pgpoolkey
sudo chmod 600 /var/lib/pgsql/.pgpoolkey
  • Pgpool 反映(全ノード)
sudo systemctl restart pgpool-II
  • 【後始末】pg1 の /tmp を掃除
sudo rm -f /tmp/pool_passwd /tmp/.pgpoolkey

3.7. Metastore スキーマ初期化(hive1で1 回のみ)

sudo -u hadoop /usr/lib/hive/bin/schematool -dbType postgres -initSchema

3.8. サービス作成

sudo tee /etc/default/hive <<'EOF'
HIVE_HOME=/usr/lib/hive
HIVE_CONF_DIR=/etc/hive/conf
HADOOP_CONF_DIR=/etc/hadoop/conf
YARN_CONF_DIR=/etc/hadoop/conf
MAPRED_CONF_DIR=/etc/hadoop/conf
JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
TERM=dumb
EOF
sudo tee /etc/systemd/system/hive-metastore.service <<'EOF'
[Unit]
Description=Apache Hive Metastore Service
After=network.target
Wants=network.target

After=hadoop-hdfs-namenode.service hadoop-hdfs-datanode.service hadoop-yarn-resourcemanager.service hadoop-yarn-nodemanager.service
Wants=hadoop-hdfs-namenode.service hadoop-hdfs-datanode.service hadoop-yarn-resourcemanager.service hadoop-yarn-nodemanager.service

[Service]
Type=simple
User=hive
Group=hive
EnvironmentFile=-/etc/default/hive
Environment="HIVE_CONF_DIR=/etc/hive/conf"

ExecStart=/usr/lib/hive/bin/hive --service metastore
Restart=on-failure
RestartSec=5
LimitNOFILE=100000

[Install]
WantedBy=multi-user.target
EOF
sudo tee /etc/systemd/system/hiveserver2.service <<'EOF'
[Unit]
Description=Apache HiveServer2 Service
After=network.target hive-metastore.service
Wants=network.target hive-metastore.service

[Service]
Type=simple
User=hive
Group=hive
EnvironmentFile=-/etc/default/hive
Environment="HADOOP_CLIENT_OPTS=-Dlog4j2.debug=false"
Environment="HIVE_OPTS=--hiveconf hive.root.logger=INFO,console --hiveconf hive.server2.logging.operation.enabled=true"
Environment="HADOOP_HEAPSIZE=1024"

ExecStartPre=/bin/bash -lc 'for i in {1..30}; do nc -z localhost 9083 && exit 0; sleep 1; done; exit 1'
ExecStart=/usr/lib/hive/bin/hive --service hiveserver2
Restart=on-failure
RestartSec=5
LimitNOFILE=100000

[Install]
WantedBy=multi-user.target
EOF

3.9. HDFS 上に Hive warehouse 作成(master1で実施)

既存のHadoopクラスタに対し、以下の設定を実施すること。

sudo su - hadoop

hdfs dfs -mkdir -p /user/hive/warehouse
hdfs dfs -chown -R hive:hive /user/hive
hdfs dfs -chmod 771 /user/hive
hdfs dfs -chmod 771 /user/hive/warehouse
hdfs dfs -chmod -R 1777 /tmp

exit

3.10. 起動(hive1/hive2)

sudo systemctl enable --now hive-metastore hiveserver2

4. 動作確認(Hive)

4.1. beeline/zeppelin利用確認

それぞれのHive接続で使用するJDBC設定を以下のように変更して、
それぞれ利用できることを確認する。

変更前

'jdbc:hive2://master1:10000/default'

変更後

'jdbc:hive2://master1:2181,master2:2181,master3:2181/;serviceDiscoveryMode=zooKeeper;zooKeeperNamespace=hiveserver2'

5. 動作確認(PostgreSQL)

5.1 準備

5.1.1 確認用端末

psqlコマンドを使用できるホストを用意する。

psqlコマンドを使用できるようにする。

sudo apt install postgresql-client-16

5.1.2 pg1/pg2/pg3設定

例として以下のIP(192.168.11.71)で登録する。

sudo tee -a /etc/pgpool-II/pool_hba.conf <<EOF
# ope1からのアクセス許可(オプション)
host    all         all         192.168.11.71/32    scram-sha-256 

EOF
sudo systemctl reload pgpool-II

5.1.3 動作確認

ope1にて以下のコマンドを入力して応答が返ることを確認する。

psql -h 192.168.11.40 -p 9999 -U pgpool -d postgres -c "SHOW pool_nodes;"

5.2. 事前確認(共通)

5.2.1. 現在状態(VIP経由で確認)

ope1

psql -h 192.168.11.40 -p 9999 -U pgpool -d postgres -c "SHOW pool_nodes;"

期待結果

pg1 primary
pg2 standby
pg3 standby
status/pg_status: up

5.3. フェールオーバー試験

5.3.1. 概要

目的:primary を pg1 → pg2 に自動的にフェールオーバーさせる。
障害注入方法:pg1のpostgresqlサービスを停止する。
期待する結果:自動的にpg2へDBプライマリが自動的に切り替わり、外からの接続も実施できること。

5.3.2. primary(pg1) の PostgreSQL を停止(障害注入)

pg1

sudo systemctl stop postgresql-16
sudo systemctl is-active postgresql-16 || true

期待結果

inactive

5.3.3. フェールオーバー成立確認(VIP経由)

ope1

psql -h 192.168.11.40 -p 9999 -U pgpool -d postgres -c "SHOW pool_nodes;"

期待結果(数十秒〜で変化)

pg1 は status/pg_status=down になる
pg2 が role=primary / pg_role=primary になる
pg3 は standby のまま

5.3.4. 新primary(pg2) 側で “本当にprimaryか” を確認

pg2

sudo -u postgres psql -c "select pg_is_in_recovery();"

期待結果

f(= primary)

5.3.5. レプリケーション確認

pg2

sudo -u postgres psql -c "select client_addr,state,sync_state,application_name from pg_stat_replication;"

期待結果

何も出ないこと。

5.4. スタンバイ復旧(pg1/pg3)

5.4.1. 概要

目的:pg1/pg3をスタンバイ待機させ、pg3からいつでもフェーるバックできるようにする。
リスク:pg2のスタンバイとしてpg1/pg3が立ち上がらなくなり、クラスタ状態が壊れる
対策:basebackup方式を利用し、pg1/pg3のDB削除、pg2からのリストア,pgpoolへのBackendDB再登録を手動で確実に実施する。

5.4.2. pg1 を basebackup で作り直す

pg1

sudo systemctl stop postgresql-16 || true
sudo mv /var/lib/pgsql/16/data /var/lib/pgsql/16/data.old.$(date +%F-%H%M%S)
sudo install -d -o postgres -g postgres -m 700 /var/lib/pgsql/16/data
sudo restorecon -RFv /var/lib/pgsql/16/data || true
sudo -u postgres /usr/pgsql-16/bin/pg_basebackup \
  -h pg2 -p 5432 -U repl \
  -D /var/lib/pgsql/16/data \
  -R -X stream -C -S "pg1" \
  --write-recovery-conf
sudo systemctl start postgresql-16
sudo systemctl is-active postgresql-16

期待結果

pg1のpostgresql-16 が active

確認(pg1で):

sudo -u postgres psql -c "select pg_is_in_recovery();"

期待結果

t(= standby)

5.4.3. pg3 を basebackup で作り直す

pg3

sudo systemctl stop postgresql-16 || true
sudo mv /var/lib/pgsql/16/data /var/lib/pgsql/16/data.old.$(date +%F-%H%M%S)
sudo install -d -o postgres -g postgres -m 700 /var/lib/pgsql/16/data
sudo restorecon -RFv /var/lib/pgsql/16/data || true
sudo -u postgres /usr/pgsql-16/bin/pg_basebackup \
  -h pg2 -p 5432 -U repl \
  -D /var/lib/pgsql/16/data \
  -R -X stream -C -S "pg3" \
  --write-recovery-conf
sudo systemctl start postgresql-16
sudo systemctl is-active postgresql-16

期待結果

pg3のpostgresql-16 が active

確認(pg3で):

sudo -u postgres psql -c "select pg_is_in_recovery();"

期待結果

t(= standby)

5.4.4. pgpool Attach実施

pg2で実施

  • node 0(pg1) を attach
pcp_attach_node -h 127.0.0.1 -p 9898 -U pgpool -n 0
  • node 2(pg3) を attach
pcp_attach_node -h 127.0.0.1 -p 9898 -U pgpool -n 2

5.4.5. pgpool視点で復旧確認(VIP経由)

ope1

psql -h 192.168.11.40 -p 9999 -U pgpool -d postgres -c "SHOW pool_nodes;"

期待結果

pg1 standby
pg2 primary
pg3 standby
status/pg_status: up

5.4.5. レプリケーション確認

pg2

sudo -u postgres psql -c "select client_addr,state,sync_state,application_name from pg_stat_replication;"

期待結果

pg1/pg3 が並ぶ(2行)

5.5. フェイルバック

5.5.1. 概要

目的:primary を pg2 → pg1 に戻す
リスク:pgpool稼働中にpg2を止めると、自動判定が走る可能性(pg1に確実に戻したい。)
pg1のスタンバイとしてpg2/pg3が立ち上がらなくなり、クラスタ状態が壊れる
→ 対策:フェイルバック作業中だけ pgpoolを全台止める
basebackup方式を利用し、pg2/pg3のDB削除、pg2からのリストアを手動で確実に実施する。
pgpoolへのBackendDB再登録は事前にpgpoolを停止しているため必要ない。

5.5.2. pgpool を全台停止(pg1/pg2/pg3)

各ノードで:

sudo systemctl stop pgpool-II
sudo systemctl is-active pgpool-II || true

期待結果

3台とも pgpool-II inactive

5.5.3. 現primary(pg2) を停止

pg2

sudo systemctl stop postgresql-16
sudo systemctl is-active postgresql-16 || true

期待結果

pg2 postgresql-16 inactive

5.5.4. pg1 を primary に昇格

pg1

sudo -u postgres /usr/pgsql-16/bin/pg_ctl -D /var/lib/pgsql/16/data -w promote
sudo -u postgres psql -c "select pg_is_in_recovery();"

期待結果

f(pg1 primary)

5.5.5. pg3 を pg1 の standby として作り直し

pg3:basebackupで作り直す

sudo systemctl stop postgresql-16 || true
sudo mv /var/lib/pgsql/16/data /var/lib/pgsql/16/data.old.$(date +%F-%H%M%S)
sudo install -d -o postgres -g postgres -m 700 /var/lib/pgsql/16/data
sudo restorecon -RFv /var/lib/pgsql/16/data || true
sudo -u postgres /usr/pgsql-16/bin/pg_basebackup \
  -h pg1 -p 5432 -U repl \
  -D /var/lib/pgsql/16/data \
  -R -X stream -C -S "pg3" \
  --write-recovery-conf
sudo systemctl start postgresql-16
sudo -u postgres psql -c "select pg_is_in_recovery();"

期待結果

t(pg3 standby)

5.5.6. pg2 を pg1 の standby として作り直す

pg2:basebackupで作り直す

sudo systemctl stop postgresql-16 || true
sudo mv /var/lib/pgsql/16/data /var/lib/pgsql/16/data.old.$(date +%F-%H%M%S)
sudo install -d -o postgres -g postgres -m 700 /var/lib/pgsql/16/data
sudo restorecon -RFv /var/lib/pgsql/16/data || true
sudo -u postgres /usr/pgsql-16/bin/pg_basebackup \
  -h pg1 -p 5432 -U repl \
  -D /var/lib/pgsql/16/data \
  -R -X stream -C -S "pg2" \
  --write-recovery-conf
sudo systemctl start postgresql-16
sudo -u postgres psql -c "select pg_is_in_recovery();"

期待結果

t(pg2 standby)

5.5.7. pg1でレプリケーション確認

pg1

sudo -u postgres psql -c "select client_addr,state,sync_state,application_name from pg_stat_replication;"

期待結果

pg2/pg3 が並ぶ(2行)

5.5.8. pgpool を全台起動

(pg1→pg2→pg3の順番で)

sudo systemctl start pgpool-II
sudo systemctl is-active pgpool-II

5.5.9. VIP経由で最終確認

ope1

psql -h 192.168.11.40 -p 9999 -U pgpool -d postgres -c "SHOW pool_nodes;"

期待結果

pg1 primary
pg2 standby
pg3 standby
status/pg_status: up

1
0
5

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?