源码:bitnami-docker-postgresql
- https://github.com/bitnami/bitnami-docker-postgresql
使用以下环境变量,可以使用 Bitnami PostgreSQL Docker 镜像
轻松设置流复制集群:
POSTGRESQL_REPLICATION_MODE
: replication 模式。可能的值master
/slave
。没有默认值。POSTGRESQL_REPLICATION_USER
: 首次运行时在主服务器上创建的 replication 用户。没有默认值。POSTGRESQL_REPLICATION_PASSWORD
: replication 用户密码。 没有默认值。POSTGRESQL_REPLICATION_PASSWORD_FILE
: 包含 replication 用户密码的文件的路径。这将覆盖POSTGRESQL_REPLICATION_PASSWORD
中指定的值。没有默认值。POSTGRESQL_MASTER_HOST
: replication master(slave 参数)Hostname/IP。没有默认值。POSTGRESQL_MASTER_PORT_NUMBER
: replication master 的服务器端口(slave 参数)。默认是5432
。
在复制(replication)
集群中,您可以拥有一个主(master)
服务器和零个或多个从(slave)
服务器。 启用复制后,master
节点处于读写模式,而 slave
节点处于只读模式。 为了获得最佳性能,建议将读取限制在 slave
上。
- http://www.postgresql.org/docs/9.4/static/warm-standby.html#STREAMING-REPLICATION
第一步是启动 master。
$ docker run --name postgresql-master \
-e POSTGRESQL_REPLICATION_MODE=master \
-e POSTGRESQL_USERNAME=my_user \
-e POSTGRESQL_PASSWORD=password123 \
-e POSTGRESQL_DATABASE=my_database \
-e POSTGRESQL_REPLICATION_USER=my_repl_user \
-e POSTGRESQL_REPLICATION_PASSWORD=my_repl_password \
bitnami/postgresql:latest
在此命令中,我们使用 POSTGRESQL_REPLICATION_MODE=master
参数将容器配置为 master
容器。使用 POSTGRESQL_REPLICATION_USER
和 POSTGRESQL_REPLICATION_PASSWORD
参数指定 replication
用户。
接下来我们启动一个 replication slave
容器。
$ docker run --name postgresql-slave \
--link postgresql-master:master \
-e POSTGRESQL_REPLICATION_MODE=slave \
-e POSTGRESQL_MASTER_HOST=master \
-e POSTGRESQL_MASTER_PORT_NUMBER=5432 \
-e POSTGRESQL_REPLICATION_USER=my_repl_user \
-e POSTGRESQL_REPLICATION_PASSWORD=my_repl_password \
bitnami/postgresql:latest
在上面的命令中,使用 POSTGRESQL_REPLICATION_MODE
参数将容器配置为slave
。 在 replication slave
启动之前,slave
容器使用 POSTGRESQL_MASTER_HOST
和 POSTGRESQL_MASTER_PORT_NUMBER
参数连接到 master
并从 master
复制初始数据库。POSTGRESQL_REPLICATION_USER
和 POSTGRESQL_REPLICATION_PASSWORD
凭证用于向 master
进行身份验证。为了改变 pg_hba.conf
的默认设置,slave
需要知道是否设置了 POSTGRESQL_PASSWORD
。
使用这两个命令,您现在可以启动并运行一个两节点 PostgreSQL
主从(master-slave
)流复制集群。 您可以通过添加/删除从(slave)
服务器来扩展集群,而不会导致任何停机。
Note: 集群完整地复制 master 服务器,包括所有用户和数据库。
如果 master
服务器宕机,您可以重新配置一个 slave
服务器作为 master
服务器并通过创建触发器文件 /tmp/postgresql.trigger.5432
开始接受写入。例如,以下命令将 postgresql-slave
重新配置为 master
服务器:
$ docker exec postgresql-slave touch /tmp/postgresql.trigger.5432
Note: 需要更新集群中其他
slave
服务器的配置,以便他们知道新的master
服务器。这将要求您根据我们的示例使用--link postgresql-slave:master
重新启动其他slave
服务器。
使用 Docker Compose
,可以使用以下方式设置主从复制:
version: '2'
services:
postgresql-master:
image: 'bitnami/postgresql:latest'
ports:
- '5432'
volumes:
- 'postgresql_master_data:/bitnami/postgresql'
environment:
- POSTGRESQL_REPLICATION_MODE=master
- POSTGRESQL_REPLICATION_USER=repl_user
- POSTGRESQL_REPLICATION_PASSWORD=repl_password
- POSTGRESQL_USERNAME=my_user
- POSTGRESQL_PASSWORD=my_password
- POSTGRESQL_DATABASE=my_database
postgresql-slave:
image: 'bitnami/postgresql:latest'
ports:
- '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_PASSWORD=my_password
- POSTGRESQL_MASTER_PORT_NUMBER=5432
volumes:
postgresql_master_data:
使用以下方法缩放 slave
的数量:
$ docker-compose up --detach --scale postgresql-master=1 --scale postgresql-slave=3
上面的命令将 slave
的数量增加到 3
。你可以用同样的方法缩小。
同步提交Note: 您不应该扩大/缩小主节点的数量。始终只运行一个主节点。
默认情况下,slave
实例配置为异步复制。为了保证更高的数据稳定性(以牺牲一些性能为代价),可以使用以下环境变量设置同步提交(即,在将事务提交写入一组副本之前,事务提交不会将成功返回给客户端)。
POSTGRESQL_SYNCHRONOUS_COMMIT_MODE
: 建立同步提交的类型。可用选项有:on
、remote_apply
、remote_write
、local
和off
。 默认值为on
。有关更多信息,请查看官方 PostgreSQL 文档。- https://www.postgresql.org/docs/9.6/runtime-config-wal.html#GUC-SYNCHRONOUS-COMMIT
POSTGRESQL_NUM_SYNCHRONOUS_REPLICAS
: 确定将启用同步复制的副本数。此数量不得超过您在集群中配置的slave
的数量。
使用 Docker Compose
,可以按如下方式设置带有同步提交的主从复制:
version: '2'
services:
postgresql-master:
image: 'bitnami/postgresql:latest'
ports:
- '5432'
volumes:
- 'postgresql_master_data:/bitnami/postgresql'
environment:
- POSTGRESQL_REPLICATION_MODE=master
- POSTGRESQL_REPLICATION_USER=repl_user
- POSTGRESQL_REPLICATION_PASSWORD=repl_password
- POSTGRESQL_USERNAME=my_user
- POSTGRESQL_PASSWORD=my_password
- POSTGRESQL_DATABASE=my_database
- POSTGRESQL_SYNCHRONOUS_COMMIT_MODE=on
- POSTGRESQL_NUM_SYNCHRONOUS_REPLICAS=1
volumes:
- '/path/to/postgresql-persistence:/bitnami/postgresql'
postgresql-slave:
image: 'bitnami/postgresql:latest'
ports:
- '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_MASTER_PORT_NUMBER=5432
postgresql-slave2:
image: 'bitnami/postgresql:latest'
ports:
- '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_MASTER_PORT_NUMBER=5432
在上面的示例中,提交需要同时写入主服务器和其中一个从服务器才能被接受。另一个 slave
将继续使用异步复制。使用以下 SQL
查询对其进行检查:
postgres=# select application_name as server, state,
postgres-# sync_priority as priority, sync_state
postgres-# from pg_stat_replication;
| server | state | priority | sync_state |
|-------------|-----------|----------|------------|
| walreceiver | streaming | 0 | sync |
| walreceiver | streaming | 0 | async |
更多Note: 对于更高级的设置,您可以通过设置
POSTGRESQL_CLUSTER_APP_NAME
环境变量,使用application_name
参数定义不同的复制组。
- Pgpool-II 4.3 中文手册-前言
- pgpool-II 4.3 中文手册 - 入门教程
- 「在 Kubernetes 上运行 Pgpool-Il」实现 PostgreSQL 查询(读)负载均衡和连接池