解密 云HBase时序引擎OpenTSDB 优化技术

逝者如斯夫,不舍昼夜。
                                                       —— 孔子

时间如流水,一去不复返。自古不乏对时间流逝的感慨,而现代已经有很多技术记录流逝的过去。我们可以拍照,可以录像,当然还可以用时序数据库!

时序数据库是专门存放随着时间推移而不断变化的数据。近些年,随着IoT等概念的流行,时序数据库成为数据库一个相对独立的领域逐渐受到重视,广泛应用于物联网、监控系统、金融、医疗和零售等多种场景。

过去12个月时序数据库(Time Series DBMS)热度不断增长

那么云上的用户如何构建一个存储海量数据的时序数据库呢?笔者这里推荐使用 云HBase + OpenTSDB 方案。云HBase是使用阿里多年优化过的HBase内核版本,本文不作过多介绍,详情请看产品主页。

OpenTSDB简介

OpenTSDB是一款基于HBase构建的时序数据库,它的数据存储完全交给HBase,本身没有任何数据存储。所有节点是对等的,所以部署起来其实是非常方便的。因为基于HBase,所以本身就具备了横向扩展,存储海量数据的能力。常见的部署模式有2种,一种分离部署,一种混合部署。

独立部署,即与多个业务共享一个HBase。适合时序业务较小,或者用不满HBase资源。

 



混合部署,即TSDB进程和RS在一个VM内。适合时序业务较重,需要独享HBase。

 

上述2种模式,云HBase产品都能提供支持,云HBase购买页面现已增加时序引擎购买入口。

OpenTSDB数据定义

 

一条时间线由 Metirc + 多个tag 唯一确定,时间线上会有源源不断的数据点(Data Point)写入,数据点由时间戳和值组成。OpenTSDB支持秒级(10位整数),毫秒级别(13位整数)两种时间精度。

举个例子,比如我们监控一个手环收集的心跳信息,那么我们可以这样定义:

Metric: "band.heartbeat"
Tags: "id"               # 只定义一个tag,就是手环的ID

那么我们通过 band.heartbeat  + id=1  就能查询到编为1的手环收集到的心跳信息。

OpenTSDB数据存储格式

数据表整体设计

 

这个设计有几个特点:

  • 1.metric和tag映射成UID,不存储实际字符串,以节约空间。
  • 2.每条时间线每小时的数据点归在一行,每列是一个数据点,这样每列只需要记录与这行起始时间偏移,以节省空间。
  • 3.每列就是一个KeyValue,如果是毫秒精度,一行最多可以有3600000个KV,这里其实会有些问题,后面会讲到。

RowKey格式

 

salt:打散同一metric不同时间线的热点
metric, tagK, tagV:实际存储的是字符串对应的UID(在tsdb-uid表中)
timestamp:每小时数据存在一行,记录的是每小时整点秒级时间戳

metric和tag

它们长度默认是3个字节,即最多只能分配 2^24=16777216 个UID。可以通过这些参数调整:

tsd.storage.uid.width.metric # metric UID长度,默认3
tsd.storage.uid.width.tagk   # tagK UID长度,默认3
tsd.storage.uid.width.tagv   # tagV UID长度 默认3
# 这3者的UID分配分别是独立的空间

注意
集群已经写过数据后就无法修改,所以最好是一开始就确定好,建议4个字节。因为使用压缩技术后,RowKey多占的几个字节可以忽略,下文会提到。

salt

salt这个东西最好根据自己HBase集群规模去配置,它有2个配置:

tsd.storage.salt.width   # 默认1,1基本够了,不用调整
tsd.storage.salt.buckets # 打散到几个bucket去,默认20

查询的时候会并发 tsd.storage.salt.buckets   个Scanner到HBase上,所以如果这个配置太大,对查询影响比较大,容易打爆HBase。这里其实是一个权衡,写入热点和查询压力。默认20其实我个人觉得有点多,配置3~8就差不多了,当然实际效果还和metric设计有关,如果在一个metric里设计了很多时间线,那就得配置很多bucket。在一个metric中设计过多时间线,会影响OpenTSDB的查询效率,所以不建议这么做。
这个参数也是设置了就不能改的,所以也是要一开始规划好。

Column格式

 

这是列名(HBase中称为qualifier)的格式,可以看到毫米级需要多出2个字节。所以如果你的采集间隔不需要精确到毫秒级别,那请一定使用秒级(10位整数)。Value只能存储整数和浮点,所以有一个bit存储Float flag。

这里大家一定会有疑问,直接通过qualifier长度是4还是2不就能判断是秒级精度的数据点,还是毫秒了么?为何还需要MS flag这样一个标记信息?阅读下面的“压缩”部分,就能知道为什么。

