当前位置: 首页 > ai >正文

跨主机用 Docker Compose 部署 PostgreSQL + PostGIS 主从

q下面是跨主机用 Docker Compose 部署 PostgreSQL + PostGIS 主从复制的完整详细步骤(主库 + 从库),主从都用官方 PostGIS 镜像 postgis/postgis:15-3.3,并注意网络与持久化。复制即可。


🚩 跨主机 PostgreSQL + PostGIS 主从复制完整部署方案


基本假设

主机角色IP端口映射
主机A主库192.168.10.1015432 → 5432
主机B从库192.168.10.1025433 → 5432

1. 主机A(主库)部署步骤

1.1 创建目录

mkdir -p ~/pg-master/{data,config}
cd ~/pg-master

1.2 准备配置文件

config/postgresql.conf
listen_addresses = '*'
port = 5432
wal_level = replica
max_wal_senders = 10
wal_keep_size = 64
hot_standby = on
config/pg_hba.conf
# 允许所有 IP 用 md5 连接(可根据安全需求收紧)
host all all 0.0.0.0/0 md5
host replication postgres 0.0.0.0/0 md5

1.3 创建 docker-compose.yml

version: "3.8"services:postgis-master:image: postgis/postgis:15-3.3container_name: postgis-masterrestart: alwaysenvironment:POSTGRES_DB: gisPOSTGRES_USER: postgresPOSTGRES_PASSWORD: masterpassports:- "5432:5432"volumes:- ./data:/var/lib/postgresql/data- ./config/postgresql.conf:/etc/postgresql/postgresql.conf- ./config/pg_hba.conf:/etc/postgresql/pg_hba.confcommand: >postgres -c config_file=/etc/postgresql/postgresql.confnetworks:- pgnetnetworks:pgnet:driver: bridge

1.4 启动主库容器

docker-compose up -d

1.5 初始化数据库,创建 PostGIS 扩展及授权复制权限

docker exec -it postgis-master psql -U postgres -d gis

在 psql 里执行:

CREATE EXTENSION postgis;
ALTER ROLE postgres WITH REPLICATION;

2. 主机B(从库)部署步骤

2.1 创建目录

mkdir -p ~/pg-slave/data
cd ~/pg-slave

2.2 创建 docker-compose.yml

version: "3.8"services:postgis-slave:image: postgis/postgis:15-3.3container_name: postgis-slaverestart: alwaysenvironment:POSTGRES_USER: postgresPOSTGRES_PASSWORD: masterpassports:- "5433:5432"volumes:- ./data:/var/lib/postgresql/datanetworks:- pgnetcommand: >bash -c "if [ ! -s /var/lib/postgresql/data/PG_VERSION ]; thenpg_basebackup -h 192.168.10.101 -p 5432 -U postgres -D /var/lib/postgresql/data -Fp -Xs -P -Rfi &&postgres"networks:pgnet:driver: bridge

 其中下面这段:

这一步骤的作用:

  1. pg_basebackup:首次启动从库时,自动从主库拉取数据目录快照(全量数据),包括数据库数据文件和 WAL 日志配置。

  2. -R 参数:会自动在从库数据目录写入**standby.signal**文件(PostgreSQL 12+ 的新机制,取代旧的 recovery.conf),并且自动生成主库连接的复制配置(primary_conninfo),这就是主从连接的配置。

    • primary_conninfo 里包括主库 IP、端口、用户名、密码等信息,从库根据它连接主库,接收 WAL 日志持续同步。

command: >bash -c "if [ ! -s /var/lib/postgresql/data/PG_VERSION ]; thenpg_basebackup -h 192.168.10.101 -p 5432 -U postgres -D /var/lib/postgresql/data -Fp -Xs -P -Rfi &&postgres"

2.3 启动从库容器

docker-compose up -d

3. 测试验证

3.1 主库插入测试数据

docker exec -it postgis-master psql -U postgres -d gis

执行:

CREATE TABLE test(id SERIAL PRIMARY KEY, name TEXT);
INSERT INTO test(name) VALUES ('hello from master');

3.2 从库查看同步数据

docker exec -it postgis-slave psql -U postgres -d gis

执行:

SELECT * FROM test;
-- 应该能看到 'hello from master'

4. 注意事项总结

  • 确保主机之间 5432 端口(主库)开放,防火墙允许通信

  • pg_hba.conf 允许从库主机 IP 访问复制权限

  • 主从镜像都用 postgis/postgis:15-3.3,保证插件文件一致

  • 从库首次启动自动通过 pg_basebackup 拉取主库数据,后续通过 WAL 复制同步

  • 持久化目录映射保证数据不会丢失

  • 网络配置建议使用内网桥接网络或 Docker Swarm overlay 网络


5. 额外推荐命令

查看主库日志:

docker logs -f postgis-master

