使用Docker搭建PostgreSQL主从复制

PostgreSQL是一款功能强大的开源关系数据库管理系统,其主从复制特性使得数据的冗余与备份变得简单。在这篇文章中,我们将使用Docker搭建一个基于PostgreSQL的主从复制环境,并提供相应的代码示例。

什么是主从复制?

在数据库的主从复制架构中,主服务器负责处理所有的写请求,并将这些请求的变更同步到一个或多个从服务器。从服务器则用于读取请求,提供负载均衡,同时也作为数据备份的一种方式。

环境准备

首先,确保你的机器上已经安装了Docker。我们将创建以下两个服务:一个主服务器(Master)和一个从服务器(Replica)。

创建Docker网络

为了让主从服务器互相通信,我们需要创建一个Docker网络:

docker network create pg-network

启动主服务器

接下来,我们将启动PostgreSQL的主服务器。可以使用以下命令:

docker run -d \
  --name pg-master \
  --network pg-network \
  -e POSTGRES_USER=postgres \
  -e POSTGRES_PASSWORD=mysecretpassword \
  -e POSTGRES_DB=mydb \
  -p 5432:5432 \
  postgres

在这个命令中,我们设置了PostgreSQL的用户名、密码以及数据库名。

启动从服务器

然后,我们需要启动一个从服务器。以下命令用于启动从服务器:

docker run -d \
  --name pg-replica \
  --network pg-network \
  -e POSTGRES_USER=postgres \
  -e POSTGRES_PASSWORD=mysecretpassword \
  -p 5433:5432 \
  postgres

配置主从复制

在主服务器上配置

连接到主服务器容器并修改postgresql.conf文件:

docker exec -it pg-master bash

在容器中,我们需要设置以下参数:

echo "wal_level = replica" >> /var/lib/postgresql/data/postgresql.conf
echo "max_wal_senders = 3" >> /var/lib/postgresql/data/postgresql.conf
echo "wal_keep_segments = 64" >> /var/lib/postgresql/data/postgresql.conf

然后修改pg_hba.conf以允许从服务器连接:

echo "host    replication     all             pg-replica         md5" >> /var/lib/postgresql/data/pg_hba.conf

重启主服务器使配置生效:

pg_ctl reload

在从服务器上配置

连接到从服务器:

docker exec -it pg-replica bash

在容器内,使用以下命令创建一个recovery.conf文件:

echo "standby_mode = 'on'" > /var/lib/postgresql/data/recovery.conf
echo "primary_conninfo = 'host=pg-master port=5432 user=postgres password=mysecretpassword'" >> /var/lib/postgresql/data/recovery.conf
echo "trigger_file = '/tmp/postgresql.trigger'" >> /var/lib/postgresql/data/recovery.conf

重启从服务器容器即可:

pg_ctl reload

验证主从复制

在主服务器上创建一张表:

CREATE TABLE test_table (id SERIAL PRIMARY KEY, name VARCHAR(50));

然后在从服务器上执行以下命令,确认数据已复制:

SELECT * FROM test_table;

类图

以下是PostgreSQL主从复制的类图示例:

classDiagram
    class Master {
        +start()
        +createDatabase()
        +acceptConnections()
    }
    class Replica {
        +start()
        +connectToMaster()
        +syncData()
    }
    Master <|-- Replica : replicates

总结

通过上述步骤,我们成功地利用Docker搭建了PostgreSQL的主从复制环境。主服务器负责数据的写入,而从服务器则负责数据的读取和备份。这样的架构,不仅提升了系统的可用性,还增强了数据的安全性。希望这篇文章能够帮助你更好地理解和搭建PostgreSQL的主从复制!