POLARDB IMCI 白皮书 云原生HTAP 数据库系统 一 数据压缩和打包处理与数据更新
开头还是介绍一下群,如果感兴趣polardb ,mongodb ,mysql ,postgresql ,redis 等有问题,有需求都可以加群群内有各大数据库行业大咖,CTO,可以解决你的问题。加群请联系 liuaustin3 ,在新加的朋友会分到2群(共1100人左右 1 + 2 + 3)新人会进入3群

4.3 数据打包压缩和整理压缩
当部分package达到最大容量后,它会被转换为big package并压缩到磁盘上以减少空间消耗。压缩过程采用写时复制模式以避免访问冲突。也就是说,生成一个新package来保存压缩数据,而不对部分package进行任何更改。PolarDB-IMCI在压缩后更新元数据,将部分打包替换为新的package(即以原子方式更新指向新打包的指针),对于不同的数据类型,列索引采用不同的压缩算法。数值列采用参考帧、delta编码和位压缩的组合,而字符串列使用字典压缩。此外,由于打包是不可变的,当活动事务大于所有VID时,即没有活动事务引用插入VID映射时,该打包的插入VID映射是无用的。在这种情况下,PolarDB-IMCI会删除行组中的插入VID映射以减少内存占用。
整理
删除操作可能在一个打包中设置删除VID,从而在该打包中留下空洞。随着无效行的数量随时间增加,扫描性能和空间利用效率会降低。PolarDB-IMCI定期检测和重新整理不足的打包,以保持列索引无效行的低水位。例如,少于一半有效行的稀疏包被选为不能进行package。然后,后台线程发起一个整理事务,其中包括大量的更新操作,针对每个迁移的有效行,将选定的打包的所有有效行重新追加到部分打包中。请记住,列索引的更新操作是就地进行的,因此旧行在整理期间甚至之后仍然可以进行前台操作,这使得更新操作不受阻塞。整理后选定的打包在没有活动事务访问时将被永久删除。
5 更新传播
在本节中,我们描述了我们在同步异构数据存储方面的努力。对OLTP的最小干扰是PolarDB-IMCI的一个高优先级目标。为了实现这个目标,PolarDB-IMCI中的更新传播是通过REDO日志实现的,消除了将额外逻辑日志持久化的开销。在REDO日志的基础上,PolarDB需要尽可能及时地保持RO节点的更新以保持数据的新鲜度。为此,我们引入了前置提交日志传送(CALS)来减少可见延迟,并引入了两阶段无冲突并行回放(2P-COFFER)机制来提高回放吞吐量。

5.1 提前提交日志传输 为了最小化性能干扰,在PolarDB-IMCI中,对RO节点的更新是完全异步的。鉴于此,为增强数据的新鲜度,PolarDB-IMCI使用了提前提交日志传输(CALS)技术,在提交之前将事务传送到其他节点。如图5所示,一个事务由多个日志项组成:最后一个日志项是提交或中止日志,前面的日志项是DML日志。每个日志项都被分配了一个日志序列号(LSN)。例如,事务TID为101的日志项有LSN 300∼302。日志项300和301是DML操作的日志,而日志项302包含了事务的决定(即中止)。当RW节点将一个日志项写入共享存储(即PolarFS)后,它通过广播其最新的LSN(在我们的例子中为299)通知RO节点。当接收到LSN时,RO节点立即从PolarFS中读取日志。然后,每个DML日志都会被解析为一个DML语句,并基于其TID存储在一个事务缓冲区中(每个事务一个缓冲单元)。整个过程不需要等待RW节点提交事务。例如,在日志项299中的最终提交之前,具有TID 100的事务中的DML操作将被传输。当RO节点读取一个提交日志项时,较早的DML语句已经被解析并作为逻辑操作交付到事务缓冲区中,使得PolarDB-IMCI能够立即重放这些DML操作。当读取一个中止日志项时,RO节点只需释放事务缓冲区,无需回滚数据。
5.2 两阶段无冲突并行回放 如前所述,PolarDB-IMCI不会为了更新传播而生成额外的逻辑日志,而是重用REDO日志。其原因是日志传送会使RW节点写入更多的日志项,从而影响OLTP性能。然而,从长远来看,使用REDO日志同步异构存储被认为几乎是不可能的[34]。这存在三个挑战:(1) REDO日志仅记录行存储中物理页面的变化,缺乏数据库级别或表级别的信息[42](例如,RO节点不知道页面更改对应哪个表)。(2) REDO日志还包括由行存储本身引起的页面更改,而不仅仅是用户的DML操作,例如B+树的分裂/合并和页面整理。列索引不能应用这些日志,否则可能导致不一致。(3) REDO日志仅包含差异而不是完整的更新,以减少日志占用空间。

