从CSDN来博客园开个博

Cao, W., Gao, Y., Lin, B., Feng, X., Xie, Y., Lou, X., & Wang, P. (2018, May). Tcprt: Instrument and diagnostic analysis system for service quality of cloud databases at massive scale in real-time. In Proceedings of the 2018 International Conference on Management of Data (pp. 615-627).

Zhang, J., Wu, S., Tan, Z., Chen, G., Cheng, Z., Cao, W., ... & Feng, X. (2019). S3: a scalable in-memory skip-list index for key-value store. Proceedings of the VLDB Endowment12(12), 2183-2194.

Cao, W., Gao, Y., Li, F., Wang, S., Lin, B., Xu, K., ... & Zhang, G. (2020, June). Timon: A Timestamped Event Database for Efficient Telemetry Data Processing and Analytics. In Proceedings of the 2020 ACM SIGMOD International Conference on Management of Data (pp. 739-753).

Chen, W., Chen, L., Xie, Y., Cao, W., Gao, Y., & Feng, X. (2020, April). Multi-range attentive bicomponent graph convolutional network for traffic forecasting. In Proceedings of the AAAI Conference on Artificial Intelligence (Vol. 34, No. 04, pp. 3529-3536).

Cao, W., Feng, X., Liang, B., Zhang, T., Gao, Y., Zhang, Y., & Li, F. (2021, June). LogStore: A Cloud-Native and Multi-Tenant Log Database. In Proceedings of the 2021 International Conference on Management of Data (pp. 2464-2476).

Yishan Managing large-scale cloud database instances via machine learning 

Timon

Blind Write VS. Read-Modify-Write

out-of-order events不用进行RMW,直接blind write

 

幂等保证Exactly Once

对于At-least Once的系统Kafka,记录每个Partition的latest offset,避免重复存储

 

数据模型

如图,

一组一同采集的metric,metricSet,具有一个时间戳,等同于row

一个metricSet的collection,称为StreamSet ,具有一个uuid,比如对于某一个主机发送的指标组,就用一个uuid标识

以uuid为标准,匹配一组TagSet,即一个StreamSet可以附加一组特殊的属性

TagSet单独存储,作为元数据,存储在本地的rocksDB中

博客园开博记录

 

SEDA (Staged Event Driven Architecture)

 

Windows聚合和Late数据的处理

首先,数据写入时,有两个MemTable,其中一个是为了late数据的

为何要单独分出一个late的,因为late的会破坏连续性,不便于后续用数组来存储数据

这里之所以有late的说法,就需要参考dataflow里面对于窗口的解释

博客园开博记录

 

 

然后提出一个page的概念,600条records,一个UUID至少对应于一个page,一个page中的数据属于一个UUID,因为后面以page为维度要聚合

一个page写满,就会排序并聚合,这个取决于时间戳的精度,如果是秒级精度就按秒级聚合,聚合的算子定义的时候可以指定

这里sealed page的实现用数组,这样避免search的代价,因为根据数组的下标就可以直接找到相应的时间,

所以这里甚至不用事先排序,直接乱序插入即可,插入的过程本身就是排序的过程

有个问题是如果这里的时间是sparse的,那么数组中就会有很多的空洞,下面也说如果太过sparse那么就暂时不seal,多等一会,但这毕竟不是根本的解决方法。

这也是为何还需要一个late的内存表,

这里又有一个假设,就是写入的数据是在时间上dense的,这个对于监控数据而言是成立的

博客园开博记录

SSTable的存储结构

内存中的数据会定期的flush成SSTable,内存中的page对应于block

一个SSTable中包含很多block,按时间戳排序,并且没有overlap,这样可以精准查询,因为late单独存,所以没有overlap

这里在一个SSTable中,对每一个UUID会建立一个时间的线段树索引,即按时间维度聚合,便于long time span的查询

博客园开博记录

 

SSTable由如下组成,

首先是MetaZone,元数据,比如时间戳范围,这个meta非常小,所以可以将所有的meta都放在内存中

再者是所谓的bucket和collision,其实就是一个序列化的hash table,记录每个UUID的数据的时间戳范围和offset;

这个hash table也是用array来实现的,避免二分search;用uuid的hash找到index,如果冲突则使用64byte指向其他collided的UUID

最后是DataZone,这个是按UUID分开的,先存一个时间的线段树索引,接着是一堆的blocks

博客园开博记录

 

 博客园开博记录

 

时间线段树

可以记录不同时间粒度的聚合数据,

这里做的优化是,这个线段树是用数组存储的,知道depth和local position,就可以计算出在数组的中的index

博客园开博记录

 

博客园开博记录

 

相关文章: