@@ -12,8 +12,8 @@ PG_BASEBACKUP="$INSTALL_DIR/bin/pg_basebackup"
12
12
PSQL=" $INSTALL_DIR /bin/psql"
13
13
SYSBENCH=" /usr/bin/sysbench"
14
14
15
- PORT_PRIMARY=5432
16
- PORT_REPLICA=5433
15
+ PORT_PRIMARY=5433
16
+ PORT_REPLICA=5434
17
17
REPL_USER=repl
18
18
REPL_PASS=replica
19
19
DB_NAME=postgres
@@ -22,22 +22,18 @@ DB_USER=$(whoami)
22
22
# Clean slate
23
23
pkill -9 postgres
24
24
rm -rf " $PRIMARY_DATA " " $REPLICA_DATA "
25
- rm -rf /tmp/primary_keyfile
26
25
27
26
# Step 1: Init primary
28
27
$INSTALL_DIR /bin/initdb -D " $PRIMARY_DATA "
29
28
30
29
# Configure primary
31
30
cat >> " $PRIMARY_DATA /postgresql.conf" << EOF
32
31
port = $PORT_PRIMARY
33
- shared_preload_libraries = 'pg_tde'
34
- default_table_access_method = 'tde_heap'
35
32
wal_level = replica
36
- wal_compression = on
37
33
wal_log_hints = on
38
- wal_keep_size = 512MB
34
+ wal_keep_size = 1024MB
39
35
max_replication_slots = 2
40
- max_wal_senders = 2
36
+ max_wal_senders = 10
41
37
listen_addresses = 'localhost'
42
38
logging_collector = on
43
39
log_directory = 'log'
@@ -51,92 +47,87 @@ echo "=> Step 1: Start primary"
51
47
echo " #########################"
52
48
$PG_CTL -D " $PRIMARY_DATA " -o " -p $PORT_PRIMARY " -l " $PRIMARY_LOGFILE " start
53
49
sleep 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));"
62
51
63
52
# Create replication user
64
53
$PSQL -p $PORT_PRIMARY -d $DB_NAME -c " CREATE ROLE $REPL_USER WITH LOGIN REPLICATION SUPERUSER PASSWORD '$REPL_PASS ';"
65
54
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
-
70
55
echo " => Step 2: Take base backup for replica"
71
56
echo " #######################################"
72
57
$PG_BASEBACKUP -D " $REPLICA_DATA " -X stream -R -h localhost -p $PORT_PRIMARY -U $REPL_USER
73
58
74
59
# Configure replica
75
60
cat > " $REPLICA_DATA /postgresql.conf" << EOF
76
61
port = $PORT_REPLICA
77
- shared_preload_libraries = 'pg_tde'
78
- default_table_access_method = 'tde_heap'
79
62
hot_standby = on
80
63
logging_collector = on
81
64
log_directory = 'log'
82
65
log_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
87
68
EOF
88
69
89
70
echo " =>Step 3: Start replica"
90
71
echo " ########################"
91
72
$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
97
78
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 ;"
100
81
82
+ echo " =>Step 4: Stop primary (simulate crash)"
83
+ echo " #######################################"
84
+ echo " Simulating primary crash..."
101
85
$PG_CTL -D " $PRIMARY_DATA " -m immediate stop
102
- sleep 3
103
86
104
87
echo " => Step 5: Promote replica"
105
88
echo " ##########################"
106
- # Remove auto conf file which was created by pg_basebackup
107
- rm -f $REPLICA_DATA /postgresql.auto.conf
108
89
$PG_CTL -D " $REPLICA_DATA " promote
90
+ sleep 5
109
91
110
- echo " =>Step 6: Use sysbench to generate WAL on promoted replica"
92
+ echo " =>Step 6: Create table to generate WAL on promoted replica"
111
93
echo " ##########################################################"
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) );"
114
96
115
97
# Backing up the Original config file
116
98
cp $PRIMARY_DATA /postgresql.conf /tmp/postgresql_bk.conf
117
- echo " => Step 8 : Rewind old primary"
99
+ echo " => Step 7 : Rewind old primary"
118
100
echo " ############################"
119
101
echo " Rewinding old primary..."
120
102
$PG_REWIND --target-pgdata=" $PRIMARY_DATA " \
121
103
--source-server=" host=localhost port=$PORT_REPLICA user=$REPL_USER dbname=$DB_NAME "
122
104
123
105
# 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
125
107
126
- echo " => Step 9 : Configure old primary as standby"
108
+ echo " => Step 8 : Configure old primary as standby"
127
109
echo " ###########################################"
128
110
touch $PRIMARY_DATA /standby.signal
129
111
cat >> " $PRIMARY_DATA /postgresql.conf" << EOF
130
112
primary_conninfo = 'host=localhost port=$PORT_REPLICA user=$REPL_USER password=$REPL_PASS '
131
113
EOF
132
114
133
- echo " => Step 10 : Start rewound primary"
115
+ echo " => Step 9 : Start rewound primary"
134
116
echo " ################################"
135
117
$PG_CTL -D " $PRIMARY_DATA " -o " -p $PORT_PRIMARY " -l " $PRIMARY_LOGFILE " start
136
118
sleep 5
137
119
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;"
141
131
142
- tail -10f $PRIMARY_DATA /log/primary.log
132
+ # Tail logs
133
+ tail -n 10 " $PRIMARY_DATA /log/primary.log"
0 commit comments