当前位置: 首页 > news >正文

066、故障处理之热点问题

为什么要解决热点

分布式架构中各个组件的理想状态:资源利用率相对均衡
在这里插入图片描述

形成写热点的原因

  1. 高频访问的小表
  2. SQL执行计划不合理
  3. 具有顺序增长属性的索引扫描

数据组织模型

在这里插入图片描述
例如数据是序列递增,则有可能数据全部都集中一个region上 ,或者集中在一个节点
在这里插入图片描述

定位热点

  • TiDB Dashboard
    • 流量可视化页面
    • 慢查询页面
    • SQL 语句分析
  • Grafana监控
    • TiKV - Trouble Shooting
    • TiKV - Details
    • PD

TiDB Dashboard流量可视化

  • 总览
    在这里插入图片描述

语句执行情况

在这里插入图片描述
在这里插入图片描述

写热点打散

表结构

shard_row_id_bits 和 pre_split_regions
在这里插入图片描述

create table t(c int) shard_row_id_bits = 4;
alter table t shard_row_id_bits =4 ;

auto_random

create table t(a bigint primary key auto_random,b varchar(255));

在这里插入图片描述

索引

split table table_name index idx_name between () and () regions n

系统变量

tidb_scatter_region: 作用域是global,默认值是off. 它的作用是预先在不同的节点上分配空region

写热点打散 - 业务运行过程中

步骤1: TiDB Dashboard流量可视化页面,观测写流量的情况

  • 判断流量明亮情况
  • 记录有效信息

步骤2: Dashboard慢查询页面& SQL语句分析,确认对应数据库对象DML的操作类型

步骤3: show create table …

步骤4: 热点打散

insert

数据类型操作类型自增主键打散方式
行数据insertalter table tbl_name shared_row_id_bits=n;
行数据insertalter table t modify a bigint auto_random(5); v4.0.13起支持

update/delete

数据类型操作类型打散方式
行数据update/delete如下
  • 通过流量可视化菜单,可以定位菜单目标Region ID
    • pd-ctl region key {start_key}
  • 分裂reggion
    • pd-ctl operator add split-region {region_id} --polict=approximate
  • transfter 分裂出新region 到其他store
    • 通过pd.log 过滤出新split后的新region id
    • transfter 到资源利用率相对较低的store
      • operator add add-peer {new_region_id} {target_store_id}
      • operator add transfer-leader {new_region_id} {target_store_id}
      • operator add remove-peer {new_region_id} {target_store_id}
  • alter table t modify a bigint auto_random(5); v4.0.13起支持

索引

数据类型打散方式
索引数据如下
  • 通过流量可视化菜单,可以定位菜单目标Region ID
    • pd-ctl region key {start_key}
  • 分裂reggion
    • pd-ctl operator add split-region {region_id} --polict=approximate
  • transfter 分裂出新region 到其他store
    • 通过pd.log 过滤出新split后的新region id
    • transfter 到资源利用率相对较低的store
      • operator add add-peer {new_region_id} {target_store_id}
      • operator add transfer-leader {new_region_id} {target_store_id}
      • operator add remove-peer {new_region_id} {target_store_id}
  • split table tbl_name index index_name between () and () regions n;

读热点打散

步骤1: TiDB Dashboard 流量可视化页面观测读流量的情况

  • 判断流量明亮情况
  • 记录有效信息
    步骤2: TiDB Dashboard 慢查询页面& SQL语句分析,确认问题时间段数据库中SQL:
  • 执行的频次
  • 执行计划: 扫描数据的行数

小表频繁访问引起热点

解决方案 load base ,它会自动打散,通常不需要人工干预

  • 方式1
    qps超过3000或者流量超过30M/s 自动分裂 自动打散
    • set config tikv split.qps-threshold=3000
    • set config tikv split.byte-threshold=30
mysql> set config tikv split.qps-threshold=4000;
Query OK, 0 rows affected (0.02 sec)mysql> show config where name like '%qps-threshold%';
+------+---------------------+---------------------+-------+
| Type | Instance            | Name                | Value |
+------+---------------------+---------------------+-------+
| tikv | 192.168.16.13:20160 | split.qps-threshold | 4000  |
+------+---------------------+---------------------+-------+
1 row in set (0.01 sec)
  • 方式2
    • curl -X POST "http://192.168.16.13:20180/config" -H "accept: application/json" -d '{"split.qps-threshold":"3000"}' # 20180 : 修改是tikv参数,这个对应的是是TiKV的status port
    • curl -X POST "http://192.168.16.13:20180/config" -H "accept: application/json" -d '{"split.byte-threshold":"30"}' # 20180 : 修改是tikv参数,这个对应的是是TiKV的status port
