性能提升70%~220%,OBKV提高事务处理效率

1. OBKV 是什么?

OBKV,OceanBase的多模KV产品,专注低成本、大规模的结构化或半结构化数据存储,并提供高效访问性能的简易操作接口。

在实现层面,OBKV Bypass了SQL层,直接基于OceanBase的分布式存储构建了多种多模KV形态,如兼容HBase接口的OBKV-HBase、支持Redis协议的OBKV-Redis,以及通过表格接口提供的OBKV-Table等。这些多模产品形态之间,OBKV通过TableAPI这一框架层,为模型层提供了封装的存储和事务处理能力。详细的架构参见下图:

1717481083

2. 基础性能优化介绍

在v4.2.3(本特性也会Patch到v4.3.3),相较于之前的版本,v4.2.3~v4.3.3的OBKV单行读写性能提升约70%,批量读写性能提升80-220%。下面介绍v4.2.3 OBKV性能优化的原理,主要包含两大优化点:

  • 多行Batch操作的性能优化。
  • 单行操作的性能优化。

2.1. Batch性能优化

OBKV提供了Batch接口,用户可以通过调用Batch接口,将多个单操作聚合为一个批量消息,提交给服务端。Batch能提升性能意味着减少了消息请求响应的数量,所以在网络IO量不变的情况下可以处理更多的消息。在OBKV中,单操作/单分区的Batch会保证事务语义,单分区的Batch中所有的操作会作为一个事务来提交,也减少了事务的开销。

但为什么说OBKV已有的Batch能力并没能完全发挥OceanBase内核的优势呢?主要原因有两点:

  • OBKV的Batch是按照分区粒度组织,分区数量会对Batch性能产生较大的影响。
  • OceanBase底层内核支持了Batch语义,OBKV没有把Batch语义下压给存储,有一定的性能损失。

因此,本次优化针对性地支持LS粒度的Batch,并将Batch语义下压给存储,提升性能。

2.1.1. 支持LS粒度的 Batch

OBKV v4.2.3之前的版本,Batch是分区粒度的,当分区数比较多的时候,一个Batch的操作比较有限,不能很好的发挥Batch的优势。OceanBase 4.0版本之后,底层分布式存储引擎引入了LS(Log Stream)的概念,LS是分区的逻辑容器,一般情况下,LS可以看成是节点级别的概念,一个LS内的事务的性能和单机事务的性能是一样的。在OBKV v4.2.3,引入了更匹配LS概念的消息格式,可以按照LS来组织Batch,也就是可以按照节点维度来做Batch,客户端以及服务端消息交互,以及服务端事务的开销,都有了大幅度降低。

新的消息格式,也做了一些消息请求瘦身的优化,比如:

  • Batch消息中引入列名字典:之前Batch的消息格式,是单操作消息的集合,而每个单操作消息中都单独带了列名信息,有较大冗余。之所以考虑引入字典,是因为存在每个单操作消息需要访问的列名不同的场景(比如表结构中,列数比较多,但是每次插入操作,只有部分列有值)。引入字典后,各个单操作消息中需要访问的列的信息,只用持有列名字典的引用即可。
  • 对元数据做了瘦身:列的元数据用于和服务端交互列的类型,是否为空等信息,之前的消息格式采用定长的元数据结构,在新的消息格式中,元数据结构中的内容做了精简的同时,也引入了变长的元数据格式,大幅度降低了消息包中元数据的开销。

2.1.2. Batch语义下压给存储

OceanBase存储内核,很早之前支持了Multi Get的能力,在v4.2.3支持了Multi Set的能力。为了简化描述,把存储的Multi Get/Set概念,按照TableAPI的Batch Get/Set概念来统一介绍。

接下来以Batch Get为例,分别解释在存储内外做Batch的区别:假设数据在存储中逻辑组织成一颗树,在存储外做Batch Get,每个Get都是一次对存储的调用,每次调用都会从存储树的根节点开始检索数据。在存储内做Batch Get,先对这一批单操作请求的主键做排序,只调用存储一次接口,在迭代一次存储树的过程中按序检索多条记录。也即Batch语义直接下压给存储,减少存储接口调用次数,减少了存储树重复迭代的次数。

OBKV在v4.2.3中,适配了存储的批量能力,一个Batch请求(如果是同一种操作),会在TableAPI层转换为存储的一次批量调用,进一步提升Batch的性能。

2.2. 单操作的性能优化

