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 主从复制环境。主从复制不仅提高了数据的可靠性,还可以帮助我们在负载较高时进行负载均衡、实现读写分离增强数据库的吞吐量。

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

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

相关文章

[云讷科技]DASA数字孪生机器人概念

DASA数字孪生机器人概念 我们在 虚幻引擎 (UE) 的帮助下在 DASA 中建立了数字孪生机器人概念。 UE 是 Epic Games 开发的 3D 计算机图形游戏引擎&#xff0c;广泛应用于视频游戏、电影和电视。我们在 DASA 中利用强大的 UE 功能来实现外观逼真的数字机器人&#xff0c;并允许与…

探索Python新境界:Buzhug库的神秘面纱

文章目录 探索Python新境界&#xff1a;Buzhug库的神秘面纱第一部分&#xff1a;背景介绍第二部分&#xff1a;Buzhug库是什么&#xff1f;第三部分&#xff1a;如何安装Buzhug库&#xff1f;第四部分&#xff1a;Buzhug库函数使用方法第五部分&#xff1a;Buzhug库使用场景第六…

微信小程序的上拉刷新与下拉刷新

效果图如下&#xff1a; 上拉刷新 与 下拉刷新 代码如下&#xff1a; joked.wxml <scroll-view class"scroll" scroll-y refresher-enabled refresher-default-style"white" bindrefresherrefresh"onRefresh" refresher-triggered&qu…

Java唯一键实现方案

数据唯一性 1、生成UUID1.1 代码中实现1.2 数据库中实现优点缺点 2、数据库递增主键优点 3、数据库递增序列3.1 创建序列3.2 使用序列优点缺点 在Java项目开发中&#xff0c;对数据的唯一性要求&#xff0c;业务数据入库的时候保持单表只有一条记录&#xff0c;因此对记录中要求…

《向量数据库指南》——BGE-M3:引领多模态RAG系统新风尚!

