diff --git a/.github/workflows/jpa-boot-read-replica-postgresql.yml b/.github/workflows/jpa-boot-read-replica-postgresql.yml index 4ca1bc661..19508175c 100644 --- a/.github/workflows/jpa-boot-read-replica-postgresql.yml +++ b/.github/workflows/jpa-boot-read-replica-postgresql.yml @@ -33,7 +33,7 @@ jobs: cache: "maven" - name: Start up databases via docker compose run: | - docker compose up -d postgresql-master postgresql-slave + docker compose -f docker/docker-compose.yml up -d postgresql-master postgresql-slave sleep 5 docker ps -a - name: Build and analyze diff --git a/.vscode/launch.json b/.vscode/launch.json index fd5cad552..516c647fd 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -292,6 +292,16 @@ "projectName": "boot-scheduler-quartz", "args": "--spring.profiles.active=local", "envFile": "${workspaceFolder}/.env" + }, + { + "type": "java", + "name": "Spring Boot-ReadReplicaApplication", + "request": "launch", + "cwd": "${workspaceFolder}", + "mainClass": "com.example.demo.readreplica.ReadReplicaApplication", + "projectName": "boot-read-replica-postgresql", + "args": "", + "envFile": "${workspaceFolder}/.env" } ] } diff --git a/jpa/boot-read-replica-postgresql/docker-compose.yaml b/jpa/boot-read-replica-postgresql/docker-compose.yaml deleted file mode 100644 index 3e7644958..000000000 --- a/jpa/boot-read-replica-postgresql/docker-compose.yaml +++ /dev/null @@ -1,46 +0,0 @@ -services: - postgresql-master: - image: 'bitnami/postgresql:latest' - ports: - - '5432:5432' - volumes: - - 'postgresql_master_data:/bitnami/postgresql' - environment: - - POSTGRESQL_PGAUDIT_LOG=READ,WRITE - - POSTGRESQL_LOG_HOSTNAME=TRUE - - POSTGRESQL_REPLICATION_MODE=master - - POSTGRESQL_REPLICATION_USER=repl_user - - POSTGRESQL_REPLICATION_PASSWORD=repl_password - - POSTGRESQL_USERNAME=postgres_write - - POSTGRESQL_PASSWORD=postgres_write - - POSTGRESQL_DATABASE=my_database - postgresql-slave: - image: 'bitnami/postgresql:latest' - ports: - - '15432:5432' - depends_on: - - postgresql-master - environment: - - POSTGRESQL_REPLICATION_MODE=slave - - POSTGRESQL_REPLICATION_USER=repl_user - - POSTGRESQL_REPLICATION_PASSWORD=repl_password - - POSTGRESQL_MASTER_HOST=postgresql-master - - POSTGRESQL_USERNAME=postgres_write - - POSTGRESQL_PASSWORD=postgres_write - - POSTGRESQL_MASTER_PORT_NUMBER=5432 - - POSTGRESQL_PGAUDIT_LOG=READ,WRITE - - POSTGRESQL_LOG_HOSTNAME=TRUE - - pgadmin4: - image: dpage/pgadmin4 - ports: - - "5050:80" - depends_on: - - postgresql-master - environment: - - PGADMIN_DEFAULT_EMAIL=pgadmin4@pgadmin.org - - PGADMIN_DEFAULT_PASSWORD=admin - -volumes: - postgresql_master_data: - driver: local \ No newline at end of file diff --git a/jpa/boot-read-replica-postgresql/docker/configure-master.sh b/jpa/boot-read-replica-postgresql/docker/configure-master.sh new file mode 100644 index 000000000..ac563c18e --- /dev/null +++ b/jpa/boot-read-replica-postgresql/docker/configure-master.sh @@ -0,0 +1,25 @@ +#!/bin/bash +set -euo pipefail + +echo "Configuring PostgreSQL master for replication..." + +# Update postgresql.conf for replication +cat >> "$PGDATA/postgresql.conf" <> "$PGDATA/pg_hba.conf" < /dev/null 2>&1 +do + echo "Waiting for master database..." + sleep 3 +done + +echo "Master is ready. Checking if slave data exists..." + +if [ "$(ls -A $PGDATA 2>/dev/null)" ]; then + echo "Data directory exists, starting PostgreSQL..." + # Change ownership and start as postgres user + chown -R postgres:postgres "$PGDATA" + exec gosu postgres postgres -c hot_standby=on -c hot_standby_feedback=on +else + echo "Data directory is empty, creating base backup..." + + # Create base backup from master + PGPASSWORD="$REPLICATION_PASSWORD" pg_basebackup \ + -h "$POSTGRES_MASTER_HOST" \ + -p "$POSTGRES_MASTER_PORT" \ + -U "$REPLICATION_USER" \ + -D "$PGDATA" \ + -W \ + -v \ + -R \ + -X stream + + # Set proper permissions + chmod 700 "$PGDATA" + chown -R postgres:postgres "$PGDATA" + + # Add standby configuration + cat >> "$PGDATA/postgresql.conf" <