主库 IP:192.168.1.100
从库 IP:192.168.1.101
1、主从服务器装PostgreSQL
#新建挂载目录
mkdir /data/postgres
#拉取镜像
docker pull postgres
#运行容器
docker run --name postgres \
-e TZ=Asia/Shanghai \
--restart=always \
-e POSTGRES_PASSWORD=ly123456 \
-p 5432:5432 \
-v /data/postgresql:/var/lib/postgresql/data \
-d postgres
这里挂载了 /var/lib/postgresql/data目录
2、主库操作
2.1 进入容器,并创建用于数据同步的角色
#进入容器
docker exec -it postgres /bin/bash
# 切换到 postgres 用户
su postgres
# 进去 postgres 客户端
psql
#创建角色
CREATE ROLE syncuser login replication encrypted password 'syncuser';
创建用户成功之后,控制台会显示 “CREATE ROLE”,利用 \du 命令可以查看 postgres 的用户列表
2.2 修改 pg_hba.conf 文件
由于之前已经挂载出/var/lib/postgresql/data目录,直接vim修改文件
#编辑文件
vim pg_hba.conf
#添加一行
host replication syncuser 192.168.1.101/32 trust
注意:192.168.1.101是从库IP
2.3 修改 postgresql.conf 文件
listen_addresses = '*' #监听所有IP
archive_mode = on #允许归档
archive_command = '/bin/date' #用该命令来归档logfile segment,这里取消归档。
wal_level = replica #开启热备
max_wal_senders = 10 #这个设置了可以最多有几个流复制连接,差不多有几个从,就设置几个
wal_keep_size = 1024 #设置wal的大小,单位M。
wal_sender_timeout = 60s #设置流复制主机发送数据的超时时间
max_connections = 100 #这个设置要注意下,从库的max_connections必须要大于主库的
2.4 重启容器
docker restart postgres
---------------------------------------- ↑上面是主库 | 下面是从库↓ ----------------------------------------
3、从库操作
3.1 拉镜像(略)
3.2 启动容器
docker run --name postgres \
--restart=always \
-e TZ=Asia/Shanghai \
-e POSTGRES_PASSWORD=ly123456 \
-p 5432:5432 \
-v /data/postgresql/data:/var/lib/postgresql/data \
-v /data/postgresql/repl:/var/lib/postgresql/repl \
-d postgres
这里挂载目录repl的作用是用来同步主库数据。
进入容器(略)
3.3 拷贝主服务器数据进入从节点容器并同步(注意按实际情况修改主库节点ip地址)
#拷贝主库数据
pg_basebackup -R -D /var/lib/postgresql/repl -Fp -Xs -v -P -h 192.168.1.100 -p 5432 -U syncuser
3.4 退出,删除容器,删除挂载的data目录,拷贝主库数据
#退出
exit
#删除容器
docker rm -f postgres
#删除挂载data目录
rm -rf /data/postgresql/data
#移动主库数据至data目录
mv /data/postgresql/repl /data/postgresql/data
检查下postgresql.auto.conf文件是否包含primary_conninfo = 'user=syncuser ......
3.5 重新启动容器,这时不需要挂载repl文件夹
docker run --name postgres \
--restart=always \
-e TZ=Asia/Shanghai \
-e POSTGRES_PASSWORD=ly123456 \
-p 5432:5432 \
-v /data/postgresql/data:/var/lib/postgresql/data \
-d postgres