PostgreSQL 学习笔记:PostgreSQL 主从复制
PostgreSQL 笔记:PostgreSQL 主从复制
博客地址:TMDOG 的博客
在现代应用程序中,数据库的高可用性和扩展性是至关重要的。PostgreSQL 提供了主从复制功能,可以在多个数据库实例之间复制数据,以实现冗余和负载均衡。本文将介绍如何在 Docker 环境中构建PostgreSQL 主从复制环境。
1. 主从复制原理
PostgreSQL 的主从复制是通过将主服务器的 WAL(Write-Ahead Logging)日志复制到从服务器实现的。以下是主要原理:
-
预写式日志(WAL): PostgreSQL 使用预写式日志记录事务更改,确保在任何时刻数据的完整性。在执行写入操作之前,系统会将更改先写入 WAL,这样即使发生崩溃,也可以通过 WAL 恢复数据。
-
主服务器(Master): 负责处理所有写入操作。当数据被写入时,它首先记录到 WAL 中,然后再应用到数据文件。
-
从服务器(Slave): 被配置为从主服务器接收和应用 WAL 日志,以保持数据一致性。它可以处于热备份状态,随时接收主服务器的更新。
-
复制角色: 从服务器需要一个具备复制权限的角色(如
repl
),通过此角色进行身份验证和连接。 -
异步与同步复制: PostgreSQL 支持异步和同步复制。异步复制可以提高性能,但主服务器不会等待从服务器确认接收到数据,而同步复制则确保数据在主服务器和从服务器之间一致性。
2. 创建网络环境
首先,我们需要为 PostgreSQL 实例创建一个 Docker 网络,以便它们可以相互通信。
docker network create pg-network
3. 创建主服务器
接下来,启动一个 PostgreSQL 主服务器容器。我们将数据存储在宿主机上,以便在容器重启时数据不会丢失。
docker run --network=pg-network --name pgsmaster -p 5500:5432 -e POSTGRES_PASSWORD=123456 -v /var/lib/pgsmaster:/var/lib/postgresql/data -d postgres:16.4
4. 创建从属服务器
同样,我们创建一个 PostgreSQL 从属服务器容器。它将用于接收主服务器的数据复制。
docker run --network=pg-network --name pgsslave -p 5501:5432 -e POSTGRES_PASSWORD=123456 -d postgres:16.4
5. 获取 IP 地址
为了配置主从复制,我们需要获取主从服务器的 IP 地址:
docker inspect pgsmaster | grep IPAddress
docker inspect pgsslave | grep IPAddress
6. 配置主服务器
编辑主服务器的 postgresql.conf
文件,添加从属连接信息。使用上一步获取的 IP 地址。
cat >> /var/lib/pgsmaster/postgresql.conf <<-'EOF'
primary_conninfo = 'host=<主服务器IP> port=5432 user=repl password=repl'
EOF
7. 更新 pg_hba.conf
为了允许从属服务器连接到主服务器,我们需要更新 pg_hba.conf
文件:
cat >> /var/lib/pgsmaster/pg_hba.conf <<-'EOF'
host replication repl <从属服务器IP>/32 md5
EOF
8. 重启主服务器
重启主服务器以使配置更改生效:
docker restart pgsmaster
9. 进入主服务器容器控制台
现在我们进入主服务器的容器:
docker exec -it pgsmaster /bin/bash
10. 创建复制角色
在从属服务器上,我们需要创建一个角色来处理复制:
psql -U postgres
# 关闭同步提交,从属服务器不会等待主服务器确认数据已写入后再提交事务。
set synchronous_commit = off;
# 创建复制角色
create role repl login replication encrypted password 'repl';
# 查看角色
\du
\q
exit
我们看到repl角色,说明创建成功
11. 进入从属服务器
现在我们进入从属服务器的容器:
docker exec -it pgsslave /bin/bash
12. 数据备份
使用 pg_basebackup
从主服务器备份数据:
此次备份是将整个数据库文件从主服务器中备份下来,而不是通过流的形式备份
pg_basebackup -Fp --progress -D /home/opt/postgresql-16.0/data/ -R -h <主服务器IP> -p 5432 -U repl --password
输入密码:repl
exit退出
13. 复制数据到宿主机
将从属服务器的数据复制到宿主机,以便我们可以在新的从属服务器中使用:
docker cp pgsslave:/home/opt/postgresql-16.0/data/ /var/lib/pgsslave
我们查看/var/lib/pgsslave包含完整的数据库文件
14. 删除从属服务器
删除旧的从属服务器容器:
docker rm -f pgsslave
15. 使用复制的数据创建新的从属服务器
重新创建从属服务器,使用之前备份的数据:
docker run --network=pg-network --name pgsslave -p 5501:5432 -e POSTGRES_PASSWORD=123456 -v /var/lib/pgsslave:/var/lib/postgresql/data -d postgres:16.4
16. 查看从属服务器日志
最后,查看从属服务器的日志,以确保复制正常运行:
docker logs -f pgsslave
我们发现日志中包含“recovery”、“WAL”等字样
测试
我们连接两个数据库
在主服务器上创建表并插入数据
我们打开从属服务器发现数据同步了
我们想在从属服务器插入数据发现插入失败
查看主服务器的复制日志表发现复制记录
总结
通过以上步骤,我们成功地在 Docker 中创建了 PostgreSQL 主从复制环境。主从复制不仅提高了数据的可靠性,还可以帮助我们在负载较高时进行负载均衡、实现读写分离增强数据库的吞吐量。
相关文章:

