一、准备
1、docker环境
2、准备两个服务器,假设ip分别为192.168.3.110(主)/192.168.3.111(从)
3、提前准备好postgres数据库镜像,版本10.1
二、启动镜像
docker run --name postgres --net hylink --log-opt max-size=1g --log-opt max-file=3 \
-v /home/hylink/docker/container/postgres/:/var/lib/postgresql/data/ \
-v /etc/localtime:/etc/localtime:ro \
--restart=always \
-p 5432:5432 -e POSTGRES_PASSWORD=Hylink2014@postgres -d 599272bf538f
在两台服务器上执行启动命令,之后可用navicat测试连接数据库
三、配置
1、主库
- 找到挂载目录/home/hylink/docker/container/postgres/位置下pg_hba.conf文件,在最下面新增一行代码
host replication replica 192.168.3.110/32 md5
- 进入容器
docker exec -it postgres /bin/bash
- 连接数据库
注:创建的role用户名、密码根据需要自己修改
1)默认端口情况
输入:psql -U postgres;
输入:postgres密码;
输入:set synchronous_commit = off;
输入:create role replica login replication encrypted password '123456';
查看创建情况:\du;
2)修改端口情况
修改/home/hylink/docker/container/postgres/挂载目录下postgresql.conf文件的port = 5433;
进入容器 ;
输入:psql -U postgres -h 192.168.3.110 -p 5433;
输入:postgres密码;
输入:set synchronous_commit = off;
输入:create role replica login replication encrypted password '123456';
查看创建情况:\du;
2、从库
- 主从同步
1)进入容器
2)备份同步:pg_basebackup -D /home -h 35.1.176.4 -p 5432 -U replica -Fp -R -X s -P -v
3)输入replica密码
3)覆盖数据:cp -R /home/* /var/lib/postgresql/data/
4)清空home:rm -rf /home/*
- 新建recovery.conf文件
在挂载目录下新建recovery.conf文件,并填充如下内容
standby_mode = 'on'
primary_conninfo = 'user=replica password=123456 host=192.168.3.110 port=543 sslmode=prefer sslcompression=1 krbsrvname=postgres target_session_attrs=any'
四、按顺序重启主、从数据库
docker restart postgres
五、问题
1、当主库操作频繁时,会产生很多的流复制文件,也就是pg_wal文件夹内的文件,根据数据库主从复制的原理,从库会从主库的pg_wal文件夹内拿取文件执行,将主库数据同步到从库,一旦从库产生的文件过多,从库又来不及复制文件进行数据同步,这样就会导致主从数据不一致从而失去了主从流复制机制。
2、同样的问题,一旦主库产生的流复制文件过多造成堆积,会占用服务器物理空间,从而导致服务器挂掉
针对上面所产生的问题,建议使用postgres主从流复制机制的通知,也要充分考虑自己业务的应用场景,是否合适,至于彻底解决办法,目前还没有好的方式,后续如果处理了会更新文章
六、问题处理
当发生上述问题造成主从数据不一致时,或者因为误操作导致主从数据不一致,甚至是主从数据库无法正常启动的情况(一般就是starting up、缺失文件这两个问题),如果想继续恢复主从关系,在你没有其他的解决方法时,可以参考我的办法(暴力):
直接彻底删除从库,包括镜像和挂载目录,然后按照3-2的步骤操作,完成后重启从库即可
如果不想继续主从模式,关闭从库即可,如果依然不生效,建议重启一下docker之后再启动主库关闭从库试一试