跨主机用 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.pswp.cn/pingmian/86858.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/86858.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

会议动态|千眼狼高速摄像机、DIC测量系统等科学仪器亮相第十五届全国爆炸力学学术会议

第十五届全国爆炸力学学术会议于6月28日在绍兴盛大召开&#xff0c;会议汇聚来自全国爆炸力学与冲击领域专家学者2000余人&#xff0c;聚焦“爆炸与冲击动力学工程应用”、“材料动态力学行为与损伤断裂“、“工程爆破与毁伤评估”、“含能材料与水中爆炸”、“结构动态响应与安…

vscode一个文件夹有残余的git仓库文件,已经失效了,怎样进行清空仓库残余文件并重新初始化git--ubuntu

vscode一个文件夹有残余的git仓库文件&#xff0c;已经失效了&#xff0c;怎样进行清空仓库残余文件并重新初始化git–ubuntu 首先要把工作区里重要的文件备份好&#xff0c;防止操作时数据丢失。删除.git文件夹 rm -rf .git初始化 (base) zd4090zd4090-System-Product-Name:…

6月30日作业

思维导图 一、读取文件&#xff0c;效果类似 cat 的功能 代码 #include <25041head.h>int main(int argc, const char *argv[]) {//打开文件printf("请输入你要读取的文件路径&#xff1a;");char str[128]"";scanf("%s",str);FILE *fpf…

ubuntu源码安装python3.13遇到Could not build the ssl module!解决方法

我在Ubuntu 24.04.2 LTS下载源码安装Python 3.13.5时&#xff1a; #./configure --enable-loadable-sqlite-extensions --enable-optimizations #make 显示错误信息&#xff1a; Could not build the ssl module! Python requires a OpenSSL 1.1.1 or newer 查询我的openssl版…

Ai工具分享(2):Vscode+Cline无限免费的使用教程

大家好,我是程序员寒山。 今天给大家分享一个最新的免费使用的Ai插件Cline的方法,之前也给大家分享过一些免费的方案,但是这些都是随时在变化,之前推荐的很多都不能使用了。 Ai工具分享(2):Vscode+Cline无限免费的使用教 今天再给大家推荐一个,可以免费使用,且没有token…

Docker 目录迁移脚本【Windows Junction 类型链接】

Docker 目录迁移脚本完整教程&#xff1a;从诞生到自动化使用 一、脚本诞生背景与开发历程 1. 为什么需要迁移 Docker 目录&#xff1f; 系统盘空间压力&#xff1a;Docker 镜像和容器数据通常存储在C:\Users\用户名目录下&#xff0c;随着使用时间增长会占用大量系统盘空间…

spring-ai 工作流

目录 工作流概念工作流程图spring-boot 编码定义节点 (Node)定义节点图StateGraphcontroller测试浏览器测试用户输入 工作流概念 工作流是以相对固化的模式来人为地拆解任务&#xff0c;将一个大任务拆解为包含多个分支的固化流程。工作流的优势是确定性强&#xff0c;模型作为…

重头开始学ROS(6)---Eigen库安装与使用

Eigen库 矩阵运算是一种非常重要的运算方式&#xff0c;在Matlab中&#xff0c;矩阵运算可以轻松的实现&#xff0c;但在C这种偏底层的语言中&#xff0c;若不借助第三方库&#xff0c;矩阵运算需要我们进行较为复杂的代码设计。Eigen库是一个用于线性运算的C模板库&#xff0…

【STM32】外部中断

STM32 外部中断&#xff08;EXTI&#xff09;概述 这篇文章结合示例代码&#xff0c;系统性地讲述 STM32 外部中断&#xff08;EXTI&#xff09;实验的原理、以及配置流程。目的在于辅助读者掌握STM32F1 外部中断机制。 STM32F1xx官方资料&#xff1a;《STM32中文参考手册V10》…

LeetCode Hot100 算法题 (矩阵篇)

