我们只需4/30即可调整Futureestack注册。条款和条件适用。 现在注册

kafkapocalypse:监控Kafka而不失去你的思想

15分钟阅读

经过本夏天

(这篇文章改编自一个名为“Kafka在新遗物监测”给予Futureestack:纽约2017年。高级产品经理Neha Duggal贡献了这次谈话。)

在新遗物中,边缘团队负责处理进入我们公司的所有数据的管道。我们是早期的提升者Apache Kafka.,我们开始使用该数据管道。我们的初始结果卓越。我们的群集处理我们扔的任何数据;它显示出令人难以置信的容错和水平缩放。我们的实施非常稳定,我们基本上忘了它。这就是说,我们完全忽略了它。然后有一天我们经历了灾难性的事件。

我们的主要集群抓住了。所有图形,图表和仪表板都空白。突然,我们完全在黑暗中 - 我们的客户也是如此。事件持续了近四个小时,最后,客户数量不满意的客户经历了某种数据丢失。这是一个史诗般的灾难。我们的Kafka基础设施已经像冠军一样奔跑超过一年,突然间才能停止。

这发生了几年前,但到了这一天,我们仍然将事件称为“kafkapocalypse”。

有时在软件中,事情会变得非常错误,但这是你如何反弹这真的很重要。

一旦我们恢复了一切,我们的客户被安排了,我们做了很多灵魂搜索。我们有多年的经验监控复杂和分布式系统,但很明显与Kafka一起,我们不明白监控和警告的所有关键指标。在这篇文章中,我将分享来自那个可怕的一天的关键外来,并留下六个提示,旨在帮助Devops团队避免通过自己的kafkapocalypse遭受遭受的痛苦。

什么是Kafka,它是如何工作的?

这篇文章不打算深入探讨所有Kafka的技术细节但是简单地说,Kafka是一个可扩展的、容错的消息传递系统。它用于构建实时数据管道和流媒体应用程序,并在Netflix、沃尔玛、Twitter和Uber等公司的生产环境中运行。

这是它的运作方式:

  • 生产者发送消息到主题,这是流数据的记录。Kafka服务器上存在主题,也称为经纪人Kafka基础知识图像1
  • 消费者从经纪人阅读主题数据。
  • 主题分为分区,它是这些个人主题分区,生产者和消费者与之互动。
  • 主题分区在整个群集中分发以平衡负载。这意味着当生产者和消费者与主题分区互动时,他们同时发送和接收来自多个经纪商。Kafka基础知识图片2

Kafka支持本地复制。每个主题分区有一个复制因子(RF)它决定了数据的副本数量。在New Relic,我们使用RF3,所以我们有所有数据的三份副本。

Kafka基础知识图片3

对于每个复制的分区,只有一个经纪人是领导者。这是生产者和消费者与之互动的分区的领导者。

我们的Kafka堆栈的演变

在2014年,我们的Kafka部署有5个broker处理大约1 - 2gbps,这大概相当于每秒处理一集你最喜欢的HBO节目。但是,随着我们的客户群的增长和我们所吸收的数据量的增加,我们扩展了我们的部署以满足我们的需求。

从本撰写中,我们拥有超过100家经纪人处理300多个Gbps,在三个不同的数据中心部署,这就像加工你最喜欢的HBO的整个季节每秒两次。在消息传递术语中,每秒大约是1500万条消息。

显然,这代表了体积和复杂性的显着增长。

我们对我们无法监控该系统中发生的每一个事件并不是很实际的。如果我们跟踪每条消息并通知集群中发生的每一个事件,我们可能会导致信息过载和警报疲劳。相反,我们发现了一个“中间道路”,我们能够拥有健康,性能的群集,并睡个好觉。

那么这条中间路线到底是什么呢?

在保持理智时监测Kafka

我们现在有三个非常重要的事情,我们现在监控和警告我们的Kafka集群:

  • 保留:我们可以为每个主题分区存储多少数据?
  • 复制:我们可以复制多少份数据?
  • 消费者滞后:我们如何监测消费者申请的落后程度来自生产者?

在维护理智时监测Kafka:保留

这是另一个快速故事......

几个月前,我们在一个大容量的话题上遇到了一个消费者滞后事件:我们处理数据的速度不及数据到达的速度,所以它在Kafka中进行缓冲。在高峰期,我们比实时时间落后8或9分钟;这不是另一个卡夫卡启示录,但它已经足够严重了。

所讨论的主题被配置为最多保留2小时的数据,但是当我们根据增加的数据速率计算存储时,发现我们存储的数据比我们应该存储的要少得多。

