热点更新场景,OceanBase如何实现性能优化

news2024/12/23 14:37:53

案例背景

这个案例来自一个保险行业的客户:他们的核心系统底层采用了OceanBase数据库作为存储解决方案,然而,在系统上线运行后,出现了一个异常情况,执行简单的主键更新语句时SQL执行时间出现了显著的波动。为了迅速定位问题原因,DBA立即介入,通过查看OceanBase的审计日志,对引发异常的SQL语句执行情况进行分析。

异常主键更新SQL

审计日志分析

从审计日志里面对异常sql进行统计,sql通过主键ID进行更新,正常情况下不到0.5ms 即可返回,但是异常情况下,最大执行时间甚至超过11秒。根据最大执行时间的执行sql的trace_id, 检索对应observer 日志,可以发现有6005错误,failed to lock write memtable相关信息,可确定为行级锁冲突导致的sql变慢。

ERROR 6005 (HY000) : Try lock row conflict
OceanBase 错误码:6005
错误原因:更新操作加锁失败,向上层返回该错误码并重试。

此种异常问题类似热门商品在营销活动中限时秒杀,属于热点更新场景。热点更新的本质是短时间内对数据库中的同一行数据的某些字段值进行高并发的修改(余额,库存等),这其中的瓶颈主要在于关系型数据库为了保持事务一致性,对数据行的更新都需要经过“加锁,更新,写日志提交,释放锁”的过程,而这个过程实质上是串行的。 所以,提高热点行更新能力的关键在于如何尽可能缩短持有锁的时间。OceanBase 在这个问题上通过持续的探索,提出了一种基于分布式架实现的“提前解行锁(Early Lock Release)”的方案(即“ELR”),提升类似业务场景中单行并发更新的能力。

技术原理

事务提交流程

  • 优化前

当用户发起commit之后,DB端开始触发日志的持久化操作:序列化内存数据并提交本地『buffer manager』,然后发给所有备机,等多数派备机同步日志成功之后,日志才算持久化成功,最后才会解锁并给客户端应答事务提交成功。显然一个事务持锁的时间,包括了4个方面:数据写入+日志序列化+同步备机网络通信+日志刷盘的耗时。对于三地五中心或者磁盘比较差的场景,热点行的性能影响还是比较大的。

  • 优化后

整个提交流程基本不变,仅仅对解锁的时机做了调整。新方案里面,等日志序列化完成,提交到『buffer manager』之后,就开始触发解锁操作,不再等日志多数派刷盘完成,从而降低了整个事务的持锁时间。当前事务解锁之后,允许后续的事务进来操作同一行,到达了多个事务并发更新同一行的效果,从而提高了系统的吞吐能力。

基于上述原理,一个热点行场景的性能,性能的计算公式如下:

TPS=1/一个事务内热点行的持锁耗时,这里的持锁耗时,表示从加锁开始算起,到事务commit的时间间隔;

对于三地五中心场景下,由于整体sql的耗时是30ms,事务跨城的commit rt大约为30ms,因此有了热点行优化之后,性能基本能跟同城部署的性能一致。

正确性保证

(1)两个概念

前驱事务:提前解锁的事务;

后继事务:当前驱事务解锁之后,后面操作同一行的事务会读取到前驱的最新数据,这样后继和前驱产生了『依赖』,我们称当前事务为后继事务。

(2)重要问题解决方案

  • 提前解锁的事务客户端应答时机

提前解锁的事务,并不代表日志一定会同步成功。所以解锁之后,不能立即给客户端应答commit成功,需要等日志完成持久化成功之后再决定。

  • 前驱和后继并发场景下,提交状态如何决定

前驱事务如果出现了回滚,后继事务必然需要回滚。前驱没有明确commit成功之前,后继事务是不能确定commit成功,需要等前驱的状态确定。

  • 级联回滚

如果一行上默认并发的事务很多,一旦最开始的前驱事务回滚,则所有的后继事务都必须回滚,给业务带了在灾难性的问题。为了尽量降低该问题产生的概率,OB限制单行上最大允许并发的事务数量为10,且根据实际情况,可以配置。

应用改造 

Mybatis statementType选择

MYbatis支持STATEMENT,PREPARED 或 CALLABLE(存储过程) ,默认是PREPARED,保持默认PREPARED即可;不要使用statementType="CALLABLE",当使用statementType="CALLABLE"时,驱动层会执行 use database,show function like,这些语句比较费性能,因此当前来说不建议使用statementType="CALLABLE",推荐使用PREPARED