OpenTSDB压缩问题

OpenTSDB有个很常见并且很麻烦的问题,就是整点时候对HBase对流量冲击。下面2张图是我们一个测试集群只做写入对效果:


可以看到会有一个数倍流量的爆发,要持续很久才能消化。这意味着我们需要更高规格去抗这个峰值。首先我们要明白OpenTSDB为啥要做压缩?在压缩些什么东西?
前面提到过OpenTSDB一行一小时的特点,那么一行里会有很多KV。表面上看起来好像没什么问题,但是实际上对比逻辑视图和物理视图你会发现一些问题。

很明显,每个KV都记录了rowX,那rowX就是一个空间浪费。这个空间不仅影响成本,还影响查询效率(毕竟数据多了)。压缩做的事情就是把多个小KV合成1个大KV,减少这部分浪费。所以压缩的时候会涉及到对HBase的“读-写-删”,这就是整点HBase IO流量的来源。

那么我们有没有办法,既做压缩,同时又消除这部分HBase IO呢?

当然有!我们可以把压缩的逻辑放到HBase内部去。因为HBase本身就需要对HFile做合并工作,这时候HBase本身就会读写数据文件,这部分对HDFS的IO不会少,而我们通过hook在HBase读出数据后,替换掉要写入的数据(即压缩好的数据)。

 

 


实现上面这个功能,当然需要一定内核开发量。好消息是通过云HBase购买页面购买的时序引擎,已经自带了上述功能。不管是分离部署模式,还是混合部署模式。
这个功能的好处显而易见,消除峰值节省成本,提升集群稳定性。这样我们对一个现有的HBase集群空闲资源需求就不是那么高了,完全可以复用了。下面是使用此功能后,同样只做写入的测试集群的流量情况:
 

原文链接
本文为云栖社区原创内容,未经允许不得转载。

 

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

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

相关文章

官宣!CSDN 重磅发布「AI开源贡献奖Top5」「AI新锐公司奖Top10」「AI优秀案例奖Top30」三大榜单...

2020 年无疑是特殊的一年,AI 在开年的这场“战疫”中表现出惊人的力量。站在“新十年”的起点上,CSDN发起【百万人学AI】评选活动。我们继续聚焦AI的技术落地,关注开源和新生的力量。作为CSDN第三届AI评选活动,本次活动受到数百家…

SpringBoot2 整合 XFIRE 服务端和客户端

文章目录一、集成XFIRE1. 版本选型2. 导入依赖3. 注入XFireSpringServlet4. 创建一个xml文件5. 使用ImportResource注入xml6. 创建WebService接口6. 创建实现类7. 添加配置类8. 工具类二、XFIRE 发布服务2.1. 运行项目2.2. 异常解决2.3. 测试验证三、XFIRE客户端开源源码.一、集…

css3动画过渡按钮

