066、故障处理之热点问题

news2024/10/6 1:42:53

为什么要解决热点

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

形成写热点的原因

  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、 查看热力图,流量可视化
在这里插入图片描述

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

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

相关文章

什么是等保定级?

TOC 一、等保评测介绍 1.1 等保定级目的 网络安全等级保护介绍:目的就是涉及民生问题的信息系统,要按照影响,提前划定等级 实施网络安全保护 信息系统:就是保护的系统,比如 魔幻的 健康码系统安全产品:健…

【lesson5】linux常见权限问题

文章目录 目录权限umask粘滞位 目录权限 先来思考一个问题: 进入一个目录需要什么权限呢? 由上图我们可以得知,进入目录需要x权限,那么没有r和w权限是什么情况呢? 从图中我们可以得知没有r权限不能查看目录里面的内容&#xff…

基于STM32设计的智能教室管理系统

前言 本文介绍了一个智慧教室的设计,该设计由电器设备控制系统、环境检测系统和考勤系统三大模块构成。通过使用STM32微处理器和物联网电器设备控制中心,实现对教室内风扇、照明灯和窗帘等电器设备的智能化统一控制与运行。同时,环境检测系统可以实时监测环境光强、温度、湿…

模型调参及优化

调参 调权重参数,偏置参数 训练数据集用来训练参数w,b 调超参数 验证数据集用来选择超参数学习率lr,隐藏层大小等 如何调参 当泛化误差和训练误差都没有降下去说明欠拟合;当训练误差降下去,但泛化误差出现上升形式&…

33. 本地记事本