PostgreSQL 学习笔记:PostgreSQL 主从复制
PostgreSQL 笔记:PostgreSQL 主从复制 博客地址:TMDOG 的博客 在现代应用程序中,数据库的高可用性和扩展性是至关重要的。PostgreSQL 提供了主从复制功能,可以在多个数据库实例之间复制数据,以实现冗余和负载均衡。本…...
【系统架构设计师(第2版)】十一、未来信息综合技术
未来信息综合技术是指近年来新技术发展而提出的一些新概念、新知识、新产品,主要包括信息物理系统(CPS)、人工智能(AI)、机器人、边缘计算、数字孪生、云计算和大数据等技术。这些技术涉及多学科、多领域,具…...
Pytorch学习--神经网络--优化器
一、头文件 torch.optim.Optimizer(params, defaults) optim文档 for input, target in dataset:optimizer.zero_grad()output model(input)loss loss_fn(output, target)loss.backward()optimizer.step()二、代码 不带优化器的代码框架 import torch import torchvision…...

w~自动驾驶合集11
我自己的原文哦~ https://blog.51cto.com/whaosoft/12329152 #特斯拉的“纯视觉”路线 , 也许不是最好的 BEVTransformer占用网络技术路线的大热,再次将激光雷达推向风口浪尖。 激光雷达该不该被抛弃? 对车企来说,这是一个艰难的抉择&am…...

大数据新视界 -- 大数据大厂之 Impala 性能优化:解锁大数据分析的速度密码(上)(1/30)
💖💖💖亲爱的朋友们,热烈欢迎你们来到 青云交的博客!能与你们在此邂逅,我满心欢喜,深感无比荣幸。在这个瞬息万变的时代,我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…...

GESP4级考试语法知识(算法概论(三))
爱因斯坦的阶梯代码: //算法1-12 #include<iostream> using namespace std; int main() {int n1; //n为所设的阶梯数while(!((n%21)&&(n%32)&&(n%54)&&(n%65)&&(n%70)))n; //判别是否满足一组同余式cout<<n<…...

x-cmd pkg | gum - 轻松构建美观实用的终端界面,解锁命令行新玩法
目录 简介快速上手安装使用 功能特点竞品和相关作品进一步探索 简介 gum 是由 Charm 团队于 2022 年使用 Go 开发的终端 UI 组件工具箱,能帮用户在终端中快速构建交互式 TUI 界面(如表单、菜单、提示框等),简化命令行应用程序的开…...

WMS系统打通仓储全链条数据势在必行,该如何做呢
一、引言 在当今竞争激烈的商业环境中,高效的仓储管理对于企业的生存和发展至关重要。仓储管理系统(WMS)作为现代仓储管理的核心工具,其作用不仅仅是简单地记录库存数量和位置,更在于打通仓储全链条数据,实…...

基于Python的校园爱心帮扶管理系统
作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏:…...

如何基于pdf2image实现pdf批量转换为图片
最近为了将pdf报告解析成为文本和图片,需要将大量多页的pdf文件拆分下单独的一页一页的图像,以便后续进行OCR和图像处理,因此就需要实现将pdf2image,本文主要结合开源的pdf2image和poppler,实现了pdf转换为png格式图片…...
Tomcat(1) 什么是Tomcat?
Tomcat是一个开源的Web服务器和Servlet容器,它实现了Java Servlet、JavaServer Pages (JSP)、WebSocket和Java EL等Java EE规范。Tomcat由Apache软件基金会维护,是Java应用程序的常用部署平台。 深入理解Tomcat 1. 架构 Tomcat的核心组件包括…...
商务礼仪与职场沟通
知人者智,自知者明。胜人者有力,自胜者强。知足者富,强行者有志,不失其所者久,死而不亡者寿。 ——《道德经(第三十三章)》 认知先行——意识塑造 职业化——标准化,规范化&#…...

