在这篇文章中,我们将带您在整合和利用之旅LinkedIn的布鲁克林平台作为一个镜像技术来代替卡夫卡镜制造商(KMM)。

我们将解释我们是如何从配置、操作和维护转换过来的212独特的卡夫卡镜子制造商集群,只有14Brooklin集群支持33个本地Kafka集群和17个聚合Kafka集群。在转换之后,我们使用的cpu减少了57%,同时获得了成功管理Kafka环境的新能力。我们在一个由数千台机器和数千个cpu组成、每秒处理超过1500万条消息的环境中执行了此迁移,没有出现全局停机。

在深入讨论实现细节之前,让我们通过讨论关键技术和挑战来设置一些上下文,以便了解情况。

卡夫卡,卡夫卡无处不在……

卡夫卡的分布式流媒体平台Apache软件基金会,是我们Wayfair大数据平台的关键组成部分。我们使用Kafka构建实时流应用程序和数据管道,服务于各种各样的用例,包括事件消息传递、web活动跟踪、变更数据捕获流、日志和指标聚合以及流处理。

自部署以来4年前,我们已经观察到卡夫卡的使用和采用的急剧增加。这主要是由两个因素推动。首先,出现了在我们的核心店面的网络流量的持续增长通过我们快速增长的客户群的推动。其次,很多球队从传统消息和批量为基础的系统的实时数据管道是规模搬走。今天,卡夫卡的网友发布的共约90 k的话题周围,创造每秒1500万条信息周围每天有1.3万亿条信息。这种高流量运行在33个本地Kafka集群上,这些集群完全运行在少数几个地理分布的数据中心(DCs)中,我们在本地和谷歌云(GCP)中运行。

卡夫卡的建立是为了在单个数据中心内运行,虽然它可以跨多个可用区的单个DC内建成。我们还运行另一个17簇用作骨料卡夫卡簇,组合来自位于各个数据中心内的多个本地卡夫卡簇的数据。例如,我们有一个本地卡夫卡集群日志记录我们所有数据中心的工作负载。系统将它们的日志发送到它们自己dc中的本地Kafka集群,然而,我们也希望能够对数据进行聚合处理。为了实现这一点,我们在两个专门用于日志记录工作负载。这两个聚合Kafka集群不仅运行我们的日志摄取、聚合和报告系统,而且帮助实现高可用性,使我们能够承受单个数据中心的损失并保持日志流动。

更多的镜子制造商

现在的问题是——我们如何在Kafka中从一个数据中心获取数据到另一个数据中心?更具体地说,我们如何将数据从本地Kafka集群复制到聚合Kafka集群?这就需要一个制镜师。Kafka Mirror Makers (KMM)是他们自己的服务器“集群”类型,所以我们将其称为KMM集群。为了支持将数据从33个本地Kafka集群复制到适当的17个聚合Kafka集群,我们需要操作212 (!)不同的KMM集群,围绕~ 8000虚拟中央处理器。毫不奇怪,这种复杂的拓扑结构导致了高额的资金和运营成本。

我们只好跑这么多KMMs,因为他们只支持单一的源将数据发送到一个单一的目标。也就是说,KMM可以从一个地方卡夫卡集群将数据发送到一个聚合卡夫卡集群。下图描绘了用于为简单起见两个靶的DC卡夫卡镜像过程:

图1:Wayfair上的Kafka镜像

为了说明集群数量不断增加带来的高可维护性和成本问题,让我们以两个odc为例。下图演示了使用的KMM数据聚合的拓扑DC1DC2。在给定的例子,你会发现,一共有四个KMM集群(被描绘为紫色框)正在使用。回想一下,KMM仅支持一对一的源和目的地的映射。

图2:Kafka镜像制造者拓扑

图2:Kafka镜像制造者拓扑

如果我们推断单个数据流和地方卡夫卡集群分散在d从数据中心复制数据ñ来源目标,我们需要N * M个(d总共具有相同的值)制镜簇。