[root@tidb2 ~]# curl -X POST "http://192.168.16.13:20180/config" -H "accept: application/json" -d '{"split.byte-threshold":"40"}'mysql> show config where name like '%byte-threshold%';
+------+---------------------+----------------------+-------+
| Type | Instance            | Name                 | Value |
+------+---------------------+----------------------+-------+
| tikv | 192.168.16.13:20160 | split.byte-threshold | 40    |
+------+---------------------+----------------------+-------+
1 row in set (0.02 sec)

SQL执行计划不合理

  • 缺少索引,出现不必要全表扫描
  • 多个索引,但优化器选择错误
    • 检查目标表统计信息的健康程度
    • 干预优化器

顺序增长属性字段索引范围扫描

  • 方式1
    qps超过3000或者流量超过30M/s 自动分裂 自动打散

    • set config tikv split.qps-threshold=3000
    • set config tikv split.byte-threshold=30
    • curl -X POST "http://192.168.16.13:20180/config" -H "accept: application/json" -d '{"split.qps-threshold":"3000"}' # 20180 : 修改是tikv参数,这个对应的是是TiKV的status port
    • curl -X POST "http://192.168.16.13:20180/config" -H "accept: application/json" -d '{"split.byte-threshold":"30"}' # 20180 : 修改是tikv参数,这个对应的是是TiKV的status port
  • 方式2

    • split table tbl_name index idx_name between () and () regions n;

实验

使用sysbench 工具模拟数据的并发插入,并采用auto_random选项来尝试打散热点

1、 安装sysbench

wget https://codeload.github.com/akopytov/sysbench/tar.gz/1.0.17
mv 1.0.17 sysbench-1.0.17.tar.gz
tar -zxvf sysbench-1.0.17.tar.gz -C /usr/local/
yum install automake libtool –y
cd /usr/local/sysbench-1.0.17/
[root@tidb2 sysbench-1.0.17]# ./autogen.sh
[root@tidb2 sysbench-1.0.17]# ./configure
[root@tidb2 sysbench-1.0.17]# make -j
[root@tidb2 sysbench-1.0.17]# make install
[root@tidb2 sysbench-1.0.17]# sysbench --version
sysbench 1.0.17

2、 配置sysbench 配置文件

[root@tidb2 ~]# more config_new 
mysql-host=192.168.16.13
mysql-port=4000
mysql-user=root
mysql-db=sbtest
time=600
threads=32
report-interval=10
db-driver=mysql

3、创建sysbench测试数据库sbtest

[root@tidb2 ~]# mysql -uroot -p -h192.168.16.13 -P 4000
mysql> create database sbtest;

4、采用sysbench模拟并发批量写入数据,此过程时间较长(15 min)左右,如下:

[root@tidb2 ~]# sysbench /usr/local/share/sysbench/oltp_common.lua --config-file=config_new --tables=1 --table-size=20000000 --mysql-password=Aa123ab!  prepare

5、实验用的表是自增主键的聚簇索引表

mysql> show create table sbtest1;
+---------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table   | Create Table                                                                                                                                                                                                                                                                                                               |
+---------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| sbtest1 | CREATE TABLE `sbtest1` (`id` int(11) NOT NULL AUTO_INCREMENT,`k` int(11) NOT NULL DEFAULT '0',`c` char(120) NOT NULL DEFAULT '',`pad` char(60) NOT NULL DEFAULT '',PRIMARY KEY (`id`) /*T![clustered_index] CLUSTERED */
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin AUTO_INCREMENT=2000001 |
+---------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.11 sec)

6、 查看热力图,流量可视化
在这里插入图片描述
7、修改测试脚本,将自增主键调整为auto_random

mysql> show create table sbtest1;
+---------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table   | Create Table                                                                                                                                                                                                                                                                                                               |
+---------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| sbtest1 | CREATE TABLE `sbtest1` (`id` int(11) NOT NULL AUTO_RANDOM(5),`k` int(11) NOT NULL DEFAULT '0',`c` char(120) NOT NULL DEFAULT '',`pad` char(60) NOT NULL DEFAULT '',PRIMARY KEY (`id`) /*T![clustered_index] CLUSTERED */
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin |
+---------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.11 sec)

8、清理之前实验数据

[root@tidb2 ~]# sysbench /usr/local/share/sysbench/oltp_common.lua --config-file=config_new --mysql-password=Aa123ab! cleanup

9、再次采用sysbench模拟并发并批量写入数据

[root@tidb2 ~]# sysbench /usr/local/share/sysbench/oltp_common.lua --config-file=config_new --tables=1 --table-size=20000000 --mysql-password=Aa123ab!  prepare

10、 查看热力图,流量可视化
在这里插入图片描述

相关文章:

066、故障处理之热点问题

