1.首先准备好postgresql的镜像,并编写docker-compost.yml:
主:
version: '3.3'
services:
db:
image: postgres
container_name: db
ports:
- 5432:5432
environment:
POSTGRES_PASSWORD: 123456
POSTGRES_DB: postgres
volumes:
- ./data:/var/lib/postgresql/data
从:
version: '3.3'
services:
db:
image: postgres
container_name: db2
ports:
- 5433:5432
environment:
POSTGRES_PASSWORD: 123456
POSTGRES_DB: postgres
volumes:
- ./data:/var/lib/postgresql/data
2.启动主镜像后,进入容器登陆postgresql后创建复制用户:
进入启动的 docker 容器内部,新建用于归档日志的目录:
docker exec -it db bash
mkdir -p /var/lib/postgresql/data/pg_archive
# 切换到 postgres 用户
su postgres
# 进去 postgres 客户端
psql
CREATE ROLE replica login replication encrypted password 'replica';
退出到宿主机切换为root,修改pg_hba.conf
最后一行添加:
host replication replica 172.25.0.1/32 trust #允许 14.34 机器使用 replica 用户来复制
这个172.25.0.1地址是查看ifconfig后,db镜像得gateway,试验后使用的这个,至于为啥,还没搞清楚..如果使用得是不同主机不同ip,则添加从服务器的ip地址;通过docker inspect db查看信息:
"Gateway": "172.25.0.1"
修改postgresql.conf:
listen_addresses = '*' # 监听所有IP
archive_mode = on # 允许归档
archive_command = 'cp %p /var/lib/postgresql/data/pg_archive/%f' # 用该命令来归档logfile segment
wal_level = hot_standby #开启热备
max_wal_senders = 32 # 这个设置了可以最多有几个流复制连接,差不多有几个从,就设置几个
wal_keep_segments = 64 # 设置流复制保留的最多的xlog数目,一份是 16M,注意机器磁盘 16M*64 = 1G
wal_sender_timeout = 60s # 设置流复制主机发送数据的超时时间
max_connections = 100 # 这个设置要注意下,从库的max_connections必须要大于主库的
最后重启镜像;
3.设置从服务器镜像
启动镜像后,进入容器执行命令:
su postgres # 切换 postgres 用户
rm -rf /var/lib/postgresql/data/* # 需要先清除data下文件才能进行备份
pg_basebackup -h 172.25.0.1 -U replica -D /var/lib/postgresql/data -X stream -P
mkdir -p /var/lib/postgresql/data/pg_archive
这里的172.25.0.1代表主服务器的ip地址,这里跟主服务器配置文件里的ip一样,我觉得可能是因为同一虚拟机下,其实ip一样,所以走的是主容器相同的网关ip;
在宿主机的data中添加文件recovery.conf:
standby_mode = on # 说明该节点是从服务器
primary_conninfo = 'host=172.25.0.1 port=5432 user=replica password=replica' # 主服务器的信息以及连接的用户
recovery_target_timeline = 'latest'
最后重启容器.可以看到实现了主从复制;