我正在尝试使用复制和自动故障转移创建Postgresql设置。我希望它是可重用的,可扩展的和可移植的,所以我尝试使用docker来运行Postgres。我也不想重新发明轮子,所以我尝试使用repmgr,因为它是建议postgres复制时的推荐工具。
在第一台机器上,我使用docker-compose和简单的Dockerfile启动了主节点。然后我添加了bash脚本以在容器启动后运行。它看起来像主人设置正确。
然后在第二台机器上我试图运行待机状态。我在docker中开始postgres并进行了实验。我们可以在repmgr github repo上阅读,要运行待机,我需要使用repmgr命令克隆master,它在内部使用pg_basebackup。 Pg_basebackup不会让我将db克隆到非空目录(pgdata)中,所以我需要在克隆之前删除由dockerized postgres创建的pgdata。当我这样做时,容器会死掉,因为当然唯一的服务就是postgres,它会在没有文件的情况下死掉。所以我之后无法运行repmgr命令,因为没有容器可以在里面运行它:)
所以我尝试仅为备用数据库创建另一个Dockerfile。删除里面的pgdata,然后repmgr clones master,然后正确启动postgres。没有错误。但是当我登录到主机并验证复制是否正在运行时 - 它不是。
我使用和创建的文件: docker-compose.yml(主节点和备用节点):
version: '3'
services:
db:
build:
context: .
volumes:
- ${DATABASE_STORAGE_PATH}:/var/lib/postgresql/data
env_file:
- .env
environment:
- PGDATA=/var/lib/postgresql/data/pgdata
ports:
- ${DB_PORT}:5432
Master Dockerfile:
FROM postgres:9.6.4
# install repmgr
RUN apt-get update \
&& apt-get install -y repmgr
# COPY conf files
COPY repmgr.conf .
COPY postgres.replication.conf /var/lib/postgresql/data/pgdata/
RUN echo "include '/var/lib/postgresql/data/pgdata/postgres.replication.conf'" >> /var/lib/postgresql/data/pgdata/postgresql.conf
CMD ["postgres"]
当postgres容器(master)处于活动状态时运行的Bash脚本:
#!/bin/bash
CONTAINER_ID="replicatest2_db_1"
docker exec -d $CONTAINER_ID createuser -s repmgr -U postgres
docker exec -d $CONTAINER_ID createdb repmgr -O repmgr -U postgres
docker exec -d $CONTAINER_ID su postgres -c 'repmgr -f repmgr.conf master register'
备用docker-compose是一样的。待机Dockerfile:
FROM postgres:9.6.4
# install repmgr
RUN apt-get update \
&& apt-get install -y repmgr
# COPY repmgr conf
COPY repmgr.conf .
RUN rm -rf /var/lib/postgresql/data/pgdata
RUN su postgres -c "repmgr -h {master-host} -p {master-port} -U repmgr -d repmgr -D /var/lib/postgresql/data/pgdata -f repmgr.conf standby clone"
CMD ["postgres"]
答案 0 :(得分:0)
您可以使用pg-dock,使用pg-dock,您可以使用repmgr运行dockerized postgres集群,否则您可以浏览项目并了解这些内容是如何工作的。
祝你好运。