OBKV的单操作性能,是基于OceanBase底层分布式存储的性能,能够优化的空间有限。OBKV v4.2.3引入了组提交的思路,对不同客户端的单操作请求,在数据库服务端做聚合,基于服务端优化后的Batch能力,降低事务以及存储的调用开销。通过组提交的方式,在请求密集型的场景,请求RT不明显增加的情况下,单操作性能提升70%。

本次组提交作为OBKV的一个实验性功能,需要通过配置项控制,默认关闭:

打开:AlTER SYSTEM SET enable_kv_group_commit=true

组提交在使用上,和客户端Batch有一些不同:

  1. 首先,客户端Batch是请求级别,通过用户显式调用Batch接口,聚合一个客户端的多个请求。组提交在服务端做批量,自动聚合多个客户端的同一类型操作,比较适合单个客户端压力不是太大,但是客户端比较多,整体压力较大的场景。
  2. 其次,组提交的聚合是自适应的,业务不需要设置Batch Size。当压力较小的时候,组提交会退化为单操作。当压力比较大的时候,组提交会基于请求队列的积压情况,系统平均RT等因素,自动选择聚合的粒度以及提交的时机。基于自适应组提交,系统的平均RT也不会有明显的变化。
  3. 最后,组提交对业务的环境,编码要求更小,可以直接通过配置项来开启或者关闭组提交,也能获得一个相对不错的服务端批量性能。但是服务端为了把多个单操作模拟成Batch,做了很多适配,比如聚集消息,把结果集拆分为单操作的响应包等,也会有一定的性能损耗,Batch在一些简单场景,可以获得更极致的性能。

综上,组提交和客户端Batch,都是基于批量的思路优化OBKV的基础性能,提供类似自动档和手动档的方式,给业务纷繁的场景以不同的选择。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux内核下网卡硬件 MAC 和PHY分析笔记

1 简介 通常CPU自带的以太网接口是MAC控制器,为了实现完整的功能,外围硬件还需要增加一个PHY芯片。 PHY芯片在建立网络连接时负责协商确定网速、全双工 或者 半双工等。在正常通讯时负责在MAC控制器的MII信号 与 网线中的信号之间做转换。 本文的内核代…

Servlet-01

文章目录 Servlet创建Servlet探究Servlet的生命周期 HttpServletWebServlet注解详解 重定向与请求转发ServletContextServletContext中的接口 HttpServletRequestHttpServletResponse状态码解释Cookie Servlet Q:它能做什么呢? A:我们可以通…

[office] Excel教学:Excel通配符怎么用? #其他#职场发展

Excel教学:Excel通配符怎么用? 尽管Excel使用了很多年,但很多人都还是忽略了Excel通配符的存在,不知道通配符是什么,不知道如何使用它。今天我就完整地介绍一下通配符,让你彻底地认识通配符。 关于通配符…

SpringBoot2+Vue3开发课程审核流程系统

SpringBoot2Vue3开发课程审核流程系统 简介 此系统实现了课程审核全流程功能并使用了Activiti7工作流技术,功能包含:课程管理、用户管理、流程定义、课程审核(我的申请、我的代办、我的已办) 功能介绍 课程管理 对课程信息的管…

【JavaScript对象详解】 Day05

JavaScript对象详解 JavaScript 基础 - 第5天对象语法对象属性对象使用属性-查属性-改属性-增属性-删 (了解) 方法和调用遍历对象遍历数组对象null 内置对象Math属性方法生成任意范围随机数 综合案例随机点名案例猜数字游戏猜数字游戏设定次数生成随机颜…

深入解读Prometheus Adapter:云原生监控的核心组件

一、引言 Prometheus Adapter的背景与重要性 在现代的云原生架构中,微服务和容器化技术得到了广泛的应用。这些技术带来了系统灵活性和扩展性的提升,但同时也增加了系统监控和管理的复杂度。Prometheus作为一款开源的监控系统,因其强大的指标…

微信小程序 导航navigation-bar

属性类型默认值必填说明最低版本titlestring否导航条标题2.9.0loadingbooleanfalse否是否在导航条显示 loading 加载提示2.9.0front-colorstring否导航条前景颜色值,包括按钮、标题、状态栏的颜色,仅支持 #ffffff 和 #0000002.9.0background-colorstring…

javaweb学习(day14-ThreadLocal文件上传下载)