css(css代码是网上找的)和html代码: .mui-switch {width: 52px;height: 31px;position: relative;border: 1px solid #dfdfdf;background-color: #fdfdfd;box-shadow: #dfdfdf 0 0 0 0 inset;border-radius: 20px;border-top-left-radius: 20px;border-top-right-ra…

阿里云上万个 Kubernetes 集群大规模管理实践

内容简介: 阿里云容器服务从2015年上线后,一路伴随并支撑双十一发展。在2019年的双十一中,容器服务ACK除了支撑集团内部核心系统容器化上云和阿里云的云产品本身,也将阿里多年的大规模容器技术以产品化的能力输出给众多围绕双十一…

SpringBoot2 整合 AXIS 服务端和客户端

文章目录一、服务端1. 版本选型2.导入依赖3. SERVLET4. 接口5.实现类6. 配置工厂7.启动类8. WEB-INF目录18. WEB-INF目录29. /目录19. /目录210. wsdd11. 测试验证二、客户端开源源码.一、服务端 1. 版本选型 阿健/框架版本spring-boot2.5.4axis1.4axis-jaxrpc1.4commons-dis…

地理文本处理技术在高德的演进(下)

在【上篇】里,我们介绍了地理文本处理技术在高德的整体演进,选取了几个通用query分析的点进行了介绍。下篇中,我们会选取几个地图搜索文本处理中特有的文本分析技术做出分析,包括城市分析,wherewhat分析,路…

真正拿大厂offer的人,都赢在这一点

学好一门技术最有价值的体现就是“面试”,对于大部分人来说 “面试”是涨薪的主要途径之一,因此我们需要认真的准备面试,因为它直接决定着你今后几年内的薪资水平,所以在面试这件事上花费再多的时间和精力都是值得的。你会发现有…

今天的这个小成绩,需要向阿里云的朋友报告一下!

今天,想向大家报告一个最新的小成绩: 在数据库领域的权威评选——Gartner全球数据库魔力象限评比中,阿里云成功进入“挑战者”象限,连续两年作为唯一的中国企业入选。 最新评选表明,阿里云过去一年在产品技术领域进展迅…

90%的人会遇到性能问题,如何用1行代码快速定位?

阿里妹导读:在《如何回答性能优化的问题,才能打动阿里面试官?》中,主要是介绍了应用常见性能瓶颈点的分布,及如何初判若干指标是否出现了异常。 今天,齐光将会基于之前列举的众多指标,给出一些常…

SpringBoot2 整合 CXF 服务端和客户端

文章目录一、CXF服务端1. 导入依赖2. 创建service接口3. 接口实现类4. cxf配置类5. 查看wsdl结果二、CXF客户端2.1. 客户端2.2. 断点调试2.3. 发起调用服务开源源码.一、CXF服务端 1. 导入依赖 <properties><cxf.version>3.3.1</cxf.version></propertie…

如果张东升是个程序员,你还有机会吗?

来源 | 编程技术宇宙责编 | Carol封图 | CSDN 下载自视觉中国张东升是一家互联网公司的程序员&#xff0c;一直以来都勤勤恳恳老实工作。可最近一段时间&#xff0c;老板接了几个项目回来&#xff0c;不但开启了996的工作模式&#xff0c;更要命的是频频更改需求&#xff0c;弄…

蚂蚁金服资深总监韩鸿源:企业级数据库平台的持续与创新

2019年11月19日&#xff0c;蚂蚁金服在北京举办“巅峰洞见聚焦金融新技术”发布会&#xff0c;介绍2019双11支付宝背后的技术&#xff0c;并重磅发布全新OceanBase 2.2版本。欢迎持续关注&#xff5e; 蚂蚁金服研究员韩鸿源在发布会分享了《企业级数据库平台的持续与创新》&…

jquery标题左右移动动画

标题会在红框范围内来回移动 html和css代码 <div class"menu-notice" click"check_cart"><div class"menu-notice-logo"></div><div class"menu-notice-title" ref"noticeTitle">{{storeinfo[0] ?…

解密 云HBase 冷热分离技术原理

前言 HBase是当下流行的一款海量数据存储的分布式数据库。往往海量数据存储会涉及到一个成本问题&#xff0c;如何降低成本。常见的方案就是通过冷热分离来治理数据。冷数据可以用更高的压缩比算法&#xff08;ZSTD&#xff09;&#xff0c;更低副本数算法&#xff08;Erasure…

再见,工资!2020年6月程序员工资统计,平均14404元,网友:又跌了!

见了鬼&#xff01;工资竟然又跌了2020 年 6 月全国招收程序员 313739 人。2020 年 6 月全国程序员平均工资 14404 元&#xff0c;工资中位数 12500 元&#xff0c;其中 95% 的人的工资介于 5250 元到 35000 元。怪不得小陈发现最近猎头的“骚扰”电话越来越少了&#xff0c;这…

mysql创建function 报错误1418 - This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in

解决方法&#xff1a; 执行这条sql就可以了&#xff1a; set global log_bin_trust_function_creators1;运行结果&#xff1a; 函数创建成功了

一个实时精准触达系统的自我修养

问题定义 在互联网行业&#xff0c;唯一不变的就是一直在变化。作为技术同学&#xff0c;我们经常会碰到以下几种需求&#xff1a; 当用户收藏的商品降价后及时通知用户&#xff0c;促进双方交易达成&#xff1b;新用户或90天内未成交的用户浏览多个商品后引导用户主动和卖家聊…

vue-datepicker的使用

写这个文章主要是记录下用法&#xff0c;官网已经说的很详细了 npm install vue-datepicker --savehtml代码 <myDatepicker :date"startTime" :option"multiOption" :limit"limit"></myDatepicker> <myDatepicker :date"e…

数据库怎么选择?终于有人讲明白了

作者 | Alex Petrov所有数据库管理系统的主要工作都是可靠地存储数据并使其对用户可用。我们使用数据库作为数据的主要来源&#xff0c;帮助我们在应用程序的不同部分之间共享数据。我们使用数据库&#xff0c;而不是在每次创建新应用程序时寻找存储和检索信息的方法&#xff0…

医疗数据典型特征及架构发展方向研究

前言 医疗健康产业目前呈高速发展状态&#xff0c;处在互联网对医疗行业赋能的关键阶段&#xff0c;由于医疗行业数据的隐私性较强&#xff0c;通过传统方式很难获取公开的医疗健康数据进行研究&#xff0c;根据阿里云天池比赛赛题设置研究及提供的脱敏数据集着手进行分析是比…