如图6所示,PolarDB-IMCI通过两个重放阶段解决了这些挑战。第一阶段是将REDO日志重放到RO节点的内存中的行存储的副本。在这个阶段,PolarDB-IMCI获取完整的信息,将REDO日志解析为逻辑DML语句。然后,第二阶段是将DML语句重放到列索引中。重放的性能对我们的系统至关重要。为了实现高性能,文献中提出了几种并行重放机制[6, 45, 46, 54]。这些工作要么以会话粒度进行并行重放,要么以事务粒度进行并行重放,并借助冲突处理辅助工具(例如锁或依赖图)或者乐观控制。与这些工作不同,PolarDB-IMCI提出了一种新的重放方法,即2P-COFFER,使得两个重放阶段都是无冲突的。在2P-COFFER中,第一阶段以页面粒度进行,而第二阶段以行粒度进行,以实现对不同页面/行的并发修改。修改相同页面/行但属于不同事务的日志条目被视为依赖项,应该按顺序重放。使用2P-COFFER,RO节点的重放吞吐量要远高于RW节点的OLTP吞吐量(图13)。

5.3 第一阶段:物理日志解析 如图7所示,PolarDB的REDO日志记录包含多个字段。为简单起见,我们以更新操作为例,其他类型的操作类似。
TID是创建此记录的事务标识符。
LSN表示日志中此记录的顺序。
PageID标识此记录更新的行所属的物理页面。偏移字段(SlotID)进一步确定更新的行在页面上的位置。
Data字段(差分日志)包含更新值与原始值之间的差异。在图6的左侧,第一阶段根据PageID将REDO日志分发给不同的工作者,并且每个工作者按照LSN的顺序重放页面更改以重现DML的细节。分发过程与第二阶段(第5.4节)类似,但是以页面粒度进行。对于更新类型的日志记录,工作者在重放过程中将生成一个删除DML和一个插入DML,因为列索引是被更新到非原地的。但是REDO日志的差分字段可能不包含主键(PK)信息,而删除DML需要主键信息因此,工作者根据PageID和偏移字段从PolarFS中获取旧行,并在申请条目之前使用旧行组装一个删除类型的DML。然后,工作者将差分字段应用于提取的行中以重放页面更改,并在应用后组装插入DML。为了真正将操作组合成逻辑DML,每个操作还必须补充其表模式。工作者通过记录在页面上的表ID来获取表模式信息。此外,工作者必须识别行存储本身生成的日志条目(例如,B+树分裂)。为了处理这个问题,工作者首先检查一个日志条目是否属于活动事务。如果不属于,则确认该条目不是由用户事务生成的。如果属于,则工作者进一步检查该条目的主键是否在活动事务中被重复插入(通过一个主键集合)。注意,重复的主键插入不是用户DML。因此,重复使用REDO日志会导致重放所有页面更改。作为一种优化,PolarDB-IMCI允许RO节点像RW节点一样维护行存储的缓冲池,以减少数据页面读取量。在我们的实践中,第一阶段的计算能力远远超过RW的日志产生能力。一方面,RO节点直接重现页面更改,无需重做事务的开销,如B+树遍历。另一方面,REDO日志在实际工作负载下始终作用于热页面,使得缓冲池的命中率接近99%。尽管缓冲池减少了用于OLAP的内存,但我们在这里进行了权衡,因为通过REDO日志减少对OLTP的干扰在我们的场景中是更高优先级的。
5.4 第二阶段:逻辑DML应用 REDO日志的LSN顺序确保了日志重放的基本前提,这意味着在RO节点中的更改可以按照与RW相同的顺序进行。第一阶段打破了这个顺序。因此,在转换之后,后台线程将根据关联日志条目的LSN对DML进行排序。然后,后台线程将DML插入到事务缓冲单元中。
在第二阶段,调度程序将一批事务分发给多个工作者,以并行的方式对列索引进行修改。分发是逐行进行的,来自单个事务的DML语句将被分配给多个工作者进行重放。对于一个DML语句,调度程序通过对行主键的哈希值取模来分配指定的工作者。因此,即使这些DML语句属于不同的事务,修改相同行的DML语句将按照提交顺序被分配给相同的工作者。调度程序按照提交顺序处理每个事务,确保对同一行的不同修改按照顺序传递给相同的工作者,从而保证一致性。每个工作者按照§4.2中描述的步骤依次重放每个DML语句,并将更改批量提交到列索引中。
图6的右侧示例演示了两个工作者(W1和W2)如何同时重放两个事务(T1和T2)。T1分别执行插入(1,“A”)和插入(2,“D”)。T2执行更新(2,“B”)和插入(3,“C”)。插入(2,“D”)和更新(2,“B”)按照T1和T2的提交顺序分配给W2。W1按顺序执行这两个DML语句,没有并发冲突。

