我正在嘗試使用複製和自動故障轉移來創建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正常啓動。沒有錯誤。但是當我登錄到主機並驗證複製是否正在運行時 - 事實並非如此。
- 是否有可能爲dockerized postgres運行repmgr?
- 如果是這樣,怎麼樣?我究竟做錯了什麼?
- 如果不是,我怎樣才能創建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"]