【开发笔记】 Postgres-12.1数据库,基于docker-compose做主从备份

如题,关于postgres 12.1版本做主从备份

一开始安装了两个数据库,照着好多教程,配置主数据库后,数据库无法启动,查看启动日志,发现是主数据库的postgresql.conf中的配置了wal_keep_segments,配置文件中有这个参数的说明,但是配置了就无法启动,原因在查找中

折腾了一天,最后在大神的帮助下,基于网上现成的9.5版本的docker,改造调试了下,将12.1版本的整理出来

直接上配置:(将下面四个文件放在一个目录下)

docker-compose

version: '2.0'

services:

  # 从数据库
  postgres-slave:
    build:
      context: ./
      dockerfile: ./Dockerfile
    container_name: PG-SLAVE
    ports:
      - 20002:5432
    links:
      - postgres-master
    environment:
      REPLICATION_ROLE: slave
      POSTGRES_MASTER_SERVICE_HOST: postgres-master
      POSTGRES_PASSWORD: 123456

  # 主数据库
  postgres-master:
    container_name: PG-MASTER
    build:
      context: ./
      dockerfile: ./Dockerfile
    ports:
      - 20001:5432
    environment:
      REPLICATION_ROLE: master
      POSTGRES_PASSWORD: 123456

dockerfile

# -*- mode: conf -*-
FROM postgres:12.1

MAINTAINER ***

# common settings
ENV MAX_CONNECTIONS 500
ENV MAX_WAL_SENDERS 100


# master/slave settings
ENV REPLICATION_USER replication
ENV REPLICATION_PASSWORD 123456

# slave settings
ENV POSTGRES_MASTER_SERVICE_HOST localhost
ENV POSTGRES_MASTER_SERVICE_PORT 5432

COPY 10-config.sh /docker-entrypoint-initdb.d/
COPY 20-replication.sh /docker-entrypoint-initdb.d/
# Evaluate vars inside PGDATA at runtime.
# For example HOSTNAME in 'ENV PGDATA=/mnt/$HOSTNAME'
# is resolved runtime rather then during build
RUN sed -i 's/set -e/set -e -x\nPGDATA=$(eval echo "$PGDATA")/' /docker-entrypoint.sh

两个脚本文件

10-config.sh

#!/bin/bash
set -e

echo [*] configuring $REPLICATION_ROLE instance

echo "max_connections = $MAX_CONNECTIONS" >> "$PGDATA/postgresql.conf"

# We set master replication-related parameters for both slave and master,
# so that the slave might work as a primary after failover.
echo "wal_level = hot_standby" >> "$PGDATA/postgresql.conf"
echo "max_wal_senders = $MAX_WAL_SENDERS" >> "$PGDATA/postgresql.conf"
# slave settings, ignored on master
echo "hot_standby = on" >> "$PGDATA/postgresql.conf"

echo "host replication $REPLICATION_USER 0.0.0.0/0 trust" >> "$PGDATA/pg_hba.conf"

20-replication.sh

#!/bin/bash
set -e

if [ $REPLICATION_ROLE = "master" ]; then
    psql -U postgres -c "CREATE ROLE $REPLICATION_USER WITH REPLICATION PASSWORD '$REPLICATION_PASSWORD' LOGIN"

elif [ $REPLICATION_ROLE = "slave" ]; then
    # stop postgres instance and reset PGDATA,
    # confs will be copied by pg_basebackup
    pg_ctl -D "$PGDATA" -m fast -w stop
    # make sure standby's data directory is empty
    rm -r "$PGDATA"/*

    pg_basebackup \
         --write-recovery-conf \
         --pgdata="$PGDATA" \
         --username=$REPLICATION_USER \
         --host=$POSTGRES_MASTER_SERVICE_HOST \
         --port=$POSTGRES_MASTER_SERVICE_PORT \
         --progress \
         --verbose
		 
		 #--xlog-method=fetch \

    # useless postgres start to fullfil docker-entrypoint.sh stop
    pg_ctl -D "$PGDATA" \
         -o "-c listen_addresses='*'" \
         -w start
fi

echo [*] $REPLICATION_ROLE instance configured!

文件部署后,直接运行 docker-compose up

该配置是在同一个主机上部署,如果要将两个数据库部署在不同主机

则将docker-compose中的主备分开,先在主机上跑

在从机上部署时,需要把主机的数据库ip和端口手动写入dockerfile和20-replication.sh文件中


版权声明:本文为wpf719971425原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。