IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> PostgreSQL逻辑复制(Logical Replication)原理 -> 正文阅读

[大数据]PostgreSQL逻辑复制(Logical Replication)原理

PostgreSQL 数据复制原理和实际操作演示

1 什么是WAL日志?

WAL 全称是Write-Ahead Logging,预写式日志在数据库系统中是一个保证数据完整性的标准解决方案。事物中对数据文件的变更会优先写入wal文件,只有等事物提交之后(日志文件刷盘成功)才会应用到数据文件。如果这个期间数据库发生崩溃,那么没有被应用的数据可以通过重放wal日志进行恢复。

通常我们对数据库的变更操作(INSERT、 UPDATE、 DELET)在写入wal成功之后就会给客户端返回成功,此时变更存在于wal日志和RAM中,后续在经过check point之后,数据才会落到data page中。
在pg中wal日志可以用来保证数据完整性,也可以用来做数据复制。那么wal文件到底是个什么东西呢?

通过观察数据库的wal文件我们可以发现,wal文件保存在pg的数据目录下的pg_wal目录下,如下图所示:

在这里插入图片描述

可以看到每个wal文件的大小为16MB(这个大小是可以调整的), 内部被分成多个段(segement),每个段为8kb大小(可以调整)。

Wal文件中的内容无法直接以人可读的方式查看, 需要借助pg的内置的工具进行查看。如下模拟一个事物中插入三条数据:
在这里插入图片描述

我们通过pg的内置工具pg_waldump查看 介于 事物开始之前和事物提交之后的lsn之间的wal的内容。
在这里插入图片描述

这里提到了lsn, 那么lsn是什么东西呢?

在pg中的每写入一条记录都会在wal日志中增加一条wal记录,写入这个记录的位置就是lsn,全称为Log Sequence Number,lsn的值是wal文件中字节偏移量。在pg中wal文件的命名跟lsn之间有着关联关系。 首先来看下wal文件命名:

00000001   高8位,代表数据库的timeline	 
      
0000000E   中8位,代表logid           	

00000043   低8位,代表logseq

LSN的格式: E/43D09EB8

Lsn被“/”分隔,高位和wal名称中的中八位对应, 低位中的前两位和wal的低位对应, 后六位的十进制对应的是wal中的字节码的偏移量。Pg中可以通过提供的内置函数pg_walfile_name_offset来查询某个具体的lsn对应的wal文件个偏移量:

在这里插入图片描述

2 什么是逻辑复制?

既然有逻辑二字来限定复制那就说明还有其他的复制方式, 在pg中不止存在逻辑复制, 还有物理复制, 物理复制是逐块逐字节的进行复制。逻辑复制是一种基于对象的复制标识(replica identify)来复制数据对象及其变化的方式。
相较于物理复制, 逻辑复制提供了更加细粒度的控制。逻辑复制整体上采用的是一个发布订阅的模型,订阅者可以订阅一个或者多个发布者, 发布者也可以被一个或者多个订阅者订阅,通常我们在做逻辑复制的通用步骤是:订阅者首先获取发布者数据库上的数据快照并拷贝这部分存量数据,当这个快照复制执行完成之后,发布者数据库上的变更数据就可以实时的发送给订阅者,订阅者也会顺序处理这些增量数据,基于此逻辑复制可以保证事物的一致性,所以有时候也称逻辑复制为事物复制。

2.1 逻辑复制的基础知识

要使用pg的逻辑复制,就得用逻辑解码器,经过逻辑解码器解码后的数据基本上就可以肉眼可读了。Pg提供了两个内置的逻辑解码器一个是pgoutput 另外一个是test_decoding, pgoutput需要编写代码使用流式逻辑复制协议来使用,test_decoding插件我们可以直接使用sql命令执行。如下采用test_decoding来演示获取wal日志中的增量数据。

1. 提前准备好数据库,并修改数据库配置wal_level为logical(如果要使用逻辑复制,必须做此变更)
在这里插入图片描述

2. 接着我们准备好需要的slot, 关于slot以及其他术语我们后面介绍

创建slot
在这里插入图片描述

查看数据库当前的lsn
在这里插入图片描述

查看当前创建好的slot
在这里插入图片描述

// 先查询一次增量数据,发现为空
在这里插入图片描述

// 对现有数据库中的表做一次变更,然后执行查询
在这里插入图片描述

在讲逻辑复制的时候我们提到了几个名词,订阅者,发布者, 复制标识等,接下来就让我们来认识下这几个术语。

术语描述
发布者发布数据的服务
订阅者订阅复制数据的服务
复制标识原名repelication identify,u是在pdate和delete场景下定位老数据的标识,一般是主键或者唯一键
Slot一个标记, 用来记录客户端数据复制的进度信息,主要是lsn的信息
PublicationPublication是一个变更集, 也可以称之为复制集,内部包含了表的变更。也可以作为一个过滤器,提供了行级别力度的控制,可以定义哪些表被发布,也可以定义某个表中符合条件的行被发布。

对于发布者和订阅者

在pg的数据复制过程中,发布者和订阅者是个相对的概念, 发布数据的为发布者,订阅数据的为订阅者,这个发布订阅的模型是可以进行级联的,订阅者也可以发布数据供下游继续订阅。

对于slot的详细信息可以查阅下表

字段名含义
xmin该slot需要数据库保存的最旧的lsn,该lsn之后的事物不会被VACUUM删除
Catalog_xmin该slot需要数据库保留影响系统catalog的最旧的lsn
Restart_lsn使用该slot的消费者可能需要的lsn, 不会被checkpoint删除,只有当此lsn落后current lsn超过max_slot_wal_keep_size. 如果该slot从未被reserved,那么该值为null。
Confirmed_flush_lsn表明消费者已经确认接受到数据对应的lsn, 比当前lsn更老的数据将不会再次接受。
Wal_status该slot需要的wal文件的可用性:
1. reserved:表明该slot需要的wal文件在max_wal_size范围内。
2. extende:表明超过了max_wal_size但是文件仍然被slot或者wal_keep_size保留。
3. unreserved:该slot不再保留需要的wal文件,其中的一些将会在下次的checkpoint被删除, 此状态可以变成reserved或者extended
4. lost:该slot所需的wal文件已经被删除,该slot也不再可用。
Safe_wal_size表明该slot所需的wal文件还可以被写入的字节数(意味着该slot没有处于lost的危险状态), lost的slot该值为null,max_slot_keep_size为-1的该值也为null。
Two_phase如果slot启动了对prepared 事物解码,则为true, 物理slot始终未false。

2.2 数据复制场景中常用的SQL汇总

用途SQL命令
查询pg版本select version();
创建slot
查询slotSELECT * FROM pg_replication_slots;
删除slotselect pg_drop_replication_slot(‘slot_name’);
查询publicationselect * from pg_publication;
查询publication发布的表select * from pg_publication_tables;
查询某个表的replication identifySELECT CASE relreplident WHEN ‘d’ THEN ‘default’ WHEN ‘n’ THEN ‘nothing’ WHEN ‘f’ THEN ‘full’ WHEN ‘i’ THEN ‘index’ END AS replica_identity FROM pg_class WHERE oid = ‘mytablename’::regclass;
查询数据库当前正在执行的操作select * from pg_stat_activity where state =‘active’;

2.3 有了以上的理论基础我们如何实现数据复制呢?

Pg的jdbc驱动中提供了一套API来做逻辑复制。只需要简单的几行代码就可以实现一个简单的数据服务的逻辑。

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-10-22 21:22:24  更:2022-10-22 21:26:11 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年3日历 -2025/3/4 6:21:12-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码