注意:PREPARED下也能支持call PL()调用存储过程,可以参考以下写法

delimiter $$
create procedure prc_update_budget (
`pk_id` bigint(18),
  `uk_sbid` varchar(64),
  `amount` bigint(18)
  )
begin
  update budget set
    CURRENT_AMOUNT = CURRENT_AMOUNT - `amount`,
    GMT_MODIFY = now()
    where ID = `pk_id` and CURRENT_AMOUNT >= `amount`;
    if row_count() <= 0 then
        rollback;
        signal SQLSTATE 'NOT_ENOUGH';
    else
        commit;
    end if;
end $$
delimiter ;

OBSERVER端参数优化

alter system set enable_early_lock_release=true tenant=all; 
alter system set enable_early_lock_release=false tenant=sys;      
alter system set syslog_level="ERROR";
alter system set enable_sql_audit=true;   
alter system set enable_perf_event=true;
alter system set cpu_quota_concurrency = 4;
alter system set _ob_enable_prepared_statement = true;

注意点:

走了远程执行计划的热点行sql,走不到热点行优化路径的,热点行能力也会大大下降;由于远程执行计划难以直接发现,因此最好配置巡检,主动发现。

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

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

相关文章

供应链管理、一件代发系统功能及源码分享 PHP+Mysql

随着电商行业的不断发展&#xff0c;传统的库存管理模式已经逐渐无法满足市场需求。越来越多的企业选择“一件代发”模式&#xff0c;即商家不需要自己储备商品库存&#xff0c;而是将订单直接转给供应商&#xff0c;由供应商直接进行发货。这种方式极大地降低了企业的运营成本…

使用Axios函数库进行网络请求的使用指南

目录 前言1. 什么是Axios2. Axios的引入方式2.1 通过CDN直接引入2.2 在模块化项目中引入 3. 使用Axios发送请求3.1 GET请求3.2 POST请求 4. Axios请求方式别名5. 使用Axios创建实例5.1 创建Axios实例5.2 使用实例发送请求 6. 使用async/await简化异步请求6.1 获取所有文章数据6…

Python Web 应用开发基础知识

Python Web 应用开发基础知识 引言 随着互联网的快速发展&#xff0c;Web 应用程序的需求日益增加。Python 作为一种简单易学且功能强大的编程语言&#xff0c;已经成为 Web 开发中广受欢迎的选择之一。本文将深入探讨 Python Web 开发的基础知识&#xff0c;包括常用框架、基…

Ubuntu 的 ROS 2 操作系统 turtlebot3 gazebo仿真

引言 TurtleBot3 Gazebo仿真环境是一个非常强大的工具&#xff0c;能够帮助开发者在虚拟环境中测试和验证机器人算法。 Gazebo是一个开源的3D机器人仿真平台&#xff0c;它能支持物理引擎&#xff0c;允许机器人在虚拟环境中模拟和测试。结合ROS&#xff0c;它能提供一个完整的…

前后端交互之动态列

一. 情景 在做项目时&#xff0c;有时候后会遇到后端使用了聚合函数&#xff0c;导致生成的对象的属性数量或数量不固定&#xff0c;因此无法建立一个与之对应的对象来向前端传递数据&#xff0c;这时可以采用NameDataListVO向前端传递数据。 Data Builder AllArgsConstructo…

json转excel,读取json文件写入到excel中【rust语言】

一、rust代码 将json文件写入到 excel中。&#xff08;保持json &#xff1a;key原始顺序&#xff09; 可执行程序: 「json2excel.exe」 链接&#xff1a;https://pan.quark.cn/s/fe851c86c659 use indexmap::IndexMap; use serde::Deserialize; use serde_json::{Value,…

【python系列】python数据类型之数字类型

1.定义 数字类型是编程中最常用的数据类型。什么是数字类型&#xff0c;下面是数字类型官方文档的解释&#xff1a;https://docs.python.org/zh-cn/3.10/library/stdtypes.html?highlightstr%20join#numeric-types-int-float-complex 以上可以知道&#xff1a; 数字类型包…

[Redis] Redis服务集群

&#x1f338;个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 &#x1f3f5;️热门专栏: &#x1f9ca; Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 &#x1f355; Collection与…

LLaMA-Factory全流程训练模型

&#x1f917;本文主要讲述在docker下使用LLaMA-Factory训练推理模型。 &#x1fae1;拉取镜像 首先需要启动docker&#xff0c;然后在终端中输入&#xff1a; docker run -tid --gpus all -p 8000:8000 --name LLM -e NVIDIA_DRIVER_CAPABILITIEScompute,utility -e NVIDIA…

计算机组成原理对于学习嵌入式开发的意义

计算机组成原理对于学习嵌入式开发的意义 前言 最近有位同学向我咨询&#xff0c;问学习嵌入式开发需不需要学习硬件&#xff1f;进而引申到了需不需要学习计算机组成原理呢&#xff1f; 正文 首先计算机组成原理是计算机科学与技术专业的一门核心基础课程&#xff0c;它深入…

Python学习从0到1 day27 Python 高阶技巧 ③ 设计模式 — 单例模式

此去经年&#xff0c;再难同游 —— 24.11.11 一、什么是设计模式 设计模式是一种编程套路&#xff0c;可以极大的方便程序的开发最常见、最经典的设计模式&#xff0c;就是我们所学习的面向对象了。 除了面向对象外,在编程中也有很多既定的套路可以方便开发,我们称之为设计模…

算法---解决“汉诺塔”问题

# 初始化步骤计数器 i 1 # 定义移动盘子的函数 def move(n, mfrom, mto): global i # 使用全局变量i来跟踪步骤 print("第%d步:将%d号盘子从%s->%s" % (i, n, mfrom, mto)) # 打印移动步骤 i 1 # 步骤计数器加1 #第一种方法 # 定义汉诺塔问题的递归…

2024游戏陪玩app源码的功能介绍/线上陪玩交友上线即可运营软件平台源码搭建流程

一个完整的陪玩交友系统从概念到实现再到维护的全过程得以清晰展现。每一步都需要团队的紧密协作与细致规划&#xff0c;以确保系统既满足用户需求&#xff0c;又具备良好的稳定性和可扩展性。 基础框架 移动端开发框架&#xff1a;如uniapp&#xff0c;它支持多平台开发&…

AGI自学分享,简单有用的理论与实践

开始必备 谷歌邮箱 没有谷歌邮箱简直“寸步难行”。 GitHub Build and ship software on a single, collaborative platform GitHub GitHub上有所有开源项目的源代码&#xff0c;当然还有许许多多资源的分享。 huggingface huggingface上的space可以试用许多模型demo&a…

基于stm32的智能变频电冰箱系统

基于stm32的智能变频电冰箱系统 持续更新&#xff0c;欢迎关注!!! 基于stm32的智能变频电冰箱系统 随着集成电路技术的发展&#xff0c;单片微型计算机的功能也不断增强&#xff0c;许多高性能的新型机种不断涌现出来。单片机以其功能强、体积小、可靠性高、造价低和开发周期短…

[OpenGL]使用OpenGL实现透明效果

一、简介 本文介绍了如何使用OpenGL实现透明效果&#xff08;transparent&#xff09;&#xff0c;并在最后给出了全部的代码。 在实现透明效果时&#xff0c;使用OpenGL中的混合&#xff08;Blend&#xff09;功能&#xff0c;根据纹理贴图的 alpha 分量将各像素&#xff08;…

ABAP关于PS模块CJ20N中项目物料的屏幕和字段增强CI_RSADD

网上搜关于CJ20N的屏幕增强,基本都是关于项目定义(CI_PROJ)、项目WBS(CI_PRPS)、项目网络活动工序(CI_AFVU)的字段与屏幕增强,几乎没有关于项目物料(CI_RSADD)的字段屏幕增强,我在这里做一个分享。 主要逻辑:实现badi增强,并自建一个函数组后创建屏幕,在badi里面调用…

Android setTheme设置透明主题无效

【问题现象】 1、首先&#xff0c;你在AndroidManifest.xml中声明一个activity&#xff0c;不给application或者activity设置android:theme, 例如这样&#xff1a; <applicationandroid:allowBackup"true"android:icon"mipmap/ic_launcher"android:lab…

windows下git和TortoiseGit(小乌龟)和putty安装配置对github进行操作

本次安装版本如下&#xff1a; 1&#xff0c;先下载安装tortoiseGit一路下载安装即可一直到在桌面上右键可以看到有git的选项出现为止&#xff0c;注意在第一步的时候选择使用putty还是ssh建立网络连接决定后面的步骤&#xff0c;本次以选择putty为例。 2&#xff0c;安装git&a…

Flutter:input输入框

输入框&#xff1a; // 是否显示关闭按钮 bool _showClear false; // 文字编辑控制器&#xff0c;监听搜索框的变化。 final TextEditingController _controller TextEditingController(); // 输入框发生变化事件 void _onChange(String value){if(value.length > 0){setS…