Cortex和Thanos项目如何协作使普罗米修斯更好地伸缩

2020-08-17 02:51:43

Cortex和Thanos是扩展普罗米修斯的两个出色的解决方案,许多公司现在都在大规模生产它们。这两个项目都在CNCF沙箱中,最初以不同的技术方法和理念开始:

Cortex从第一天开始就设计为可伸缩性和高性能,而Thanos最初专注于操作简单性和成本效益。

Thanos可以逐步推出,首先是一辆Thanos侧车与您的Prometheus服务器一起运行,然后在需要时添加其他组件,而Cortex的理念是要么全有,要么全不。

Cortex基于基于推送的模型(Prometheus服务器远程写入Cortex),而最初Thanos只有一个基于Pull的模型(Thanos查询器在查询时从Prometheus取出系列)。

但随着时间的推移,这两个项目开始相互学习,甚至相互影响-这些差异已经缩小。Thanos现在通过其最近引入的接收器组件支持基于推送的模型,并且在可伸缩性和性能方面都做了很多改进。同样,Cortex的操作复杂性也大大降低:我们引入了单一二进制模式,删除了一些外部依赖项,并努力改进文档。

在PromCon 2019上,Tom Wilkie(Cortex的联合创作者)和Bartek Plotka(Thanos的联合创作者)就Cortex和Thanos的异同做了精彩的演讲。在本周的PromCon Online上,Bartek和我(Cortex和Thanos的新维护者)决定就过去一年的合作如何变得更加强大进行后续讨论。

皮质过去需要两个后端存储空间来存储时间序列数据:一个对象存储空间用于存储压缩的时间戳值对块,另一个索引存储空间用于通过序列标签匹配器查找这些块。

此体系结构工作良好,可伸缩性很好;我们看到存储数千万到数亿个活动序列的海量Cortex集群,查询延迟99.5%,低于2.5s。但是,在内部(例如,Cassandra)运行大型且可扩展的索引存储可能会显著增加运营复杂性,而在云服务(例如,AWS DynamoDB或Google BigTable)上运行可能会带来巨大的运营成本。

大约一年前,在Cortex社区,我们开始集思广益,讨论完全不需要运行索引存储,而是将所有时间序列数据存储在对象存储中。

我们开始独立设计它,但是总是喜欢Thanos在他们的存储组件中解决这个问题的方式。因此,与其重新发明轮子并与Thanos竞争,为什么不与他们合作,帮助他们进一步改进呢?

这就是Cortex Block存储(Cortex的替代存储引擎)诞生的原因--与Thanos开始了更强大的协作。

到目前为止,与塔诺斯的合作是一次令人惊叹的经历。人们都是善良、开放和熟练的。其中涉及到强烈的意见,但这些意见都是松散的,最终,做出决定是为了Cortex和Thanos的最佳利益。

但让我们实话实说吧!合作和分享有时也很艰难,竞争的幽灵总是在转角处。

达成共识需要很长时间,你必须说服更广泛的人群。这两个项目在策略上也有一些不同,所以我们对Thanos提出的任何更改都必须对两个项目都有意义,而不会在性能或维护负担方面带来任何明显的负面影响。

此外,有些更改最终是一个分两步进行的过程:首先将更改提交到Thanos,然后,一旦合并,就将这些更改导入到Cortex。更不用说对普罗米修斯的任何贡献了,那里的链条要长一步。你知道Grafana Loki依赖Cortex吗?对他们来说,链条更长,是的,我有时能感受到他们的痛苦。

选择最短的路径是很有诱惑力的。也许你不用提升你的改进或修复就能把事情做好。也许你只会推迟它们(我们都知道,一旦你推迟了某件事,你就永远不会去做了)。或者,您可能采取了一种极端的方法,即分叉整个包以加快移动速度。

但我们不是为了合作而合作。我们在合作和分享,因为我们彼此关心,我们相信每个项目得到的回报大于我们个人贡献的总和。

