在 Docker 中搭建 PostgreSQL16 主从同步环境
1. 环境搭建
本文介绍了如何在同一台机器上使用 Docker 容器搭建 PostgreSQL 的主从同步环境。通过创建互联网络和配置主库及从库,详细讲解了数据库初始化、角色创建、数据同步和验证步骤。主要步骤包括设置主库的连接信息、创建用于复制的角色、使用 pg_basebackup 同步数据,并最终验证同步状态。
1.1. 主库搭建
# 创建docker容器互联网络
docker network create pg-network# 创建映射目录
mkdir /data/postgresdocker run -d -p 5500:5432 -v /docker-data/pgmaster:/var/lib/postgresql/data \
-e POSTGRES_PASSWORD=postgress@123 \
--name pgmaster --network=pg-network postgres:16.4
1.2. 从库搭建
# 创建从库
docker run -d -p 5501:5432 \
-e POSTGRES_PASSWORD=postgress@123 \
--name pgslave1 --network=pg-network postgres:16.4
1.3. 查看主库和从库 IP
# 查看容器IP pgmaster = 172.18.0.2
docker inspect pgmapgmaster = 172.18.0.2ster | grep IPAddress
# pgslave1 = 172.18.0.3
docker inspect pgslave1 | grep IPAddress
1.4. 主库配置
设置主服务的连接信息, 从库使用pg_basebackup同步过来数据后可以直接使用这个配置去同步数据
# 追加参数 主服务的连接信息, 用于从属服务器读取使用
# SQL用户名和密码 user=repl password=repl
cat >> /docker-data/pgmaster/postgresql.conf <<- 'EOF'
primary_conninfo = 'host=172.18.0.2 port=5432 user=repl password=repl'
EOF
host=172.18.0.2主库 IP , 这里因为使用了 同一个网络 pg-network, 所以可以直接通信user=repl password=repl主库数据库中用于同步数据的角色和密码, 等下需要创建
设置只允许哪几个 IP 个角色可以复制数据
# 追加参数, 表示只允许这几个IP的角色repl复制数据
cat >> /docker-data/pgmaster/pg_hba.conf <<- 'EOF'
host replication repl 172.18.0.2/32 md5
host replication repl 172.18.0.3/32 md5
EOF
主库创建用于复制的角色
# 设置账户
docker exec -it pgmaster /bin/bash# 登录
pgsql -U postgres# 关闭异步提交
SET synchronous_commit = off;# 创建 角色名 = repl , 密码 = repl 的账户, 权限为登录和复制
create role repl login replication encrypted password 'repl';# 查看是否创建成功
\du# 退出
\q# ctrl + D 也可以退出
# 重启容器
docker restart pgmaster
# 追加参数 主服务的连接信息, 用于从属服务器读取使用
# SQL用户名和密码 user=repl password=repl
cat >> /docker-data/pgmaster/postgresql.conf <<- 'EOF'
primary_conninfo = 'host=172.18.0.2 port=5432 user=repl password=repl'
EOF# 追加参数, 表示只允许这几个IP的角色repl复制数据
cat >> /docker-data/pgmaster/pg_hba.conf <<- 'EOF'
host replication repl 172.18.0.2/32 md5
host replication repl 172.18.0.3/32 md5
EOF# 设置账户
docker exec -it pgmaster /bin/bash# 登录
pgsql -U postgres
# 关闭异步提交
SET synchronous_commit = off;# 创建 角色名 = repl , 密码 = repl 的账户, 权限为登录和复制
create role repl login replication encrypted password 'repl';# 查看是否创建成功
\du# 退出
\q# ctrl + D 也可以退出
# 重启容器
docker restart pgmaster
1.5. 拷贝主库数据
进入从属容器内部, 使用pg_basebackup 同步主库的数据到从库
# 进入从属容器
docker exec -it pgslave1 /bin/bash
# 同步主服务器数据, 注意 这里的 /docker-data/opt/postgresql-16.0/data 是容器内部的数据
pg_basebackup -Fp --progress -D /docker-data/opt/postgresql-16.0/data/ -R -h 172.18.0.2 -p 5432 -U repl --password
在本地创建目录, 将容器的数据拷贝出来
# 创建目录
mkdir -p /docker-data/opt/postgresql/pgslave1
# 将容器内部的数据复制到外部
docker cp pgslave1:/docker-data/opt/postgresql-16.0/data /docker-data/opt/postgresql/pgslave1
1.6. 重新启动从库
删除容器, 重新启动从库
# 删除容器
docker rm -f pgslave1# 重新开启容器, 注意映射目录
docker run -d -p 5501:5432 \
-e POSTGRES_PASSWORD=postgress@123 \
-v /docker-data/opt/postgresql/pgslave1/data:/var/lib/postgresql/data \
--name pgslave1 --network=pg-network -d postgres:16.4
1.7. 验证
docker logs -f pgslave1

