如何将repmgr与dockerized Postgresql一起使用?

时间:2017-09-02 16:08:13

标签: postgresql docker repmgr

我正在尝试使用复制和自动故障转移创建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。没有错误。但是当我登录到主机并验证复制是否正在运行时 - 它不是。

  1. 是否可以为dockerized postgres运行repmgr?
  2. 如果是这样,怎么样?我做错了什么?
  3. 如果没有,如何在不手动配置每个服务器的情况下创建postgres集群复制?你知道,不是将服务器视为宠物,而是将牛视为牛等。)
  4. 我使用和创建的文件: 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"]
    

1 个答案:

答案 0 :(得分:0)

您可以使用pg-dock,使用pg-dock,您可以使用repmgr运行dockerized postgres集群,否则您可以浏览项目并了解这些内容是如何工作的。

祝你好运。