最佳实践—如何支持热点更新场景

简介: 背景介绍 数据库中更新的模式为lock -> update -> unlock,当对数据库中的同一条记录有大量修改请求时,会造成大量的锁争抢与锁等待。请求量增加会导致TPS下降,延迟飙升。例如,秒杀场景中对于商品库存的扣减。 您可以选择在数据库内核中进行批处理,即对该条记录进行的更新操作使用组提交,更新的模式更改为lock-> group update -> unlock,从而减少锁争抢。结合流水线处理等优化,可以大大提高该场景的TPS,详情可见测试结果。

使用方法

  1. 开启hotspot相关功能。在控制台的参数设置页面打开以下两个开关项,或者使用set global命令(非必须情况不建议使用set global指令)。
set global hotspot=on;
set global hotspot_lock_type=on
  1. 切换事务类型为XA,并在业务的update语句中添加inventory hint。
begin;

set drds_transaction_policy=xa; // 若默认事务策略是XA,则无须重复设置,否则每次均需设置事务策略为XA以使用热点更新hint
UPDATE /+ commit_on_success rollback_on_fail target_affect_row(number)/ table_reference
SET assignment_list
[WHERE where_condition];

注意事项

  • where条件应为主键更新或唯一键更新,且不支持带有全局索引的表(可包含本地索引)。
  • 若已开启共享read_view,则应当先将共享read_view进行关闭,而后使用热点更新的能力。
  • 热点更新hint的使用场景为单分片事务,无法在跨库场景中使用。

Inventory Hint各参数含义

  • commit_on_success(必选)如果该语句成功,则进行提交,连同该语句之前的未提交语句一并提交。
  • rollback_on_fail如果该语句失败,则进行回滚,连同该语句之前的未提交语句一并回滚。
  • target_affect_row(number)校验更新的行数是否符合预期,若不符合则更新失败。

示例

  • 添加commit_on_success以使用组提交等针对热点更新场景的优化(id为主键,使用如下语句对id=1的记录进行更新时,若更新成功则自动提交)
begin;
set drds_transaction_policy=xa;
UPDATE /+ commit_on_success/ table_test SET c = c - 1 WHERE id = 1;
  • 使用rollback_on_fail,可使得更新失败时自动进行回滚
begin;
set drds_transaction_policy=xa;
UPDATE /+ commit_on_success rollback_on_fail/ table_test SET c = c - 1 WHERE id = 1;
  • 使用target_affect_row(number),使得该update语句的预期更新行数为number,若不为number,则更新失败
begin;
set drds_transaction_policy=xa;
UPDATE /+ commit_on_success rollback_on_fail target_affect_row(1)/ table_test SET c = c - 1 WHERE id = 1;
  • 在带有热点更新hint的update语句前,可对同一个物理库中的表进行DML操作
begin;
set drds_transaction_policy=xa;
INSERT into table_test_2 values (1,1);
UPDATE /+ commit_on_success rollback_on_fail target_affect_row(1)/ table_test SET c = c - 1 WHERE id = 1;
  • 在带有热点更新hint的update语句后继续进行DML操作,原因是其后的语句会重新开启新的事务(非必须情况下不推荐)
begin;
set drds_transaction_policy=xa;
UPDATE /+ commit_on_success rollback_on_fail target_affect_row(1)/ table_test SET c = c - 1 WHERE id = 1;
INSERT into table_test_2 values (1,1); // 不推荐,因为该条sql会重新开启一个新的事务

查看inventory hint是否生效

  • 使用命令show global status like "%Group_update%"查看组提交状态,Group_update_leader_count一直增加则说明触发了热点组提交的优化逻辑。
mysql> show global status like "%Group_update%";
+---------------------------------------+--------+
| Variable_name | Value |
+---------------------------------------+--------+
| Group_update_fail_count | 54 |
| Group_update_follower_count | 962869 |
| Group_update_free_count | 2 |
| Group_update_group_same_count | 0 |
| Group_update_gu_leak_count | 0 |
| Group_update_ignore_count | 0 |
| Group_update_insert_dup | 0 |
| Group_update_leader_count | 168292 |
| Group_update_lock_fail_count | 0 |
| Group_update_mgr_recycle_queue_length | 0 |
| Group_update_recycle_queue_length | 0 |
| Group_update_reuse_count | 23329 |
| Group_update_total_count | 2 |
+---------------------------------------+--------+
13 rows in set (0.01 sec)
  • 使用show physical full processlist查看update的状态,是否出现hotspot字样
mysql> show physical full processlist where command != 'Sleep';
+-------+------+-----+---------+-------------+---------+------+-------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Group | Atom | Id | User | db | Command | Time | State | Info |
+-------+------+-----+---------+-------------+---------+------+-------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| 0 | 0 | 56 | diamond | test_000001 | Query | 0 | hotspot wait for commit | /DRDS /127.0.0.1/12e774cab8800000-128/0// /UPDATE /+COMMIT_ON_SUCCESS ROLLBACK_ON_FAIL TARGET_AFFECT_ROW(1) / `test_hotline_lZTr` AS `test_hotline` SET `b` = (`b` + 1) WHERE (`a` = 1) |
| 0 | 0 | 822 | diamond | test_000001 | Query | 0 | query end | /DRDS /127.0.0.1/12e774c4e9400000-563/0// /UPDATE /+COMMIT_ON_SUCCESS ROLLBACK_ON_FAIL TARGET_AFFECT_ROW(1) / `test_hotline_lZTr` AS `test_hotline` SET `b` = (`b` + 1) WHERE (`a` = 1) |
| 0 | 0 | 831 | diamond | test_000001 | Query | 0 | hotspot wait for commit | /DRDS /127.0.0.1/12e774c551000000-509/0// /UPDATE /+COMMIT_ON_SUCCESS ROLLBACK_ON_FAIL TARGET_AFFECT_ROW(1) / `test_hotline_lZTr` AS `test_hotline` SET `b` = (`b` + 1) WHERE (`a` = 1) |
| 0 | 0 | 838 | diamond | test_000000 | Query | 0 | starting | show full processlist |
+-------+------+-----+---------+-------------+---------+------+-------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
4 rows in set (0.33 sec)

