【发布时间】:2019-10-29 07:51:22
【问题描述】:
我有几个 Postgresql 服务,以及其他一些对我有用的服务(用于创建 HA Postgresql 集群)。该集群在 docker-compose 中描述如下:
version: '3.3'
services:
haproxy:
image: haproxy:alpine
ports:
- "5000:5000"
- "5001:5001"
- "8008:8008"
configs:
- haproxy_cfg
networks:
- dbs
command: haproxy -f /haproxy_cfg
etcd:
image: quay.io/coreos/etcd:v3.1.2
configs:
- etcd_cfg
networks:
- dbs
command: /bin/sh /etcd_cfg
dbnode1:
image: seocahill/patroni:1.2.5
secrets:
- patroni.yml
environment:
- PATRONI_NAME=dbnode1
- PATRONI_POSTGRESQL_DATA_DIR=data/dbnode1
- PATRONI_POSTGRESQL_CONNECT_ADDRESS=dbnode1:5432
- PATRONI_RESTAPI_CONNECT_ADDRESS=dbnode1:8008
env_file:
- test.env
networks:
- dbs
entrypoint: patroni
command: /run/secrets/patroni.yml
dbnode2:
image: seocahill/patroni:1.2.5
secrets:
- patroni.yml
environment:
- PATRONI_NAME=dbnode2
- PATRONI_POSTGRESQL_DATA_DIR=data/dbnode2
- PATRONI_POSTGRESQL_CONNECT_ADDRESS=dbnode2:5432
- PATRONI_RESTAPI_CONNECT_ADDRESS=dbnode2:8008
env_file:
- test.env
networks:
- dbs
entrypoint: patroni
command: /run/secrets/patroni.yml
dbnode3:
image: seocahill/patroni:1.2.5
secrets:
- patroni.yml
environment:
- PATRONI_NAME=dbnode3
- PATRONI_POSTGRESQL_DATA_DIR=data/dbnode3
- PATRONI_POSTGRESQL_CONNECT_ADDRESS=dbnode3:5432
- PATRONI_RESTAPI_CONNECT_ADDRESS=dbnode3:8008
env_file:
- test.env
networks:
- dbs
entrypoint: patroni
command: /run/secrets/patroni.yml
networks:
dbs:
external: true
configs:
haproxy_cfg:
file: config/haproxy.cfg
etcd_cfg:
file: config/etcd.sh
secrets:
patroni.yml:
file: patroni.test.yml
我从https://github.com/seocahill/ha-postgres-docker-stack.git 获取了这个 yml 代码。我使用下一个命令在 docker swarm 中部署此服务 - docker network create -d overlay --attachable dbs && docker stack deploy -c docker-stack.test.yml test_pg_cluster。但是如果我创建一些数据库并向其中插入一些数据然后重新启动服务 - 我的数据将会丢失。
我知道我需要使用volume 在主机上保存数据。
我使用 docker 命令创建卷:docker volume create pgdata 使用默认 docker 卷目录并像这样安装它:
dbnode1:
image: seocahill/patroni:1.2.5
secrets:
- patroni.yml
environment:
- PATRONI_NAME=dbnode1
- PATRONI_POSTGRESQL_DATA_DIR=data/dbnode1
- PATRONI_POSTGRESQL_CONNECT_ADDRESS=dbnode1:5432
- PATRONI_RESTAPI_CONNECT_ADDRESS=dbnode1:8008
env_file:
- test.env
volumes:
pgdata:/data/dbnode1
networks:
- dbs
entrypoint: patroni
command: /run/secrets/patroni.yml
volumes:
pgdata:
当容器启动时,它在容器内的数据目录 data/dbnode1 中有自己的配置。如果我挂载卷pgdata 以在主机中存储数据,我无法连接到数据库并且容器目录data/dbnode1 中有空文件夹。如何创建持久数据卷以在 PostgerSQL 中保存更改的数据?
【问题讨论】:
-
例如docker swarm 不会在集群节点之间同步卷,不建议从主机绑定挂载,除非您为服务添加放置约束,就好像服务崩溃并重新安排到不同的节点,然后您将“松散”您的数据 -您应该在可以从所有节点访问的 nfs 共享中创建 docker 卷。例如可以看看this compose file。
标签: docker docker-compose docker-swarm patroni