2017-09-02 42 views
0

我正在嘗試使用複製和自動故障轉移來創建Postgresql安裝程序。我希望它是可重用的,可擴展的和可移植的,所以我試圖用docker來運行Postgres。我也不想重新發明輪子,所以我嘗試使用repmgr,因爲它是建立postgres複製時推薦的工具。如何使用dockerized Postgresql的repmgr?

在第一臺機器上,我使用docker-compose和簡單的Dockerfile啓動了主節點。然後我添加了bash腳本以在容器啓動後運行。它看起來像主人正確安裝。

然後在第二臺機器上,我嘗試運行待機。我開始在碼頭工作postgres和實驗。正如我們可以在repmgr github repo上看到的那樣,爲了運行待機狀態,我需要使用repmgr命令克隆主機,該命令在內部使用pg_basebackup。 Pg_basebackup不會讓我將db克隆到非空目錄(pgdata)中,所以我需要在克隆之前刪除由dockerized postgres創建的pgdata。當我這樣做時,容器就會死亡,因爲當然唯一的服務,postgres,沒有文件就死掉了。所以我不能運行repmgr命令後,因爲沒有容器來運行它:)

所以我試着創建另一個Dockerfile只有standbies。內部pgdata被刪除,然後repmgr克隆主,然後postgres正常啓動。沒有錯誤。但是當我登錄到主機並驗證複製是否正在運行時 - 事實並非如此。

  1. 是否有可能爲dockerized postgres運行repmgr?
  2. 如果是這樣,怎麼樣?我究竟做錯了什麼?
  3. 如果不是,我怎樣才能創建postgres集羣複製,而無需手動配置每個服務器?要知道,沒有治療服務器作爲寵物飼養,但如牛等:)

文件我用創造: 泊塢窗 - 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"] 

bash腳本運行時postgres的容器(主)是活的:

#!/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

您可以使用pg-dock,與PG-碼頭,你可以運行repmgr dockerized Postgres的集羣,否則你可以遊覽項目,並得到理解的事情是如何工作的。

祝你好運。