OpenTSDB原理系列:读取流程

2024-04-06 19:08

本文主要是介绍OpenTSDB原理系列:读取流程,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

OpenTSDB原理系列:读取流程

一个完整的OpenTSDB HTTP Query请求,分别由OpenTSDB I/O Thread和AsyncHBase I/O Thread完成。OpenTSDB I/O Thread线程负责处理HTTP Query请求,AsyncHBase I/O Thread负责处理HBase的响应并发送HTTP响应。

 

请求处理流程

ReadProcess

1.OpenTSDB I/O Thread收到HTTP Query请求后,会根据OpenTSDB是否使用了SALT进行不同的处理。

相关配置项:

参数1:tsd.storage.salt.width

默认值:0

说明:SALT的字节长度。当设置为0时,表示不使用SAL。

参数2:tsd.storage.salt.buckets

默认值:20

说明: SALT的数量。当“tsd.storage.salt.width”为非0时,才发挥作用。该配置项的值,不能超过SALT的字节长度所能表示的最大数字。例如SALT的字节长度为1时,该配置项的不能配置成大于256。这两个配置在OpenTSDB初始化就必须确定,运行过程中不能随意修改,否则会导致历史数据读取错误。

是否使用了SALT,只会对生成的HBase Scanner数量产生影响,每个HBase Scanner的处理流程都是相同的。

当使用了SALT,就会生成相应SALT数量的HBase Scanner。

需要注意的是,Scanner的StatKey和StopKey中,只包含了{SALT+Metric ID+Timestamp}。如果需要查询的Metric中包含大量不同的TagName或者TagValue的话,这个Scanner可能需要扫描大量的数据,影响OpenTSDB查询的性能。

2.为每个Scanner设置Filter,设置Filter可以更精确的过滤HBase的行,减少无效数据行的传输和处理,以提高查询的性能。

如果HTTP Query中设置了Tag的查询条件,Scanner中就会设置KeyRegexpFilter;如果同时设置了explicitTags 为true,Scanner中还会再设置FuzzyRowFilter。

参数3:tsd.query.enable_fuzzy_filter

默认值:true

说明:当查询请求中包含explicitTags字段的时候,是否在HBase的Scan请求中使用FuzzyRowFilter

注意:

  • 虽然设置了Filter,但是在HBase服务端需要扫描的数据量并不会减少,只是减少了返回的数据量。

  • Scan caching默认值为128,可以通过如下配置项进行配置:参数4:tsd.storage.hbase.scanner.maxNumRows

    默认值:128

    说明:每次scan时从HBase一次返回的数据行数。

3.最后调用Scanner的scan方法,scan方法采用了异步调用。

到这里,一个HTTP Query的请求调用已经被处理完了。

响应处理流程

1. 一个HTTP Query所生成的多个Scanner,可能发送到了多个RegionServer上,所以OpenTSDB可能收到多个RegionServer发送过来的scanner结果。

2. 每个RegionServer的scanner结果,都由其绑定的一个线程进行处理。这个线程既负责从socket中接收Scanner结果,也要负责处理这些scanner结果。因此,它只能逐个处理这些Scanner结果。

3. 当处理完一个scanner结果后,如果这个scanner的所有结果还没有传输完,就继续异步调用scan方法,以获得后续的scanner结果。调用完后,就继续处理下一个scanner结果。

4. 当一个scanner的所有结果都已经处理完了,而且这个scanner不是所关联HTTP Query请求的最后一个被处理的Scanner,那么就把处理后的数据暂时缓存起来。然后继续处理下一个scanner结果;如果是最后一个scanner,就把这个HTTP Query请求的所有scanner结果进行合并,生成一个HTTP Query的Response,并发送回到OpenTSDB应用。

至此,在OpenTSDB的应用端,就已经完成了一次完整的HTTP Query查询。

本文源自:NoSQL漫谈(nosqlnotes.com)
除非特别注明,本站文章均为原创,转载请注明出处和链接。