一、线程数据共享和安全 -ThreadLocal 1 什么是 ThreadLocal ThreadLocal 的作用,可以实现在同一个线程数据共享, 从而解决多线程数据安全问题. ThreadLocal 可以给当前线程关联一个数据(普通变量、对象、数组)set 方法 [源码!] ThreadLocal 可以像 Map 一样存取数…

Steam下载游戏很慢?一个设置解决!

博主今天重装系统后,用steam下载发现巨慢 500MB,都要下载半小时。 平时下载软件,一般1分钟就搞定了,于是大致就知道,设置应该出问题了 于是修改了,如下设置之后,速度翻了10倍。 如下&#x…

Mysql使用中的性能优化——单次插入和批量插入的性能差异

一般Mysql的客户端和服务端不在一台机器上,所以它们之间的通信需要通过网络进行。我们本次实验,希望抛开网络的影响,测试不同SQL方案在Mysql服务器上的执行效率的对比。于是我们使用“存储过程”来辅助测试。 结论 先上结论: 批…

windows安装conda

1 Conda简介 Conda 是一个开源的软件包管理系统和环境管理系统,用于安装多个版本的软件包及其依赖关系,并在它们之间轻松切换。Conda 是为 Python 程序创建的,适用于 Linux,OS X 和Windows,也可以打包和分发其他软…

【Vue】如何提供访问vuex的数据

文章目录 一、提供数据二、访问Vuex中的数据通过$store访问的语法1)模板中使用2)组件逻辑中使用3)js文件中使用 三、通过辅助函数 - mapState获取 state中的数据 一、提供数据 State提供唯一的公共数据源,所有共享的数据都要统一…

Redis进阶知识个人汇总

持久化 三种方式实现它的持久化: RDB持久化 全称Redis数据备份文件,又称Redis数据快照 这种就是将Redis内存中所有数据记录到磁盘中,当实例出故障后,从磁盘中读快照文件进行恢复数据。 一般使用bgsave指令实现 复制主线程得到一…

NVeloDocx一个基于NVelocity的word模版引擎

NVeloDocx是一个基于NVelocity的Word模版引擎,目前主要是用于E6低代码开发平台供用户轻松制作各种Word报告模版。 有以下优点: 1、完全的NVelocity语法; 2、直接在Word中写NVelocity脚本,使用非常非常方便; 3、完全兼…

值类型和引用类型在使用和存储上的区别

使用上的区别 //值类型 int a 10; //引用类型 int[] arr new int[] { 1, 2, 3, 4, 5 };//声明了一个b让其等于之前的a int b a; //声明了一个arr2让其等于之前的arr int[] arr2 arr; Console.WriteLine("a{0},b{1}", a, b); Console.WriteLine("arr[0]{0},…

【SQLAlChemy】如何连接数据库?

使用SQLAlChemy连接数据库 导入包 首先,导入创建数据库引擎的包。 from sqlalchemy import create_engine编写数据库配置 SQLALCHEMY_DATABASE_URL "mysql://root:123456789127.0.0.1:3306/tortoise"字段解释: mysql::这是数…

关于python中的列表和元组

变量就是一块内存空间,用来表示/存储数据 如果表示的数据较少,直接定义几个变量就行了 但是也有的时候,要表示的数据就比较多,如果只是通过定义一个变量来表示一个数据的话,这样的工作效率太低, 所以在p…

QT学习之标签+鼠标/定时器

标签鼠标 QEvent 需求鼠标进入控件范围会进行相关操作 在QEnterEvent类中 [virtual protected] void QWidget::enterEvent(QEnterEvent *event)虚成员函数可以进行重写 实现鼠标进入或离开Lable会打印输出 新建一个父类为QWidget的名字为mylable的C类文件 先声明在.h文件这…

[HGAME 2023 week4]shellcode

看题目,将base64解密,然后dump下来,再拉进ida里,发现为tea加密 在tea加密中得到key 密文就是另外的一个文件 exp import re from ctypes import *import libnumdef decrypt(v, k):v0, v1 c_uint32(v[0]), c_uint32(v[1])delta…

HTML做成一个炫酷跳动爱心的页面

大家好,今天制作制作一个炫酷跳动爱心的页面! 先看具体效果: 要创建一个炫酷跳动爱心的HTML页面,你可以使用HTML、CSS和JavaScript的组合。以下是一个简单的示例,它使用CSS动画和JavaScript来实现跳动效果。 首先&…