Cortex算得上反对prometheus的长久化存储的元老了,很早就退出到CNCF基金会,目前曾经处于孵化状态了。然而倒退却始终不温不火,反而thanos青出于蓝。细想其中的起因,其架构的复杂性无疑是一个重要的起因。上面是其chunk 存储模式的架构图:
波及到组件十几个,其chunk 模式,依赖两种存储,部署和保护艰难。
从瑜亮之争到双赢
cortex和thanos 作为Prometheus长久化的两种计划,几乎就是瑜亮之争。各自有各自的劣势,不过貌似thanos倒退更好一些。
目前两种解决方案正在互相学习,逐渐补救本人的短处。乏味的是这两个计划,间接援用了对方的代码来补强性能。
对于thanos, 其变动体现在上面两个方面:
- 在写门路上,引入了receive组件,逐渐替换掉sidecar。
- 在读门路上,引入了query-frontend 组件,用于split 大查问和缓存某些查问后果。
对于cortex,其变动体现在引入block存储模式,简化了其架构模式。
实际上,在存储上,cortex向thanos学习更多一些。在读门路上,thanos向cortex学习更多一些。
上面咱们具体介绍一下cortex的block 存储引擎模式。
Block 存储引擎
块存储是基于Prometheus TSDB的Cortex存储引擎:它将每个租户的工夫序列存储到本人的TSDB中,而后将其序列写到磁盘上的块中(默认为2h块范畴周期)。每个块由块文件(蕴含多个序列的工夫戳-值对)和索引组成,该索引将metrcis名称和labels索引到块文件中的工夫序列。
块存储反对的后端是:
- 亚马逊S3
- 谷歌云存储
- Microsoft Azure存储
- 本地文件系统(仅单节点)
置信阿里云和腾讯云的对象存储也会很快反对。
架构
运行Cortex块存储时,Cortex架构不会产生重大变动,因而惯例体系结构文档也实用于块存储。然而,运行块存储时还有两个其余的Cortex服务:
- Store-gateway
- Compactor
能够看出compactor和store-gateway组件,显著学习了thanos。
store-gateway负责查问chunk,并在查问时由查询器应用。抉择块存储模式时,须要store-gateway。
compactor负责将较小的块合并和反复数据删除为较大的块,以缩小给定租户的长期存储中存储的块数量,并更无效地查问它们。compactor是可选的,然而在生产环境必不可少。
写门路
Ingesters从distributors接管进来的sample。每个推送申请都属于一个租户,而ingester会将接管到的sample附加到存储在本地磁盘上的特定的每个租户TSDB。接管到的sample都保留在内存中,并写入到预写日志(WAL)中,并用于在内存忽然终止的状况下复原内存中的序列。一旦每个租户收到第一个sample,就会在每个租户中提早创立每个租户的TSDB。
创立新的TSDB块时,内存中的sample会定期刷新到磁盘,并且WAL会被截断,默认状况下,每2个小时会产生一次。而后,每个新创建的块都将上载到长期存储中,并保留在初始状态,直到配置的-blocks-storage.tsdb.retention-period
到期为止,以便给予queriers 和 store-gateways足够的工夫来发现新块存储并下载其索引头。
为了无效地应用WAL并可能在忽然终止Inester后复原内存中的序列,WAL须要存储到一个永恒磁盘,该磁盘在产生Inester失败(例如AWS EBS卷或GCP)的状况下仍能够生存在云端运行时应用永恒磁盘)。例如,如果您在Kubernetes中运行Cortex集群,则能够将StatefulSet与长久化批量申明一起应用。文件系统上存储WAL的地位与存储本地TSDB块(从头压缩)的地位雷同,并且无奈解耦。
Distributor series 分片和复制
Distributor 实现的series分片和复制不会依据存储引擎而扭转。
请务必留神,因为复制因子为N(通常为3),因而与块存储不同的是,因为复制因子N,每个工夫序列均存储N个ingesters。因为每个实例都将其本人的块写入长期存储,因而这导致存储利用率是块存储的N倍。 Compactor通过将来自多个ingesters的块合并为一个块,并删除反复的sample来解决此问题。
读门路
Queriers 和 store-gateways 定期在存储桶上进行迭代,以发现最近由ingesters上传的块。 对于每个发现的块,Queriers 仅下载块的meta.json文件(蕴含一些元数据,包含该块中sample的最小和最大工夫戳),而 store-gateways 下载meta.json以及索引头,这是一个store-gateways在查问时用于查找序列的块索引的一小部分。 Queriers应用块元数据来计算在查问时须要查问的块列表,并从保留所需块的store-gateways实例中获取匹配序列。
总结
不过因为cortex 倒退比拟早,其组件更丰盛。也是将来thanos的倒退方向。例如cortex 封装了alertmanager,使其也反对多租户。
到底谁是赢家,不太好说。不过最终胜利的那个解决方案,身上肯定存满了另一个的影子。