这篇关于OpenTSDB原理系列:读取流程的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/880599

相关文章

通过Docker容器部署Python环境的全流程

《通过Docker容器部署Python环境的全流程》在现代化开发流程中,Docker因其轻量化、环境隔离和跨平台一致性的特性,已成为部署Python应用的标准工具,本文将详细演示如何通过Docker容... 目录引言一、docker与python的协同优势二、核心步骤详解三、进阶配置技巧四、生产环境最佳实践

MyBatis分页查询实战案例完整流程

《MyBatis分页查询实战案例完整流程》MyBatis是一个强大的Java持久层框架,支持自定义SQL和高级映射,本案例以员工工资信息管理为例,详细讲解如何在IDEA中使用MyBatis结合Page... 目录1. MyBATis框架简介2. 分页查询原理与应用场景2.1 分页查询的基本原理2.1.1 分

ShardingProxy读写分离之原理、配置与实践过程

《ShardingProxy读写分离之原理、配置与实践过程》ShardingProxy是ApacheShardingSphere的数据库中间件,通过三层架构实现读写分离,解决高并发场景下数据库性能瓶... 目录一、ShardingProxy技术定位与读写分离核心价值1.1 技术定位1.2 读写分离核心价值二

深度解析Python中递归下降解析器的原理与实现

《深度解析Python中递归下降解析器的原理与实现》在编译器设计、配置文件处理和数据转换领域,递归下降解析器是最常用且最直观的解析技术,本文将详细介绍递归下降解析器的原理与实现,感兴趣的小伙伴可以跟随... 目录引言:解析器的核心价值一、递归下降解析器基础1.1 核心概念解析1.2 基本架构二、简单算术表达

深入浅出Spring中的@Autowired自动注入的工作原理及实践应用

《深入浅出Spring中的@Autowired自动注入的工作原理及实践应用》在Spring框架的学习旅程中,@Autowired无疑是一个高频出现却又让初学者头疼的注解,它看似简单,却蕴含着Sprin... 目录深入浅出Spring中的@Autowired:自动注入的奥秘什么是依赖注入?@Autowired

redis-sentinel基础概念及部署流程

《redis-sentinel基础概念及部署流程》RedisSentinel是Redis的高可用解决方案,通过监控主从节点、自动故障转移、通知机制及配置提供,实现集群故障恢复与服务持续可用,核心组件包... 目录一. 引言二. 核心功能三. 核心组件四. 故障转移流程五. 服务部署六. sentinel部署

从原理到实战解析Java Stream 的并行流性能优化

《从原理到实战解析JavaStream的并行流性能优化》本文给大家介绍JavaStream的并行流性能优化:从原理到实战的全攻略,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的... 目录一、并行流的核心原理与适用场景二、性能优化的核心策略1. 合理设置并行度:打破默认阈值2. 避免装箱

SpringBoot集成XXL-JOB实现任务管理全流程

《SpringBoot集成XXL-JOB实现任务管理全流程》XXL-JOB是一款轻量级分布式任务调度平台,功能丰富、界面简洁、易于扩展,本文介绍如何通过SpringBoot项目,使用RestTempl... 目录一、前言二、项目结构简述三、Maven 依赖四、Controller 代码详解五、Service

使用Java读取本地文件并转换为MultipartFile对象的方法

《使用Java读取本地文件并转换为MultipartFile对象的方法》在许多JavaWeb应用中,我们经常会遇到将本地文件上传至服务器或其他系统的需求,在这种场景下,MultipartFile对象非... 目录1. 基本需求2. 自定义 MultipartFile 类3. 实现代码4. 代码解析5. 自定

Python中的filter() 函数的工作原理及应用技巧

《Python中的filter()函数的工作原理及应用技巧》Python的filter()函数用于筛选序列元素,返回迭代器,适合函数式编程,相比列表推导式,内存更优,尤其适用于大数据集,结合lamb... 目录前言一、基本概念基本语法二、使用方式1. 使用 lambda 函数2. 使用普通函数3. 使用 N