热点更新测试

测试表定义


CREATE TABLE sbtest(id INT UNSIGNED NOT NULL PRIMARY KEY, c BIGINT UNSIGNED NOT NULL);

测试语句


UPDATE /+ COMMIT_ON_SUCCESS ROLLBACK_ON_FAIL TARGET_AFFECT_ROW(1) / sbtest SET c=c+1 WHERE id = 1;

测试工具

sysbench

机器规格

4C8G×2 (两节点)

测试结果

场景 1线程 4线程 8线程 16线程 32线程 64线程 128线程 256线程 512线程
热点更新 298 986 1872 3472 6315 10138 13714 15803 23262
普通更新 318 423 409 409 412 428 448 497 615
  • 以上结果的单位为TPS,即每秒处理的交易数(Transaction per second)
  • 热点更新的TPS与机器规格、并发请求数、更新语句有关,测试结果仅供参考
相关文章
|
4月前
|
数据采集 JavaScript 物联网
智能工厂四大核心系统:ERP/PLM/MES/WMS规划架构图详解
企业数字化转型需要构建ERP、PLM、MES、WMS等核心系统协同运作的完整体系。ERP整合企业资源管理,PLM管理产品全生命周期数据,MES实现车间生产执行管控,WMS优化仓储物流管理。各系统通过数据流紧密衔接:PLM为ERP提供BOM数据,ERP为MES下达生产计划,MES与WMS协同物料调度。
|
9月前
|
人工智能 运维 监控
十万人好评的Zabbix AI助手,10分钟教你get
本文由实施工程师、Zabbix认证专家张宇分享,教你10分钟打造专属Zabbix AI助手。通过结合DeepSeek大模型与本地化Zabbix知识库,无需搭建知识库服务,快速提升运维效率。方案使用Cherry Studio平台对接API,导入500+篇实战经验总结的知识库,精准解决Zabbix告警风暴、Housekeeping等问题。对比测试显示,该助手能有效过滤AI错误建议,提供安全可靠的解决方案,强化用户问题处理能力。此外,作者还是B站Zabbix入门课程主讲人,欢迎进一步学习!
550 0
十万人好评的Zabbix AI助手,10分钟教你get
|
NoSQL 定位技术 Redis
RedisTemplate.opsForGeo()用法简介并举例
RedisTemplate.opsForGeo()用法简介并举例
828 3
|
监控 安全 测试技术
构建高效的精准测试平台:设计与实现指南
在软件开发过程中,精准测试是确保产品质量和性能的关键环节。一个精准的测试平台能够自动化测试流程,提高测试效率,缩短测试周期,并提供准确的测试结果。本文将分享如何设计和实现一个精准测试平台,从需求分析到技术选型,再到具体的实现步骤。
559 1
|
关系型数据库 MySQL 数据处理
数据传输DTS延迟问题之数据延迟如何解决
数据传输服务(DTS)是一项专注于数据迁移和同步的云服务,在使用过程中可能遇到多种问题,本合集精选常见的DTS数据传输问题及其答疑解惑,以助用户顺利实现数据流转。
|
Kubernetes 网络协议 druid
一文详解长连接黑洞重现和分析
本文先通过重现在不同业务线反复出现的问题,详细描述了从业务、数据库、OS等不同的角度来分析如何解决它。
|
安全 Java 数据安全/隐私保护
如何解决security中异常UsernameNotFoundException总是抛出密码错误问题
如何解决security中异常UsernameNotFoundException总是抛出密码错误问题
545 0
|
Java 应用服务中间件 Apache
Spring Boot几种启动问题的解决方案
  使用Spring Boot以来,遇到和解决过好几次不同的项目启动问题,大多数事故起于错误的配置和依赖。因此,本文用于汇总这些问题,以及提供相应的解决方案,帮助大家更快的定位和排除故障。
3046 0
|
JavaScript Java 测试技术
基于SpringBoot+Vue+uniapp的题库管理系统的详细设计和实现(源码+lw+部署文档+讲解等)
基于SpringBoot+Vue+uniapp的题库管理系统的详细设计和实现(源码+lw+部署文档+讲解等)
197 0
|
机器学习/深度学习 编解码 人工智能
视频分辨率的历史发展,未来趋势是什么?
随着技术的不断发展,视频分辨率也在不断提高。视频分辨率是指视频图像中可显示的像素数量,通常表示为水平像素数和垂直像素数。它对于观看视频时的清晰程度和细节呈现有着重要的影响。 本文将会介绍视频分辨率的基本概念,包括单位、历史发展、标准和未来趋势。我们还会探讨视频分辨率对观影体验的影响以及如何选择适合自己设备的视频分辨率。 无论您是电影爱好者还是普通用户,通过本文,您将能够了解到视频分辨率在过去的发展历程和未来的趋势,从而更好地使用和享受视频娱乐。
视频分辨率的历史发展,未来趋势是什么?

热门文章

最新文章