master 文件夹
1.docker-compose.yml
version: "2"
services:
db_pg_master:
build: .
image: pg_master_1.0:1.0.0
restart: always
working_dir: /workspace/
volumes:
- /etc/localtime:/etc/localtime:ro
- ./pg_data/pg_master_data:/var/lib/postgresql/data
environment:
- POSTGRES_USER=videt
- POSTGRES_PASSWORD=123456
- POSTGRES_DB=videt
- PG_REP_USER=rep
- PG_REP_PASSWORD=123456
ports:
- 5431:5432
2.dockerfile
FROM postgres:11.6
COPY ./setup-master.sh /docker-entrypoint-initdb.d/setup-master.sh
RUN chmod 0666 /docker-entrypoint-initdb.d/setup-master.sh
3.setup-master.sh
#!/bin/bash
echo "host replication all 0.0.0.0/0 md5" >> "$PGDATA/pg_hba.conf"
set -e
psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" <<-EOSQL
CREATE USER $PG_REP_USER REPLICATION LOGIN CONNECTION LIMIT 100 ENCRYPTED PASSWORD '$PG_REP_PASSWORD';
EOSQL
cat >> ${PGDATA}/postgresql.conf <<EOF
wal_level = hot_standby
archive_mode = on
archive_command = 'cd .'
max_wal_senders = 8
wal_keep_segments = 8
hot_standby = on
listen_addresses= '*'
logging_collector= on
log_directory= 'pg_log'
log_filename= 'postgresql-%a.log'
log_truncate_on_rotation= on
log_rotation_age= 1d
log_rotation_size= 0
log_timezone= 'PRC'
timezone= 'PRC'
max_connections= 750
max_prepared_transactions= 750
superuser_reserved_connections= 10
tcp_keepalives_idle= 180
tcp_keepalives_interval= 10
tcp_keepalives_count= 3
password_encryption= md5
huge_pages= try
EOF
slave 文件夹
1.docker-compose.yml
version: "2"
services:
db_pg_slave:
build: .
image: pg_slave_1.0:1.0.0
restart: always
working_dir: /workspace/
volumes:
- /etc/localtime:/etc/localtime:ro
- ./pg_data/pg_slave_data:/var/lib/postgresql/data
environment:
- POSTGRES_USER=videt
- POSTGRES_PASSWORD=123456
- POSTGRES_DB=videt
- PG_REP_USER=rep
- PG_REP_PASSWORD=123456
- PG_HOST_NAME=主库host
- PG_PORT_NAME=5431
ports:
- 5433:5432
2.Dockerfile
```dockerfile
FROM postgresql:11.6
ENV GOSU_VERSION 1.10
ADD ./gosu /usr/bin/
RUN chmod +x /usr/bin/gosu
RUN apt-get update
RUN apt-get install iputils-ping -y
COPY ./docker-entrypoint.sh /docker-entrypoint.sh
RUN chmod +x /docker-entrypoint.sh
ENTRYPOINT ["/docker-entrypoint.sh"]
CMD ["gosu", "postgres", "postgres"]
3.docker-entrypoint.sh
#!/bin/bash
if [ ! -s "$PGDATA/PG_VERSION" ]; then
echo "*:*:*:$PG_REP_USER:$PG_REP_PASSWORD" > ~/.pgpass
chmod 0600 ~/.pgpass
until ping -c 1 -W 1 ${PG_HOST_NAME}
do
echo "Waiting for master to ping..."
sleep 1s
done
until pg_basebackup -h ${PG_HOST_NAME} -p ${PG_PORT_NAME} -D ${PGDATA} -U ${PG_REP_USER} -vP -W
do
echo "Waiting for master to connect..."
sleep 1s
done
echo "host replication all 0.0.0.0/0 md5" >> "$PGDATA/pg_hba.conf"
set -e
cat > ${PGDATA}/recovery.conf <<EOF
standby_mode = on
primary_conninfo = 'host=$PG_HOST_NAME port=$PG_PORT_NAME user=$PG_REP_USER password=$PG_REP_PASSWORD'
trigger_file = '/tmp/touch_me_to_promote_to_me_master'
EOF
chown postgres. ${PGDATA} -R
chmod 700 ${PGDATA} -R
fi
sed -i 's/wal_level = hot_standby/wal_level = replica/g' ${PGDATA}/postgresql.conf
exec "[email protected]"
注:需要在 github 下载 gosu 放在 slave 目录下,不清楚 gosu 作用的自行百度
分别在master目录和slave目录下执行 build 和 up,先 master 后 slave