我们经常分享想法、成功和失败的故事、生产问题、优化技术或设计原则。我们不一定在每件事上都达成一致,但我们就项目的多个方面进行的这种开放的对话帮助我们打开了思路,开阔了视野,学习了东西。分享就是学习。

Cortec在积极缓存方面有着相当长的历史。所有计算或操作代价高昂的内容都缓存在Cortex中。Tom的口头禅是:如果某件事很慢,很可能是因为前面没有足够的缓存。

当我们开始构建Cortex块存储时,我们意识到Thanos存储不支持共享缓存,并且这里还有一些改进的空间。

在过去的几个月中,我们在Thanos中引入了对索引缓存、块缓存和元数据缓存(存储桶对象内容、属性和列表)的memcached支持。在大规模测试Cortex块存储时,我们看到了它在查询性能和存储桶API调用减少方面的巨大好处。

Thanos的配置非常优雅。它紧凑、稳定、易于消费。来自不同的设计原则,Cortex配置允许您微调每一位,这在您设置大型生产集群时被证明是相当强大的,但却增加了入门的难度。

我们从Thanos那里学到了很多,我们显著改进和简化了Cortex 1.0中的Cortex配置,尽管这仍是一项正在进行的工作。我们致力于更好的缺省、文档和一致性。

一个例子是Cortex运行DNS服务发现的方式(例如,memcached集群节点)。在此之前,没有通用的解决方案,不同的Cortex组件支持的服务发现是根据具体情况进行不同配置的。最近我们开始迁移到Thanos DNS服务发现,它有一种简单而有效的方式来配置它。

优化是一个永无止境的过程。您可能整个职业生涯都在优化一段代码,但在最后一天的工作中,您仍然会发现新的技术。这就是为什么分享学习是非常重要的,我们确实分享了很多东西。

您是否知道,在基数非常高的标签名称上运行正则表达式匹配会很慢,并且有一些常见的用例在正则表达式中使用文字,如.*foo或foo.*-可以使用简单的string.HasPrefix()或string s.HasSuffix()对其进行显著优化?我们没有,但是我们从洛基那里学到的!

或者您是否知道,如果您预先知道输入读取器的大小,那么常用的ioutil.ReadAll()在内存分配方面非常糟糕,但是有一个简单的解决方案可以解决它。我们也从洛基那里学到了这一点。老实说,在性能优化方面,Loki团队是一流的。非常尊重你!

这些只是几个例子。但这不是一个单一的优化问题。这一切都是关于分享你所学到的东西,并将你的发现支持到其他项目中。

最后但并非最不重要的一点是,Cortex BLOCKS存储构建在几个核心的Thanos组件之上:BLOCKS送货机、存储桶和压实机。

利用Thanos可以让我们快速获得有效的概念证明,并避免犯一些早期错误。如果我们一切从头开始,我非常肯定我今天不会在这里提到新的Cortex Block存储有多酷。很可能我们还在建造它。

另一方面,Thanos让他们的代码得到了更多的练习,我们在这里和那里发现并修复了一些问题,并且-正如前面提到的-我们通过一些速度改进做出了贡献,比如缓存。

鉴于Thanos存储基于Prometheus TSDB,因此Cortex块存储也是如此,我们还帮助练习和压力测试TSDB。我们发现并修复了错误和瓶颈,显然我们会继续这样做,因为我们关心。很多!

对我来说,开源是协作最美好的表现之一。来自世界各地的一群非常不同的人,团结在一起,为更广泛的社区建设一些东西。

合作并非易事,但绝对值得。很难预见未来我们会减少Cortex和Thanos之间的合作。毕竟,一个人不会改变一支获胜的球队。

如果您想要共同建设更伟大的事业,请保重,确保安全,并加入我们!

PromCon Online从今天开始,Grafana实验室的团队成员将就普罗米修斯存储引擎、生态系统的未来等进行演讲。

错过最近在特拉维夫举行的格拉法纳会议吗?在这里观看所有演讲的录音!

Tom Wilkie回顾了他在PromCon上的演讲,内容是Cortex和Thanos采用不同的方法来解决普罗米修斯面临的相同挑战。