没过多久,团队就意识到是时候寻找替代品了,因为目前的系统没有达到我们的质量标准,增加了巨大的操作难度。具体来说,以下紧迫的挑战和支持不断增长的用户群的需要成为了这种变化的驱动因素:

  • 每个KMM管道都需要一个到一个复制(一个源:一个目的地),从而产生超过212个集群来支持数据聚合用例。
  • 计算成本(vCPUs的#)太高了,因为我们在KMM集群中使用了大约8K的vCPUs。
  • KMM 1.0版本有几个问题,导致服务频繁故障。其中包括Kafka重新平衡和随后的Kafka主题延迟,目标集群中缺失的主题,以及未解决的bug等等。我们平均每个月要处理12个问题。
  • 频繁的服务中断和增加的延迟不仅使我们的内部客户感到不满,而且使我们的支持工作流过度紧张。

我们选择了基于我们的初步研究评估了以下系统:

为了评估这些产品,我们使用了基于的需求记分卡莫斯科中号科大,小号应该还是有限公司uld或w ^on't有)优先框架来对一组预定义的功能评价平台。这些特征包括能力很好地扩展,易于配置,成本,细粒主题的对照(选择性主题复制),高性能,弹性等布鲁克林(每人服务器第二消息数)的额定中所有平台的最高的。

更好地与布鲁克林

布鲁克林是LinkedIn的团队开发了一个开源的系统,“在大规模可靠的近线数据流的可扩展的分布式系统。”它可以作为一个数据流平台读取和发布到异构一套系统。要了解更多信息,请参阅开源布鲁克林:近实时数据流的规模博客。下面的图表提供了平台的高级概述。

图3:布鲁克林高层次图

图3:Brooklin高级图[来源:https://github.com/linkedin/Brooklin/]

Brooklin是作为一个通用流媒体平台构建的,它可以作为一个镜像制造商(MM)来跨Kafka集群复制数据。为了与上一个示例(图2)中的KMM拓扑进行比较,让我们看一下两个DCs的BMM拓扑。如下图所示,我们可以使用一个Brooklin集群来聚合来自不同数据中心的多个数据源的数据。多租户模型允许在一个Brooklin集群中创建从多个源到多个目的地的数据流。这大大减少了镜像集群的数量。

图4:Brooklin mirror maker拓扑

图4:Brooklin mirror maker拓扑

在四大流媒体平台中,Brooklin以绝对优势脱颖而出,原因如下:

  • 可扩展性:BMM允许水平地和垂直缩放任何给定的簇的大小在两个不同的维度。由于该任务分区策略的灵活性,一个可以增加节点上的存储器和CPU在现有的簇(垂直缩放)或添加新节点集群动态(水平缩放)。这种灵活性使我们比簇更多的控制,我们可以将它们调整到工作负载的地址特定需求。
  • 多租户模型:BMM允许使用单个集群从多个源镜像到多个目的地。这打破了KMM的“每个源一个集群:目标配对”方法(这是对它的巨大改进)。添加新的流不再需要构建新的集群。
  • 易于设置:布鲁克林的结构是简单的和(在我们的情况下,经由木偶)容易自动化,因此添加新节点到现有的群集,或创建全新的簇很简单,只要在配置重写参数。
  • 用于数据流管理的Restful api:向Brooklin添加新的镜像流需要一个单行命令来创建一个新的datastream。现在,简单的REST调用可以执行所需的所有主要管理操作。一个特别的提示:通过api暂停流的能力对于管理镜像制造商的操作非常有帮助。
  • 与Linkedin的早期合作:在项目早期,我们联系了LinkedIn与问题,并修复了很多问题,我们在测试中发现的。该团队欢迎我们张开双臂,给了我们洞悉其经验,路线图和配置。与LinkedIn的团队一个开放,合作初期极大​​地帮助我们在我们的实现。
  • 高吞吐量:BMM簇提供〜2.5倍以上的网络吞吐量(以字节/字节出)比KMM簇具有相同的设置和资源。
  • 积极开发管道:一个活跃的开发社区意味着bug和特性将继续被修复并添加到平台上。
  • 可扩展性:Brooklin架构是一个通用的数据移动平台。如果迁移进展顺利,我们将有许多其他方法来利用和扩展Brooklin来满足我们的总体数据迁移需求。

实现方法

评估后,我们开始实现系统,以支持我们当前的业务关键消息管道,同时考虑到我们未来的扩展需求。这需要在4月份Wayfair大型销售活动之前的3个月时间内完成。我们分享我们的方法和主要经验如下:

  1. 尝试和应用

在过去,我们进行了多次优化KMM参数的迭代。这些努力没有白费。我们首先在KMM和BMM参数之间绘制平行线并创建一个地图。我们使用了一个n1-standard-16机器类型与指标工作负载。我们的目标是配置设置来建立一个稳定的平台,我们能够通过调整记录大小、批处理大小和超时来实现这一点,如表1所示。

Brooklin的一个显著优势是可以调整制作人的工作负载参数(numProducersPerConnectortransportProvider这有助于提高生产者的整体生产能力。按节点使用两个生产者线程的能力允许我们线性扩展,这导致生产者和消费者之间的字节进出平衡。

下表显示的结果有助于减少重平衡和内存不足异常(OOMs)的数量,并增加吞吐量,同时建立一个初始稳定的测试环境:

表1:BMM参数调优结果

参数 描述 KMM BMM
max.poll.records 对poll()的一次调用中返回的最大记录数 1000-6000 500
max.poll.interval.ms

(毫秒)

使用使用者组管理时poll()调用之间的最大延迟 600000毫秒 120000毫秒
pollTimeoutMs

(毫秒)

如果没有可用的数据,用于等待轮询调用Kafka的超时(以毫秒为单位) NA 900000 -1,505,000毫秒
batch.size 记录在一个单一批次生产数量 32 k - 100 k 16384年
缓冲区。米emory (megabytes) 生成器可用于缓冲等待发送到服务器的记录的内存总字节 256-1024 MB 128 - 512 MB

我们在2019年12月进行了试点,部署Brooklin作为备用实例指标聚集Kafka集群,运行在我们的一个GCP数据中心。在圣诞节和新年假期高峰负荷期间的成功试点进一步验证了我们的工作。

2.首先解决最复杂的问题

在Wayfair,我们有三个主要卡夫卡的工作负载,日志记录,点击流,度量,这很大程度上推动了我们对Kafka和所有其他相关服务的需求。它们的规格各不相同,但它们通常可以被描述为:

  • 高消息率,小消息(指标
  • 低消息率,大消息(日志记录
  • 较低的消息率、异构消息大小(点击流

下面下列2X2矩阵映射消息的这三种工作负载的消息大小和输入速率,并提供了这些系统的体积和速度感。

图5:日志、指标、Clickstream工作负载的2X2负载概要矩阵

图5:日志、指标、Clickstream工作负载的2X2负载概要矩阵

在下表中,我们列出了特定的消息率、Kafka主题的总数、平均分区数、平均消息大小和每个数据中心每个工作负载接收到的平均字节数。

表2:工作负载概要度量,日志记录,点击流每个数据中心

工作量

(每DC)

消息率

每秒(消息)

总主题# 正在复制的Avg分区 Avg消息大小(KB) Avg bytes_in

(MB / s)的

指标 1 - 5几百万 4 68 20-22 250 - 400
日志记录 400 - 450 K 205 442 55-65 200-275
点击流 200-400ķ 365 302 80 - 100 128-512

对于我们的第一个迁移从KMM到BMM,我们选择了指标Kafka集群在所有DCs上每秒处理超过1060万条消息。我们认为这是最具挑战性的工作流程,因为这些集群处理的消息速度非常快。此外,这些集群对正常运行时间有最严格的要求,对主题延迟的容忍度最低。因此,解决这些挑战指标工作流首先可以作为我们其余数据管道的试金石。

3.协作,贡献

在这个项目的过程中,团队密切配合,在LinkedIn内部团队和外部合作伙伴合作。LinkedIn的团队是非常有帮助的,并分享了它的建筑和环境,非常符合我们的决策帮助我们的详细信息。有我们的实施过程中发现的两个主要问题。

首先,我们遇到了一些bug。我们发现了一个导致Brooklin集群因为处理Zookeeper会话过期事件而无领导的bug。我们报告了一个bug并发布了一个pull request (PR) -ZooKeeper的会话泄漏修复。我们遇到了另一个在目标主题中丢失记录键的bug,再次发布PR来解决这个问题-缺少卡夫卡目标主题记录键

其次,我们发现,部分集群关机期间,负载均衡会发出太多的任务的一些活动节点。这偶尔会压倒节点的子集,导致Linux的奥姆斯和后续节点故障。要解决这个问题,我们引入了一个新的参数(见新的maxTasksPerInstance选项)限制每个数据流分配给单个节点实例的任务数量。通过限制任何单个节点处理的任务数量,我们现在可以防止由于节点故障而导致的domino效应,最终减少重新平衡的数量并提高总体稳定性。

在项目的不同阶段,我们还与三个团队合作度量,日志记录,点击流工作量,以得到早期反馈。在一种情况下,我们进行了压力测试与日志记录指标成功测试三倍于他们典型负载的团队。在另一个例子中,我们帮助指标团队调试了一个问题,他们的背压机制启动了。结果是团队在调整背压时假定了一些延迟。Brooklin复制恢复得如此之快,以至于看起来像一个交通高峰,导致反压机制开始发挥作用。这导致了指标团队对他们的系统进行重新校准,并设置合理的反压力阀值。

通过紧密的合作,我们确保从卡夫卡镜面制造商的过渡是无缝为我们的客户。

4.学习和遍历!

Wayfair文化的尝试;测量;提高。我们有证明这种心态两个快速的例子。首先,我们最初部署的虚拟机上的布鲁克林。当我们提到这对LinkedIn的球队,他们有兴趣听听它如何去,因为他们已经部署了体检,但也考虑到迁移的虚拟机。虚拟机都很好,但我们想做得更多。由于集装箱的许多好处,我们决定采取集装布鲁克林。我们取得了一些初步的成功,但是,我们发现,布鲁克林服务是正常的维护非常敏感/重建K8S荚的周期。在Wayfair K8S队只在那个时间点支持无状态的应用程序。 In order to avoid instability in the environment, we decided to pivot away from K8s back to VMs.

在摆动我们的部署回虚拟机,我们需要确定相应的设置在我们的集群应用。我们想选择哪个,我们可以为了简化和精简这些集群的管理工作流程,跨应用的标准化群集配置。每个工作流被在一个时间迭代测试,调谐一个设置来衡量其影响,然后移动到下一个设置。多的测试后,我们的工作将它们合并到,可以在所有三个工作流应用单一的配置。虽然这些工作流程的特点不同,我们发现,我们能够找到一个“甜蜜点”,在我们的一些设置,而性能造成负面影响。

要微调的最佳性能的系统,我们的表现团队紧密合作,系统地优化网络流量(配置所有工作负荷bytes_inbytes_out最初用于单个消费者和生产者线程。经过第二轮调优,我们能够将Brooklin系统扩展到单次提供约30 MB /秒的吞吐量n1-standard-16GCP的节点。这为我们提供了一个标准的“性能单元”,然后我们可以使用它进行水平扩展。接下来,我们使用该单元来计算达到一定吞吐量所需的节点数量。

下面描述了图横向扩展的具有约1.15十亿滞后的影响。我们的目标是看到处理消息的速度如何缩小与BMM集群中的节点数量。为了进行这种测量,我们跨越相关的三个不同卡夫卡主题产生未处理的消息的队列中的单个数据中心指标

图6:滞后恢复时间未处理的消息5,10和30个BMM节点

图6:滞后恢复时间未处理的消息5,10和30个BMM节点

为1.15十亿的给定的总滞后,一个30节点的配置所带来的恢复时间缩短到〜18分钟相比于具有10个节点的〜40分钟内。红线描绘了在其被处理的消息的数量的斜率或速率。更高(负)斜率是指信息的处理速度更快,有较快的恢复时间。我们确认,信息处理速度与节点的数量很好地扩展。

这个节点级性能基准测试使我们能够很容易地计算出从滞后基于特定的服务级别目标(SLO)一定的时间恢复所需的节点数量,使得大多数其他设置不变。

  1. 测量一次,测试两次

严格和全面的测试与对系统稳定性、弹性和可测量性能的关注相结合,并共享结果。测试针对三种不同的工作流执行;指标日志记录点击流,每个服务于一个独特的用例。

除了基于系统的度量之外,例如CPU利用率,内存利用率,bytes_inbytes_outDatadog,Kafka特定的度量标准,比如num_rebalances。producer.waiting_threads计数,aggregate.events_byte_processed_rate.mean_rate被用来比较的性能。Kibana / ElasticSearch被用于测量日志在不同级别的错误频率,重新平衡的数记录处理速度

上面列出的度量被捕获用于以下测试方案:

  • 重新启动布鲁克林集群
  • 重新启动布鲁克林簇为1小时和4小时值得滞后
  • 重新启动布鲁克林与约1个十亿消息滞后
  • 原因停止源和目标卡夫卡代理节点卡夫卡再平衡。
  • 通过停止布鲁克林集群的5个节点来实现布鲁克林再平衡

我们进一步调整max.poll.interval.ms、commitIntervalMs daemonThreadIntervalInSecondsnonGoodStateThresholdMs尽量减少延迟在重新启动的布鲁克林服务。调优还解决了Java线程任务由于意外错误而终止的问题。下表显示了这三个工作负载的最终集群级配置设置。

表3:最终集群级别配置设置度量,记录点击流工作负载(即比其余不同的配置设置标记为粗体)

工作负载的名字 总#BMM节点 消费性 制片人属性
每个集群的使用者任务的# max.poll.records 每个节点的生产任务# 缓冲。记忆体(MB) batch.size
指标 60 40 500 2 128 16384
日志记录 40 32 500 2 512 16384
点击流 40 32 500 2 512 16384

结果与结论

迁移到布鲁克林,不仅为我们提供了镜像的平台以较低的复制延迟一个稳定的卡夫卡,但也减少了镜面机集群从数21214布鲁克林集群。这是一个93%我们必须配置和操作的系统的衰落。搬到Brooklin mirroring也给了我很大的帮助57%减少所需的vcpu。总的来说,移民为部署后每年节省了数十万美元。

除了减少基础设施支出之外,由于集群数量减少、配置管理和部署流程简化,维护镜像制造商的操作开销也减少了90%。迁移到BMM导致生产问题每月减少10次以上,提高了系统可用性和客户满意度。

该项目已于2020年3月完成,三个月开始到结束之内。这包括飞行员,安装,测试,部署,培训和文档。成功部署到生产后,我们准备Wayfair的四月保存大,还给销售活动。该系统在大型活动期间的完美无缺。

特别感谢!

在紧张的时间限制内建立一个新的大规模流媒体管道并迁移到它是一项巨大的任务。如果没有管理层的支持、以剃须刀为核心的团队和强大的利益相关者伙伴关系,这是不可能实现的。

我们想我们感谢我们的团队成员(阿尼尔弗雷德克里希纳桑托什Sukhvinder汤姆)及计划赞助商(佩里Vinay)。我们还要感谢所有其他跨职能团队,其支持和反馈的帮助我们从的PoC快速移动到试点再到最终的部署。

关于我们

Wayfair的大数据工程(BDE)团队是一个核心基础团队,专注于构建安全、可伸缩和可靠的下一代平台。我们推动企业利用数据为数百万网上购买家具的Wayfair用户创造最佳体验的能力。

参考文献

  1. LinkedIn工程:开源布鲁克林
  2. 布鲁克林配置
  3. 卡夫卡文件