在这种情况下,我们没有考虑在空间与时间保持保留。

在Kafka中,您可以按时间(分钟,小时等)和空间(兆字节,千兆字节等)配置保留设置。

如果只需时间配置,例如要保留24小时的数据,并且音量增加,24小时的数据可能会比您所期望的更多,并且服务器可以用完空间。Kafka不会那样。

如果仅按空间配置,则卷的增加可能会缩短您在磁盘上保持的时间间隔;突然间,您应该在磁盘上有10分钟的数据,而您应该有2小时。

所以空间与时间 - 你如何选择哪一个配置?

快速答案是你不选择一个;您可以配置两者。

让我们考虑一下Devops Trip#1:配置空间和时间保留设置。

但是,请记住,在空间上的帽子可以保护您免受压倒性的情况下,卷的增加仍然可以使其保持比您想象的更少。

为了防止出现这种情况,我们编写了监控分区的数据速率、磁盘上的大小和当前主题配置的代码,并将这些数据发送到新的遗物见解。我们结合了新的遗物警报如果我们接近我们的时间门槛,请警告我们。

KAFKA数据保留在见解中

此洞察查询显示磁盘上的实际字节与主题分区的配置最大字节相比的实际字节比率。如果比率超过100,我们可以按大小而不是按时间删除数据,这就是我们处理保留的方式。新遗物使其在这些查询中设置超级警报。

这带来了我们devops提示#2和#3

DevOps技巧2:尽可能少的保存数据,同时保持业务目标和义务。您可以在分区重新分配期间快速移动数据,并在同步中获取替换代理如果旧失败将不那么痛苦。

DevOps技巧3:快速提高用户留存率。(这实际上是针对第一次提示的对冲。)我们的团队创建了一个功能我们称之为大红色保留按钮,这使得其他新的遗物团队能够立即增加他们拥有的主题的保留。如果中间有事件,他们可以在不唤醒我们的团队的情况下保护自己。任何保留变化都带来了这种方式,所有都通过源源控制,因此在赶上时,增加也可以很容易地恢复。

没有什么比自助服务“devops”。

在维护理智时监控Kafka:复制

Kafkapocalypse是一个完美的监测问题。一件事让它难以快速解决,我们最终以较复制的状态结束 - 我们会丢失数据冗余。我们需要重新启动Kafka经纪人,但不能因为它们是持有特定数据集的经纪人。

复制监控是我们的盲点。但是,今天,我们将无法复制。

如果我们从单个分区上从三个副本下降到两个,我们立即通知。警报消息告诉我们究竟是哪个代理以及哪些分区受到影响。我们甚至通知了关于非优先副本分配和经纪人到代理的消费者滞后事件,这是如此简要的群集本身甚至没有改变状态。

但是,对复制的警报可以是双刃剑。监控所有内容意味着您可以通过所有事情收到通知。大多数Devops团队参加寻呼机旋转,所以如果你是其中一个团队(或睡觉在其中一个团队中的人旁边),你知道多层警报很重要。

我们至少有三个所有数据的副本。如果服务器在半夜失败,我们只发送一封电子邮件或松弛消息 - 毕竟,我们仍然有两个数据副本,我们可以在早上修复单一失败。但是,如果两个服务器失败,有人被醒来。

硬件突破一直休息,对计划不可避免的意识到这一点至关重要Devops Tip#4:将复制的数据保存在单独的故障域中。

例如,如果您使用复制因子3并将所有内容保留在一个数据中心中,我们曾经至少保留在不同机架中共享分区的Kafka经纪人。您不希望单个机架未能将您放在故障点的情况下。

今天,我们的集群分布在多个数据中心。我们将主题分区的每个副本保存在单独的位置;即使我们丢失了整个数据中心,我们仍然拥有数据的多个副本。

鉴于我们的复制需求,我们还必须确保磁盘I / O不会成为约束。

Kafka的吞吐量受到磁盘写入速度的限制,所以监视磁盘I/O和网络流量很重要——这两者通常是相关的。您需要确保主题分区的数量均匀地分布在代理之间,但是由于所有主题的创建不是相同的,因此就流量而言,您也需要考虑这一点。

平衡领导层是指经纪人在任何一次领先的分区数量并不完全不平衡,因为领导者做了更多的工作。考虑下图:

平衡分区领导者

如您所见,虽然副本必须只处理来自领导者的入站数据,但领导者必须处理来自生产者的入站数据、发送给消费者的出站数据以及发送给所有副本的出站数据。

