在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;"
如果一切配置正确,你应该能看到从节点的状态信息。
总结
通过以上步骤,我们完成了在Docker环境中部署PostgreSQL主从复制的基本配置。请注意,实际生产环境中还需考虑安全性增强(如SSL加密)、监控、自动故障切换等高级配置。此外,根据具体的业务需求和规模,可能还需要考虑使用更专业的解决方案或工具,如Patroni、PgBouncer等,来进一步提升数据库集群的稳定性和效率。