@@ -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 " " -p $PORT_PRIMARY " " $PRIMARY_LOGFILE " 
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 " " -p $PORT_PRIMARY " " $PRIMARY_LOGFILE " 
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 " $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 " " -p $PORT_REPLICA " " $REPLICA_LOGFILE " 
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 " 
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 " 
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 " " -p $PORT_PRIMARY " " $PRIMARY_LOGFILE " 
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