在docker上部署postgresSQL主从

本文涉及的产品
云原生数据库 PolarDB PostgreSQL 版,标准版 2核4GB 50GB
云原生数据库 PolarDB MySQL 版,通用型 2核8GB 50GB
简介: 通过以上步骤,我们完成了在Docker环境中部署PostgreSQL主从复制的基本配置。请注意,实际生产环境中还需考虑安全性增强(如SSL加密)、监控、自动故障切换等高级配置。此外,根据具体的业务需求和规模,可能还需要考虑使用更专业的解决方案或工具,如Patroni、PgBouncer等,来进一步提升数据库集群的稳定性和效率。

在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等,来进一步提升数据库集群的稳定性和效率。

相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
目录
相关文章
|
3天前
|
消息中间件 监控 RocketMQ
Docker部署RocketMQ5.2.0集群
本文详细介绍了如何使用Docker和Docker Compose部署RocketMQ 5.2.0集群。通过创建配置文件、启动集群和验证容器状态,您可以快速搭建起一个RocketMQ集群环境。希望本文能够帮助您更好地理解和应用RocketMQ,提高消息中间件的部署和管理效率。
143 91
|
4天前
|
存储 NoSQL Redis
Docker 部署 Redis
在使用 Docker 部署 Redis 时,为实现数据持久化,需正确挂载容器内的数据目录到宿主机。推荐命令如下: ``` docker run -d --name redis -v /mnt/data/redis:/data -p 6379:6379 redis ``` 该命令将宿主机的 `/mnt/data/redis` 目录挂载到容器的 `/data` 目录,确保 Redis 数据持久化。此路径更通用,适合大多数场景。避免使用不匹配的挂载路径,如 `/var/lib/redis` 或 `/mnt/data/redis` 到非默认目录,以防止数据无法正确持久化。
|
19天前
|
存储 关系型数据库 MySQL
美团面试:MySQL为什么 不用 Docker部署?
45岁老架构师尼恩在读者交流群中分享了关于“MySQL为什么不推荐使用Docker部署”的深入分析。通过系统化的梳理,尼恩帮助读者理解为何大型MySQL数据库通常不使用Docker部署,主要涉及性能、管理复杂度和稳定性等方面的考量。文章详细解释了有状态容器的特点、Docker的资源隔离问题以及磁盘IO性能损耗,并提供了小型MySQL使用Docker的最佳实践。此外,尼恩还介绍了Share Nothing架构的优势及其应用场景,强调了配置管理和数据持久化的挑战。最后,尼恩建议读者参考《尼恩Java面试宝典PDF》以提升技术能力,更好地应对面试中的难题。
|
11天前
|
JavaScript 前端开发 Docker
如何通过pm2以cluster模式多进程部署next.js(包括docker下的部署)
通过这些步骤,可以确保您的Next.js应用在多核服务器上高效运行,并且在Docker环境中实现高效的容器化管理。
71 44
|
1月前
|
监控 Java 应用服务中间件
tomcat相关概念与部署tomcat多实例-zabbix监控(docker部署)
通过上述步骤,您可以在Ubuntu系统上成功编译并安装OpenCV 4.8。这种方法不仅使您能够定制OpenCV的功能,还可以优化性能以满足特定需求。确保按照每一步进行操作,以避免常见的编译问题。
58 23
|
23天前
|
SQL Java Maven
docker部署apollo
docker部署apollo步骤
|
1月前
|
监控 Java 应用服务中间件
tomcat相关概念与部署tomcat多实例-zabbix监控(docker部署)
通过上述步骤,您可以在Ubuntu系统上成功编译并安装OpenCV 4.8。这种方法不仅使您能够定制OpenCV的功能,还可以优化性能以满足特定需求。确保按照每一步进行操作,以避免常见的编译问题。
49 22
|
1月前
|
监控 Java 应用服务中间件
tomcat相关概念与部署tomcat多实例-zabbix监控(docker部署)
通过上述步骤,您可以在Ubuntu系统上成功编译并安装OpenCV 4.8。这种方法不仅使您能够定制OpenCV的功能,还可以优化性能以满足特定需求。确保按照每一步进行操作,以避免常见的编译问题。
66 25
|
2月前
|
Ubuntu Linux 开发工具
docker 是什么?docker初认识之如何部署docker-优雅草后续将会把产品发布部署至docker容器中-因此会出相关系列文章-优雅草央千澈
Docker 是一个开源的容器化平台,允许开发者将应用程序及其依赖项打包成标准化单元(容器),确保在任何支持 Docker 的操作系统上一致运行。容器共享主机内核,提供轻量级、高效的执行环境。本文介绍如何在 Ubuntu 上安装 Docker,并通过简单步骤验证安装成功。后续文章将探讨使用 Docker 部署开源项目。优雅草央千澈 源、安装 Docker 包、验证安装 - 适用场景:开发、测试、生产环境 通过以上步骤,您可以在 Ubuntu 系统上成功安装并运行 Docker,为后续的应用部署打下基础。
96 8
docker 是什么?docker初认识之如何部署docker-优雅草后续将会把产品发布部署至docker容器中-因此会出相关系列文章-优雅草央千澈
|
1月前
|
SQL 关系型数据库 MySQL
docker-compose部署mysql8
使用docker-compose容器化部署mysql8