本地记事本 html部分 <button class"add"><i class"iconfont icon-jiahao"></i> </button>css部分 *{margin: 0;padding: 0; } body{background-color: #7bdaf3;display: flex;padding-top: 3rem;flex-wrap: wrap; } .add{pos…

Vue2基础一、快速入门

零、文章目录 Vue2基础一、快速入门 1、Vue 概念 &#xff08;1&#xff09;为什么学 前端必备技能 岗位多&#xff0c;绝大互联网公司都在使用Vue 提高开发效率 高薪必备技能&#xff08;Vue2Vue3&#xff09; &#xff08;2&#xff09;Vue是什么 **概念&#xff1a;…

第二届“鼎信杯”榜单发布,麒麟信安荣获“优秀技术支撑奖”

由中国电子信息产业发展研究院、北京市海淀区人民政府主办&#xff0c;中国软件评测中心&#xff08;工业和信息化部软件与集成电路促进中心&#xff09;、中关村科学城管委会和北京市国际技术贸易协会承办的“2023 鼎信杯信息技术发展论坛”日前在北京举办。麒麟信安受邀参加主…

和鲸 ModelWhale 与麒麟系统适配认证,打造自主安全、性能可靠的信创 AI 基础软件

发展信创&#xff0c;解决核心技术的自主可控问题&#xff0c;是我国产业升级和数字经济发展过程中的重要命题。信创产业链主要由基础硬件、基础软件、应用软件、信息安全及云计算平台等几部分组成&#xff0c;拥抱信创国产化需要各厂商聚力共创生态&#xff0c;增强自身产品的…

JSONPath提取器案例详解

jsonpath语法 $ 表示根节点&#xff0c;也是所有jsonpath表达式的开始 . 表示获取子节点 .. 表示获取所有符合条件的内容 * 代表所有的元素节点 [] 表示迭代器的标示&#xff08;可以用于处理下标等情况&#xff09; [,] 表示多个结果的选择 ?() 表示过滤操作 表示当前节点一…

【QT】Day1

1. 收到实现登录框 要求&#xff1a; 1、登录窗口更改标题、图标 2、设置固定尺寸、并给定一定的透明度 widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QDebug> //信息调试类&#xff0c;用于打印输出的 #include <QIcon>…

windows命令行

参考:https://blog.csdn.net/u014419722/article/details/130427423 1、 创建文件夹&#xff08;mkdir或md&#xff09; 创建单个文件&#xff1a;mkdir cmd_test 创建二级文件&#xff1a;mkdir cmd_test\456\123 创建多个文件&#xff1a;mkdir cmd_test\000 cmd_test\111 2…

【js】javascript中base64转file、file压缩图片:

文章目录 一、效果图:二、实现代码: 一、效果图: 二、实现代码: /*** base64转file* param {string} urlData base64格式图片* returns */ export function base64ConvertFile(urlData) {if (typeof urlData ! string) {this.$toast("urlData不是字符串")return;}va…

IDEA 模块不加载依旧是灰色 没有变成小蓝色的方块

Settings > Build, Execution, Deployment > Build Tools > Maven > Ignored Files下降对应的模块勾选掉 但通常在Maven的配置中&#xff0c;您会找到一个名为“ignoredFiles”的列表&#xff0c;其中包含被忽略的文件和目录。您可以通过取消选中所需的文件或目录…

腾讯云—自动挂载云盘

腾讯云&#xff0c;稍微麻烦了点。 腾讯云服务器&#xff0c;镜像为opencloudos 8。 ### 1、挂载云盘bash #首先通过以下命令&#xff0c;能够看到新的数据盘&#xff0c;如果不能需要通过腾讯云控制台卸载后&#xff0c;重新挂载&#xff0c;并重启服务器。 fdisk -l#为 /dev…

【iVX】低代码未来发展趋势

未来低代码开发将更加注重用户体验、集成能力、自动化水平和移动支持。同时&#xff0c;应用场景也将进一步扩展&#xff0c;安全与可靠性也将得到更大程度的关注和加强。这些发展方向将进一步推动低代码开发在各个行业和领域的广泛应用和发展。 增强设计能力&#xff1a;低代码…

RFID技术如何赋能化工行业?

化工生产是指在化工行业中&#xff0c;将原材料经过一系列的物理、化学或生物过程转化为最终产品的过程。RFID技术在化工行业中提供了实时跟踪、自动化控制、安全监测和环境管理等方面的帮助&#xff0c;对于提高生产效率、质量控制和安全性具有重要的意义。我们通过典型的化工…

【100天精通python】Day18:python程序异常与调试_常用程序调试方式与技巧,如何将调试代码与正式代码分开

一 程序调试 在Python中&#xff0c;调试是指识别和修复程序中的错误和问题。 调试是程序开发过程中必不可少的一部分&#xff0c;合理利用调试工具和技术可以提高程序开发的效率和质量。Python提供了几种用于调试的工具和技术&#xff0c;帮助开发者找出程序中的bug并进行修复…

论文笔记:Fine-Grained Urban Flow Prediction

2021 WWW 1 intro 细粒度城市流量预测 两个挑战 细粒度数据中观察到的网格间的转移动态使得预测变得更加复杂 需要在全局范围内捕获网格单元之间的空间依赖性单独学习外部因素&#xff08;例如天气、POI、路段信息等&#xff09;对大量网格单元的影响非常具有挑战性——>论…

Spring Batch教程(五)spring boot实现batch功能注解示例:读写文本文件(读取一行数据,针对一行数据进行求和)

Spring batch 系列文章 Spring Batch教程&#xff08;一&#xff09; 简单的介绍以及通过springbatch将xml文件转成txt文件 Spring Batch教程&#xff08;二&#xff09;示例&#xff1a;将txt文件转成xml文件以及读取xml文件内容存储到数据库mysql Spring Batch教程&#xff…

【Spring】Spring 总览

一、简单介绍一下 Spring Spring是一个全面的、企业应用开发的一站式解决方案&#xff0c;贯穿表现层、业务层、持久层&#xff0c;可以轻松和其他框架整合&#xff0c;具有轻量级、控制反转、面向切面、容器等特征。 轻量级 &#xff1a; 空间开销和时间开销都很轻量 控制反…