5.5 处理大事务 到目前为止,我们已经介绍了PolarDB-IMCI的更新传播,但还有一个问题。如5.1所述,CALS从PolarFS预取日志条目到事务缓冲区。因此,如果一个事务包含太多的操作,它的事务缓冲区单元可能会消耗大量的内存。
为了避免过度的内存消耗,PolarDB-IMCI对大事务进行预提交:当事务缓冲单元中的DML语句数量达到给定阈值时,将进行预提交。预提交的基本思想是将更新写入到具有无效插入和删除VID的部分数据包中,使得更新在暂时不可见。预提交的具体步骤如下。首先,为当前事务缓冲区中的所有行请求连续的RID,并保存此RID范围。重要的是要注意,在预提交阶段,全局RID定位器尚不能更改,以避免未提交事务的暴露。因此,PolarDB-IMCI创建一个临时的RID定位器,而不是更新RID全局定位器以缓存新的PK到RID映射关系。然后,PolarDB-IMCI将更新写入到部分数据包中,同时将插入和删除VID设置为无效以使其不可见。最后,PolarDB-IMCI释放事务缓冲单元使用的内存。
当大事务提交时,PolarDB-IMCI将临时RID定位器合并到全局RID定位器中,并使用事务提交序列号纠正无效的VID(在保存的RID范围内)。否则,如果大事务中止,则临时定位器将被清除。部分数据包中剩余的预提交行无效,并将在后台的压缩线程中稍后消除。

