拉取PostgreSQL镜像
docker pull postgres
构建镜像容器
docker run -it \
--name postgres \
--restart always \
-e POSTGRES_PASSWORD='123456' \
-e ALLOW_IP_RANGE=0.0.0.0/0 \
-v /home/postgres/data:/var/lib/postgresql \
-p 55432:5432 \
-d postgres
--name:自定义容器名称
-d 容器
-
-d: 后台运行容器,并返回容器ID;
-
password:密码
进入postgresql容器
docker exec -it postgres bash
部署主从数据库
主库
CREATE ROLE replica login replication encrypted password '123456';
\du
一定要在数据库里面 创建 用户 replica,否则从库不能拉取数据
**修改 pg_hba.conf**
修改`pg_hba.conf`,允许 `replica`用户从 `172.18.12.101` 从库上连接主库。配置文件在本地:`/home/pg_p/data`目录(创建时设置的虚拟目录)下,如:
host replication replica 172.18.12.101/32 trust
# 允许172.18.12.101使用 replica 用户来复制
# 改为0.0.0.0/0,表示所有IP都可以连接主库
**修改postgresql.conf**
listen_addresses = '*' # 监听所有IP
archive_mode = on # 允许归档
wal_level = replica # 开启热备
archive_command = '/bin/date' # 用该命令来归档logfile segment,这里取消归档。
max_wal_senders = 32 # 这个设置了可以最多有几个流复制连接,差不多有几个从,就设置几个
wal_keep_segments = 64 # 设置流复制保留的最多的xlog数目,一份是 16M,注意机器磁盘 16M*64 = 1G
wal_sender_timeout = 60s # 设置流复制主机发送数据的超时时间
max_connections = 200 # 这个设置要注意下,从库的max_connections必须要大于主库的
最后重启容器
从库
初始化数据
进入容器删除原始数据文件,利用`pg_basebackup`从主库初始化数据。
docker exec -it pg_s /bin/bash
su postgres
# 删除原有数据文件
rm -rf /var/lib/postgresql/data/*
# 备份恢复
pg_basebackup -h 172.18.12.100 -p 5432 -U replica -Fp -Xs -Pv -R -D /var/lib/postgresql/data
新增并配置`standby.signal`文件
standby_mode = 'on'
修改 `postgresql.conf`
wal_level = replica # WAL 日志级别为 replica
primary_conninfo = 'host=172.18.12.100 port=5432 user=replica password=123456'
# 主库连接信息
hot_standby = on # 恢复期间,允许查询
recovery_target_timeline = latest # 默认
max_connections = 120 # 大于等于主节点,正式环境应当重新考虑此值的大小
docker restart pg_s
重启容器