pgpool2.git / summary / log / commit / refs

commit    6ff2ac0a512c858b580fedccae28fbf7db48b00f
Author:   Tatsuo Ishii <ishii@postgresql.org>
Date:     Fri Jul 29 06:27:56 2016 +0000

    Add new script called "watchdog_setup".
    
    watchdog_setup is intended to test watchdog, and does not suitable for
    a production use. wachdog_setup uses pgpool_setup as a workhorse and
    you need the script which comes with pgpool-II source code.


src/test/watchdog_setup | 317 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 317 insertions(+) diff --git a/src/test/watchdog_setup b/src/test/watchdog_setup new file mode 100755 index 000000000..c3a687ae2 --- /dev/null +++ b/src/test/watchdog_setup @@ -0,0 +1,317 @@ +#!/usr/bin/env bash +# +# Copyright (c) 2013-2016 PgPool Global Development Group +# +# Permission to use, copy, modify, and distribute this software and +# its documentation for any purpose and without fee is hereby +# granted, provided that the above copyright notice appear in all +# copies and that both that copyright notice and this permission +# notice appear in supporting documentation, and that the name of the +# author not be used in advertising or publicity pertaining to +# distribution of the software without specific, written prior +# permission. The author makes no representations about the +# suitability of this software for any purpose. It is provided "as +# is" without express or implied warranty. +#------------------------------------------------------------------- +# Set up watchdog enabled pgpool-II and PostgreSQL temporary +# installation in current directory for *testing* purpose. Do not use +# this tool for production environment! +# Note that this script uses pgpool_setup as a work horse. +# +# usage: watchdog_setup [-wn num_pgpool][-wp watchdog_base_port][-m r|s|n][-n num_clusters][-p base_port][--no-stop][-d] +# -wn num_pgpool: create num_pgpool pgpool nodes. The default is 3. Must be greater than 1. +# -wp watchdog_base_port: starting port number. The default is +# 50000. +#------------------------------------------- +# Configuration section +#------------------------------------------- +# Number of Pgpool-II installations. +W_NUM_PGPOOL=${W_NUM_PGPOOL:-"3"} + +# Starting port number. +W_BASE_PORT=${W_BASE_PORT:-"50000"} + +# PostgreSQL startig port number. +export PGBASEPORT=`expr $W_BASE_PORT + 1000` + +# number of ports used in a single pgpool-II installation. +# (port, pcp_port, wd_port, wd_heartbeat_port) +num_ports_per_node=4 + +#------------------------------------------- +# End of configuration section +#------------------------------------------- +# +# user name +WHOAMI=`whoami` + +# our root directory +BASEDIR=`pwd` + +# location of pgpool_setup +PGPOOL_SETUP=${PGPOOL_SETUP:-"pgpool_setup"} + +# PostgreSQL bin directory +INITDB=$PGBIN/initdb +PG_CTL=$PGBIN/pg_ctl +PSQL=$PGBIN/psql + +#------------------------------------------- +# set postgresql.conf +# argument: PostgreSQL database cluster directory +#------------------------------------------- +function set_postgresql_conf +{ + PGCONF=$1/postgresql.conf + + echo "listen_addresses = '*'" >> $PGCONF + echo "port = $PORT" >> $PGCONF + echo "logging_collector = on" >> $PGCONF + echo "log_filename = '%A.log'" >> $PGCONF + echo "log_line_prefix = '%p %t '" >> $PGCONF + echo "log_truncate_on_rotation = on" >> $PGCONF + echo "log_statement = 'all'" >> $PGCONF + echo "max_prepared_transactions = 10" >> $PGCONF + echo "unix_socket_directories = '$PGSOCKET_DIR'" >> $PGCONF + + if [ $MODE = "s" ];then + echo "hot_standby = on" >> $PGCONF + echo "wal_level = hot_standby" >> $PGCONF + echo "max_wal_senders = $NUMCLUSTERS" >> $PGCONF + echo "archive_mode = on" >> $PGCONF + echo "archive_command = 'cp %p $BASEDIR/archivedir/%f </dev/null'" >> $PGCONF + elif [ $MODE = 'r' ];then + echo "wal_level = archive" >> $PGCONF + echo "archive_mode = on" >> $PGCONF + echo "archive_command = 'cp %p $BASEDIR/archivedir/%f </dev/null'" >> $PGCONF + fi + + ed $1/pg_hba.conf <<EOF +/^#local *replication/s/^#//p +/^#host *replication/s/^#//p +/^#host *replication/s/^#//p +w +q +EOF + +} + +#------------------------------------------- +# set pgpool.conf +# argument: absolute path to pgpool.conf +#------------------------------------------- +function set_pgpool_conf { + echo "sr_check_user = '$WHOAMI'" >> $CONF + echo "recovery_user = '$WHOAMI'" >> $CONF + echo "recovery_password = ''" >> $CONF + echo "recovery_1st_stage_command = 'basebackup.sh'" >> $CONF + + if [ $MODE = "r" ];then + echo "recovery_2nd_stage_command = 'pgpool_recovery_pitr'" >> $CONF + fi + + echo "health_check_period = 10" >> $CONF + echo "health_check_user = '$WHOAMI'" >> $CONF + OIDDIR=$BASEDIR/log/pgpool/oiddir + mkdir -p $OIDDIR + echo "memqcache_oiddir = '$OIDDIR'" >> $CONF + echo "log_per_node_statement = on" >> $CONF + + if [ $MODE = "s" ];then + echo "failover_command = '$FAILOVER_SCRIPT %d %h %p %D %m %M %H %P %r %R'" >> $CONF + fi + + echo "socket_dir = '$PGSOCKET_DIR'" >> $CONF + echo "pcp_socket_dir = '$PGSOCKET_DIR'" >> $CONF +} + +#------------------------------------------- +# wait for pgpool comes up +#------------------------------------------- +function wait_for_pgpool_startup { + timeout=20 + + while [ $timeout -gt 0 ] + do + $PSQL -p $PGPOOL_PORT -c "show pool_nodes" postgres >/dev/null 2>&1 + if [ $? = 0 ];then + # echo "pgpool-II comes up after `expr 20 - $timeout` seconds" + break; + fi + timeout=`expr $timeout - 1` + sleep 1 + done +} + +#------------------------------------------- +# wait for pgpool reload finished +#------------------------------------------- +function wait_for_pgpool_reload { + timeout=20 + num_node=$1 + + while [ $timeout -gt 0 ] + do + N=`$PSQL -p $PGPOOL_PORT -c "show pool_status" test | grep backend_data | wc -l` + if [ $N = $num_node ];then + break; + fi + timeout=`expr $timeout - 1` + sleep 1 + done +} + +#------------------------------------------- +# Set watchdog params to pgpool.conf +#------------------------------------------- +function set_watchdog_params { + id=$1 + num_pgpool=$2 + base_port=$3 + priority=`expr $num_pgpool - $id` + n=0 + conf=etc/pgpool.conf + wd_port=`expr $base_port + \( $id \* $num_ports_per_node \) + 2` + wd_heartbeat_port=`expr $wd_port + 1` + + cat >> $conf <<EOF +use_watchdog = on +wd_interval = 1 +wd_priorty = $priority +wd_hostname = 'localhost' +wd_port = $wd_port +wd_heartbeat_port = $wd_heartbeat_port +EOF + + suf=0 + while [ $n -lt $num_pgpool ] + do + if [ $id != $n ];then + echo "heartbeat_destination$suf = 'localhost'" >> $conf + pgpool_port=`expr $base_port + \( $n \* $num_ports_per_node \)` + pcp_port=`expr $pgpool_port + 1` + wd_port=`expr $pcp_port + 1` + wd_heartbeat_port=`expr $wd_port + 1` + echo "heartbeat_destination_port$suf = $wd_heartbeat_port" >> $conf + echo "other_pgpool_hostname$suf = 'localhost'" >> $conf + echo "other_pgpool_port$suf = $pgpool_port" >> $conf + echo "other_wd_port$suf = $wd_port" >> $conf + suf=`expr $suf + 1` + fi + n=`expr $n + 1` + done +} + +################################################################################# +# +# main script +# +################################################################################ +function usage() +{ + echo "usage: $0 [-wn num_pgpool][-wp watchdog_base_port][-m r|s|n] [-n num_clusters] [-p base_port] [-pg pg_base_port][--no-stop] [-d]";exit 1 +} + +#------------------------------------------- +# Argument check +# usage: $0 [-wn num_pgpool][-wp watchdog_base_port][-m r|s|n][-n num_clusters][-p base_port][-pg pg_base_port][--no-stop][-d] +#------------------------------------------- +# +# default mode is streaming replication mode +MODE="s" +NO_STOP="false" + +while [ $# -gt 0 ] +do + if [ $1 = "-wn" ];then + shift + W_NUM_PGPOOL=$1 + elif [ $1 = "-wp" ];then + shift + W_BASE_PORT=$1 + PGBASEPORT=`expr $W_BASE_PORT + 1000` + + # rest are pgpool_setup args + + elif [ $1 = "-m" ];then + shift + case $1 in + r ) MODE="r";; + s ) MODE="s";; + n ) MODE="n";; + * ) usage;; + esac + elif [ $1 = "-n" ];then + shift + export NUMCLUSTERS=$1 + elif [ $1 = "-p" ];then + shift + export BASEPORT=$1 + elif [ $1 = "-pg" ];then + shift + export PGBASEPORT=$1 + elif [ $1 = "--no-stop" ];then + shift + NO_STOP="true" + elif [ $1 = "-d" ];then + export PGPOOLDEBUG="true" + shift; + elif [ $1 = "--help" -o $1 = "-o" ];then + usage + exit + else + usage + exit + fi + shift +done + +#------------------------------------------- +# Make sure that current directory is empty +#------------------------------------------- +if [ "`/bin/ls`" != "" ] +then + echo "$0: Current directory is not empty. Please remove files and directories then try again." + exit 1 +fi + +#------------------------------------------- +# everything looks good. starting setup... +#------------------------------------------- +echo "Satrting set up " + +#------------------------------------------- +# Run pgpool_setup +#------------------------------------------- + +STARTALL=$BASEDIR/startall +SHUTDOWNALL=$BASEDIR/shutdownall + +cnt=0 + +while [ $cnt -lt $W_NUM_PGPOOL ] +do + echo "============= setting up pgpool $cnt =============" + mkdir pgpool$cnt + cd pgpool$cnt + port=`expr $W_BASE_PORT + \( $cnt \* $num_ports_per_node \)` + $PGPOOL_SETUP -p $port -pg $PGBASEPORT + set_watchdog_params $cnt $W_NUM_PGPOOL $W_BASE_PORT + + # remove "pg_ctl start" line from startall/shutdownall script in other than pgpool0 + if [ $cnt != 0 ] + then + sed -i '/.*data.*/d' startall + sed -i '/.*data.*/d' shutdownall + fi + + echo "cd pgpool$cnt" >> $STARTALL + echo "./startall" >> $STARTALL + echo "cd .." >> $STARTALL + echo "cd pgpool$cnt" >> $SHUTDOWNALL + echo "./shutdownall" >> $SHUTDOWNALL + echo "cd .." >> $SHUTDOWNALL + + cd .. + cnt=`expr $cnt + 1` +done [parent: cf319c48dadc]