我正在尝试使用复制和自动故障转移创建 Postgresql 设置。我希望它是可重用、可扩展和可移植的,所以我尝试使用 docker 来运行 Postgres。我也不想重新发明轮子,所以我尝试使用 repmgr 作为设置 postgres 复制时推荐的工具。
在第一台机器上,我使用 docker-compose 和简单的 Dockerfile 启动了主节点。然后我添加了 bash 脚本在容器启动后运行。看起来 master 设置正确。
然后在第二台机器上我尝试运行待机。我在 docker 中启动了 postgres 并进行了实验。正如我们在repmgr github repo上看到的那样,要运行待机,我需要使用 repmgr 命令克隆 master,该命令在内部使用 pg_basebackup。Pg_basebackup 不会让我将 db 克隆到非空目录(pgdata)中,因此我需要在克隆之前删除由 dockerized postgres 创建的 pgdata。当我这样做时,容器会死掉,因为当然唯一的服务 postgres 会在没有文件的情况下死掉。所以之后我不能运行 repmgr 命令,因为里面没有运行它的容器:)
所以我尝试为备用创建另一个 Dockerfile。内部 pgdata 被删除,然后 repmgr 克隆 master,然后 postgres 正确启动。没有错误。但是当我登录到主机并验证复制是否正在运行时 - 它不是。
- 是否可以为 dockerized postgres 运行 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
主 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 容器(主)处于活动状态时运行的 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"]