BGE-M3 BGE-M3 是一个多功能的 Embedding 模型,能够处理多种语言的文本,并支持不同的粒度级别。例如,您可以处理短句,也可以处理长达 8192 个 Token 的长文档。这个 Embedding 模型还能够输出两种不同的向量类型:稠密向量(Dense embedding)和稀疏向量(Sparse embeddin…

在Ubuntu上安装TensorFlow与Keras

文章目录 1. 查看系统和Python版本信息1.1 查看Ubuntu版本信息1.2 查看Python版本信息 2. 安装pip2.1 下载get-pip.py2.2 运行get-pip.py2.3 查看pip版本 3. 安装Jupyter Notebook3.1 安装Jupyter Notebook3.2 运行Jupyter Notebook3.3 安装jupyter-core3.4 配置Jupyter Notebo…

江协科技STM32学习- P34 I2C通信外设

&#x1f680;write in front&#x1f680; &#x1f50e;大家好&#xff0c;我是黄桃罐头&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流 &#x1f381;欢迎各位→点赞&#x1f44d; 收藏⭐️ 留言&#x1f4dd;​…

大学生软件测试2024(练习赛)

本人不太会java语法&#xff0c;主要是本专业老师主讲java&#xff0c;所以不得不使用java语言进行编写&#xff0c;不当之处请见谅&#xff01; 背景说一哈&#xff0c;有点摸鱼的成分&#xff0c;主要是期末课设和这个有关&#xff0c;想学着看看&#xff0c;不知道能不能得…

研究了100个小绿书十万加之后,我们发现2024小绿书独家秘籍就是:在于“先抄后超,持续出摊,量大管饱”!

小绿书作为今年最大的红利&#xff0c;很多人已经吃到了螃蟹。看——&#xff1a; 今天我们总结了100个10万爆款&#xff0c;我们发现要在这个平台上脱颖而出&#xff0c;找到属于自己的方法尤为重要。在这里分享一个主题——小绿书的秘诀就是“先抄后超&#xff0c;持续出摊”…

SQLark百灵连接——整合项目监控过程

关键词&#xff1a;SQL编写、数据查询、数据导入、达梦数据库、项目管理、信息透明 项目监控背景 作为新手项目经理的我&#xff0c;经常觉得哪儿哪儿都是问题&#xff0c;今天催这个&#xff0c;明天推那个&#xff0c;可就是什么事都推不动&#xff0c;谁都不配合。后来&…

【论文解读】EdgeYOLO:一种边缘实时目标检测器(附论文地址)

论文地址&#xff1a;https://arxiv.org/pdf/2302.07483 这篇文章的标题是《EdgeYOLO: An Edge-Real-Time Object Detector》&#xff0c;由中国北京理工大学的Shihan Liu、Junlin Zha、Jian Sun、Zhuo Li和Gang Wang共同撰写。这篇论文提出了一个基于最新YOLO框架的高效、低复…

github打不开网络问题

当打开github出现超时或者网络不能访问的情况时&#xff0c;我们进行如下方法解决&#xff1a; 1&#xff0c;ping gitbub.com查看域名分析的DNS IP C:\Users\86156>ping github.com 正在 Ping github.com [20.205.243.166] 具有 32 字节的数据: 来自 20.205.243.166 的回复…

详解K8S--声明式API

23-0-声明式API 这些API对象&#xff0c;有的描述应用&#xff0c;有的为应用提供服务。但为使用这些API对象提供的能力&#xff0c;都要编写对应YAML文件交给k8s。 这YAML正是k8s声明式API必备要素。 1 用YAML代替命令行操作&#xff0c;就是声明式API&#xff1f; Swarm编排操…

如何策划一场战争?

前言 这个世界并不和平&#xff0c;我们只是生活在一个和平的国家。克服恐惧&#xff0c;最好的办法就是面对它。本文结合作者对于《孙子兵法》和毛泽东军事思想的部分了解&#xff0c;介绍了一般战争的发起、过程和结束的情况。 零、战争定义 首先要说明战争的定义是什么。《…

【Windows】X-DOC:无需NAS使用Windows也能安装Jellyfin玩私人影音媒体平台

【Windows】X-DOC&#xff1a;无需NAS使用Windows也能安装Jellyfin玩私人影音媒体平台 1、前言2、Jellyfin服务搭建2.1 Jellyfin简介2.2 Jellyfin下载2.3 Jellyfin安装2.4 Jellyfin设置2.5 Jellyfin使用 3、终端访问3.1 浏览器访问 4、内网穿透 1、前言 下载收藏高清电影、电视…

Rust的enum枚举的强大用法

在Rust中&#xff0c;enum&#xff08;枚举&#xff09;是一种非常强大的类型&#xff0c;它可以包含多个变体&#xff08;variants&#xff09;&#xff0c;每个变体可以是不同的类型&#xff0c;包括复杂类型。这使得enum在Rust中不仅用于表示简单的状态或选项集合&#xff0…

jmeter基础01-2_环境准备-Mac系统安装jdk

Step1. 查看系统类型 方法&#xff1a;苹果菜单 - 关于本机&#xff0c;看到本机为M1芯片。&#xff08;Mac系统芯片有M系列和Intel两种&#xff09; Step2. 官网下载安装包 https://www.oracle.com/java/technologies/downloads/ 根据芯片类型&#xff0c;选择安装包进行下…

引起what(): basic_string::_M_replace_aux问题的一个原因以及解决方法

自己在做一个项目的时候&#xff0c;报了下面的这个问题&#xff1a; terminate called after throwing an instance of std::length_error what(): basic_string::_M_replace_aux 经过自己的研究&#xff0c;发现是在读取文件的时候没有加上错误判断。 通过网站直接访问一个…

论文阅读:Computational Long Exposure Mobile Photography (一)

这篇文章是谷歌发表在 2023 ACM transaction on Graphic 上的一篇文章&#xff0c;介绍如何在手机摄影中实现长曝光的一些拍摄效果。 Abstract 长曝光摄影能拍出令人惊叹的影像&#xff0c;用运动模糊来呈现场景中的移动元素。它通常有两种模式&#xff0c;分别产生前景模糊或…

【canal 中间件】canal 常见的启动方式

文章目录 一、安装 canal-admin1.1 拉取镜像1.2 启动 canal-admin 容器(使用脚本)1.2.1 下载脚本1.2.2 执行脚本1.2.3 初始化元数据库(可选) 1.3 启动 canal-admin 容器(直接使用 Docker 命令)1.3.1 启动容器1.3.2 查看启动日志 1.4 访问页面 二、 安装 canal-server2.1 拉取镜…