Loading... 在Docker环境中部署PostgreSQL主从复制是一种常见的做法,用于提高数据库的可用性和扩展读取能力。以下是一个分步指南,详细说明如何设置一个基于Docker的PostgreSQL主从架构。 ### 准备工作 确保你已安装了Docker环境,并且对Docker的基本操作有所了解。此外,理解PostgreSQL的基本概念,特别是涉及到的复制术语,如主节点(Primary)、从节点(Standby)等,会对本过程有所帮助。 ![](https://www.8kiz.cn/usr/uploads/2024/05/1021405485.png) ### 第一步:获取PostgreSQL镜像 首先,从Docker Hub获取官方的PostgreSQL镜像。你可以使用以下命令拉取最新版的PostgreSQL镜像: ```bash docker pull postgres ``` ### 第二步:配置主节点 创建一个Docker容器作为主节点。这里我们使用卷(volume)来持久化数据,同时开放5432端口以便外部访问。 ```bash 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命令来实现: ```bash 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)。 接下来,创建从节点容器,并指定主节点的连接信息: ```bash 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服务。 ### 第四步:配置复制 登录到主节点容器,创建复制用户并获取其复制槽的信息: ```bash 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');" ``` 记下返回的复制槽名称,然后在从节点上设置复制: ```bash 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();" ``` ### 第五步:验证复制 最后,检查从节点是否成功复制了主节点的数据: ```bash docker exec -it pg-standby psql -U postgres -c "SELECT * FROM pg_stat_replication;" ``` 如果一切配置正确,你应该能看到从节点的状态信息。 ### 总结 通过以上步骤,我们完成了在Docker环境中部署PostgreSQL主从复制的基本配置。请注意,实际生产环境中还需考虑安全性增强(如SSL加密)、监控、自动故障切换等高级配置。此外,根据具体的业务需求和规模,可能还需要考虑使用更专业的解决方案或工具,如Patroni、PgBouncer等,来进一步提升数据库集群的稳定性和效率。 最后修改:2024 年 05 月 19 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 如果觉得我的文章对你有用,请随意赞赏