为什么要解决热点 分布式架构中各个组件的理想状态:资源利用率相对均衡 形成写热点的原因 高频访问的小表SQL执行计划不合理具有顺序增长属性的索引扫描 数据组织模型 例如数据是序列递增,则有可能数据全部都集中一个region上 ,或者集中…...

C/C++常用宏归纳

1 #define TO_STRING(t) #t #define MAP_TO_STRING(ot) {TO_STRING(ot), ot}TO_STRING宏接受一个参数t,并使用#运算符将其转换为字符串。这意味着当你在代码中使用TO_STRING(abc)时,它将被替换为字符串"abc"。 MAP_TO_STRING宏接受一个…...

在Windows 10/11 上安装GNS3模拟器

文章目录 在Windows 10/11 上安装GNS3模拟器简介支持的操作系统最低要求推荐配置要求最佳配置要求下载GNS3 all-in-one 安装文件安装GNS3在Windows 10/11 上安装GNS3模拟器 简介 本文档解释了如何在Windows环境中安装GNS3。你将学习如何: 下载所需的软件安装前提条件和可选软…...

React Route5 路由

💻 React Route5 路由🏠专栏:React 👀个人主页:繁星学编程🍁 🧑个人简介:一个不断提高自我的平凡人🚀 🔊分享方向:目前主攻前端,其他知…...

海尔设计借助亚马逊云科技生成式AI,实现端到端的云上工业设计解决方案

海尔创新设计中心(以下简称海尔设计)成立于1994年,目前拥有400多名设计师,为海尔智家旗下七大品牌全球的所有产品提供设计创新和模式探索。亚马逊云科技为海尔设计提供了四个完整的云上解决方案,全面替代自有机房&…...

python数据结构和字符串用法

python数据结构和字符串用法 #Python 中数学运算常用的函数基本都在 math 模块 import math print(math.ceil(4.1)) #5 print(math.floor(4.9)) #4 print(math.fabs(-10)) #10.0 print(math.sqrt(9)) #3.0 print(math.exp(1)) #2.718281828459045 #Python随机数 #使用random(…...

ext4 - mballoc块分配机制

