ubuntu18 docker 部署 postgresql,docker-compose、dockerfile 主從流複製

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 "$@"

注:需要在 github 下載 gosu 放在 slave 目錄下,不清楚 gosu 作用的自行百度

分別在master目錄和slave目錄下執行 build 和 up,先 master 後 slave

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章