在同一台服务器上使用Docker部署PostgreSQL主从复制

PostgreSQL是一个开源的关系数据库管理系统,因其强大的功能和灵活性广受欢迎。在许多应用场景中,设置数据库的主从复制是常见的需求。本文将介绍如何在同一台服务器上使用Docker快速部署PostgreSQL主从复制,并通过代码示例进行说明。

环境准备

首先,确保你的服务器上已安装Docker。可以通过以下命令验证Docker是否已安装:

docker --version

如果没有安装,可以参考Docker的[官方文档](

创建Docker网络

为了让主节点和从节点相互通信,我们需要先创建一个Docker网络:

docker network create pg-network

启动主节点

接下来,我们将创建并启动PostgreSQL主节点。使用以下命令启动主节点:

docker run -d \
  --name pg-master \
  --network pg-network \
  -e POSTGRES_USER=postgres \
  -e POSTGRES_PASSWORD=yourpassword \
  -e POSTGRES_DB=mydatabase \
  -p 5432:5432 \
  postgres:latest

在上述命令中,我们设置了PostgreSQL的用户名、密码和数据库名称。主节点会监听5432端口。

配置主节点为准备从节点

在主节点上,我们需要启用 WAL 归档和复制配置。连接到主节点的容器,并编辑postgresql.confpg_hba.conf文件:

docker exec -it pg-master bash

然后编辑 postgresql.conf

echo "wal_level = replica" >> /var/lib/postgresql/data/postgresql.conf
echo "max_wal_senders = 3" >> /var/lib/postgresql/data/postgresql.conf
echo "wal_keep_size = 1024" >> /var/lib/postgresql/data/postgresql.conf

接着编辑 pg_hba.conf

echo "host replication postgres 0.0.0.0/0 md5" >> /var/lib/postgresql/data/pg_hba.conf

完成配置后,重启主节点:

docker restart pg-master

启动从节点

现在我们将创建并启动PostgreSQL的从节点。使用以下命令启动从节点:

docker run -d \
  --name pg-slave \
  --network pg-network \
  -e POSTGRES_USER=postgres \
  -e POSTGRES_PASSWORD=yourpassword \
  -p 5433:5432 \
  postgres:latest

连接到从节点的容器,并执行以下命令进行配置:

docker exec -it pg-slave bash

执行以下命令以设置主节点的信息:

echo "standby_mode = 'on'" >> /var/lib/postgresql/data/recovery.conf
echo "primary_conninfo = 'host=pg-master user=postgres password=yourpassword'" >> /var/lib/postgresql/data/recovery.conf

重启从节点:

docker restart pg-slave

验证主从复制

现在,我们可以使用以下命令验证主从节点的复制状态:

在主节点中,运行:

docker exec -it pg-master psql -U postgres -c "SELECT * FROM pg_stat_replication;"

在从节点中,运行:

docker exec -it pg-slave psql -U postgres -c "SELECT pg_is_in_recovery();"

如果一切配置正确,你将在主节点上看到从节点的状态,并在从节点上得到 true 的结果。

序列图

为了更直观地展示主从复制的流程,以下为序列图:

sequenceDiagram
    participant M as 主节点
    participant S as 从节点
    M->>S: 发送WAL日志
    S->>M: 请求WAL日志
    M->>S: 返回WAL日志
    S->>S: 应用WAL日志

结论

通过使用Docker,我们轻松地在同一台服务器上部署了PostgreSQL的主从复制。这种方法不仅便捷,也便于管理和维护。通过合理的配置,你可以在生产环境中高效地使用主从架构,以提升应用的可用性和性能。希望本文能够为你的PostgreSQL部署提供帮助。