概述 ext4为了尽量避免block管理的碎片化有如此措施: 1.mballoc多块分配器。 buddy算法管理每个block group采用prellocation机制,氛围per-cpu local preallocation和per inode preallocation 小文件和大文件采用不同的策略小文件(具体怎么…...

Spring整合junit

1、导入pom坐标 <dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope></dependency><dependency><groupId>org.springframework</gro…...

Swift 让ScrollView滚动到具体某个位置

1. 使用scrollToItem方法滚动集合视图 DispatchQueue.main.asyncAfter(deadline: .now() 0.1) {let firstIndexPath IndexPath(item: 0, section: 0)let lastIndexPath IndexPath(item: self.recordArray.count - 1, section: 0)// Scroll to first itemself.collectionVie…...

【C语言day08】

int n5; int a[n][n2] 数组定义下角标不能为变量 注&#xff1a;C99标准中支持了使用变量本题考查的是二维数组的元素访问&#xff0c;A选项是 正确的&#xff0c;X[i]就是第i行的数组名&#xff0c;数组名表示首元素的地址&#xff0c;X[i]表示第i行的第一个元素的地址&#…...

【并发编程】ThreadLocal

从名字我们就可以看到 ThreadLocal 叫做线程变量&#xff0c;意思是 ThreadLocal 中填充的变量属于当前线程&#xff0c;该变量对其他线程而言是隔离的。 ThreadLocal 为变量在每个线程中都创建了一个副本&#xff0c;那么每个线程可以访问自己内部的副本变量。 static ThreadL…...

如何提高自己的软件测试水平之bug定位

同学们在面试投简历的时候会经常看到人家公司JD上写的要求之一&#xff0c;如下&#xff1a; 这句话大家不要以为随便写写的&#xff0c;在我工作的十几年过程中起码见过10个以上试用期没过的公司新人&#xff0c;公司在衡量一个测试工程师是否专业的标准之一就是&#xff1a;…...

发点实用的快捷键(mac

切换输入法&#xff1a;ctrlspace /ctrloptionspace&#xff08;更快捷 切换网页&#xff1a; shifttab 切换应用界面&#xff1a;alttab 关闭页面&#xff1a;altw 搜索&#xff1a;altspace 展示mac隐藏文件&#xff1a; Commangshift . (点) 以下是一些浏览器快捷键&am…...

Android播放多媒体文件——播放音频

以下内容摘自郭霖《第一行代码》第三版 播放音频 MediaPlayer类中常用的控制方法 方法名功能描述setDataSource()设置要播放的音频文件的位置prepare()在开始播放之前调用&#xff0c;以完成准备工作start()开始或继续播放音频pause()暂停播放音频reset()将MediaPlayer对象重…...

存储重启后,ceph挂载信息没了,手动定位osd序号并挂载到对应磁盘操作流程、ceph查看不到osd信息处理方法

文章目录 故障说明处理流程定位硬盘中的osd序号挂载osd到ceph上验证并拉起osd重复上面操作故障说明 我们的一个存储节点莫名其妙的重启了,不知道咋回事 但这样的问题就是,所有osd都down了 因为挂载信息没有写到fstab里面,所以不会自动up,并且没有挂载信息,并且也看不到o…...

Linux学习之循环处理位置参数

for处理位置参数 loopPositionFor.sh里边的内容如下&#xff1a; #!/bin/bash# show learningfor inputString in $* doif [ "${inputString}" "good" ];thenecho "learning"fi donechmod urx loopPositionFor.sh给当前用户把loopPositionFor…...

NLP实战8:图解 Transformer笔记

目录 1.Transformer宏观结构 2.Transformer结构细节 2.1输入 2.2编码部分 2.3解码部分 2.4多头注意力机制 2.5线性层和softmax 2.6 损失函数 3.参考代码 &#x1f368; 本文为[&#x1f517;365天深度学习训练营]内部限免文章&#xff08;版权归 *K同学啊* 所有&#…...

Pytorch个人学习记录总结 玩俄罗斯方块の深度学习小项目

目录 前言 模型成果演示 训练过程演示 代码实现 deep_network tetris test train 前言 当今&#xff0c;深度学习在各个领域展现出了惊人的应用潜力&#xff0c;而游戏开发领域也不例外。俄罗斯方块作为经典的益智游戏&#xff0c;一直以来深受玩家喜爱。在这个项目中&…...

PuTTY连接服务器报错Connection refused

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…...

11-3_Qt 5.9 C++开发指南_QSqlQuery的使用(QSqlQuery 是能执行任意 SQL 语句的类)

文章目录 1. QSqlQuery基本用法2. QSqlQueryModel和QSqlQuery联合使用2.1 可视化UI设计框架2.1.1主窗口的可视化UI设计框架2.1.2 对话框的可视化UI设计框架 2.2 数据表显示2.3 编辑记录对话框2.4 编辑记录2.5 插入记录2.6 删除记录2.7 记录遍历2.8 程序框架及源码2.8.1 程序整体…...

19c补丁后oracle属主变化,导致不能识别磁盘组

补丁后服务器重启&#xff0c;数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后&#xff0c;存在与用户组权限相关的问题。具体表现为&#xff0c;Oracle 实例的运行用户&#xff08;oracle&#xff09;和集…...

反向工程与模型迁移:打造未来商品详情API的可持续创新体系

在电商行业蓬勃发展的当下&#xff0c;商品详情API作为连接电商平台与开发者、商家及用户的关键纽带&#xff0c;其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息&#xff08;如名称、价格、库存等&#xff09;的获取与展示&#xff0c;已难以满足市场对个性化、智能…...

黑马Mybatis

Mybatis 表现层&#xff1a;页面展示 业务层&#xff1a;逻辑处理 持久层&#xff1a;持久数据化保存 在这里插入图片描述 Mybatis快速入门 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/6501c2109c4442118ceb6014725e48e4.png //logback.xml <?xml ver…...

R语言AI模型部署方案:精准离线运行详解

R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...

将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?

Otsu 是一种自动阈值化方法&#xff0c;用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理&#xff0c;能够自动确定一个阈值&#xff0c;将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...

土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等

&#x1f50d; 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术&#xff0c;可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势&#xff0c;还能有效评价重大生态工程…...

【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)

要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况&#xff0c;可以通过以下几种方式模拟或触发&#xff1a; 1. 增加CPU负载 运行大量计算密集型任务&#xff0c;例如&#xff1a; 使用多线程循环执行复杂计算&#xff08;如数学运算、加密解密等&#xff09;。运行图…...

大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计

随着大语言模型&#xff08;LLM&#xff09;参数规模的增长&#xff0c;推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长&#xff0c;而KV缓存的内存消耗可能高达数十GB&#xff08;例如Llama2-7B处理100K token时需50GB内存&a…...

Reasoning over Uncertain Text by Generative Large Language Models

https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829 1. 概述 文本中的不确定性在许多语境中传达,从日常对话到特定领域的文档(例如医学文档)(Heritage 2013;Landmark、Gulbrandsen 和 Svenevei…...

【Redis】笔记|第8节|大厂高并发缓存架构实战与优化

缓存架构 代码结构 代码详情 功能点&#xff1a; 多级缓存&#xff0c;先查本地缓存&#xff0c;再查Redis&#xff0c;最后才查数据库热点数据重建逻辑使用分布式锁&#xff0c;二次查询更新缓存采用读写锁提升性能采用Redis的发布订阅机制通知所有实例更新本地缓存适用读多…...