2017-09-02 1 views
0

J'essaye de créer l'installation de Postgresql avec la réplication et le basculement automatique. Je voulais qu'il soit réutilisable, évolutif et portable, j'ai donc essayé d'utiliser docker pour exécuter Postgres. Je ne voulais pas non plus réinventer la roue, j'ai donc essayé d'utiliser repmgr car c'est un outil recommandé lors de la configuration de la réplication postgres.Comment utiliser repmgr avec Postgresql dockerized?

Sur la première machine, j'ai commencé nœud maître à l'aide docker-Compose et simple Dockerfile. Puis j'ai ajouté le script bash à exécuter après le début du conteneur. Il semble que le maître a été configuré correctement.

Puis sur la deuxième machine, j'ai essayé de courir en veille. J'ai commencé postgres dans docker et expérimenté. Comme on peut le lire sur repmgr github repo, pour exécuter je besoin de secours pour cloner maître avec repmgr commande, qui utilise pg_basebackup en interne. Pg_basebackup ne me laissera pas cloner db dans un répertoire non vide (pgdata), donc j'ai besoin de supprimer pgdata créé par postgres dockerized avant de cloner. Quand je fais ça, le conteneur meurt, car bien sûr le seul service, postgres, meurt sans ses fichiers. Donc, je ne peux pas exécuter la commande repmgr par la suite, car il n'y a pas de conteneur pour l'exécuter à l'intérieur :)

J'ai donc essayé de créer un autre Dockerfile pour standbies uniquement. Inside pgdata est supprimé, puis repmgr clones master, puis postgres est démarré correctement. Il n'y a pas d'erreurs Mais lorsque je me connecte à la machine maître et que je vérifie si la réplication est en cours, ce n'est pas le cas.

  1. Est-il possible d'exécuter repmgr pour postgres dockerized?
  2. Si oui, comment? Qu'est-ce que je fais mal?
  3. Sinon, comment puis-je créer une réplication de cluster Postgres sans configurer manuellement chaque serveur? Vous savez, ne pas traiter les serveurs comme animaux de compagnie, mais comme le bétail etc :)

Fichiers I utilisé et créé: docker-compose.yml (maître et noeud veille):

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 

Maître 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"] 

script Bash pour exécuter lorsque le conteneur postgres (maître) est vivant:

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

Le docker-composer en attente est le même. Veille 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"] 

Répondre

0

Vous pouvez utiliser pg-dock, avec pg-dock vous pouvez exécuter dockerized cluster postgres avec repmgr, sinon vous pouvez explorer le projet et obtenir à comprendre comment les choses sont le travail.

Bonne chance.