@@ -12,8 +12,8 @@ PG_BASEBACKUP="$INSTALL_DIR/bin/pg_basebackup"
1212PSQL=" $INSTALL_DIR /bin/psql"
1313SYSBENCH=" /usr/bin/sysbench"
1414
15- PORT_PRIMARY=5432
16- PORT_REPLICA=5433
15+ PORT_PRIMARY=5433
16+ PORT_REPLICA=5434
1717REPL_USER=repl
1818REPL_PASS=replica
1919DB_NAME=postgres
@@ -22,22 +22,18 @@ DB_USER=$(whoami)
2222# Clean slate
2323pkill -9 postgres
2424rm -rf " $PRIMARY_DATA " " $REPLICA_DATA "
25- rm -rf /tmp/primary_keyfile
2625
2726# Step 1: Init primary
2827$INSTALL_DIR /bin/initdb -D " $PRIMARY_DATA "
2928
3029# Configure primary
3130cat >> " $PRIMARY_DATA /postgresql.conf" << EOF
3231port = $PORT_PRIMARY
33- shared_preload_libraries = 'pg_tde'
34- default_table_access_method = 'tde_heap'
3532wal_level = replica
36- wal_compression = on
3733wal_log_hints = on
38- wal_keep_size = 512MB
34+ wal_keep_size = 1024MB
3935max_replication_slots = 2
40- max_wal_senders = 2
36+ max_wal_senders = 10
4137listen_addresses = 'localhost'
4238logging_collector = on
4339log_directory = 'log'
@@ -51,92 +47,87 @@ echo "=> Step 1: Start primary"
5147echo " #########################"
5248$PG_CTL -D " $PRIMARY_DATA " -o " -p $PORT_PRIMARY " -l " $PRIMARY_LOGFILE " start
5349sleep 3
54- $PSQL -p $PORT_PRIMARY -d $DB_NAME -c " CREATE EXTENSION pg_tde;"
55- $PSQL -p $PORT_PRIMARY -d $DB_NAME -c " SELECT pg_tde_add_global_key_provider_file('file_provider','/tmp/primary_keyfile');"
56- $PSQL -p $PORT_PRIMARY -d $DB_NAME -c " SELECT pg_tde_create_key_using_global_key_provider('key1','file_provider');"
57- $PSQL -p $PORT_PRIMARY -d $DB_NAME -c " SELECT pg_tde_set_default_key_using_global_key_provider('key1','file_provider');"
58- $PSQL -p $PORT_PRIMARY -d $DB_NAME -c " ALTER SYSTEM SET pg_tde.wal_encrypt=ON;"
59- # Restart primary
60- $PG_CTL -D " $PRIMARY_DATA " -o " -p $PORT_PRIMARY " -l " $PRIMARY_LOGFILE " restart
61- sleep 3
50+ $PSQL -p $PORT_PRIMARY -d $DB_NAME -c " CREATE TABLE t1(a int, b varchar(20));"
6251
6352# Create replication user
6453$PSQL -p $PORT_PRIMARY -d $DB_NAME -c " CREATE ROLE $REPL_USER WITH LOGIN REPLICATION SUPERUSER PASSWORD '$REPL_PASS ';"
6554
66- # Create tables
67- $PSQL -p $PORT_PRIMARY -d $DB_NAME -c " CREATE TABLE t1(id INT, name TEXT);"
68- $PSQL -p $PORT_PRIMARY -d $DB_NAME -c " INSERT INTO t1 VALUES(101,'First Record Before BaseBackup');"
69-
7055echo " => Step 2: Take base backup for replica"
7156echo " #######################################"
7257$PG_BASEBACKUP -D " $REPLICA_DATA " -X stream -R -h localhost -p $PORT_PRIMARY -U $REPL_USER
7358
7459# Configure replica
7560cat > " $REPLICA_DATA /postgresql.conf" << EOF
7661port = $PORT_REPLICA
77- shared_preload_libraries = 'pg_tde'
78- default_table_access_method = 'tde_heap'
7962hot_standby = on
8063logging_collector = on
8164log_directory = 'log'
8265log_filename = 'replica.log'
83- wal_level = replica
84- wal_compression = on
85- wal_keep_size= 512MB
86- max_wal_senders = 2
66+ wal_keep_size=1024MB
67+ max_wal_senders = 10
8768EOF
8869
8970echo " =>Step 3: Start replica"
9071echo " ########################"
9172$PG_CTL -D " $REPLICA_DATA " -o " -p $PORT_REPLICA " -l " $REPLICA_LOGFILE " start
92- sleep 5
93- $PSQL -p $PORT_REPLICA -d $DB_NAME -c " ALTER SYSTEM SET pg_tde.wal_encrypt=ON; "
94- # Restart replica
95- $PG_CTL -D " $REPLICA_DATA " -o " -p $PORT_REPLICA " -l " $REPLICA_LOGFILE " restart
96- sleep 5
73+ sleep 2
74+
75+ echo " => Check if replication is working "
76+ $PSQL -p $PORT_PRIMARY -d $DB_NAME -c " INSERT INTO t1 VALUES(1,'mohit'); "
77+ sleep 2
9778
98- echo " =>Step 4: Generate some WAL on primary "
99- $PSQL -p $PORT_PRIMARY -d $DB_NAME -c " INSERT INTO t1 VALUES (102, 'Second Record After Setting Streaming Replication') ;"
79+ echo " => Verify if rows get replicated "
80+ $PSQL -p $PORT_REPLICA -d $DB_NAME -c " SELECT * FROM t1 ;"
10081
82+ echo " =>Step 4: Stop primary (simulate crash)"
83+ echo " #######################################"
84+ echo " Simulating primary crash..."
10185$PG_CTL -D " $PRIMARY_DATA " -m immediate stop
102- sleep 3
10386
10487echo " => Step 5: Promote replica"
10588echo " ##########################"
106- # Remove auto conf file which was created by pg_basebackup
107- rm -f $REPLICA_DATA /postgresql.auto.conf
10889$PG_CTL -D " $REPLICA_DATA " promote
90+ sleep 5
10991
110- echo " =>Step 6: Use sysbench to generate WAL on promoted replica"
92+ echo " =>Step 6: Create table to generate WAL on promoted replica"
11193echo " ##########################################################"
112- echo " Generating WAL with sysbench ..."
113- $PSQL -p $PORT_REPLICA -d $DB_NAME -c " INSERT INTO t1 VALUES(103,'Third Record Replicated Via PgRewind' );"
94+ echo " Generating WAL..."
95+ $PSQL -p $PORT_REPLICA -d $DB_NAME -c " CREATE TABLE t2(a int, b varchar(20) );"
11496
11597# Backing up the Original config file
11698cp $PRIMARY_DATA /postgresql.conf /tmp/postgresql_bk.conf
117- echo " => Step 8 : Rewind old primary"
99+ echo " => Step 7 : Rewind old primary"
118100echo " ############################"
119101echo " Rewinding old primary..."
120102$PG_REWIND --target-pgdata=" $PRIMARY_DATA " \
121103 --source-server=" host=localhost port=$PORT_REPLICA user=$REPL_USER dbname=$DB_NAME "
122104
123105# Restoring the Original config file
124- cp /tmp/postgresql_bk.conf $PRIMARY_DATA /postgresql.conf
106+ mv /tmp/postgresql_bk.conf $PRIMARY_DATA /postgresql.conf
125107
126- echo " => Step 9 : Configure old primary as standby"
108+ echo " => Step 8 : Configure old primary as standby"
127109echo " ###########################################"
128110touch $PRIMARY_DATA /standby.signal
129111cat >> " $PRIMARY_DATA /postgresql.conf" << EOF
130112primary_conninfo = 'host=localhost port=$PORT_REPLICA user=$REPL_USER password=$REPL_PASS '
131113EOF
132114
133- echo " => Step 10 : Start rewound primary"
115+ echo " => Step 9 : Start rewound primary"
134116echo " ################################"
135117$PG_CTL -D " $PRIMARY_DATA " -o " -p $PORT_PRIMARY " -l " $PRIMARY_LOGFILE " start
136118sleep 5
137119
138- # Validate data on both servers
139- $PSQL -p $PORT_PRIMARY -d $DB_NAME -c " SELECT * FROM t1"
140- $PSQL -p $PORT_REPLICA -d $DB_NAME -c " SELECT * FROM t1"
120+ echo " => Check if replication is working"
121+ $PSQL -p $PORT_REPLICA -d $DB_NAME -c " INSERT INTO t2 VALUES(2,'mohit');"
122+ sleep 2
123+
124+ echo " => Verify if rows get replicated"
125+ $PSQL -p $PORT_PRIMARY -d $DB_NAME -c " SELECT * FROM t2;"
126+
127+
128+ # Done
129+ echo -e " \n✅ Check status of Old Primary"
130+ $PSQL -p $PORT_PRIMARY -d $DB_NAME -c " SELECT * FROM pg_stat_wal_receiver;"
141131
142- tail -10f $PRIMARY_DATA /log/primary.log
132+ # Tail logs
133+ tail -n 10 " $PRIMARY_DATA /log/primary.log"
0 commit comments