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,使其也反对多租户。
到底谁是赢家,不太好说。不过最终胜利的那个解决方案,身上肯定存满了另一个的影子。