Pgpool load balancer for Postgres based on https://github.com/paunin/postgres-docker-cluster
1.1K
This project includes:
postgresql cluster
Two docker images were produced:
pgmaster (primary node1) --|
|- pgslave1 (node2) --|
| |- pgslave2 (node3) --|----pgpool (master_slave_mode stream)
|- pgslave3 (node4) --|
|- pgslave4 (node5) --|
Each postgres node (pgmaster, pgslaveX) is managed by repmgr/repmgrd. It allows to use automatic failover and check cluster status.
To start cluster run it as normal docker-compose application docker-compose up -d
Please check comments for each ENV variable in docker-compose.yml file to understand parameter for cluster's node
To make it easier repository contains services' objects under k8s dir
minikube (for local tests) and kubectlminikube start, minikube envPostgreSQL cluster: kubectl create -f ./k8s/database-service/postgres node to be able to access DB (e.g. docker-compose exec pgpool bash -c 'PGPASSWORD=$CHECK_PASSWORD psql -U $CHECK_USER -h localhost template1 -c "show pool_nodes"')PGPASSWORD=monkey_pass psql -U monkey_user -h database-pgpool-service -p 5432 monkey_dbgosu postgres repmgr cluster showInitial topology:
gosu postgres repmgr cluster show
[2016-12-28 06:46:13] [INFO] connecting to database
Role | Name | Upstream | Connection String
----------+-------|----------|----------------------------------------------------------------------------------------------------------------
* master | node1 | | user=replication_user password=replication_pass host=pgmaster dbname=replication_db port=5432 connect_timeout=2
standby | node4 | node1 | user=replication_user password=replication_pass host=pgslave3 dbname=replication_db port=5432 connect_timeout=2
standby | node2 | node1 | user=replication_user password=replication_pass host=pgslave1 dbname=replication_db port=5432 connect_timeout=2
standby | node3 | node2 | user=replication_user password=replication_pass host=pgslave2 dbname=replication_db port=5432 connect_timeout=2
standby | node5 | node4 | user=replication_user password=replication_pass host=pgslave4 dbname=replication_db port=5432 connect_timeout=2
PGPASSWORD=$CHECK_PASSWORD psql -U $CHECK_USER -h localhost template1 -c "show pool_nodes"
node_id | hostname | port | status | lb_weight | role
---------+----------+------+--------+-----------+---------
0 | pgmaster | 5432 | 2 | 0.250000 | primary
1 | pgslave1 | 5432 | 2 | 0.250000 | standby
2 | pgslave2 | 5432 | 2 | 0.250000 | standby
3 | pgslave3 | 5432 | 2 | 0.250000 | standby
Don't try restart docker-compose without cleaning volumes after any failover (unless you use environment variable FORCE_CLEAN=1 in each container)
You should update cluster with new topology manually because second start of initial master will bring inconsistent in the cluster.
Optionally you can reconfigure your pgpool to ignore initial master before second start
Abnormal but possible situation in cluster:
gosu postgres repmgr cluster show
Role | Name | Upstream | Connection String
----------+-------|----------|----------------------------------------------------------------------------------------------
standby | node3 | node2 | user=replication_user password=replication_pass host=pgslave2 dbname=replication_db port=5432
standby | node5 | node4 | user=replication_user password=replication_pass host=pgslave4 dbname=replication_db port=5432
* master | node1 | | user=replication_user password=replication_pass host=pgmaster dbname=replication_db port=5432
* master | node2 | | user=replication_user password=replication_pass host=pgslave1 dbname=replication_db port=5432
standby | node4 | node2 | user=replication_user password=replication_pass host=pgslave3 dbname=replication_db port=5432
postgres node):
gosu postgres repmgr cluster show - tries to connect to all nodes on request ignore status of node in repmgr_$CLUSTER_NAME.repl_nodesgosu postgres psql $REPLICATION_DB -c "SELECT * FROM repmgr_$CLUSTER_NAME.repl_nodes" - just select data from tablespostgres node) gosu postgres repmgr cluster crosscheckpgpool status (on any pgpool node): PGPASSWORD=$CHECK_PASSWORD psql -U $CHECK_USER -h localhost template1 -c "show pool_nodes"pgpool container check if primary node exists: /usr/local/bin/pgpool/has_write_node.shAny command might be wrapped with docker-compose or kubectl - docker-compose exec {NODE} bash -c '{COMMAND}' or kubectl exec {POD_NAME} -- bash -c '{COMMAND}'
Check the document to understand different cases of failover, split-brain resistance and recovery
pgslave1) will cause dieing of whole branch (https://groups.google.com/forum/?hl=fil#!topic/repmgr/lPAYlawhL0o)Content type
Image
Digest
Size
117.4 MB
Last updated
over 9 years ago
docker pull gnames/postgres-cluster-pgpool