在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;"
如果一切配置正确,你应该能看到从节点的状态信息。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)