Quantcast
Channel: 小蓝博客
Viewing all articles
Browse latest Browse all 3145

在 Docker 中构建 PostgreSQL 16 主从同步环境

$
0
0

在 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 的主从同步环境。这种方式简化了部署流程,提高了数据库的可用性和数据可靠性。👍


提示:在实际应用中,可以根据需求调整配置参数,以达到最佳性能。


Viewing all articles
Browse latest Browse all 3145

Trending Articles