opentsdb的/api/uid接口源码跟踪

前言

前面的文章对tsdb的使用进行了记录,那么从现在开始会记录一些关于opentsdb内部实现的原理,标题写了是源码跟踪,其实跟踪源码就是为了探清楚它是怎么实现的。文章中不会贴上一堆一堆的源码,只会对它的实现过程,以及相关的内部结构进行讲述。本文的主要内容:

  1. uid和tsuid的概念以及这样设计的意义。
  2. /api/uid/assign,这个接口可以对metric,tagk,tagv申请uid,将会讲述其实现过程。
  3. /api/uid/uidmeta,这个接口类似于/api/uid/tsmeta,但是该接口是对uid的meta data进行操作,将会讲述其实现过程。
  4. /api/uid/tsmeta,这个接口可以对uid对应的meta data进行删除或者更新,将会讲述其实现过程。

uid以及tsuid

我们知道tsdb是通过metric,tags(包括tagk和tagv),timeserious来映射到value的。而且tsdb内部映射关系,是这样的:

  1. 将metric,tagk1,tagv1,tagk2,tagv2...按照规则生成对应的metric_UID,tagk1_UID,tagv1_UID,tagk2_UID,tagv2_UID,...
  2. 将第一步生成的全部uid生成一个tsUID,其形式如 <metric_UID><tagk1_UID><tagv1_UID>[...<tagkN_UID><tagvN_UID>]。
    一个tsUID就唯一映射到一个时间序列。

uid是由数字生成,并且官方默认的长度3byte,且说明了metric,tagk,tagv各自最大的uid个数是16,777,215。其计算方式是:

3(byte) = 24(bit)
Math.pow(2,24) = 16,777,216
uid默认是自增的形式,也就是从1一直自增到16,777,215。

这样设计的原因究竟是什么呢,为何平白无故耗费一些计算力去增加这个中间层面的uid呢。大兄弟不要急,下面会娓娓道来。

假如我们目前我们有这个时间序列

sys.cpu.0.user host=websv01.lga.mysite.com owner=operations. 

我们可以就用这个字符串直接映射到这个时间序列,可是其所占的空间为60byte。
现在我们将metric和tags转化成uid,假设其分别对应的uid如下:

000000000000000000000001 000000000000000000000001 000000000000000000000001 000000000000000000000001

进一步将二进制换算为16进制,得到的tsUID如下:

000001000001000001

可以看到对于这个时间时序,单个时间点存储空间就可以从60byte变成18byte,假如这个时间序列时间跨度很大,并且十分密集,那么能节约的存储空间就非常可观了,也是tsdb这样设计的原因所在。

/api/uid/assign

opentsdb是依赖于hbase的下面几个表进行工作的:

tsdb , tsdb-meta , tsdb-tree , tsdb-uid

这里先介绍tsdb-uid这个标,这个库是用来持久化metric,tags--->uid,以及uid--->metirc,tags映射关系的。
数据库的结构如下:

图1 tsdb-uid表结构

这更正一下:列族id和列族name下面的metric列其实应该是metrics。

rowkey为\x00是计数器,前面讲到uid是以自增的形式,这个计数器就是用于实现uid的自增,每申请一个新的metric(或者tagk,tagv)对应的计数器就会增加1,并将增加得到数值作为uid。

可以看到metric:sys.cpu.0.user的uid为000001,表中持久化了两者的映射关系:

sys.cpu.0.user ---> 000001
000001         ---> sys.cpu.0.user

好了,现在我们知道表结构了,下面我们来看一下为metric分配uid的过程,即/api/uid/assign接口的实现过程,对于tags的uid分配过程也是一样的。比较简单,看一遍下面不标准的流程图就会明白,嘿嘿。

图二 uid分配流程图
看了上图之后,可能会想到一个问题。

则多个线程对同一个字符串申请uid,此时就必须避免对uid的重复申请,tsdb中时这样处理的:

有一个线程安全的map,在申请之前会对name进行记录,申请完之后有会从中删除这条记录。为了避免重复申请,就必须在申请之前查询map中是否有这个name的相关记录,若有,则无法申请;若无,则可继续申请。

/api/uid/uidmeta

该接口可以对uid的meta data进行增删改,而meta data可以看成对uid的解释和说明。

上面说我们讲到了 tsdb-uid 这张表,现在将其表结构补充一下:

图3 tsdb-uid表结构

我们可以看到图1和图3的区别之处在于:

在name列族下面多了:metric_meta,tagk_meta,tagv_meta三个列,这三个列正是以json的格式分别存储了metric,tagk,tagv的meta_data。

meta_data的增删改查也就是对这个三个列进行操作,其过程也十分简单。有个地方需要提一下的是,那就是当有多个线程尝试去修改同一个meta_data时,一定需要避免发生脏读的情况。解决的办法是:

和采取版本号的机制类似,即Atomic Compare-And-Set (CAS) ,先从库中查询原始值,更新的时候会比较如果库中的值已经不是原始值了就会更新失败。

/api/uid/tsmeta

该接口的作用和 /api/uid/uidmeta 接口类似,只是这个接口是对tsUID的mete data进行操作。

tsUID的meta data并不是存储在 tsdb-uid 表中的,而是在tsdb-meta表中,现在我们来看一下 tsdb-meta 的表结构:

图4 tsdb-meta表结构

rowkey即是tsuid,name列族下面有ts_sct,和ts_meta两个列:

  1. ts_sct:存储该时间序列收到最新数据的时间,所以每次在对这个时间序列写入新的data point时,ts_sct都会更新。
  2. ts_meta:以json的形式存储tsuid对应的meta data。

清楚了这个表结构的之后,对meta data的增删改查的操作就十分简单。

在查询中,除了返回meta data之外,还会将tsuid解析为metric,tags,并在 tsdb-uid 表中查询metric,tags的meta data一并返回。

总结

关于/api/uid的内容到此就全部结束了,内容上较为简单,主要是熟悉其中的表结构以及考虑数据的线程安全。
嘿嘿嘿,以后博主画流程图会画好看一点。。。(#^.^#)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,843评论 6 502
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,538评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,187评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,264评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,289评论 6 390
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,231评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,116评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,945评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,367评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,581评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,754评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,458评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,068评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,692评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,842评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,797评论 2 369
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,654评论 2 354

推荐阅读更多精彩内容