1、73. 矩阵置零 给定一个 m x n 的矩阵&#xff0c;如果一个元素为 0 &#xff0c;则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,1,1],[1,0,1],[1,1,1]] 输出&#xff1a;[[1,0,1],[0,0,0],[1,0,1]]// 将第一行…

Flutter基础(项目创建)

一、使用命令行创建项目 1. 确认 Flutter 环境正常 要保证 Flutter SDK 已经正确安装&#xff0c;并且环境变量配置无误。可以通过执行以下命令来验证&#xff1a; flutter doctor 要保证所有检查项都显示绿色对勾&#xff0c;要是有问题&#xff0c;可按照提示进行修复。 …

【Actix Web】Rust Web开发实战:Actix Web框架全面指南(2025企业级应用版)

​ 在2025年高并发、低延迟成为Web服务核心指标的背景下&#xff0c;​​Actix Web凭借异步Actor模型与零成本抽象​​&#xff0c;成为Rust生态中生产环境部署率最高的Web框架。本指南深入解析Actix Web 4.0核心技术&#xff0c;覆盖​​百万级并发架构设计​​、​​内存安全…

HTML之常用基础标签

HTML之常用基础标签 一、HTML文档基本结构标签1. <html>标签2. <head>标签3. <body>标签 二、文本相关基础标签1. 标题标签&#xff08;<h1> - <h6>&#xff09;2. 段落标签&#xff08;<p>&#xff09;3. 换行标签&#xff08;<br>…

外键列索引优化:加速JOIN查询的关键

在使用数据库时&#xff0c;特别是在执行涉及JOIN操作的查询时&#xff0c;优化外键列的索引是非常重要的。外键通常用于建立表之间的关联&#xff0c;而JOIN操作则是基于这些外键列来实现的。下面是一些关键步骤和技巧&#xff0c;可以帮助你优化外键列的索引&#xff0c;从而…

2025年 UI 自动化框架使用排行

💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 </

【软考高项论文】论信息系统项目的整体管理

摘要 在信息系统项目的管理中&#xff0c;整体管理处于核心地位&#xff0c;对项目全局规划与协调起着关键作用&#xff0c;保障项目各阶段目标一致且高效执行。本文结合作者参与的 2024 年 6 月启动的信息系统项目&#xff0c;深入探讨项目整体管理的过程&#xff0c;着重阐述…

(4)Wireshark捕获设置

1.简介 WireShark的强大之处就在于不用你再做任何配置就可以抓取http或者https的包。主要是讲解和分享如何使用WireShark抓包。 2.运行Wireshark 安装好 Wireshark 以后&#xff0c;就可以运行它来捕获数据包了。方法如下&#xff1a; 1.在 Windows 的“开始”菜单中&#…

智慧校园电子班牌系统源码的开发与应用,基于Java/SpringBoot后端、Vue2前端、MySQL5.7数据库

智慧校园系统源码&#xff0c;智慧班牌源码&#xff0c;java语言 技术栈&#xff1a; ‌后端开发‌&#xff1a;采用Java语言和Spring Boot框架进行开发。Java是一种广泛使用的、面向对象的编程语言&#xff0c;而Spring Boot是基于Spring框架的快速应用开发框架&#xff0c;能…

工程优化——WebSocket、WSS(WebSocket Secure)和SSE(Server-Sent Events)通信对比

WebSocket、WSS&#xff08;WebSocket Secure&#xff09;和SSE&#xff08;Server-Sent Events&#xff09;是三种常见的实时通信技术&#xff0c;它们的核心区别在于通信方向、协议实现、数据格式和适用场景。以下是分维度的详细解释&#xff0c;并附带Python示例和应用场景选…

【TiDB 社区智慧合集】 TiDB x 运营商|掌上营业厅、账务、物联网等多核心业务场景的实战应用案例

作者&#xff1a; Billmay表妹 原文来源&#xff1a; https://tidb.net/blog/bb1467af 在信息基础设施国产化战略加速落地的背景下&#xff0c;电信及广电领域正迎来数据库国产化替代的关键转型期。TiDB 凭借自身技术创新优势&#xff0c;深度携手各大运营商&#xff0c;以全…