-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathMakefile
107 lines (93 loc) · 3.82 KB
/
Makefile
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
# PostgreSQL Replication Makefile
# Variables
PROJECT ?= psql-repl
PRIMARY_NAME = postgres-primary
REPLICA_NAME = postgres-replica
# Database settings
DB_USER = myuser
DB_PASSWORD = mypassword
DB_NAME = mydatabase
REPL_USER = replicator
REPL_PASSWORD = replpassword
ADMIN_PASSWORD = adminpassword
# Deploy primary
deploy-primary:
oc new-app registry.redhat.io/rhel9/postgresql-16~https://github.com/fjcloud/psql-repl.git \
--name=$(PRIMARY_NAME) \
-e POSTGRESQL_USER=$(DB_USER) \
-e POSTGRESQL_PASSWORD=$(DB_PASSWORD) \
-e POSTGRESQL_DATABASE=$(DB_NAME) \
-e POSTGRESQL_REPLICATION_USER=$(REPL_USER) \
-e POSTGRESQL_REPLICATION_PASSWORD=$(REPL_PASSWORD) \
-e POSTGRESQL_REPLICA_HOST=$(REPLICA_NAME) \
-e POSTGRESQL_ADMIN_PASSWORD=$(ADMIN_PASSWORD) \
-e IS_PRIMARY=true
oc set volume deployment/$(PRIMARY_NAME) --add \
--name=postgres-data \
--type=pvc \
--claim-size=10Gi \
--mount-path=/var/lib/pgsql/data
# Deploy replica
deploy-replica:
oc new-app registry.redhat.io/rhel9/postgresql-16~https://github.com/fjcloud/psql-repl.git \
--name=$(REPLICA_NAME) \
-e POSTGRESQL_REPLICATION_USER=$(REPL_USER) \
-e POSTGRESQL_REPLICATION_PASSWORD=$(REPL_PASSWORD) \
-e POSTGRESQL_PRIMARY_HOST=$(PRIMARY_NAME) \
-e IS_PRIMARY=false \
-e POSTGRESQL_MIGRATION_REMOTE_HOST=$(PRIMARY_NAME) \
-e POSTGRESQL_MIGRATION_ADMIN_PASSWORD=$(ADMIN_PASSWORD) \
-e POSTGRESQL_MIGRATION_IGNORE_ERRORS=yes
oc set volume deployment/$(REPLICA_NAME) --add \
--name=postgres-data \
--type=pvc \
--claim-size=10Gi \
--mount-path=/var/lib/pgsql/data
# Deploy all components
deploy-all: deploy-primary deploy-replica
# Promote replica to primary
promote-replica:
oc exec deployment/$(REPLICA_NAME) -- pg_ctl promote -D /var/lib/pgsql/data/userdata
# Set replica to read-only
set-readonly:
oc rsh deployment/$(REPLICA_NAME) psql -U postgres -c "ALTER SYSTEM SET default_transaction_read_only = on;"
oc rsh deployment/$(REPLICA_NAME) psql -U postgres -c "SELECT pg_reload_conf();"
# Verify replication status
verify:
@echo "Checking primary status..."
@oc rsh deployment/$(PRIMARY_NAME) psql -U postgres -c "SELECT * FROM pg_stat_replication;"
@echo "\nChecking replica status..."
@oc rsh deployment/$(REPLICA_NAME) psql -U postgres -c "SELECT pg_is_in_recovery();"
# Create test data
create-test-data:
oc rsh deployment/$(PRIMARY_NAME) psql -U postgres -d $(DB_NAME) -c "\
CREATE TABLE IF NOT EXISTS sample_table ( \
id SERIAL PRIMARY KEY, \
data TEXT, \
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP \
); \
INSERT INTO sample_table (data) SELECT md5(random()::text) FROM generate_series(1, 1000);"
# Clean up primary
clean-primary:
oc delete pvc $$(oc get deployment $(PRIMARY_NAME) -o jsonpath='{.spec.template.spec.volumes[*].persistentVolumeClaim.claimName}') --wait=false
oc delete all -l app=$(PRIMARY_NAME)
# Clean up replica
clean-replica:
oc delete pvc $$(oc get deployment $(REPLICA_NAME) -o jsonpath='{.spec.template.spec.volumes[*].persistentVolumeClaim.claimName}') --wait=false
oc delete all -l app=$(REPLICA_NAME)
# Clean everything
clean-all: clean-primary clean-replica
# Show help
help:
@echo "Available targets:"
@echo " deploy-primary - Deploy primary PostgreSQL instance"
@echo " deploy-replica - Deploy replica PostgreSQL instance"
@echo " deploy-all - Deploy all components"
@echo " promote-replica - Promote replica to primary"
@echo " set-readonly - Set replica to read-only mode"
@echo " verify - Check replication status"
@echo " create-test-data - Create test table and data"
@echo " clean-primary - Remove primary instance"
@echo " clean-replica - Remove replica instance"
@echo " clean-all - Remove all components"
.PHONY: deploy-primary deploy-replica deploy-all promote-replica set-readonly verify create-test-data clean-primary clean-replica clean-all help