可以看到这里已经开始同步了
或者可以使用 select * from pg_stat_wal_receiver;

create table db_order(id bigint primary key ,name varchar(255)
);insert into db_order(id,name) values (1,'zhangsan');
2. 完整命令
# 创建docker容器互联网络
docker network create pg-network# 创建映射目录
mkdir /data/postgresdocker run -d -p 5500:5432 -v /docker-data/pgmaster:/var/lib/postgresql/data \
-e POSTGRES_PASSWORD=postgress@123 \
--name pgmaster --network=pg-network postgres:16.4# 创建从库
docker run -d -p 5501:5432 \
-e POSTGRES_PASSWORD=postgress@123 \
--name pgslave1 --network=pg-network postgres:16.4# 查看容器IP pgmaster = 172.18.0.2
docker inspect pgmapgmaster = 172.18.0.2ster | grep IPAddress
# pgslave1 = 172.18.0.
docker inspect pgslave1 | grep IPAddress# 追加参数 主服务的连接信息, 用于从属服务器读取使用
# SQL用户名和密码 user=repl password=repl
cat >> /docker-data/pgmaster/postgresql.conf <<- 'EOF'
primary_conninfo = 'host=172.18.0.2 port=5432 user=repl password=repl'
EOF# 追加参数, 表示只允许这几个IP的角色repl复制数据
cat >> /docker-data/pgmaster/pg_hba.conf <<- 'EOF'
host replication repl 172.18.0.2/32 md5
host replication repl 172.18.0.3/32 md5
EOF# 设置账户
docker exec -it pgmaster /bin/bash# 登录
pgsql -U postgres
# 关闭异步提交
SET synchronous_commit = off;# 创建 角色名 = repl , 密码 = repl 的账户, 权限为登录和复制
create role repl login replication encrypted password 'repl';# 查看是否创建成功
\du# 退出
\q# ctrl + D 也可以退出
# 重启容器
docker restart pgmaster# 进入从属容器
docker exec -it pgslave1 /bin/bash
# 同步主服务器数据, 注意 这里的 /docker-data/opt/postgresql-16.0/data 是容器内部的数据
pg_basebackup -Fp --progress -D /docker-data/opt/postgresql-16.0/data/ -R -h 172.18.0.2 -p 5432 -U repl --password# 创建目录
mkdir -p /docker-data/opt/postgresql/pgslave1
# 将容器内部的数据复制到外部
docker cp pgslave1:/docker-data/opt/postgresql-16.0/data /docker-data/opt/postgresql/pgslave1# 删除容器
docker rm -f pgslave1# 重新开启容器, 注意映射目录
docker run -d -p 5501:5432 \
-e POSTGRES_PASSWORD=postgress@123 \
-v /docker-data/opt/postgresql/pgslave1/data:/var/lib/postgresql/data \
--name pgslave1 --network=pg-network -d postgres:16.4

能看到 redo starts 说明已经开始同步了
create table db_order(id bigint primary key ,name varchar(255)
);insert into db_order(id,name) values (1,'zhangsan');
查询同步状态
select * from pg_stat_wal_receiver;

相关文章:
在 Docker 中搭建 PostgreSQL16 主从同步环境
1. 环境搭建 本文介绍了如何在同一台机器上使用 Docker 容器搭建 PostgreSQL 的主从同步环境。通过创建互联网络和配置主库及从库,详细讲解了数据库初始化、角色创建、数据同步和验证步骤。主要步骤包括设置主库的连接信息、创建用于复制的角色、使用 pg_basebacku…...
SpringCloud无介绍快使用,sentinel服务熔断功能与持久化(二十四)
TOC 问题背景 从零开始学springcloud微服务项目 注意事项: 约定 > 配置 > 编码IDEA版本2021.1这个项目,我分了很多篇章,每篇文章一个操作步骤,目的是显得更简单明了controller调service,service调dao默认安装ngi…...
判断浏览器环境,前端打开微信浏览器
我们知道微信浏览器有自带针对微信的组件(比如:微信JSAPI支付使用的WeixinJSBridge),那么,有办法在普通浏览器中打开微信浏览器并跳转页面吗?(似乎微信已禁用外部浏览器调用的普通页面直接跳转,只能通过“weixin://前缀…...
【算法笔记】前缀和算法原理深度剖析(超全详细版)
【算法笔记】前缀和算法原理深度剖析(超全详细版) 🔥个人主页:大白的编程日记 🔥专栏:算法笔记 文章目录 【算法笔记】前缀和算法原理深度剖析(超全详细版)前言一.一维前缀和1.1题…...
linux之网络子系统- 地址解析协议arp 源码分析和邻居通用框架
一、arp 的作用 ARP(Address Resolution Protocol,地址解析协议)是将IP地址解析为以太网MAC地址(物理地址)的协议。在局域网中,当主机或其他网络设备有数据要发送给另一个主机或设备时,它必须知…...
经典动态规划问题:含手续费的股票买卖【从 O(n) 到 O(1) 的优化解析】
题目理解 我们要在给定的股票价格数组 prices 中进行买卖操作,并尽可能多次交易以获取最大利润。每次交易都需要支付一定的手续费 fee,因此我们必须考虑如何通过合适的交易策略最大化利润。 在本题中,每一天可以选择: 不进行任…...
Python画笔案例-088 绘制 滚动的汉字
1、绘制 滚动的汉字 通过 python 的turtle 库绘制 滚动的汉字,如下图: 2、实现代码 绘制 滚动的汉字,以下为实现代码: """滚动的汉字.py """ import time from turtle import * from write_patch import *width,height...
Redis 5.0 安装配置(Windows)
Redis 5.0之后支持Redis Stream等功能 下载地址:Releases tporadowski/redis GitHub 点击运行redis-server.exe 此外:Redis 6.0及以后版本目前都没有Windows版...
金融行业:办公安全防护专属攻略
在中国金融市场快速迈向数字化转型的进程中,数据安全与隐私保护成为了不容忽视的关键议题。面对不断升级的网络威胁和日益严格的监管要求,构建一个既能支持创新又能提供坚实防护的信息安全体系变得尤为重要。亿格云不断深耕办公安全领域,为金…...
python如何基于numpy pandas完成复杂的数据分析操作?
数据分析是现代数据科学的重要组成部分,Python作为一种强大的编程语言,提供了许多库来简化数据分析过程。 其中,NumPy和Pandas是两个最常用的库。NumPy主要用于数值计算,而Pandas则提供了强大的数据结构和数据分析工具。 本文将深入探讨如何利用这两个库进行复杂的数据分…...
Linux中定时任务调度工具——crontab
1.简介 crontab是Unix和类Unix操作系统(如Linux)中用于定时任务调度的工具。其名称来源于“cron”这个守护进程,它负责周期性地执行任务,并且“tab”表示这个工具的配置文件。用户可以通过配置crontab文件来设定定时任务…...
思维+差分,CF 1884C - Medium Design
目录 一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 二、解题报告 1、思路分析 2、复杂度 3、代码详解 一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 1884C - Medium Design 二、解题报告 1、思路分析 考虑 最大值 和 最小值…...
简单介绍冯诺依曼体系
现代的计算机, 大多遵守冯诺依曼体系结构 CPU中央处理器:进行算术运算和逻辑判断。存储器:分为外存和内存,用于存储数据(使用二进制方式存储)。输入设备:用户给计算机发号施令。输出设备:计算机…...
kernel32.dll下载地址:如何安全地恢复系统文件
关于从网络上寻找kernel32.dll的下载地址,这通常不是一个安全的做法,而且可能涉及到多种风险。kernel32.dll是Windows操作系统的核心组件之一,负责内存管理、进程和线程管理以及其他关键系统功能。因为kernel32.dll是系统的基础文件ÿ…...
【高等数学】多元微分学 (一)
偏导数 偏导数定义 如果二元函数 f f f 在 x 0 , y 0 x_0,y_0 x0,y0 的某邻域有定义, 且下述极限存在 lim Δ x → 0 f ( x 0 Δ x , y 0 ) − f ( x 0 , y 0 ) Δ x \lim_{\Delta x\to 0} \frac{f(x_0\Delta x,y_0)-f(x_0,y_0)}{\Delta x} Δx→0limΔxf(x0Δ…...
Python爬取京东商品信息,详细讲解,手把手教学(附源码)
Python 爬虫爬取京东商品信息 下面我将逐一解释每一部分的代码 导入库 from selenium import webdriver from selenium.webdriver.edge.service import Service from selenium.webdriver.edge.options import Options import time import random import csv from selenium.c…...
大家有没有了解过TLKS-PLGS这款接地电阻在线监测装置?它在电力系统中能发挥什么作用呢?
接地电阻在线监测仪(输电铁塔接地电阻监测装置、变电站接地电阻监测装置、三极法接地网电阻监测装置)在电力系统中发挥着至关重要的作用,具体来说,有以下几个方面: 一、实时监测预警。该装置采用激励脉冲技术…...
Shell中的函数
目录 一、系统函数 (一)前言 (二)常用的函数 basename [string/pathname] [suffix] 二、自定义函数 (一)语法 (二)脚本例子 三、函数实际案例 过程中的报错: …...
通过IP地址或者主机名添加打印机20241023
文印室打印机连接方式20241023 Win键盘搜索打印机和扫描仪点击添加打印机或扫描仪,等候片刻点击“我需要的打印机不在列表中”添加打印机,选择使用IP地址或主机名添加打印机点击下一步,设备类型选择自动检测输入主机名:即打印机有…...
基于SpringBoot+Vue智慧养老关爱系统【提供源码+答辩PPT+参考文档+项目部署】
💥 这两年毕业设计和毕业答辩的要求和难度不断提升,传统的JavaWeb项目缺少创新和亮点,往往达不到毕业答辩的要求! ❗如何解决这类问题? 让我们能够顺利通过毕业,我也一直在不断思考、努力、精进。通过2024年…...
循环冗余码校验CRC码 算法步骤+详细实例计算
通信过程:(白话解释) 我们将原始待发送的消息称为 M M M,依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)(意思就是 G ( x ) G(x) G(x) 是已知的)࿰…...
Linux-07 ubuntu 的 chrome 启动不了
文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了,报错如下四、启动不了,解决如下 总结 问题原因 在应用中可以看到chrome,但是打不开(说明:原来的ubuntu系统出问题了,这个是备用的硬盘&a…...
【Java_EE】Spring MVC
目录 Spring Web MVC 编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 编辑参数重命名 RequestParam 编辑编辑传递集合 RequestParam 传递JSON数据 编辑RequestBody …...
【python异步多线程】异步多线程爬虫代码示例
claude生成的python多线程、异步代码示例,模拟20个网页的爬取,每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程:允许程序同时执行多个任务,提高IO密集型任务(如网络请求)的效率…...
关于 WASM:1. WASM 基础原理
一、WASM 简介 1.1 WebAssembly 是什么? WebAssembly(WASM) 是一种能在现代浏览器中高效运行的二进制指令格式,它不是传统的编程语言,而是一种 低级字节码格式,可由高级语言(如 C、C、Rust&am…...
Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理
引言 Bitmap(位图)是Android应用内存占用的“头号杀手”。一张1080P(1920x1080)的图片以ARGB_8888格式加载时,内存占用高达8MB(192010804字节)。据统计,超过60%的应用OOM崩溃与Bitm…...
大数据学习(132)-HIve数据分析
🍋🍋大数据学习🍋🍋 🔥系列专栏: 👑哲学语录: 用力所能及,改变世界。 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言Ǵ…...
08. C#入门系列【类的基本概念】:开启编程世界的奇妙冒险
C#入门系列【类的基本概念】:开启编程世界的奇妙冒险 嘿,各位编程小白探险家!欢迎来到 C# 的奇幻大陆!今天咱们要深入探索这片大陆上至关重要的 “建筑”—— 类!别害怕,跟着我,保准让你轻松搞…...
CSS3相关知识点
CSS3相关知识点 CSS3私有前缀私有前缀私有前缀存在的意义常见浏览器的私有前缀 CSS3基本语法CSS3 新增长度单位CSS3 新增颜色设置方式CSS3 新增选择器CSS3 新增盒模型相关属性box-sizing 怪异盒模型resize调整盒子大小box-shadow 盒子阴影opacity 不透明度 CSS3 新增背景属性ba…...
Python 高级应用10:在python 大型项目中 FastAPI 和 Django 的相互配合
无论是python,或者java 的大型项目中,都会涉及到 自身平台微服务之间的相互调用,以及和第三发平台的 接口对接,那在python 中是怎么实现的呢? 在 Python Web 开发中,FastAPI 和 Django 是两个重要但定位不…...
