本文首发于 vivo互联网技术 微信公众号
连接: https://mp.weixin.qq.com/s/qayKiwk5QAIWI7-nyD3FVA
做者:DuZhimin
随着互联网、尤为是物联网的发展,咱们须要把各类类型的终端实时监测、检查与分析设备所采集、产生的数据记录下来,在有时间的坐标中将这些数据连点成线,往过去看能够作成多纬度报表,揭示其趋势性、规律性、异常性;往将来看能够作大数据分析,机器学习,实现预测和预警。前端
这些数据的典型特色是:产生频率快(每个监测点一秒钟内可产生多条数据)、严重依赖于采集时间(每一条数据均要求对应惟一的时间)、测点多信息量大(实时监测系统均有成千上万的监测点,监测点每秒钟都产生数据,天天产生几十GB的数据量)。数据库
基于时间序列数据的特色,关系型数据库没法知足对时间序列数据的有效存储与处理,所以迫切须要一种专门针对时间序列数据来作优化处理的数据库系统。微信
时序数据是基于时间的一系列的数据。架构
时序数据库就是存放时序数据的数据库,而且须要支持时序数据的快速写入、持久化、多纬度的聚合查询等基本功能。机器学习
对比传统数据库仅仅记录了数据的当前值,时序数据库则记录了全部的历史数据。同时时序数据的查询也老是会带上时间做为过滤条件。分布式
毫无遗漏的接收并存储大量的时间序列数据。工具
咱们来看一下这样一段信息:2019-12-5 22:31:21版本号为‘3.2.1’的某产品客户端的首页PV是1000Woop
上面描述2019-12-5 22:31:21版本号为‘3.2.1’的某产品客户端的首页PV是1000W,就是1个DataPoint。性能
从OpenTSDB的部署架构中咱们看到OpenTSDB是创建在HBase之上的,那么HBase又是啥呢?为了更好的剖析OpenTSDB,这里咱们简要介绍一下HBase。学习
一、HBase是一个高可靠性、强一致性、高性能、面向列、可伸缩、实时读写的分布式开源NoSQL数据库。
二、HBase是无模式数据库,只须要提早定义列簇,并不须要指定列限定符。同时它也是无类型数据库,全部数据都是按二进制字节方式存储的。
三、它把数据存储在表中,表按“行键,列簇,列限定符和时间版本”的四维坐标系来组织,也就是说若是要惟必定位一个值,须要四个都惟一才行。下面参考Excel来讲明一下:
四、对 HBase 的操做和访问有 5 个基本方式,即 Get、Put、Delete 和 Scan 以及 Increment,HBase 基于非行键值查询的惟一途径是经过带过滤器的扫描。
五、数据在HBase中的存储(物理上):
六、数据在HBase中的存储(逻辑上):
若是你第一次用你的HBase实例运行OpenTSDB,须要建立必要的HBase表,OpenTSDB 运行仅仅须要四张表:tsdb, tsdb-uid, tsdb-tree 和 tsdb-meta,全部的DataPoint 数据都保存在这四张表中,建表语句以下:
create 'tsdb-uid', {NAME => 'id', COMPRESSION => 'NONE', BLOOMFILTER => 'ROW', DATA_BLOCK_ENCODING => 'PREFIX_TREE'}, {NAME => 'name', COMPRESSION => 'NONE', BLOOMFILTER => 'ROW', DATA_BLOCK_ENCODING => 'PREFIX_TREE'}
create 'tsdb', {NAME => 't', VERSIONS => 1, COMPRESSION => 'NONE', BLOOMFILTER => 'ROW', DATA_BLOCK_ENCODING => 'PREFIX_TREE'}
create 'tsdb-tree', {NAME => 't', VERSIONS => 1, COMPRESSION => 'NONE', BLOOMFILTER => 'ROW', DATA_BLOCK_ENCODING => 'PREFIX_TREE'}
create 'tsdb-meta', {NAME => 'name', COMPRESSION => 'NONE', BLOOMFILTER => 'ROW', DATA_BLOCK_ENCODING => 'PREFIX_TREE'}
后面将对照实际数据来专门讲解这四张表分别存储的内容。
从上面看,四个表里面的数据都是空的
@Test public void addData() { String metricName = "metric"; long value = 1; Map<String, String> tags = new HashMap<String, String>(); tags.put("tagk", "tagv"); long timestamp = System.currentTimeMillis(); tsdb.addPoint(metricName, timestamp, value, tags); System.out.println("------------"); }
发现HBase里面有数据,在tsdb-uid、tsdb、和 tsdb-meta 表里面有数据,而tsdb-tree 表里面没任何数据,下面咱们针对这些数据作一下具体分析。
它是一张索引表,用于展现树状结构的,相似于文件系统,以方便其余系统使用,这里咱们不作深刻的分析。
经过配置项tsd.core.tree.enable_processing来打开是否须要往此表里面写入数据。
这个表是OpenTSDB中不一样时间序列的一个索引,能够用来存储一些额外的信息,该表只有一个列族name,两个列,分别为ts_meta、ts_ctr。这个表里面的数据是能够根据配置项配置来控制是否生成与否,生成几个列,具体的配置项有:
tsd.core.meta.enable_realtime_ts tsd.core.meta.enable_tsuid_incrementing tsd.core.meta.enable_tsuid_tracking
Row Key 和tsdb表同样,其中不包含时间戳,<metric_uid><tagk1><tagv1>[...<tagkN><tagvN>]
ts_meta Column 和UIDMeta类似,其为UTF-8编码的JSON格式字符串
ts_ctr Column 计数器,用来记录一个时间序列中存储的数据个数,其列名为ts_ctr,为8位有符号的整数。
tsdb-uid用来存储UID映射,包括正向的和反向的。存在两列族,一列族叫作name用来将一个UID映射到一个字符串,另外一个列族叫作id,用来将字符串映射到UID。列族的每一行都至少有如下三列中的一个:
若是配置了metadata,则name列族还能够包括额外的metatata列。
时间点数据就保存在此表中,只有一个列簇t:
column qualifier 占用2 Bytes或者4 Bytes,
占用2 Bytes时表示以秒为单位的偏移,格式为:
占用4 Bytes时表示以毫秒为单位的偏移,格式为:
value 使用8 Bytes存储,既能够存储long,也能够存储double。
若是须要支持特大批量时序数据,建议使用Druid或InfluxDB,其中InfluxDB是最易用的时序数据库。
更多内容敬请关注vivo 互联网技术微信公众号
注:转载文章请先与微信号:Labs2020联系。