postgre主从部署

拉取 postgres:12 镜像

docker pull postgres:12

创建数据库数据目录

主机: mkdir -p /data/psql/master

chown 999:999 /data/psql/master

从机:

mkdir -p /data/psql/slave

mkdir -p /data/psql/repl

chown 999:999 /data/psql/slave

chown 999:999 /data/psql/repl

运行master容器

docker run -d \
-p 15432:5432 \
--name pg12master -h pg12master \
-e LANG="C.UTF-8" \
-e 'TZ=Asia/Shanghai' \
-e "POSTGRES_DB=postgres" \
-e "POSTGRES_USER=pgmaster" \
-e "POSTGRES_PASSWORD=pgmaster123" \
-v /data/psql/master:/var/lib/postgresql/data \
postgres:12

主机运行语句

CREATE ROLE repuser WITH
  LOGIN
  REPLICATION
  CONNECTION LIMIT 5
  PASSWORD 'Q1w2E#';

主机修改配置

/data/psql/master/pg_hba.conf
加入(如有多个就填多行): 
host replication repuser {你的从服务器ip}/32 md5

/data/psql/master/postgresql.conf   
查找文件中以下几个参数,并调整如下:
archive_mode = on
archive_command = '/bin/date'
max_wal_senders = 10
wal_keep_segments = 16
wal_sender_timeout = 60s
synchronous_standby_names = '*'
  • archive_mode: 开启归档, 貌似影响到主机挂了, 从机也可以从归档里读取数据
  • archive_command: 归档目录命令, 也可以每天生成一个归档目录, 方式如下
archive_command = 'DIR=/u01/pgsql/archive/`date +%F`; sudo test ! -d $DIR && sudo mkdir $DIR; sudo test ! -f $DIR/%f && sudo cp %p $DIR/%f'
  • max_wal_senders: 通过 pg_basebackup 备份或流复制备库和主库同步占用主库的最大并发连接数, 此数量必须小于数据库实例允许的最大连接数max_connections
  • wal_keep_segments: 指定在后备服务器需要为流复制获取日志段文件的情况下,pg_wal目录下所能保留的过去日志文件段的最小数目
  • wal_sender_timeout: 终止比指定毫秒数闲置更长时间的复制连接。 这对于发送服务器检测待机死机或网络中断是很有帮助的。 零值将禁用超时机制。 此参数只能在postgresql.conf文件或服务器命令行上设置。 默认值是 60 秒。值0将禁用超时机制。
  • synchronous_standby_names: 指定用逗号分隔的备用名称列表

重启主库使设置生效

# 使用 pg_ctl stop 安全停止数据库
docker exec -it -u postgres pg12master pg_ctl stop
docker start pg12master

创建从库容器

docker run -d \
-p 15432:5432 \
--name pg12slave -h pg12slave \
-e LANG="C.UTF-8" \
-e 'TZ=Asia/Shanghai' \
-e "POSTGRES_DB=postgres" \
-e "POSTGRES_USER=pgslave" \
-e "POSTGRES_PASSWORD=pgslave123" \
-v /data/psql/slave:/var/lib/postgresql/data \
-v /data/psql/repl:/var/lib/postgresql/repl \
postgres:12

进入从库容器,同步初始主库数据到 repl 目录

docker exec -it -u postgres pg12slave /bin/bash
pg_basebackup -R -D /var/lib/postgresql/repl -Fp -Xs -v -P -h {你的主机ip} -p 15432 -U repuser

注意, 这个方式只是测试, 真正没问题的情况下直接即可:

pg_basebackup -R -D /var/lib/postgresql/slave -Fp -Xs -v -P -h {你的主机ip} -p 15432 -U repuser

重建 slave 容器

通过上一步的初始备份,现在可以使用 /data/psql/repl 里的数据重建 slave容器了。首先删除slave目录,然后将repl目录改为slave,这个目录就是从库的数据目录了。

docker stop pg12slave && docker rm pg12slave
cd /data/psql/
rm -rf slave
mv repl slave
cd /data/psql/slave

# postgresql.auto.conf 将含有复制所需信息
cat postgresql.auto.conf

primary_conninfo = 'user=repuser password=''Q1w2E#'' host={显示你主机的ip} port={显示你主机的开放端口} sslmode=prefer sslcompression=0 gssencmode=prefer krbsrvname=postgres target_session_attrs=any'

正确无误后,重建容器

docker run -d \
-p 15432:5432 \
--name pg12slave -h pg12slave \
-e LANG="C.UTF-8" \
-e 'TZ=Asia/Shanghai' \
-e "POSTGRES_DB=postgres" \
-e "POSTGRES_USER=pgslave" \
-e "POSTGRES_PASSWORD=pgslave123" \
-v /data/psql/slave:/var/lib/postgresql/data \
postgres:12

连接注意

此时从机只有读权限, 登录方式未主机的用户名密码, 主机增删改查之后从机会同步

添加新评论

本站现已启用评论投票,被点踩过多的评论将自动折叠。与本文无关评论请发留言板。请不要水评论,谢谢。

已有 0条评论