我正在尝试创建带有复制和自动故障转移的Postgresql设置。我希望它是可重用的、可扩展的和可移植的,所以我尝试使用docker来运行Postgres。我也不想重新发明轮子,所以我尝试使用repmgr,因为它是在设置postgres复制时推荐的工具。
在第一台机器上,我使用Dockerfile和简单的Dockerfile启动主节点.然后,我添加了bash脚本,以便在容器启动后运行。看来主人被正确设置了。
然后,在第二台机器上,我试着运行备用。我在码头启动了postgres公司并进行了实验。由于我们可以在repmgr回购上阅读,要运行备用,我需要使用repmgr命令克隆主程序,该命令在内部使用pg_basebackup。Pg_basebackup不允许我将db克隆到非空目录( pgdata ),所以在克隆之前,我需要删除由dockerized创建的pgdata。当我这样做的时候,容器就会死掉,因为当然,唯一的服务postgres会在没有文件的情况下死去。因此,之后我无法运行repmgr命令,因为在以下内容中没有容器来运行它:)
因此,我尝试创建另一个Dockerfile,仅用于站立。移除pgdata内部,然后repmgr克隆主,然后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主治医生:
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容器(主服务器)还活着时运行的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'待机对接-合成是相同的。备用文件:
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"]发布于 2017-09-03 15:05:11
您可以使用船坞,对于pg-坞,您可以使用repmgr运行dockerized集群,否则您可以探索项目并了解事情是如何工作的。
祝好运。
https://stackoverflow.com/questions/46015714
复制相似问题