Skip to content

Instantly share code, notes, and snippets.

@michaljemala
Created August 14, 2020 13:47
Show Gist options
  • Save michaljemala/cf74ccef74e5ae9ea41aaeba4bcc6a46 to your computer and use it in GitHub Desktop.
Save michaljemala/cf74ccef74e5ae9ea41aaeba4bcc6a46 to your computer and use it in GitHub Desktop.
Postgres cluster with streaming replication and pgpool
version: '3.8'
services:
pgmaster:
image: bitnami/postgresql:latest
ports:
- 5432
volumes:
- pgmaster_data:/bitnami/postgresql
environment:
- POSTGRESQL_REPLICATION_MODE=master
- POSTGRESQL_REPLICATION_USER=postgres
- POSTGRESQL_REPLICATION_PASSWORD=s3cret
- POSTGRESQL_PASSWORD=s3cret
- POSTGRESQL_DATABASE=platform
pgslave:
image: bitnami/postgresql:latest
ports:
- 5432
depends_on:
- pgmaster
environment:
- POSTGRESQL_REPLICATION_MODE=slave
- POSTGRESQL_REPLICATION_USER=postgres
- POSTGRESQL_REPLICATION_PASSWORD=s3cret
- POSTGRESQL_MASTER_HOST=pgmaster
- POSTGRESQL_PASSWORD=s3cret
pgpool:
image: docker.io/bitnami/pgpool:latest
ports:
- 5432:5432
depends_on:
- pgmaster
volumes:
- ./pgpool.conf:/config/pgpool.conf
environment:
- PGPOOL_USER_CONF_FILE=/config/pgpool.conf
- PGPOOL_BACKEND_NODES=0:pgmaster:5432:4:master:ALWAYS_MASTER,1:pgslave:5432:6:replica1
- PGPOOL_SR_CHECK_USER=postgres
- PGPOOL_SR_CHECK_PASSWORD=s3cret
- PGPOOL_ENABLE_LDAP=no
- PGPOOL_POSTGRES_USERNAME=postgres
- PGPOOL_POSTGRES_PASSWORD=s3cret
- PGPOOL_ADMIN_USERNAME=admin
- PGPOOL_ADMIN_PASSWORD=s3cret
- PGPOOL_ENABLE_LOAD_BALANCING=yes
- PGPOOL_ENABLE_STATEMENT_LOAD_BALANCING=yes
- PGPOOL_NUM_INIT_CHILDREN=10
- PGPOOL_MAX_POOL=1
- PGPOOL_EXTRA_FLAGS=-d
volumes:
pgmaster_data:
@petre-c
Copy link

petre-c commented Jul 24, 2024

@michaljemala , can you elaborate on this line? Documentation page for bitnami/pgpool doesn't mention these extra options

- PGPOOL_BACKEND_NODES=0:pgmaster:5432:4:master:ALWAYS_MASTER,1:pgslave:5432:6:replica1

@michaljemala
Copy link
Author

Hello @petre-c The env variable is used to define the nodes in pgPool cluster. You can see more detailed info here: https://github.com/bitnami/containers/blob/a5510700758f036fc681f43eea79c33d49c8e11a/bitnami/pgpool/4/debian-12/rootfs/opt/bitnami/scripts/libpgpool.sh#L179-L192.
To illustrate the example this specific line 0:pgmaster:5432:4:master:ALWAYS_MASTER,1:pgslave:5432:6:replica1 describes a 2 nodes cluster:

  1. Master
  • NodeID=0
  • Host=pgmaster
  • Port=5432
  • Weight=4 (40%)
  • DataDir=master
  1. Replica
  • NodeID=1
  • Host=pgslave
  • Port=5432
  • Weight=6 (60%)
  • DataDir =replica1

As per the code: https://github.com/bitnami/containers/blob/main/bitnami/pgpool/4/debian-12/rootfs/opt/bitnami/scripts/libpgpool.sh#L401-L427, it will result in pgpool config snippet as follows:

backend_hostname0 = 'pgmaster'
backend_port0 = 5432
backend_weight0 = 4
backend_data_directory0 = 'master'

backend_hostname1 = 'pgslave'
backend_port1 = 5432
backend_weight1 = 6
backend_data_directory1 = 'replica1'

You can see an example of this in the docs: https://www.pgpool.net/docs/latest/en/html/example-replication-mode.html#EXAMPLE-REPLICATION-MODE-BACKEND-SETTINGS

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment