在 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
  1. host=172.18.0.2 主库 IP , 这里因为使用了 同一个网络 pg-network, 所以可以直接通信
  2. 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

img

可以看到这里已经开始同步了

或者可以使用 select * from pg_stat_wal_receiver;

img

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

img

能看到 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;

img

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/57362.shtml

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

相关文章

2024系统分析师考试---论区块链技术及其应用

试题三论区块链技术及其应用 区块链作为一种分布式记账技术,目前已经被应用到了资产管理、物联网、医疗管理、政务监管等多个领域,从网络层面来讲,区块链是一个对等网络(Peer to Peer,P2P),网络中的节点地位对等,每个节点都保存完整的账本数据,系统的运行不依赖中心化节…

成都跃享未来教育咨询有限公司抖音小店新生态

在数字化浪潮席卷全球的今天&#xff0c;教育行业正经历着前所未有的变革与升级。作为一座历史悠久而又充满活力的城市&#xff0c;成都凭借其深厚的文化底蕴和前瞻性的发展眼光&#xff0c;孕育了众多创新型企业。其中&#xff0c;成都跃享未来教育咨询有限公司&#xff08;以…

计算机专业大学四年的学习路线(非常详细),零基础入门到精通,看这一篇就够了

前言 许多学子选择踏上计算机这条充满挑战与机遇的道路。但在大学四年中&#xff0c;如何规划自己的学习路线&#xff0c;才能在毕业时脱颖而出&#xff0c;成为行业的佼佼者呢&#xff1f; 第一学年&#xff1a;基础知识的奠基 1.1 课程安排 在大学的第一年&#xff0c;重…

YoloV10改进:Block改进|使用ContextAggregation模块改善C2f模块|即插即用

摘要 在计算机视觉领域,目标检测与实例分割任务一直是研究的热点。YoloV10作为目标检测领域的佼佼者,凭借其出色的性能和效率赢得了广泛的认可。然而,随着技术的不断进步,如何进一步提升YoloV10的性能成为了我们追求的目标。近期,我们引入了ContextAggregation模块对Yolo…

spark:Structured Streaming介绍

文章目录 1. Structured Streaming介绍1.1 实时计算和离线计算1.1.1 实时计算1.1.2 离线计算 1.2 有界和无界数据 2. 简单使用3. 编程模型4. 数据处理流程4.1 读取数据Source4.1.1 文件数据处理 4.2 计算操作 Operation4.3 数据输出 Sink4.3.1 输出模式4.3.2 指定输出位置4.3.3…

JVM篇(运行时数据区(实战课程学习总结)

目录 学习前言 一、运行时数据区 1. JVM运行时数据区规范 2. Hotspot运行时数据区 3. 分配JVM内存空间 分配堆的大小 分配方法区的大小 分配线程空间的大小 二、程序计数器 1. 作用 2. 存储的数据 3. 异常 三、Java虚拟机栈 1. 栈帧 1.1. 局部变量表 存储内容 …

【已解决】C# NPOI如何在Excel文本中增加下拉框

前言 上图&#xff01; 解决方法 直接上代码&#xff01;&#xff01;&#xff01;&#xff01;综合了各个大佬的自己修改了一下&#xff01;可以直接规定在任意单元格进行设置。 核心代码方法块 #region Excel增加下拉框/// <summary>/// 增加下拉框选项/// </s…

12. 命令行

Hyperf 的命令行默认由 hyperf/command 组件提供&#xff0c;而该组件本身也是基于 symfony/console 的抽象。 一、安装 通常来说该组件会默认存在&#xff0c;但如果您希望用于非 Hyperf 项目&#xff0c;也可通过下面的命令依赖 hyperf/command 组件。 composer require hype…

PuTTY

PuTTY 是一个免费的开源终端仿真器和串口终端&#xff0c;广泛用于在 Windows 系统上进行 SSH、Telnet 和 Rlogin 等网络协议的连接。 它允许用户通过安全的方式访问远程计算机&#xff0c;常用于管理服务器和网络设备。 PuTTY 也支持公钥身份验证和端口转发等功能&#xff0c;…

使用 Spring 框架构建 MVC 应用程序:初学者教程

Spring Framework 是一个功能强大、功能丰富且设计精良的 Java 平台框架。它提供了一系列编程和配置模型&#xff0c;旨在简化和精简 Java 中健壮且可测试的应用程序的开发过程。 人们常说 Java 太复杂了&#xff0c;构建简单的应用程序需要很长时间。尽管如此&#xff0c;Jav…

Unity/C#使用EPPlus读取和写入Excel

简介&#xff1a;本篇使用EPPlus来将数据写入Excel&#xff0c;如果需要使用NPOI那可以阅读我之前文档使用NPOI创建及写入数据_npoi 模板 写数据-CSDN博客 一、安装EPPlus 这里使用 .unitypackage 文件形式安装 1.1下载NuGetForUnity.unitypackage github进行搜索下载 下载…

【MySQL】MySQL 使用全教程

MySQL 使用全教程 介绍 MySQL 是一种广泛使用的开源关系型数据库管理系统(Relational Database Management System)&#xff0c;它基于 Structured Query Language&#xff08;SQL&#xff09;进行数据管理&#xff0c;允许用户存储、检索、更新和删除数据库中的数据。通过提供…

vscode设置特定扩展名文件的打开编码格式

用vscode 编辑c语言或者Verilog代码, 由于其它开发工具的文件编码格式无法修改,默认只能是gb2312, 与我们国内奉行的统一 utf8 不一致. 所以只能是更改特殊文件的打开方式. 配置方式如下. 关键配置如下: {"git.openRepositoryInParentFolders": "never",…

【办公类-57-01】美工室材料报销EXCEL表批量插入截图(图片)

背景需求&#xff1a; 我们班分到美工室&#xff0c;需要准备大量材料&#xff0c;根据原始的报销单EXCLE&#xff0c;里面有商品名称、图片、链接、单位、数量等信息 今天我和搭档一起填写新表&#xff0c;发现手机截图的图片插入EXCEL后非常大&#xff0c; 需要手动调整图片…

4 -《本地部署开源大模型》在Ubuntu 22.04系统下部署运行ChatGLM3-6B模型

在Ubuntu 22.04系统下部署运行ChatGLM3-6B模型 大模型部署整体来看并不复杂&#xff0c;且官方一般都会提供标准的模型部署流程&#xff0c;但很多人在部署过程中会遇到各种各样的问题&#xff0c;很难成功部署&#xff0c;主要是因为这个过程会涉及非常多依赖库的安装和更新及…

当当网获得dangdang商品详情 API 返回值说明

item_get-获得dangdang商品详情 dangdang.item_get 公共参数 请求地址: 名称类型必须描述keyString是调用key&#xff08;必须以GET方式拼接在URL中&#xff09;secretString是调用密钥api_nameString是API接口名称&#xff08;包括在请求地址中&#xff09;[item_search,i…

【AI】人工智能的应用与前景

目录 人工智能的应用与前景1. 人工智能的当前应用1.1 医疗领域1.1.1 医疗影像中的AI应用1.1.2 药物研发中的AI潜力 1.2 企业与商业领域1.2.1 数据驱动的智能决策1.2.2 自动化业务流程 1.3 智能生活领域1.3.1 自动驾驶技术的崛起1.3.2 智能家居中的AI应用 2. 人工智能的未来前景…

Golang | Leetcode Golang题解之第485题最大连续1的个数

题目&#xff1a; 题解&#xff1a; func findMaxConsecutiveOnes(nums []int) (maxCnt int) {cnt : 0for _, v : range nums {if v 1 {cnt} else {maxCnt max(maxCnt, cnt)cnt 0}}maxCnt max(maxCnt, cnt)return }func max(a, b int) int {if a > b {return a}return …

全面解析P2P网络

1. 引言 什么是P2P网络&#xff1f; P2P&#xff08;Peer-to-Peer&#xff09;网络是一种分布式网络架构&#xff0c;其中每个节点&#xff08;或称为“对等体”&#xff09;都是网络的参与者&#xff0c;节点之间直接进行数据交换与通信。不同于传统的客户端-服务器架构&…

区块链技术在网络安全中的应用研究

摘要&#xff1a; 随着网络技术的快速发展&#xff0c;网络安全问题日益凸显。区块链技术以其去中心化、不可篡改、可追溯等特性&#xff0c;为网络安全提供了新的解决方案。本文深入探讨了区块链技术在网络安全多个领域的应用&#xff0c;包括数据加密与存储、身份认证、网络攻…