相关文章:
POLARDB IMCI 白皮书 云原生HTAP 数据库系统 一 数据压缩和打包处理与数据更新
开头还是介绍一下群,如果感兴趣polardb ,mongodb ,mysql ,postgresql ,redis 等有问题,有需求都可以加群群内有各大数据库行业大咖,CTO,可以解决你的问题。加群请联系 liuaustin3 ,在新加的朋友会分到2群(共…...
linux----源码安装如何加入到系统服务中(systemclt)
将自己源码安装的软件加入到系统服务中。例如nginx,mysql 就以nginx为例,源码安装,加入到系统服务中 使用yum安装nginx,自动会加入到系统服务 16-Linux系统服务 - 刘清政 - 博客园 (cnblogs.com) 第一步: 源码安装好nginx之后࿰…...
Unity 使用UnityWebRequest 读取存档 (IOS只能这样做)
打IOS包的时候发现的,不能使用正常的IO流读取,不然会读取不到数据,只能使用UnityWebRequest 读取 代码如下 public IEnumerator ReadArchive(Action<bool, string> ac, string filepath ""){UnityWebRequest request Unit…...
Caused by: org.springframework.beans.factory.
问题解决:Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name IUserRepository defined in app.test4.OpportunityMatching.IUserRepository defined in EnableJpaRepositories declared on JpaRepositoriesRegistrar.Enable…...
【docker 安装】 与【docker-compose 安装】
不同的操作系统需要不同的docker安装文件:具体下载位置: Docker: https://download.docker.com/linux/static/stable/ docekr-compose:https://github.com/docker/compose/releases 1. 验证客户机器是否有docker 和docker-compose docker -…...
意外:WPS编程新工具,不用编程,excel用户:可以不用VBA啦
来来来,拓宽一下视野! 别总以为excel和WPS只能用VBA编程,也别总是想着ACCESS这些老生常谈的工具。其实对于电子表格高级用户来讲,不会VBA,不用ACCESS,也一样可以解决复杂问题或者高级应用。 尤其是WPS用户…...
GAMES101 笔记 Lecture12 Geometry3
目录 Mesh Operations: Geometry ProcessingMesh Subdivision (曲面细分)Mesh Simplification(曲面简化)Mesh Regularization(曲面正则化) Subdivision(细分)Loop Subdivision(Loop细分)如何来调整顶点位置呢?Loop Subdivision Result (Loop细分的结果) Catmull-Cla…...
Java的内部类
内部类的概念 在 Java 中,内部类是定义在另一个类或者方法的内部的类。内部类可以访问外部类的所有成员和方法,同时可以被外部类和其他类所访问。内部类可以分为四种类型:静态内部类、成员内部类、局部内部类和匿名内部类。 静态内部类 静…...
电赛培训(高频电路类赛题)学习总结
此篇文章基于全国电子设计大赛培训网的官网的高频电路类赛题总结的知识点。 高频电路赛题的相关理论知识点 (1)高频电路的单位 a.1kHz1000Hz不等于1KHz(大写的K是错误的) b.S是西门子,电导的单位,s是秒&…...
Rust ESP32C3开发
Rust ESP32C3开发 系统开发逐步使用Rust语言,在嵌入式领域Rust也逐步完善,本着学习Rust和ESP32的目的,搭建了ESP32C3的环境,过程中遇到了不少问题,予以记录。 ESP-IDF开发ESP32 这一部分可跳过,是使用C开…...
【Spring Cloud Gateway 新一代网关】—— 每天一点小知识
💧 S p r i n g C l o u d G a t e w a y 新一代网关 \color{#FF1493}{Spring Cloud Gateway 新一代网关} SpringCloudGateway新一代网关💧 🌷 仰望天空,妳我亦是行人.✨ 🦄 个人主页——微风撞见云的博客&a…...
Java 中的关键字 final 和 static
一、关键字 final final 修饰符可以用来修饰类、方法和变量,final 修饰的类不能够被继承,修饰的方法不能被继承类重新定义,修饰的变量为常量,是不可修改的。 1.1 final 变量 final 有"最后的、最终的"的含义…...
Spring Cloud OpenFeign 全教程
1. 声明式 REST 客户端: Feign Feign 是一个声明式的 Web Service 客户端。它使编写 Web Service 客户端更容易。要使用 Feign,需要创建一个接口并对其进行注解。它有可插拔的注解支持,包括 Feign 注解和 JAX-RS 注解。Feign 还支持可插拔的…...
LLaMA模型论文《LLaMA: Open and Efficient Foundation Language Models》阅读笔记
文章目录 1. 简介2.方法2.1 预训练数据2.2 网络架构2.3 优化器2.4 高效的实现 3.论文其余部分4. 参考资料 1. 简介 LLaMA是meta在2023年2月开源的大模型,在这之后,很多开源模型都是基于LLaMA的,比如斯坦福大学的羊驼模型。 LLaMA的重点是比…...
了解Unity编辑器 之组件篇Effects(十一)
一、Halo:是一个可用于游戏对象的特效组件,它可以在对象周围添加一个光晕效果 Color属性: 用于设置Halo的颜色。你可以通过选择颜色面板中的颜色来指定光晕的外观。选择适当的颜色可以使光晕与游戏场景中的其他元素相匹配或突出显示。 Size属性: 用于设…...
笔记整理-SpringBoot中的扩展点
SpringBoot有哪些扩展点 aware 感知类接口 aware系列的扩展接口,允许spring应用感知/获取特定的上下文环境或对象。bean生命周期控制类接口 bean生命周期类的接口,可以控制spring容器对bean的处理。app生命周期控制类接口 app生命周期控制类接口…...
各系统的目录信息路径
Windows系统: 查看系统版本——C:\boot.ini IIS配置文件——C:\windows\system32\inetsrv\MetaBase.xml 存储Windows系统初次安装的密码——C:\windows\repair\sam Mysql配置——C:\ProgramFiles\mysql\my.ini MySQL root密码——C:\P…...
Asp.Net 使用Log4Net (封装帮助类)
Asp.Net 使用Log4Net (封装帮助类) 1. 创建Log4Net帮助类 首先,在你的项目中创建一个Log4Net帮助类,用于封装Log4Net的配置和日志记录逻辑。 using log4net; using log4net.Config;public class LogHelper {private static readonly ILog log LogMan…...
全志F1C200S嵌入式驱动开发(lcd屏幕驱动)
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 lcd RGB屏幕作为比较经济、实用的显示工具,在实际场景中使用较多。它的信号来说,一般也比较简单,除了常规的数据信号,剩下来就是行同步、场同步、数据使能和时钟信号了。数据信…...
dubbo原理框架设计
dubbo原理框架设计 (1)config 配置层:对外配置接口,以 ServiceConfig, ReferenceConfig 为中心,可以直接初始化配置类,也可以通过 spring 解析配置生成配置类。 (2)proxy 服务代理…...
浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)
✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义(Task Definition&…...
树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法
树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作,无需更改相机配置。但是,一…...
Leetcode 3576. Transform Array to All Equal Elements
Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接:3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到…...
PHP和Node.js哪个更爽?
先说结论,rust完胜。 php:laravel,swoole,webman,最开始在苏宁的时候写了几年php,当时觉得php真的是世界上最好的语言,因为当初活在舒适圈里,不愿意跳出来,就好比当初活在…...
云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地
借阿里云中企出海大会的东风,以**「云启出海,智联未来|打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办,现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...
理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端
🌟 什么是 MCP? 模型控制协议 (MCP) 是一种创新的协议,旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议,它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...
大数据零基础学习day1之环境准备和大数据初步理解
学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 (1)设置网关 打开VMware虚拟机,点击编辑…...
ServerTrust 并非唯一
NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...
大模型多显卡多服务器并行计算方法与实践指南
一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...
Spring AI 入门:Java 开发者的生成式 AI 实践之路
一、Spring AI 简介 在人工智能技术快速迭代的今天,Spring AI 作为 Spring 生态系统的新生力量,正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务(如 OpenAI、Anthropic)的无缝对接&…...
