王春玲:在 MogDB 中实现真正意义上的自治异步事务提交

news2024/11/19 1:36:29

导语

2023年4月7-8日,由中国DBA联盟(ACDU)和墨天轮社区联合主办的第十二届『数据技术嘉年华』(DTC 2023) 在北京新云南皇冠假日酒店成功举办。云和恩墨·本原数据内核研发工程师王春玲在“智能前沿:数据库内核技术”专题论坛上发表了《MogDB中自治异步事务提交的设计与实现》的演讲。本文根据王春玲的演讲内容进行整理归纳,供大家参考。

MogDB 是云和恩墨结合自身十余年的技术沉淀和经验积累,联合本原数据的技术研发力量,基于 openGauss 内核进行增强提升而推出的一款安稳易用的企业级关系型数据库。在 MogDB 众多创新特性中,自治异步事务提交特性使数据库在保障完整性的前提下,实现性能的大幅提升,自公开以来受到广泛关注。

24b82965c6ac52848be048f219313e71.jpeg

王春玲首先介绍了该特性的研发背景,并指出目前数据库在事务提交上存在的技术痛点:随着数据库应用场景的飞速发展,在TP场景下,企业用户对数据库高并发下的事务处理性能有着极高的要求。然而,openGauss 在事务提交过程中需要同步等待日志落盘。在等待期间,空闲的工作线程无法同时处理其他事务,从而导致性能的下降。此外,若在主备模式下,事务提交还需额外等待日志落盘在备机上,更加影响了事务处理能力。(如下图)

472e9d2935ca3cd8da28f34de1e6ee53.jpeg

MogDB 的自治异步事务提交特性基于 openGauss 的线程池而设计。为了便于理解,王春玲对线程池概念进行了讲解:openGauss 的线程池技术是将线程资源进行池化,并在不同连接之间复用。系统启动后,会根据当前核数或用户配置启用固定数量的工作线程(TPLworker)。一个工作线程服务一到多个连接会话(session),将会话和线程进行解耦,并由数据库层来进行线程调度管理,在高并发场景下不会导致线程的频繁切换。

9a32bc70c043c391d7f5faa11eb79584.jpeg

王春玲进一步举例,假设有3个CPU和10个并发的session(1-10),在没有线程池的情况下,需要分别启10个工作线程去执行;而在线程池模式下,只需启3个TPLworker就可以将10个会话分别绑定,从而减少对CPU的抢占。

DTC2023

openGauss已有的事务提交方案

社区版 openGauss 目前有两种事务提交方案,分别为同步事务提交异步事务提交。王春玲对这两种方案进行了介绍:

1、openGauss 的同步事务提交

2021d78229d2b6cbdaaf50654b70a699.jpeg

在事务提交流程中,主节点上有三个主要worker线程,WALwriter负责所有数据落盘操作,待数据全部落盘后,再由WALsender把日志发送给备机。等备机完成日志落盘后,事务才可以提交返回。

因此,该方案在执行session时,TPLworker线程需要从头至尾等待其他线程的全部操作完成,这在很大程度上影响了提交性能

2、openGuass 的异步事务提交

ef7f4504e4b8c0466538adeca86a9157.jpeg

openGuass 的异步事务提交方案可用一句话概括为:不等待日志落盘即返回事务提交成功。如上图所示,TPLworker把日志落盘和与备机同步等操作交给其他线程后,不进行等待,直接提交事务并返回,从而缩短响应时长。

这一方案的优势为性能较好,不受日志落盘速度影响。如下图所示,右侧的异步提交将单点与主备的性能差距大幅缩小,且整体性能有所提升。

aac428b0d76245d1f6b7b2788dbfa8cf.jpeg

但该模式的缺点也十分明显,即无法保障数据库完整性的首要需求。虽然事务显示提交成功,但实际上日志并没有完成落盘或与备机同步。因而一旦数据库崩盘,在重新复盘时,无法判断事务是否真正提交。因为可能出现显示提交成功,但实则数据已经丢失的情况。

综上所述,异步提交在性能提升上具有很大的研发意义。但 openGauss 已有的同步提交和异步提交方案,都只能在性能和完整性上二者择其一。因此,如何在保障数据库完整性的情况下实现性能的提升,成为有待解决的痛点。

DTC2023

MogDB的自治异步事务提交方案

bcba3612c81c79ab6b6395bfcdcb82ee.jpeg

MogDB 在提交流程中增加了一组TPLcommitter线程执行所有的事务提交。因此,TPLworker在等待其他线程处理日志落盘等操作时,可以被释放出来继续处理新的会话,从而实现事务处理和提交的流水线化。

流程细节如上图所示:WALwriter负责日志落盘,WALsender负责将日志发送给备机,备机接收到日志并落盘后,将事务提交信息返回给TPLcommitter线程,再由TPLcommitter完成剩余操作。当新会话进入后,TPLworker就可以无缝处理新会话,从而达到流水线化的效果。

该方案使整个系统事务处理的吞吐量有了明显提升。同时,测试证明committer线程的增加没有导致单个事务响应时间增长。

此外,王春玲还对 MogDB 在用户使用上的设计进行了介绍。MogDB 增加了一个GUC以便让用户能够在会话级别控制是否使用异步提交。MogDB 既支持自治异步事务提交,也支持原来社区版本 openGauss 的事务提交,用户可以在GUC上进行选择切换。

同时,为更好地监控集群状态,MogDB 提供了查看线程状态和会话状态的视图(如下图所示):TPLcommiter线程状态视图用于查看现在集群当中有多少个TPLcommiter线程;会话状态视图用于查看处于各状态下的session分别有多少个。

de658d67363055569aab861b7ba3ee35.jpeg

d2e5f1591b5f9b2c195a465ffc98ca3f.jpeg

DTC2023

MogDB自治异步事务提交性能测试

在分享的最后,王春玲展示了自治异步事务提交的性能实测。实测使用鲲鹏920,64核500G内存,对1000个TPC-C(约100G数据)& 600个并发进行测试。

测试结果显示,自治异步事务提交性能在单点模式下,实现了10%的性能提升;而在主备模式下,更是将性能提升了36.2%。并且将主备与单点间的性能差别降低至6.3%

93fc536d819b7383842f9c32b4497d8e.jpeg

652ab44583081e803420ba7dd65b9db4.jpeg

DTC2023

结语

MogDB 的自治异步事务提交本质是通过实现事务处理和提交的流水线化,使CPU资源得到充分的利用,以实现性能提升,特别是在高并发、小query、写负载高、低速IO设备/HA模式/DCF的场景下,性能优势更为明显。    

作为 openGauss 的商业发行版,MogDB 始终追求更加极致的性能,致力于为企业用户打造安稳易用的数据库产品。在持续加大 MogDB 内核研发投入的同时,云和恩墨始终积极回馈 openGauss 开源社区,以自身全栈的数据技术能力助力中国数据库产业砥砺前行。

点击文末“阅读原文”回顾完整演讲视频

b16d9f715d213046e30b3eca13c1b28b.gif

数据驱动,成就未来,云和恩墨,不负所托!


云和恩墨创立于2011年,以“数据驱动,成就未来”为使命,是智能的数据技术提供商。我们致力于将数据技术带给每个行业、每个组织、每个人,构建数据驱动的智能未来。

云和恩墨在数据承载(分布式存储、数据持续保护)、管理(数据库基础软件、数据库云管平台、数据技术服务)、加工(应用开发质量管控、数据模型管控、数字化转型咨询)和应用(数据服务化管理平台、数据智能分析处理、隐私计算)等领域为各个组织提供可信赖的产品、服务和解决方案,围绕用户需求,持续为客户创造价值,激发数据潜能,为成就未来敏捷高效的数字世界而不懈努力。

0255f2c1aa56e67586b5bb728b21a51d.gif

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

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

相关文章

Adobe设计师证书

Adobe设计师证书又称为Adobe国际认证证书和Adobe认证证书,Adobe国际认证(英文:Adobe Certified Professional)是Adobe公司CEO签发的权威国际认证体系,旨在为用户提供Adobe软件的专业认证。 Adobe认证包括产品技能认证和职业技能认证多个级别,从初学者到专…

【PWN刷题wp】[BJDCTF 2020]babystack

新手上路~低速慢行~ 目录 前言 1. checksec 2. IDA 反汇编 3. payload编写 4. exp编写 5. pwntools用法 前言 作为pwn新手,尽可能在刷题中,记录、学习一些通用的知识点,因此wp是少不了的。 本题是一道简单的ret2text 1. checksec 没有…

程序员必会的英语单词汇总,学习速度可提高10倍,偷偷超越你身边的大聪明

前言 虽然说英语不好也能学编程,但学习速度却大大减慢,尤其是到后面你要查资料或者上Github等英文网站的时候,浏览器自带的翻译还会出错。 所以我专门花了几天的时间,结合自己这些年来的开发经验,把编程常用的英语单…

【C语言】基础语法3:控制流程结构

上一篇:运算符和表达式 下一篇:函数和递归 ❤️‍🔥前情提要❤️‍🔥   欢迎来到C语言基本语法教程   在本专栏结束后会将所有内容整理成思维导图(结束换链接)并免费提供给大家学习,希望大…

linux_设置定时器(C语言)-alarm函数-time命令-settimer函数

接上一篇:linux_信号-终端按键信号-硬件异常信号-kill函数-raise函数-abort函数 本次来分享linux的定时器,也就是alarm函数和settimer函数的调用,同时也介绍time的一种用法,开始上菜: 此博主在CSDN发布的文章目录&…

C语言CRC-32 STM32格式校验函数

C语言CRC-32 STM32格式校验函数 CRC-32校验产生4个字节长度的数据校验码,通过计算得到的校验码和获得的校验码比较,用于验证获得的数据的正确性。基本的CRC-32校验算法实现,参考: C语言标准CRC-32校验函数 不同厂家通过对输入数…

