在 Docker 中构建 PostgreSQL 16 主从同步环境
在现代应用中,数据库的高可用性和数据一致性至关重要。本文将详细介绍如何在 Docker 中搭建 PostgreSQL 16 的主从同步环境。😊
一、环境准备
在开始之前,确保您已安装以下软件:
- Docker:容器化平台
- Docker Compose(可选):用于定义和运行多容器Docker应用
- PostgreSQL 16 镜像
二、创建自定义网络
首先,创建一个 Docker 网络,使主从容器能够相互通信。
docker network create pg-network
解释:
docker network create
:创建一个新的 Docker 网络pg-network
:自定义网络的名称
三、部署主节点(Master)
1. 拉取 PostgreSQL 16 镜像
docker pull postgres:16
解释:
docker pull
:从 Docker Hub 拉取镜像postgres:16
:指定 PostgreSQL 16 版本的镜像
2. 运行主节点容器
docker run -d \
--name pg-master \
--network pg-network \
-e POSTGRES_PASSWORD=master_pwd \
-v pg-master-data:/var/lib/postgresql/data \
postgres:16
解释:
-d
:后台运行容器--name pg-master
:将容器命名为pg-master
--network pg-network
:将容器连接到pg-network
网络-e POSTGRES_PASSWORD=master_pwd
:设置数据库密码为master_pwd
-v pg-master-data:/var/lib/postgresql/data
:将数据目录挂载到主机,持久化数据
3. 配置主节点参数
进入主节点容器,修改配置文件:
docker exec -it pg-master bash
编辑 postgresql.conf
:
echo "wal_level = replica" >> /var/lib/postgresql/data/postgresql.conf
echo "max_wal_senders = 10" >> /var/lib/postgresql/data/postgresql.conf
echo "wal_keep_size = 64" >> /var/lib/postgresql/data/postgresql.conf
解释:
wal_level = replica
:设置 WAL 日志级别为replica
,支持物理复制max_wal_senders = 10
:允许最多 10 个从节点连接wal_keep_size = 64
:设置 WAL 日志保留大小为 64MB
配置 pg_hba.conf
,允许从节点连接:
echo "host replication all 0.0.0.0/0 md5" >> /var/lib/postgresql/data/pg_hba.conf
解释:
- 允许所有 IP 地址使用 MD5 验证方式进行复制连接
退出容器并重启主节点:
exit
docker restart pg-master
四、部署从节点(Slave)
1. 运行从节点容器
docker run -d \
--name pg-slave \
--network pg-network \
-e POSTGRES_PASSWORD=slave_pwd \
-v pg-slave-data:/var/lib/postgresql/data \
postgres:16
解释:
--name pg-slave
:将容器命名为pg-slave
-e POSTGRES_PASSWORD=slave_pwd
:设置从节点数据库密码为slave_pwd
2. 停止从节点 PostgreSQL 服务
docker exec -it pg-slave pg_ctl -D /var/lib/postgresql/data stop
解释:
pg_ctl
:PostgreSQL 的控制命令-D /var/lib/postgresql/data stop
:停止数据目录下的 PostgreSQL 服务
3. 清空从节点数据目录
docker exec -it pg-slave rm -rf /var/lib/postgresql/data/*
解释:
rm -rf
:强制删除数据目录中的所有文件
4. 从主节点同步数据
docker exec -it pg-slave bash -c "PGPASSWORD=master_pwd pg_basebackup -h pg-master -D /var/lib/postgresql/data -U postgres -v -P"
解释:
PGPASSWORD=master_pwd
:设置主节点的密码环境变量pg_basebackup
:用于从主节点进行基础备份的工具-h pg-master
:指定主节点的主机名-D /var/lib/postgresql/data
:指定备份目录-U postgres
:使用postgres
用户进行备份-v
:显示详细信息-P
:显示进度条
5. 配置从节点
创建 standby.signal
文件,标识为从节点:
docker exec -it pg-slave touch /var/lib/postgresql/data/standby.signal
解释:
standby.signal
:存在该文件时,PostgreSQL 会以从节点模式启动
配置连接主节点的信息:
docker exec -it pg-slave bash -c "echo \"primary_conninfo = 'host=pg-master port=5432 user=postgres password=master_pwd'\" >> /var/lib/postgresql/data/postgresql.conf"
解释:
primary_conninfo
:设置从节点连接主节点的参数
6. 启动从节点服务
docker exec -it pg-slave pg_ctl -D /var/lib/postgresql/data start
解释:
- 启动从节点的 PostgreSQL 服务
五、验证主从同步
1. 在主节点创建测试表
docker exec -it pg-master psql -U postgres -c "CREATE TABLE replication_test (id SERIAL PRIMARY KEY, data TEXT);"
解释:
psql
:PostgreSQL 的交互式终端-U postgres
:使用postgres
用户登录-c
:执行指定的 SQL 命令
2. 插入测试数据
docker exec -it pg-master psql -U postgres -c "INSERT INTO replication_test (data) VALUES ('Hello, Slave!');"
3. 在从节点查询数据
docker exec -it pg-slave psql -U postgres -c "SELECT * FROM replication_test;"
如果看到插入的数据,说明主从同步成功!🎉
六、工作流程图
flowchart TD
A[创建Docker网络] --> B[部署主节点]
B --> C[配置主节点参数]
C --> D[部署从节点]
D --> E[停止从节点服务]
E --> F[清空从节点数据]
F --> G[从主节点同步数据]
G --> H[配置从节点参数]
H --> I[启动从节点服务]
I --> J[验证主从同步]
七、重要命令汇总
命令 | 说明 |
---|---|
docker network create pg-network | 创建 Docker 网络 |
docker run -d --name pg-master ... | 运行主节点容器 |
docker exec -it pg-master bash | 进入主节点容器 |
echo "参数" >> 配置文件 | 修改 PostgreSQL 配置文件 |
docker exec -it pg-slave pg_ctl -D 数据目录 stop/start | 停止/启动从节点服务 |
pg_basebackup -h 主机 -D 目录 -U 用户 -v -P | 从主节点进行基础备份 |
touch standby.signal | 标识为从节点 |
psql -U 用户 -c "SQL命令" | 执行 SQL 命令 |
八、注意事项
- 端口映射:如果需要从主机访问容器内的 PostgreSQL 服务,需在运行容器时添加端口映射,例如
-p 5432:5432
。 - 防火墙配置:确保防火墙未阻止容器之间的通信。
- 密码安全:生产环境中,请使用复杂密码,并妥善保管。
九、总结
通过以上步骤,我们成功地在 Docker 中搭建了 PostgreSQL 16 的主从同步环境。这种方式简化了部署流程,提高了数据库的可用性和数据可靠性。👍
提示:在实际应用中,可以根据需求调整配置参数,以达到最佳性能。