diff --git a/defaults/main.yml b/defaults/main.yml index 406b915..62daa6d 100644 --- a/defaults/main.yml +++ b/defaults/main.yml @@ -19,7 +19,8 @@ psql_db_size_c: 170000000 psql_listen_on_ext_int: False psql_use_alternate_data_dir: False # Deb/Ubuntu -psql_data_dir: '/var/lib/postgresql/{{ psql_version }}/main' +psql_data_root_dir: '/var/lib/postgresql/{{ psql_version }}' +psql_data_dir: '{{ psql_data_root_dir }}/main' psql_conf_dir: '/etc/postgresql/{{ psql_version }}/main' psql_log_dir: /var/log/postgresql diff --git a/templates/pgpool_recovery_stage_1.j2 b/templates/pgpool_recovery_stage_1.j2 index d202a49..9427182 100644 --- a/templates/pgpool_recovery_stage_1.j2 +++ b/templates/pgpool_recovery_stage_1.j2 @@ -5,17 +5,15 @@ TS=$(date +%Y-%m-%d_%H-%M-%S) MASTER_HOST=$(hostname -f) # $1 is {{ psql_data_dir }} while $3 is {{ psql_data_dir }} -MASTER_DATA=$1 -MASTER_DATA_BASE_DIR={{ psql_data_dir }} +#MASTER_DATA="{{ psql_data_dir }}" +MASTER_DATA="${1}" RECOVERY_TARGET=${2} -RECOVERY_DATA=${3} -RECOVERY_DATA_BASE_DIR={{ psql_data_dir }} +#RECOVERY_DATA="{{ psql_data_dir }}" +RECOVERY_DATA="${3}" logger "pgpool_recovery_1: MASTER_DATA=$MASTER_DATA" logger "pgpool_recovery_1: RECOVERY_DATA=$RECOVERY_DATA" -archive_dir={{ psql_wal_archiving_log_dir }} - # Ensure that postgres is shut down on the target node ssh -T $RECOVERY_TARGET sudo /etc/init.d/postgresql stop @@ -23,21 +21,20 @@ ssh -T $RECOVERY_TARGET sudo /etc/init.d/postgresql stop ssh -T $RECOVERY_TARGET \ "[ -d $RECOVERY_DATA ] && mv $RECOVERY_DATA $RECOVERY_DATA.$TS" -# If the archive dir is not empty the backup fails -ssh -T $RECOVERY_TARGET \ - "[ -d $archive_dir ] && rm $archive_dir/*" - # We only use archived WAL logs during recoveries, so delete all # logs from the last recovery to limit the growth. -rm $archive_dir/* +rm $MASTER_DATA/archive_log/* # With this file present, our archive_command will actually # archive WAL files. -touch $archive_dir/backup_in_progress +touch $MASTER_DATA/archive_log/backup_in_progress -psql -c "select pg_start_backup('pgpool-recovery')" postgres -echo "restore_command = 'scp $MASTER_HOST:$archive_dir/%f %p'" > $RECOVERY_DATA/recovery.conf -tar -C $MASTER_DATA_BASE_DIR -zcf pgsql.tar.gz main -psql -c 'select pg_stop_backup()' postgres -scp pgsql.tar.gz $RECOVERY_TARGET:$RECOVERY_DATA_BASE_DIR +# Perform a backup of the database. +ssh -T $RECOVERY_TARGET \ + "pg_basebackup -h $MASTER_HOST -D $RECOVERY_DATA --xlog" + +# Configure the restore_command to use the archive_log WALs we’ll copy +# over in 2nd_stage.sh. +echo "restore_command = 'cp $RECOVERY_DATA/archive_log/%f %p'" | \ + ssh -T $RECOVERY_TARGET "cat > $RECOVERY_DATA/recovery.conf" diff --git a/templates/pgpool_recovery_stage_2.j2 b/templates/pgpool_recovery_stage_2.j2 index d9e037b..4c22bed 100644 --- a/templates/pgpool_recovery_stage_2.j2 +++ b/templates/pgpool_recovery_stage_2.j2 @@ -1,20 +1,20 @@ #!/bin/bash # Online recovery 2nd stage script # -MASTER_DATA_BASE_DIR={{ psql_data_dir }} -MASTER_DATA=${1} +#MASTER_DATA="{{ psql_data_dir }}" +MASTER_DATA="${1}" RECOVERY_TARGET=${2} -RECOVERY_DATA_BASE_DIR={{ psql_data_dir }} -RECOVERY_DATA=${3} -port={{ psql_db_port }} # PostgreSQL port number +#RECOVERY_DATA="{{ psql_data_dir }}" +RECOVERY_DATA="${3}" -archive_dir={{ psql_wal_archiving_log_dir }} +port="{{ psql_db_port }}" # PostgreSQL port number + +archive_dir="{{ psql_wal_archiving_log_dir }}" logger "pgpool_recovery_2: MASTER_DATA=$MASTER_DATA" logger "pgpool_recovery_2: RECOVERY_DATA=$RECOVERY_DATA" logger "pgpool_recovery_2: archive_dir=$archive_dir" - # Force to flush current value of sequences to xlog psql -p $port -t -c 'SELECT datname FROM pg_database WHERE NOT datistemplate AND datallowconn' template1| while read i @@ -27,11 +27,11 @@ done # Flush all transactions to disk. Since pgpool stopped all connections, # there cannot be any data that does not reside on disk until the # to-be-recovered host is back on line. -psql -p $port -c "SELECT pgpool_switch_xlog('$archive_dir')" template1 +psql -p $port -c "SELECT pgpool_switch_xlog('$MASTER_DATA/archive_log')" template1 # Copy over all archive logs at once. -rsync -avx --delete $archive_dir/ \ - $RECOVERY_TARGET:$archive_dir/ +rsync -avx --delete $MASTER_DATA/archive_log/ \ + $RECOVERY_TARGET:$RECOVERY_DATA/archive_log/ # Delete the flag file to disable WAL archiving again. -rm $archive_dir/backup_in_progress +rm $MASTER_DATA/archive_log/backup_in_progress diff --git a/templates/pgpool_remote_start.j2 b/templates/pgpool_remote_start.j2 index 6c44c25..397c491 100644 --- a/templates/pgpool_remote_start.j2 +++ b/templates/pgpool_remote_start.j2 @@ -3,6 +3,6 @@ DEST=$1 DESTDIR=$2 # Deploy a base backup -ssh -T $DEST 'cd {{ psql_data_dir }}; tar zxf pgsql.tar.gz' 2>/dev/null 1>/dev/null < /dev/null +ssh -T $DEST 'cd {{ psql_data_root_dir }}; tar zxf pgsql.tar.gz' 2>/dev/null 1>/dev/null < /dev/null # Startup PostgreSQL server ssh -T $DEST sudo /etc/init.d/postgresql start 2>/dev/null 1>/dev/null < /dev/null