使用Docker安装PostgreSQL一主2从
在分布式系统中,为了提高数据库的可用性和性能,通常会使用主从复制的方式进行部署。这种部署方式可以保证主数据库的数据同步到从数据库,从而实现读写分离和故障转移。
在本文中,我们将演示如何使用Docker容器快速部署一个包含一个主数据库和两个从数据库的PostgreSQL集群。
步骤
1. 创建Docker网络
首先,我们需要创建一个Docker网络,使得容器之间可以相互通信。运行以下命令创建一个名为postgres-net的网络:
docker network create postgres-net
2. 创建主数据库容器
接下来,我们创建一个主数据库容器。运行以下命令:
docker run --name postgres-master --network postgres-net -e POSTGRES_PASSWORD=your_password -d postgres
这将创建一个名为postgres-master的容器,并设置了一个名为your_password的密码,用于连接主数据库。
3. 创建从数据库容器
现在我们创建两个从数据库容器,分别连接到主数据库。运行以下命令:
docker run --name postgres-slave1 --network postgres-net -e POSTGRES_PASSWORD=your_password -d postgres
docker run --name postgres-slave2 --network postgres-net -e POSTGRES_PASSWORD=your_password -d postgres
4. 配置主从复制
现在我们需要配置主数据库和从数据库之间的复制关系。首先,进入主数据库容器:
docker exec -it postgres-master psql -U postgres
在psql命令行下执行以下SQL语句,开启主数据库的归档和流复制:
ALTER SYSTEM SET wal_level = 'replica';
ALTER SYSTEM SET archive_mode = 'on';
ALTER SYSTEM SET max_wal_senders = 3;
ALTER SYSTEM SET wal_keep_segments = 8;
然后重启主数据库容器:
docker restart postgres-master
接着,进入从数据库容器,执行以下SQL语句连接到主数据库并开始复制:
docker exec -it postgres-slave1 psql -U postgres
docker exec -it postgres-slave2 psql -U postgres
CREATE USER replication REPLICATION LOGIN CONNECTION LIMIT 3 ENCRYPTED PASSWORD 'your_password';
SELECT pg_create_physical_replication_slot('replication_slot1');
SELECT pg_create_physical_replication_slot('replication_slot2');
SELECT pg_start_backup('base_backup');
rsync -cva --inplace --exclude=*pg_xlog* pgdata/ slave1:/var/lib/postgresql/data/
SELECT pg_stop_backup();
ALTER SYSTEM SET primary_conninfo = 'host=postgres-master user=replication password=your_password port=5432 sslmode=require sslcompression=1';
SELECT pg_reload_conf();
5. 测试主从复制
现在我们已经完成了主从复制的配置,可以测试数据同步是否正常。在主数据库中插入一条数据,并在从数据库中查询是否同步成功:
docker exec -it postgres-master psql -U postgres -c "CREATE TABLE test (id serial PRIMARY KEY, name VARCHAR(50));"
docker exec -it postgres-master psql -U postgres -c "INSERT INTO test (name) VALUES ('Hello World');"
docker exec -it postgres-slave1 psql -U postgres -c "SELECT * FROM test;"
docker exec -it postgres-slave2 psql -U postgres -c "SELECT * FROM test;"
如果从数据库中能够查询到插入的数据,则说明主从复制配置成功。
总结
通过以上步骤,我们成功搭建了一个包含一个主数据库和两个从数据库的PostgreSQL集群。这种部署方式可以提高数据库的可用性和性能,保证数据的一致性和持久性,是分布式系统中常用的架构之一。希望本文对您有所帮助,谢谢阅读!