查看从库日志:

docker logs -f postgis-slave

查看当前数据库扩展:

SELECT * FROM pg_available_extensions WHERE name='postgis';

📋 复制即用版本(笔记版)

# 主机A 主库目录准备
mkdir -p ~/pg-master/{data,config} && cd ~/pg-master# postgresql.conf
cat > config/postgresql.conf <<EOF
listen_addresses = '*'
port = 5432
wal_level = replica
max_wal_senders = 10
wal_keep_size = 64
hot_standby = on
EOF# pg_hba.conf
cat > config/pg_hba.conf <<EOF
host all all 0.0.0.0/0 md5
host replication postgres 0.0.0.0/0 md5
EOF# docker-compose.yml
cat > docker-compose.yml <<EOF
version: "3.8"
services:postgis-master:image: postgis/postgis:15-3.3container_name: postgis-masterrestart: alwaysenvironment:POSTGRES_DB: gisPOSTGRES_USER: postgresPOSTGRES_PASSWORD: masterpassports:- "5432:5432"volumes:- ./data:/var/lib/postgresql/data- ./config/postgresql.conf:/etc/postgresql/postgresql.conf- ./config/pg_hba.conf:/etc/postgresql/pg_hba.confcommand: >postgres -c config_file=/etc/postgresql/postgresql.confnetworks:- pgnet
networks:pgnet:driver: bridge
EOFdocker-compose up -ddocker exec -it postgis-master psql -U postgres -d gis -c "CREATE EXTENSION postgis;"
docker exec -it postgis-master psql -U postgres -c "ALTER ROLE postgres WITH REPLICATION;"# 主机B 从库目录准备
mkdir -p ~/pg-slave/data && cd ~/pg-slave# docker-compose.yml
cat > docker-compose.yml <<EOF
version: "3.8"
services:postgis-slave:image: postgis/postgis:15-3.3container_name: postgis-slaverestart: alwaysenvironment:POSTGRES_USER: postgresPOSTGRES_PASSWORD: masterpassports:- "5433:5432"volumes:- ./data:/var/lib/postgresql/datanetworks:- pgnetcommand: >bash -c "if [ ! -s /var/lib/postgresql/data/PG_VERSION ]; thenpg_basebackup -h 192.168.10.101 -p 5432 -U postgres -D /var/lib/postgresql/data -Fp -Xs -P -Rfi &&postgres"
networks:pgnet:driver: bridge
EOFdocker-compose up -d# 测试主库插入数据:
docker exec -it postgis-master psql -U postgres -d gis -c "CREATE TABLE test(id SERIAL PRIMARY KEY, name TEXT);"
docker exec -it postgis-master psql -U postgres -d gis -c "INSERT INTO test(name) VALUES ('hello from master');"# 测试从库查询数据:
docker exec -it postgis-slave psql -U postgres -d gis -c "SELECT * FROM test;"

http://www.xdnf.cn/news/14715.html

相关文章:

  • C++ 第四阶段 STL 容器 - 第五讲:详解 std::set 与 std::unordered_set
  • [JS逆向] 喜马拉雅登录案例
  • [面试] js手写题-树转数组
  • Objective-c把字符解析成字典
  • C语言常用转换函数实现原理
  • Docker 入门教程(九):容器网络与通信机制
  • React-Find 一款能快速在网页定位到源码的工具,支持React19.x/next 15
  • 【AI时代速通QT】第四节:Windows下Qt Creator调试指南
  • 【c/c++3】类和对象,vector容器,类继承和多态,systemd,stdboost
  • 「Java案例」输出24个希腊字母
  • 双指针的用法
  • Vue 3 Teleport 特性
  • 人工智能之数学基础:如何判断正定矩阵和负定矩阵?
  • 矩阵的逆 线性代数
  • LRU缓存设计与实现详解
  • Spring Cloud:服务监控与追踪的高级实践
  • C# 合并两个byte数组的几种方法
  • 零基础学习RabbitMQ(5)--工作模式(1)
  • C/C++数据结构之动态数组
  • ali PaddleNLP docker
  • vue-31(Nuxt.js 中的数据获取:asyncData和fetch)
  • XIP (eXecute In Place)
  • Spring AI Alibaba Nacos 集成实践
  • 【C++ 基础】 C++ 与 C 语言差异面试题(附大厂真题解析)
  • 【智能协同云图库】智能协同云图库第三弹:基于腾讯云 COS 对象存储—开发图片模块
  • 【Linux高级全栈开发】2.3.1 协程设计原理与汇编实现2.3.2 协程调度器实现与性能测试
  • 原型设计Axure RP网盘资源下载与安装教程共享
  • 【记录】服务器多用户共享Conda环境——Ubuntu24.04
  • 进阶向:Django入门,从零开始构建一个Web应用
  • Word之电子章制作——1