您希望确保当一个代理失败时,被分配的流量和领导保持平衡,因为其他代理会填补空缺。

不用说,我们观看使用大量仪表板(我们是新的遗物)。此屏幕截图显示了仪表板捕获我们主要集群中的一个数据中心的总入站和出站流量,以及磁盘I / O每个经纪人。

Kafka入站和出境流量仪表板

仪表板很棒:他们可以一目了然地向您展示有趣的事情,他们可以在运营任务期间验证假设。但依赖于仪表板来检测问题是错误的。目标是在它成为仪表板的时间之前检测到一个问题之前,您应该已经消防。

这让我想到Devops提示#5:使用新的遗物警报检测问题在他们得到批评之前,然后调查查询和仪表板。

在维护理智时监测Kafka:消费者滞后

大多数Kafka用户都知道消费者滞后是一个非常大的交易。如果您在主题中消耗数据的速度速度较慢,则在该主题中产生的数据速度较慢,您将会体验消费者滞后。

所以保持领先有多重要——可能发生的最坏情况是什么?你是怕永久丢失数据吗?

流经我们的Kafka经纪人的信息是我们公司的生命线,但更重要的是,这是客户公司的生命线。我们不能失去任何东西。事实上,在我的团队中,我们讨厌失去数据的想法,而不是我们喜欢成功提供它的想法。我们在新的遗物上仔细监控消费者滞后。

让我们再深入挖掘一下……

考虑下面的主题分区图:

Kafka主题分区

当生产者将消息添加到Kafka时,数据从右侧进入。他们通常被称为抵消,但我们已经将它们列为消息ID。生成的下一个消息将附加到130的ID。从左侧,消费者沿着处理消息移动。生产者刚刚附加消息129,消费者刚刚消耗了消息126,因此它滞后了三条消息。

追加时间是当Kafka代理写入新的消息到主题。我们已经编写了监控这个值和另一个重要时间戳的代码:提交时间,这是消费者在处理和提交消息后写的时间戳。

我们使用Append时间和Commit时间来监控两种类型的延迟:附加滞后滞后

Kafka分区延迟度量

提交延迟是被使用消息的附加时间和提交时间之间的差异。它基本上代表了消息在用户处理它之前在Kafka中停留的时间。例如,您可以看到消息126的Commit Lag是2秒,该消息是在1:09添加并在1:11处理的。

Append LAG是最新消息的附加时间与上次提交消息的附加时间之间的区别。正如您所看到的,此消费者的附加滞后是9秒。

我们建议,如果团队要对其中之一发出警报,他们应该在Append Lag上发出警报。只有当你有健康的消费者可以提交时,提交延迟才有用。如果所有的用户同时死亡(这已经发生了),你将无法计算出提交延迟。然而,随着更多消息的产生,Append Lag会继续增加,你可以为此创建警报。

所以,DevOps技巧#6:确保你的延迟监控仍然有效,特别是当所有消费者都停止提交时。

笔记:这些测量不会带Kafka出来的盒子。在新的遗物中,我们编写了一个自定义应用程序,监控每个主题分区的上一个图表中显示的所有值,并将该数据发送到洞察力,我们可以在其中应用警报。

避免你自己的卡夫卡启示录

在我们的kafkapocalypse后,我们开始监控复制,保留和消费者滞后,并没有经历过这样的情况。

复制和保留对DevOps监控Kafka集群的工程师尤为重要。你想要

  • 确保您监控空间和时间保留。
  • 保持若干瞬态数据,但有一种快速增加保留的方法。
  • 通过I / O和领导平衡您的集群,以解释经纪人失败。
  • 使用多层复制警报来检测问题并使用仪表板和查询来调查它们。

对于那些必须从Kafka分区读取数据的应用程序开发人员来说,消费者延迟更感兴趣。

最后,一个更快的故事:

几个月前,正是在我们开始复制的多层警报之后,我们的一个Kafka经纪人因硬件故障而死亡。这是在上午3点左右。

第二天早上我的团队看到了关于只有两份数据的两个副本的电子邮件和松弛消息,但没有分页。对于一个简短的时刻,我们开始恐慌,但随后我们意识到这是设计 - 我们会睡个好觉。我们取代了故障的服务器,并走了我们的一天。

我们已经发现了一定程度的监测,我们对我们感到满意。我们不再遭受警戒疲劳。与此同时,我们冒着其他kafkapocalyse风险的练习并不是那么放手。

好的,所以最后一个是有点无聊。但最幸福的梦想故事是那些什么没有真正发生的故事。