一文读懂JavaWeb,前后端数据交互原来是这样的

文章目录 一、HTTP是前后端数据交互的载体1. HTTP Request2. HTTP Response 二、数据交互格式 JSON1. JSON对象与JSON字符串2. 不同语言中的JSON对象与JSON字符串互换 三、前端如何发送数据1. 表单发送数据2. JSON对象发送数据3. JSON 字符串方式 四、前端如何接收数据五、后端…

Android开发之桌面小部件Widget的基本用法

咱们有这么一个需求,在桌面添加一个app的小部件,小部件展示app里面的热门数据,点击小部件的刷新按钮实现刷新小部件上面的数据的功能。 咱们先看实现的效果图: 小部件的基本需求实现如上: 说明,先创建一个…

EEG源定位

导读 自从脑电图(EEG)被发现以来,人们希望EEG能提供一个了解大脑的窗口,研究人员一直试图用EEG无创定位大脑中产生头皮电位的神经元活动。20世纪50年代的早期探索使用电场理论从头皮电位分布推断大脑中电流偶极子的位置和方向,引发了大量定量…

网络请求实战-实战websocket聊天程序

目录 WebSocket协议初探 Socket连接的建立过程 聊天室:node.js端 聊天室:web端 小结 WebSocket协议初探 一个基于TCP的通信协议 复用HTTP的握手基于TCP传输协议 101切换协议 WebSocket连接之后,传输的都是二进制数据了 Socket连接的建…

Jmeter前置处理器和后置处理器

1. 后置处理器(Post Processor) 本质上是⼀种对sampler发出请求后接受到的响应数据进⾏处理 (后处理)的⽅法 正则表达式后置处理器 (1)引⽤名称:下⼀个请求要引⽤的参数名称,如填写title,则可…

Transformer的原理及应用分析

上一篇博文重点介绍了Transformer的核心组件MultiHeadAttention多头注意力机制,本篇继续介绍transformer的原理。下图为transformer的结构图,其主要由位置编码、多组编码器和多组解码器。以下将重点介绍三个部分。 1. 位置编码 Positional Encoding Att…

基于html+css的图片展示18

准备项目 项目开发工具 Visual Studio Code 1.44.2 版本: 1.44.2 提交: ff915844119ce9485abfe8aa9076ec76b5300ddd 日期: 2020-04-16T16:36:23.138Z Electron: 7.1.11 Chrome: 78.0.3904.130 Node.js: 12.8.1 V8: 7.8.279.23-electron.0 OS: Windows_NT x64 10.0.19044 项目…

Scala循环中断

目录 1.使用抛出和捕获异常的方法跳出当前循环2.使用Scala中的Breaks类的break方法3.测试4.简化 使用 ._ 来引入全部内容 方便调用 在scala中无法直接使用break关键字跳出当前循环,但有其他方法 1.使用抛出和捕获异常的方法跳出当前循环 def main(args: Array[Str…

DAB-DETR代码学习记录之Transformer模块解析

DAB-DETR是吸收了Deformable-DETR,Conditional-DETR,Anchor-DETR等基础上完善而来的。其主要贡献为将query初始化为x,y,w,h思维坐标形式。 这篇博文主要从代码角度来分析DAB-DETR所完成的工作。 DAB-DETR主要是对Decoder模型进行改进。 位置编码的温度值…

「线性DP-步入」传球游戏

传球游戏 题目描述 ​ 上体育课的时候,小蛮的老师经常带着同学们一起做游戏。这次,老师带着同学们一起做传球游戏。 ​ 游戏规则是这样的:n个同学站成一个圆圈,其中的一个同学手里拿着一个球,当老师吹哨子时开始传球…

Java -枚举的使用

一、背景及定义 枚举是在JDK1.5以后引入的。主要用途是:将一组常量组织起来,在这之前表示一组常量通常使用定义常量的方式: public static int final RED 1; public static int final GREEN 2; public static int final BLACK 3;但是常量…

Python3 OpenCV4 计算机视觉学习手册:1~5

原文:Learning OpenCV 4 Computer Vision with Python 3 协议:CC BY-NC-SA 4.0 译者:飞龙 本文来自【ApacheCN 计算机视觉 译文集】,采用译后编辑(MTPE)流程来尽可能提升效率。 当别人说你没有底线的时候&a…

goland 启动go module 之后goland标红,unresolved reference 无法正常追踪代码

程序是别的同事写的,你这边从git上面拉下来 1.go build之后 所有的依赖都弄好了 2.go module也开启了 3.go程序能正常运行 最后还是依赖无法正常追踪 unresolved reference 解决步骤: 1.先让程序正常运行 go clean --modcache。再执行go run main.go或者go build重新编译 2.id…

如何通过开源项目搭建私有云平台--第四步上:安装rancher,搭建K8s集群

第四步上:安装rancher,搭建K8s集群 第四步比较复杂,因此准备分上中下三篇文章来介绍,本次采用rancher来部署K8s集群,选择rancher如下: 1)部署K8s简单,有一个不是那么复杂的管理界面…