在docker上部署postgresSQL主从

在Docker环境中部署PostgreSQL主从复制是一种常见的做法,用于提高数据库的可用性和扩展读取能力。以下是一个分步指南,详细说明如何设置一个基于Docker的PostgreSQL主从架构。

准备工作

确保你已安装了Docker环境,并且对Docker的基本操作有所了解。此外,理解PostgreSQL的基本概念,特别是涉及到的复制术语,如主节点(Primary)、从节点(Standby)等,会对本过程有所帮助。

第一步:获取PostgreSQL镜像

首先,从Docker Hub获取官方的PostgreSQL镜像。你可以使用以下命令拉取最新版的PostgreSQL镜像:

docker pull postgres
​
 
 

第二步:配置主节点

创建一个Docker容器作为主节点。这里我们使用卷(volume)来持久化数据,同时开放5432端口以便外部访问。

docker run -d --name pg-primary \
    -e POSTGRES_PASSWORD=mysecretpassword \
    -v pgdata:/var/lib/postgresql/data \
    -p 5432:5432 \
    postgres
​
 
 

这里,-e POSTGRES_PASSWORD设置了PostgreSQL的超级用户密码,-v pgdata:/var/lib/postgresql/data创建了一个Docker卷来存储数据库数据,-p 5432:5432映射了容器的5432端口到宿主机的相同端口。

第三步:配置从节点

在创建从节点之前,主节点需要启用逻辑复制功能。可以通过进入主节点容器并执行SQL命令来实现:

docker exec -it pg-primary psql -U postgres -c "ALTER SYSTEM SET max_wal_senders TO 5;"
docker exec -it pg-primary psql -U postgres -c "ALTER SYSTEM SET wal_level TO replica;"
docker restart pg-primary
 
 

这段命令设置了最大WAL发送者数量(max_wal_senders)和WAL级别(wal_level)。

接下来,创建从节点容器,并指定主节点的连接信息:

docker run -d --name pg-standby \
    -e POSTGRES_PASSWORD=mysecretpassword \
    -v pgdata-standby:/var/lib/postgresql/data \
    -e POSTGRES_HOST=pg-primary \
    -e POSTGRES_USER=postgres \
    -e POSTGRES_PASSWORD=mysecretpassword \
    postgres \
    bash -c "sed -i 's/#listen_addresses = localhost/listen_addresses = '*'/g' /etc/postgresql/postgresql.conf && \
             echo 'host    replication     postgres        0.0.0.0/0               md5' >> /var/lib/postgresql/data/pg_hba.conf && \
             pg_ctl start -D /var/lib/postgresql/data"
 
 

这里,我们通过环境变量指定了主节点的地址、用户名和密码,并通过 bash -c执行一系列初始化脚本来调整配置文件,允许远程连接和启动PostgreSQL服务。

第四步:配置复制

登录到主节点容器,创建复制用户并获取其复制槽的信息:

docker exec -it pg-primary psql -U postgres -c "CREATE USER replicator WITH REPLICATION ENCRYPTED PASSWORD 'replicationpassword';"
docker exec -it pg-primary psql -U postgres -c "SELECT * FROM pg_create_physical_replication_slot('standby_slot');"
​
 
 

记下返回的复制槽名称,然后在从节点上设置复制:

docker exec -it pg-standby psql -U replicator -h pg-primary -c "CREATE DATABASE mydb WITH TEMPLATE = template0 ENCODING = 'UTF8' LC_COLLATE = 'en_US.utf8' LC_CTYPE = 'en_US.utf8';"
docker exec -it pg-standby psql -U replicator -h pg-primary -c "ALTER SYSTEM SET primary_conninfo='host=pg-primary port=5432 user=replicator password=replicationpassword sslmode=prefer sslcompression=1 krbsrvname=postgres target_session_attrs=any replication=true';"
docker exec -it pg-standby psql -U replicator -h pg-primary -c "SELECT pg_start_backup('initial_backup', true, false);"
# 使用rsync或其他工具从主节点同步数据到从节点(此处略去具体命令)
docker exec -it pg-standby psql -U replicator -h pg-primary -c "SELECT pg_stop_backup();"
​
 
 

第五步:验证复制

最后,检查从节点是否成功复制了主节点的数据:

docker exec -it pg-standby psql -U postgres -c "SELECT * FROM pg_stat_replication;"
 
 

如果一切配置正确,你应该能看到从节点的状态信息。

posted @   我是一只小小鸟~  阅读(23)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示