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

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

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

相关文章

6、用restful风格写controller方法接口,单元测试依赖

编写单元测试,用restful风格写controller方法 单元测试依赖 实际项目开发中,单元测试与业务代码通常都会要求同步进行 TDD测试驱动开发:先编写单元测试,然后努力去开发业务代码去满足所有的单元测试用例。 添加SpringBoot的测试…

Springer独立出版 | 2023年触觉与虚拟现实国际会议(ICHVR 2023)

会议简介 Brief Introduction 2023年触觉与虚拟现实国际会议(ICHVR 2023) 会议时间:2023年12月15日-17日 召开地点:中国北海 大会官网:www.ichvr.org 2023年触觉与虚拟现实国际会议(ICHVR 2023)由东南大学、上海交通大学联合主办;…

Python-ElasticSearch客户端的封装(聚合查询、统计查询、全量数据)

目录 ES Python客户端介绍封装代码测试代码参考 ES Python客户端介绍 官方提供了两个客户端elasticsearch、elasticsearch-dsl pip install elasticsearchpip install elasticsearch-dsl第二个是对第一个的封装,类似ORM操作数据库,可以.filter、.group…

com.android.ide.common.signing.KeytoolException:

签名没问题但是提示Execution failed for task :app:packageDebug. > A failure occurred while executing com.android.build.gradle.tasks.PackageAndroidArtifact$IncrementalSplitterRunnable > com.android.ide.common.signing.KeytoolException: Failed to read ke…

github gitlab 多用户多平台切换

一、背景 我需要用账号1 来登录并管理github 账号 我需要用账号2 来登录并管理gitlab 账号 二、设置账号 邮箱 设置账号1用户名与邮箱 git config --global user.name "miaojiang" git config --global user.email "187133163.com" 三、生成本地密钥…

pycharm配置arcpy环境

目录 1、安装ArcGIS软件2、安装PyCharm3、创建PyCharm项目4、验证ArcPy环境 在GIS开发中, ArcPy是不可或缺的重要组件,而PyCharm作为一款功能强大的Python IDE,为我们提供了更便捷、高效的开发环境。在本文中,我们将详细介绍如何…

sublime配置less的一些坑(1)

仅在sublime的Install Package安装保存less报错 在sublime的Install Package安装less 打开sublime软件,按住CtrlShiftP组合键,弹出的界面中选择Install Package 选中后enter或者回车。等会弹出一个弹窗,大致意思是说你已经成功安装了package control。如果你在此之前已经安装了…

【力扣每日一题】2023.7.31 重排链表

目录 题目: 示例: 分析: 代码: 题目: 示例: 分析: 给我们一个链表,让我们按照题目要求原地修改重排链表。 那么具体怎么个重排法呢,题目给出了一串式子,其实就是把链表分为前后两段,然后在前半段的节…

企业工程管理系统源码之提高工程项目管理软件的效率

高效的工程项目管理软件不仅能够提高效率还应可以帮你节省成本提升利润 在工程行业中,管理不畅以及不良的项目执行,往往会导致项目延期、成本上升、回款拖后,最终导致项目整体盈利下降。企企管理云业财一体化的项目管理系统,确保…

UML/SysML建模工具更新(2023.7)(1-5)有国产工具

DDD领域驱动设计批评文集 欢迎加入“软件方法建模师”群 《软件方法》各章合集 最近一段时间更新的工具有: 工具最新版本:Visual Paradigm 17.1 更新时间:2023年7月11日 工具简介 很用心的建模工具。支持编写用例规约。支持文本分析和C…

小目标检测(1)——大恒(DaHeng)相机操作与控制编程

文章目录 引言正文相关开发库的介绍编程准备配置引用头文件GalaxyIncludes.h配置lib文件 具体编程过程初始化和反初始化枚举设备开关设备 属性控制属性控制器种类 图像采集控制和图像处理采单帧回调采集图像处理流对象属性控制 获取设备事件获取掉线事件通知 样例程序分析补充&…

重生之我要学C++第五天

这篇文章主要内容是构造函数的初始化列表以及运算符重载在顺序表中的简单应用,运算符重载实现自定义类型的流插入流提取。希望对大家有所帮助,点赞收藏评论,支持一下吧! 目录 构造函数进阶理解 1.内置类型成员在参数列表中的定义 …

2023.07.29 驱动开发DAY6

通过epoll实现一个并发服务器 服务器 #include <stdio.h> #include <string.h> #include <unistd.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <sys/epoll.h…

脑电信号处理与特征提取——6.运用机器学习技术和脑电进行大脑解码(涂毅恒)

目录 六、运用机器学习技术和脑电进行大脑解码 6.1 前言 6.2 基于脑电数据的机器学习基础分析 6.3 基于脑电数据的机器学习进阶分析 6.4 代码解读 六、运用机器学习技术和脑电进行大脑解码 6.1 前言 6.2 基于脑电数据的机器学习基础分析 6.3 基于脑电数据的机器学习进阶分…

内网隧道代理技术(十五)之 Earthworm的使用(二级代理)

Earthworm的使用(二级代理) 本文紧接着上一篇文章继续讲解Earthworm工具的使用 (二级代理)正向连接 二级正向代理发生在如下的情况: 1、Web服务器在公网,黑客可以直接访问 2、B机器在内网,黑客不能直接访问 3、Web服务器可以访问内网机器B 4、内网机器B可以访问公司…

flask创建数据库连接池

flask创建数据库连接池 在Python中&#xff0c;您可以使用 Flask-SQLAlchemy 这个扩展来创建一个数据库连接池。Flask-SQLAlchemy 是一个用于 Flask 框架的 SQLAlchemy 操作封装&#xff0c;实现了 ORM(Object Relational Mapper)。ORM 主要用于将类与数据库中的表建立映射关系…

Spring Boot实践三 --数据库

一&#xff0c;使用JdbcTemplate访问MySQL数据库 1&#xff0c;确认本地已正确安装mysql 按【winr】快捷键打开运行&#xff1b;输入services.msc&#xff0c;点击【确定】&#xff1b;在打开的服务列表中查找mysql服务&#xff0c;如果没有mysql服务&#xff0c;说明本机没有…

【数据结构】实验十:哈夫曼编码

实验十 哈夫曼编码 一、实验目的与要求 1&#xff09;掌握树、森林与二叉树的转换&#xff1b; 2&#xff09;掌握哈夫曼树和哈夫曼编码算法的实现&#xff1b; 二、 实验内容 1. 请编程实现如图所示的树转化为二叉树。 2. 编程实现一个哈夫曼编码系统&#xff0c;系统功能…

腾讯云标准型S6/SA3/SR1/S5/SA2服务器CPU处理器大全

腾讯云服务器CVM标准型CPU处理器大全&#xff0c;包括标准型S6、SA3、SR1、S5、S5se、SA2、S4、SN3ne、S3、SA1、S2ne实例CPU处理器型号大全&#xff0c;标准型S6云服务器CPU采用Intel Ice Lake(2.7GHz/3.3GHz)&#xff0c;标准型S5采用Intel Xeon Cascade Lake 8255C/Intel Xe…

Flink集群运行模式--Standalone运行模式

Flink集群运行模式--Standalone运行模式 一、实验目的二、实验内容三、实验原理四、实验环境五、实验步骤5.1 部署模式5.1.1 会话模式&#xff08;Session Mode&#xff09;5.1.2 单作业模式&#xff08;Per-Job Mode&#xff09;5.1.3 应用模式&#xff08;Application Mode&a…