C语言必做30道练习题
C语言练习30题(分支循环,数组,函数,递归,操作符) 目录 分支循环1.闰年的判断2.阅读代码,计算代码输出的结果3.输入一个1~7的数字,打印对应的星期几4.输入任意一个整数值,…...

Linux信号_信号的产生
信号概念 信号是进程之间事件异步通知的一种方式,属于软中断。 异步:在异步操作中,任务可以独立执行。一个任务的开始或完成不依赖于其他任务的状态。 同步:在同步操作中,任务之间的执行是相互依赖的。一个任务必须等待…...

数据库基础(7) . DML-基本操作
3.3.DML DML 是 “Data Manipulation Language”(数据操作语言)的缩写,在数据库管理系统(DBMS)中用来处理已存在的数据库中的数据。 它主要包含用于插入(INSERT)、更新(UPDATE&…...

windows运行ffmpeg的脚本报错:av_ts2str、av_ts2timestr、av_err2str => E0029 C4576
问题描述 我目前的环境是: 编辑器: Microsoft Visual Studio Community 2022 (64 位) 运行的脚本是ffmpeg自带的remux样例,只不过我想用c语言执行这个样例。在执行的过程中报错如下图: C4576 后跟初始值设定项列表的带圆括…...

[mysql]mysql的DML数据操作语言增删改,以及新特性计算列,阿里巴巴开发手册mysql相关
1DML数据操作语言,增加删除改数据 插入数据INSERT 插入添加数据,两种方法 方式1:VALUES添加数据 #准备工作 USE atguigudb; CREATE TABLE IF NOT EXISTS emp1( id INT, name VARCHAR(15), hire_data DATE, salary DOUBLE(10,2)); SELECT * FROM emp1 INSERT INTO em…...

Github 2024-11-07 Go开源项目日报 Top10
根据Github Trendings的统计,今日(2024-11-07统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Go项目10HTML项目1Kubernetes: 容器化应用程序管理系统 创建周期:3618 天开发语言:Go协议类型:Apache License 2.0Star数量:106913 个Fork数…...

【黑盒测试】等价类划分法及实例
本文主要介绍黑盒测试之等价类划分法,如什么是等价类划分法,以及如何划分,设计等价类表。以及关于三角形案例的等价类划分法。 文章目录 一、什么是等价类划分法 二、划分等价类和列出等价类表 三、确定等价类的原则 四、建立等价类表 …...

LeetCode17. 电话号码的字母组合(2024秋季每日一题 59)
给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。 示例 1: 输入:digits “23” 输出:[“…...
挑战杯推荐项目
“人工智能”创意赛 - 智能艺术创作助手:借助大模型技术,开发能根据用户输入的主题、风格等要求,生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用,帮助艺术家和创意爱好者激发创意、提高创作效率。 - 个性化梦境…...
在软件开发中正确使用MySQL日期时间类型的深度解析
在日常软件开发场景中,时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志,到供应链系统的物流节点时间戳,时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库,其日期时间类型的…...

vscode(仍待补充)
写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh? debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...

高频面试之3Zookeeper
高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个?3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制(过半机制࿰…...
leetcodeSQL解题:3564. 季节性销售分析
leetcodeSQL解题:3564. 季节性销售分析 题目: 表:sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...

【Java_EE】Spring MVC
目录 Spring Web MVC 编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 编辑参数重命名 RequestParam 编辑编辑传递集合 RequestParam 传递JSON数据 编辑RequestBody …...
Java + Spring Boot + Mybatis 实现批量插入
在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法:使用 MyBatis 的 <foreach> 标签和批处理模式(ExecutorType.BATCH)。 方法一:使用 XML 的 <foreach> 标签ÿ…...

DingDing机器人群消息推送
文章目录 1 新建机器人2 API文档说明3 代码编写 1 新建机器人 点击群设置 下滑到群管理的机器人,点击进入 添加机器人 选择自定义Webhook服务 点击添加 设置安全设置,详见说明文档 成功后,记录Webhook 2 API文档说明 点击设置说明 查看自…...

协议转换利器,profinet转ethercat网关的两大派系,各有千秋
随着工业以太网的发展,其高效、便捷、协议开放、易于冗余等诸多优点,被越来越多的工业现场所采用。西门子SIMATIC S7-1200/1500系列PLC集成有Profinet接口,具有实时性、开放性,使用TCP/IP和IT标准,符合基于工业以太网的…...
基于鸿蒙(HarmonyOS5)的打车小程序
1. 开发环境准备 安装DevEco Studio (鸿蒙官方IDE)配置HarmonyOS SDK申请开发者账号和必要的API密钥 2. 项目结构设计 ├── entry │ ├── src │ │ ├── main │ │ │ ├── ets │ │ │ │ ├── pages │ │ │ │ │ ├── H…...