PG数据库之流复制详解
一、流复制的定义
PostgreSQL流复制(Streaming Replication)是一种数据复制技术,它允许实时传输数据更改,从而在主服务器和一个或多个备用服务器之间保持数据同步。流复制是PostgreSQL数据库管理系统(DBMS)提供的一种高可用性和数据冗余机制,通过实时地在主节点和从节点之间复制数据,确保数据的一致性和可靠性。流复制技术自PostgreSQL 9.0版本引入以来,已经成为许多企业和高可用系统中的重要组成部分。
二、流复制的原理
流复制的核心思想是主节点将所有写入操作记录到一个称为写入前日志(Write-Ahead Logging,WAL)的文件中,而从节点则从主节点的WAL中读取这些变更并将其应用到自己的数据库中。以下是流复制的主要步骤和原理:
1. WAL日志生成:
当主节点上发生写入操作时,该操作将被记录到WAL中。WAL是一个顺序写入的日志文件,它记录了所有数据库变更的详细信息,包括事务ID、操作类型、受影响的数据等。
2. WAL日志传输:
主节点通过WAL日志传输进程(walsender)将WAL日志块发送给从节点。从节点上的WAL日志接收进程(walreceiver)接收到这些WAL日志块后,会将其写入到本地的WAL日志文件中。
3. WAL日志应用:
从节点上的启动进程(startup)会不断地从本地的WAL日志文件中读取变更记录,并将这些变更应用到自己的数据库中。应用过程是顺序执行的,以确保从节点上的数据与主节点保持一致。
4. 数据同步与一致性:
通过流复制,主节点和从节点之间可以保持数据的实时同步,确保数据的一致性。在同步复制模式下,主节点必须确保事务的变更已经被从节点接收并应用后,才会提交该事务,从而确保数据的一致性。
三、流复制的应用场景
流复制技术在许多应用场景中都发挥着重要作用,包括但不限于以下几个方面:
1. 高可用数据系统:
在高可用数据系统中,流复制是一种非常重要的技术,可以确保数据的一致性和可靠性。当主节点出现故障时,从节点可以立即接管,从而最小化数据丢失和停机时间。
2. 数据同步:
在数据同步的场景中,流复制可以实时地复制数据,确保数据的一致性和可靠性。例如,在分布式系统中,流复制可以确保各个节点之间的数据同步。
3. 跨数据中心复制:
使用流复制技术可以在不同的数据中心之间复制数据,并将数据保持在高度的一致性和可靠性。这对于实现地理分散的数据冗余和容灾具有重要意义。
4. 读写分离:
通过流复制,可以将读取操作分流到从节点,从而减轻主节点的负载。这对于高并发读写的应用场景非常有用,可以提高系统的整体性能。
四、流复制的配置与部署
为了实现流复制,需要在主节点和从节点上进行相应的配置和部署。以下是一个简要的配置和部署步骤:
1. 主节点配置:
-
修改postgresql.conf文件,设置以下关键参数:
wal_level:设置为replica或更高(如logical),以支持流复制。max_wal_senders:设置最大WAL发送进程数量,根据实际需求进行调整。wal_keep_size:设置主节点上保留的WAL日志的最小大小(以MB为单位),以支持从节点的读取操作。archive_mode:设置为on,以支持WAL日志的归档。archive_command:设置归档命令,用于将WAL日志文件归档到指定的存储位置。
-
修改pg_hba.conf文件,配置从节点连接主节点的权限:
host replication replication_user standby_ip/32 md5 -
创建一个具有复制权限的用户,用于从节点连接主节点:
CREATEROLE replication_user REPLICATION LOGIN PASSWORD 'replication_password'; -
重启PostgreSQL服务,使配置生效。
2. 从节点配置:
-
修改postgresql.conf文件,设置以下关键参数:
hot_standby:设置为on,以支持从节点的只读查询。primary_conninfo:设置连接主节点所需的参数信息,包括主节点的IP地址、端口、用户等。primary_slot_name:如果启用了逻辑复制槽(replication slot),可以设置此参数以确保WAL日志不会过早被删除。
-
使用pg_basebackup工具初始化从节点的数据目录,并从主节点同步初始数据:
pg_basebackup -h primary_ip -D /path_to_standby_data_dir -U replication_user -P -v --wal-method=stream -
修改recovery.conf文件(在PostgreSQL 12及以后的版本中,该文件的内容已经整合到postgresql.conf中),设置以下参数:
standby_mode:设置为on,以表明这台机器是从节点。primary_conninfo:设置连接主节点的信息。recovery_target_timeline:设置为latest,以表明流复制同步到最新的数据。
-
启动从节点上的PostgreSQL服务。
3. 验证与测试:
- 在主节点上查看同步状态,可以使用ps命令查看walsender进程,以及通过pg_stat_replication视图查看更详细的信息。
- 在从节点上查看同步状态,可以使用ps命令查看walreceiver进程。
- 进行主备切换测试,以确保在主节点故障时,从节点能够顺利接管并提供服务。
五、流复制的优缺点
(一)、优点
1. 实时数据同步:
流复制可以实时地复制数据,确保数据的一致性和可靠性。
2. 高可用性:
通过流复制,可以建立一个主备架构,当主节点出现故障时,从节点可以立即接管,从而最小化数据丢失和停机时间。
3. 负载均衡:
流复制允许将读取操作分流到从节点,从而减轻主节点的负载,提高系统的整体性能。
4. 数据保护:
流复制可以将数据复制到多个从节点,实现数据冗余,保护数据免受意外丢失或损坏。
5. 可扩展性:
流复制可以轻松地扩展到多个从节点,以满足不断增长的数据和并发需求。
(二)、缺点
1. 性能开销:
流复制会对主节点和从节点的性能产生一定的影响,因为需要记录和读取WAL日志。特别是在高并发写入的场景下,性能开销可能会更加明显。
2. 网络延迟:
流复制依赖于网络连接来传输WAL日志,因此网络延迟可能会影响数据同步的实时性。在网络条件较差的环境下,数据同步可能会存在一定的延迟。
3. 数据不一致性风险:
在异步复制模式下,主节点提交事务后不需要等待从节点确认即可返回成功,这可能会导致在主节点故障时从节点上的数据不完全一致。虽然同步复制模式可以解决这个问题,但会牺牲一定的性能。
六、流复制与逻辑复制的比较
除了流复制之外,PostgreSQL还提供了逻辑复制(Logical Replication)作为另一种数据复制技术。逻辑复制和流复制在应用场景、实现原理等方面存在一定的差异。以下是两者的主要比较:
1. 复制级别:
- 流复制:是对实例级别的复制(整个PostgreSQL数据库)。它要求主备库的大版本一致。
- 逻辑复制:是基于表级别的复制。它更灵活,可以跨不同版本的PostgreSQL实例复制数据,甚至可以在不同的数据库系统之间复制数据。逻辑复制允许用户对特定的表或模式进行复制。
2. 实现原理:
- 流复制:基于WAL日志的复制。主节点将WAL日志实时传输给从节点,从节点接收并应用这些WAL日志以实现数据同步。
- 逻辑复制:基于SQL语句层面的复制。主节点将DML操作解析成标准SQL语句并发送给从节点,从节点接收并应用这些SQL语句以实现数据同步。
3. 性能:
- 流复制:通常性能较高,因为它直接复制底层的数据变更。
- 逻辑复制:性能相对较低,因为它需要解析和应用SQL语句。然而,逻辑复制在跨版本和跨数据库系统的复制场景中可能具有优势。
4. 灵活性:
- 流复制:灵活性较低,不支持表级别的选择性复制。
- 逻辑复制:灵活性较高,支持表级别的选择性复制和跨版本、跨数据库的复制。
5. 应用场景:
- 流复制:适用于需要高性能数据同步和高可用性的场景。
- 逻辑复制:适用于需要跨版本、跨数据库系统复制或表级别选择性复制的场景。
七、流复制的最佳实践
为了充分发挥流复制技术的优势并避免潜在的问题,以下是一些最佳实践建议:
1. 合理配置参数:
根据实际需求合理配置主节点和从节点的参数,如wal_level、max_wal_senders、wal_keep_size等。确保这些参数能够支持高效的流复制操作。
2. 监控与告警:
建立监控和告警机制,实时监控流复制的状态和性能。一旦发现异常情况,立即采取措施进行处理,以避免数据丢失或服务中断。
3. 定期备份与恢复测试:
定期对数据库进行备份,并进行恢复测试以确保备份数据的
七、总结
PostgreSQL流复制是一种实时数据同步技术,通过WAL日志在主节点和从节点间传输并应用数据变更,确保数据一致性和可靠性。它适用于高可用数据系统、数据同步、跨数据中心复制及读写分离等场景。配置流复制需调整主从节点的参数,创建复制用户,并初始化从节点数据。流复制具有实时同步、高可用、负载均衡等优点,但也存在性能开销、网络延迟及数据不一致性风险。与逻辑复制相比,流复制适用于高性能数据同步,而逻辑复制则更灵活,支持跨版本和数据库复制。为发挥流复制优势,应合理配置参数、建立监控告警机制,并定期备份与恢复测试。
相关文章:
PG数据库之流复制详解
一、流复制的定义 PostgreSQL流复制(Streaming Replication)是一种数据复制技术,它允许实时传输数据更改,从而在主服务器和一个或多个备用服务器之间保持数据同步。流复制是PostgreSQL数据库管理系统(DBMS)…...
Python酷库之旅-第三方库Pandas(174)
目录 一、用法精讲 801、pandas.Categorical类 801-1、语法 801-2、参数 801-3、功能 801-4、返回值 801-5、说明 801-6、用法 801-6-1、数据准备 801-6-2、代码示例 801-6-3、结果输出 802、pandas.Categorical.from_codes方法 802-1、语法 802-2、参数 802-3、…...
【Linux网络】基于TCP的全连接队列与文件、套接字、内核之间的关系
W...Y的主页 😊 代码仓库管理💕 前言:之前我们已经学习了TCP传输协议,而无论是TCP还是UDP都是使用socket套接字进行网络传输的,而TCP的socket是比UDP复杂的,当时我们学习TCPsocket编程时使用listen函数进行…...
IDE(集成开发环境)
IDE(集成开发环境)是软件开发过程中不可或缺的工具,它集成了代码编写功能、分析功能、编译器、调试器等开发工具,旨在提高开发效率。不同的IDE支持不同的语言和框架,下面是一些通用的IDE使用技巧和插件推荐,…...
一键导入Excel到阿里云PolarDB-MySQL版
今天,我将分享如何一键导入Excel到阿里云PolarDB-MySQL版数据库。 准备数据 这里,我们准备了一张excel表格如下: 连接到阿里云PolarDB 打开的卢导表,点击新建连接-选择阿里云PolarDB-MySQL版。如果你还没有这个工具,…...
Oracle有哪些版本
目录 Oracle 1(1979年) Oracle 2(1983年) Oracle 7(1992年) Oracle 8i(1999年) Oracle 9i(2001年) Oracle 10g(2004年) Oracle 11g(2007年) Oracle 12c(2013年) Oracle 18c(2018年) Oracle 19c(2019年) Oracle 21c(2023年) Oracle 23ai(202…...
先来先服务(FCFS,First-Come, First-Served)调度算法
有利于CPU繁忙作业的原因 充分利用CPU资源: 当一个CPU繁忙型的作业到达后,它会立即被执行,并且在没有其他作业等待的情况下,可以一直占用CPU直到完成。这使得CPU能够持续地执行作业,最大化利用CPU资源。 减少上下文切换…...
Windows操作系统忘记密码怎么办 这个方法屡试不爽 还不来试一下
Windows操作系统重置密码的操作步骤如下: 本方法适用于Windows Server 2008R2及其之后的操作系统。 第一步:从Windows 2008R2之后的操作系统光盘启动到安装界面,一直下一步到磁盘分区界面,按shiftF10调出cmd命令行界面。 第二步&…...
基于java的山区环境监督管理系统(源码+定制+开发)环境数据可视化、环境数据监测、 环境保护管理 、污染防治监测系统 大数据分析
博主介绍: ✌我是阿龙,一名专注于Java技术领域的程序员,全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师,我在计算机毕业设计开发方面积累了丰富的经验。同时,我也是掘金、华为云、阿里云、InfoQ等平台…...
jQuery Mobile 表单输入
jQuery Mobile 表单输入 引言 在移动设备上,表单输入是用户与移动应用交互的重要方式。jQuery Mobile 是一个基于 jQuery 的移动设备友好的开发框架,它提供了丰富的组件和工具来帮助开发者创建响应式和交互式的移动界面。本文将详细介绍如何使用 jQuery Mobile 来创建和定制…...
IoC详解
共有两类注解类型可以实现: 1. 类注解:Controller、Service、Repository、Component、Configuration. 2. 方法注解:Bean. 类注解 Controller(控制器存储) 使⽤Controller存储bean的代码如下所⽰: Con…...
基于 ThinkPHP+Mysql 灵活用工_灵活用工系统_灵活用工平台
基于 ThinkPHPMysql 灵活用工灵活用工平台灵活用工系统灵活用工小程序灵活用工源码灵活用工系统源码 开发语言 ThinkPHPMysql 源码合作 提供完整源代码 软件界面展示 一、企业管理后台 二、运用管理平台 三、手机端...
etcd之etcd分布式锁及事务(四)
1、etcd分布式锁及事务 1.1 前言 分布式锁是控制分布式系统之间同步访问共享资源的一种方式。在分布式系统中,常常需要协调他们的动作。如 果不同的系统或是同一个系统的不同主机之间共享了一个或一组资源,那么访问这些资源的时候,往往需要…...
智慧旅游微信小程序平台
作者介绍:✌️大厂全栈码农|毕设实战开发,专注于大学生项目实战开发、讲解和毕业答疑辅导。 🍅获取源码联系方式请查看文末🍅 推荐订阅精彩专栏 👇🏻 避免错过下次更新 Springboot项目精选实战案例 更多项目…...
C++设计模式创建型模式———简单工厂模式、工厂方法模式、抽象工厂模式
文章目录 一、引言二、简单工厂模式三、工厂方法模式三、抽象工厂模式四、总结 一、引言 创建一个类对象的传统方式是使用关键字new , 因为用 new 创建的类对象是一个堆对象,可以实现多态。工厂模式通过把创建对象的代码包装起来,实现创建对…...
C++ 类与对象(中) 默认成员函数
我们知道在类中,有成员变量和成员函数,我们可以通过创造不同的成员函数来实现这个类不同的功能,如果我们创造一个类,却不实现它的成员函数会如何呢?这个就涉及到类中的默认成员函数的概念了。但在本文我们主要介绍以下…...
中间人攻击(https降级攻击)和iptables命令分析
中间人攻击 以下是一个简单的中间人攻击示例,结合 ARP 欺骗和流量修改: 1. 进行 ARP 欺骗 首先,使用 arpspoof 进行 ARP 欺骗,将受害者的流量重定向到攻击者的机器上: sudo arpspoof -i eth0 -t 172.29.144.50 172…...
开源生活-分布式管理
开源竞争(当自己没有办法彻底掌握一门技术的时候就彻底开源掉;培养出更多的依赖,让更多人帮助你完善你的技术,那么这不就是在砸罐子吗?一个行业里面总会有人先砸罐子的,你不如先砸罐子,还能听个…...
华为OD机试真题- 关联子串
该专栏题目包含两部分: 100 分值部分题目 200 分值部分题目 所有题目都会陆续更新,订阅防丢失 题目描述: 给定两个字符串str1和str2,如果字符串str1中的字符,经过排列组合后的字符串中,只要有一个字符串是…...
云智慧完成华为原生鸿蒙系统的适配, 透视宝 APM 为用户体验保驾护航
2024 年 10 月 22 日,首个国产移动操作系统 —— 华为原生鸿蒙操作系统 HarmonyOS NEXT 正式面世,成为继 iOS 和 Android 后的全球第三大移动操作系统。HarmonyOS NEXT,从系统内核、数据库根基,到编程语言创新、AI(人工…...
SpringBoot-17-MyBatis动态SQL标签之常用标签
文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...
从零实现富文本编辑器#5-编辑器选区模型的状态结构表达
先前我们总结了浏览器选区模型的交互策略,并且实现了基本的选区操作,还调研了自绘选区的实现。那么相对的,我们还需要设计编辑器的选区表达,也可以称为模型选区。编辑器中应用变更时的操作范围,就是以模型选区为基准来…...
Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件
今天呢,博主的学习进度也是步入了Java Mybatis 框架,目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学,希望能对大家有所帮助,也特别欢迎大家指点不足之处,小生很乐意接受正确的建议&…...
涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战
“🤖手搓TuyaAI语音指令 😍秒变表情包大师,让萌系Otto机器人🔥玩出智能新花样!开整!” 🤖 Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制(TuyaAI…...
图表类系列各种样式PPT模版分享
图标图表系列PPT模版,柱状图PPT模版,线状图PPT模版,折线图PPT模版,饼状图PPT模版,雷达图PPT模版,树状图PPT模版 图表类系列各种样式PPT模版分享:图表系列PPT模板https://pan.quark.cn/s/20d40aa…...
GC1808高性能24位立体声音频ADC芯片解析
1. 芯片概述 GC1808是一款24位立体声音频模数转换器(ADC),支持8kHz~96kHz采样率,集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器,适用于高保真音频采集场景。 2. 核心特性 高精度:24位分辨率,…...
Golang——9、反射和文件操作
反射和文件操作 1、反射1.1、reflect.TypeOf()获取任意值的类型对象1.2、reflect.ValueOf()1.3、结构体反射 2、文件操作2.1、os.Open()打开文件2.2、方式一:使用Read()读取文件2.3、方式二:bufio读取文件2.4、方式三:os.ReadFile读取2.5、写…...
从面试角度回答Android中ContentProvider启动原理
Android中ContentProvider原理的面试角度解析,分为已启动和未启动两种场景: 一、ContentProvider已启动的情况 1. 核心流程 触发条件:当其他组件(如Activity、Service)通过ContentR…...
抽象类和接口(全)
一、抽象类 1.概念:如果⼀个类中没有包含⾜够的信息来描绘⼀个具体的对象,这样的类就是抽象类。 像是没有实际⼯作的⽅法,我们可以把它设计成⼀个抽象⽅法,包含抽象⽅法的类我们称为抽象类。 2.语法 在Java中,⼀个类如果被 abs…...
[特殊字符] 手撸 Redis 互斥锁那些坑
📖 手撸 Redis 互斥锁那些坑 最近搞业务遇到高并发下同一个 key 的互斥操作,想实现分布式环境下的互斥锁。于是私下顺手手撸了个基于 Redis 的简单互斥锁,也顺便跟 Redisson 的 RLock 机制对比了下,记录一波,别踩我踩过…...
